]>
git.proxmox.com Git - mirror_novnc.git/blob - app/webutil.js
e6e6afb70842af9118bf2c97e5f3f510546edf32
2 * noVNC: HTML5 VNC client
3 * Copyright (C) 2012 Joel Martin
4 * Copyright (C) 2013 NTT corp.
5 * Licensed under MPL 2.0 (see LICENSE.txt)
7 * See README.md for usage and integration instructions.
10 /*jslint bitwise: false, white: false, browser: true, devel: true */
11 /*global Util, window, document */
14 * import Util from "../core/util";
17 // Globals defined here
21 * ------------------------------------------------------
22 * Namespaced in WebUtil
23 * ------------------------------------------------------
26 // init log level reading the logging HTTP param
27 WebUtil
.init_logging = function (level
) {
29 if (typeof level
!== "undefined") {
30 Util
._log_level
= level
;
32 var param
= document
.location
.href
.match(/logging=([A-Za-z0-9\._\-]*)/);
33 Util
._log_level
= (param
|| ['', Util
._log_level
])[1];
39 WebUtil
.dirObj = function (obj
, depth
, parent
) {
41 if (! depth
) { depth
= 2; }
42 if (! parent
) { parent
= ""; }
44 // Print the properties of the passed-in object
47 if ((depth
> 1) && (typeof obj
[i
] === "object")) {
48 // Recurse attributes that are objects
49 msg
+= WebUtil
.dirObj(obj
[i
], depth
- 1, parent
+ "." + i
);
51 //val = new String(obj[i]).replace("\n", " ");
53 if (typeof(obj
[i
]) === "undefined") {
56 val
= obj
[i
].toString().replace("\n", " ");
58 if (val
.length
> 30) {
59 val
= val
.substr(0, 30) + "...";
61 msg
+= parent
+ "." + i
+ ": " + val
+ "\n";
67 // Read a query string variable
68 WebUtil
.getQueryVar = function (name
, defVal
) {
70 var re
= new RegExp('.*[?&]' + name
+ '=([^&#]*)'),
71 match
= document
.location
.href
.match(re
);
72 if (typeof defVal
=== 'undefined') { defVal
= null; }
74 return decodeURIComponent(match
[1]);
80 // Read a hash fragment variable
81 WebUtil
.getHashVar = function (name
, defVal
) {
83 var re
= new RegExp('.*[&#]' + name
+ '=([^&]*)'),
84 match
= document
.location
.hash
.match(re
);
85 if (typeof defVal
=== 'undefined') { defVal
= null; }
87 return decodeURIComponent(match
[1]);
93 // Read a variable from the fragment or the query string
94 // Fragment takes precedence
95 WebUtil
.getConfigVar = function (name
, defVal
) {
97 var val
= WebUtil
.getHashVar(name
);
99 val
= WebUtil
.getQueryVar(name
, defVal
);
105 * Cookie handling. Dervied from: http://www.quirksmode.org/js/cookies.html
108 // No days means only for this browser session
109 WebUtil
.createCookie = function (name
, value
, days
) {
114 date
.setTime(date
.getTime() + (days
* 24 * 60 * 60 * 1000));
115 expires
= "; expires=" + date
.toGMTString();
121 if (document
.location
.protocol
=== "https:") {
126 document
.cookie
= name
+ "=" + value
+ expires
+ "; path=/" + secure
;
129 WebUtil
.readCookie = function (name
, defaultValue
) {
131 var nameEQ
= name
+ "=",
132 ca
= document
.cookie
.split(';');
134 for (var i
= 0; i
< ca
.length
; i
+= 1) {
136 while (c
.charAt(0) === ' ') { c
= c
.substring(1, c
.length
); }
137 if (c
.indexOf(nameEQ
) === 0) { return c
.substring(nameEQ
.length
, c
.length
); }
139 return (typeof defaultValue
!== 'undefined') ? defaultValue
: null;
142 WebUtil
.eraseCookie = function (name
) {
144 WebUtil
.createCookie(name
, "", -1);
151 WebUtil
.initSettings = function (callback
/*, ...callbackArgs */) {
153 var callbackArgs
= Array
.prototype.slice
.call(arguments
, 1);
154 if (window
.chrome
&& window
.chrome
.storage
) {
155 window
.chrome
.storage
.sync
.get(function (cfg
) {
156 WebUtil
.settings
= cfg
;
157 console
.log(WebUtil
.settings
);
159 callback
.apply(this, callbackArgs
);
165 callback
.apply(this, callbackArgs
);
170 // No days means only for this browser session
171 WebUtil
.writeSetting = function (name
, value
) {
173 if (window
.chrome
&& window
.chrome
.storage
) {
174 //console.log("writeSetting:", name, value);
175 if (WebUtil
.settings
[name
] !== value
) {
176 WebUtil
.settings
[name
] = value
;
177 window
.chrome
.storage
.sync
.set(WebUtil
.settings
);
180 localStorage
.setItem(name
, value
);
184 WebUtil
.readSetting = function (name
, defaultValue
) {
187 if (window
.chrome
&& window
.chrome
.storage
) {
188 value
= WebUtil
.settings
[name
];
190 value
= localStorage
.getItem(name
);
192 if (typeof value
=== "undefined") {
195 if (value
=== null && typeof defaultValue
!== undefined) {
202 WebUtil
.eraseSetting = function (name
) {
204 if (window
.chrome
&& window
.chrome
.storage
) {
205 window
.chrome
.storage
.sync
.remove(name
);
206 delete WebUtil
.settings
[name
];
208 localStorage
.removeItem(name
);
212 WebUtil
.injectParamIfMissing = function (path
, param
, value
) {
213 // force pretend that we're dealing with a relative path
214 // (assume that we wanted an extra if we pass one in)
217 var elem
= document
.createElement('a');
220 var param_eq
= encodeURIComponent(param
) + "=";
223 query
= elem
.search
.slice(1).split('&');
228 if (!query
.some(function (v
) { return v
.startsWith(param_eq
); })) {
229 query
.push(param_eq
+ encodeURIComponent(value
));
230 elem
.search
= "?" + query
.join("&");
233 // some browsers (e.g. IE11) may occasionally omit the leading slash
234 // in the elem.pathname string. Handle that case gracefully.
235 if (elem
.pathname
.charAt(0) == "/") {
236 return elem
.pathname
.slice(1) + elem
.search
+ elem
.hash
;
238 return elem
.pathname
+ elem
.search
+ elem
.hash
;
242 // Dynamically load scripts without using document.write()
243 // Reference: http://unixpapa.com/js/dyna.html
245 // Handles the case where load_scripts is invoked from a script that
246 // itself is loaded via load_scripts. Once all scripts are loaded the
247 // window.onscriptsloaded handler is called (if set).
248 WebUtil
.get_include_uri = function (root_dir
) {
249 return (typeof INCLUDE_URI
!== "undefined") ? INCLUDE_URI
+ root_dir
+ '/' : root_dir
+ '/';
251 WebUtil
._loading_scripts
= [];
252 WebUtil
._pending_scripts
= [];
253 WebUtil
.load_scripts = function (files_by_dir
) {
255 var head
= document
.getElementsByTagName('head')[0], script
,
256 ls
= WebUtil
._loading_scripts
, ps
= WebUtil
._pending_scripts
;
258 var loadFunc = function (e
) {
259 while (ls
.length
> 0 && (ls
[0].readyState
=== 'loaded' ||
260 ls
[0].readyState
=== 'complete')) {
261 // For IE, append the script to trigger execution
263 //console.log("loaded script: " + s.src);
266 if (!this.readyState
||
267 (Util
.Engine
.presto
&& this.readyState
=== 'loaded') ||
268 this.readyState
=== 'complete') {
269 if (ps
.indexOf(this) >= 0) {
270 this.onload
= this.onreadystatechange
= null;
271 //console.log("completed script: " + this.src);
272 ps
.splice(ps
.indexOf(this), 1);
274 // Call window.onscriptsload after last script loads
275 if (ps
.length
=== 0 && window
.onscriptsload
) {
276 window
.onscriptsload();
282 var root_dirs
= Object
.keys(files_by_dir
);
284 for (var d
= 0; d
< root_dirs
.length
; d
++) {
285 var root_dir
= root_dirs
[d
];
286 var files
= files_by_dir
[root_dir
];
288 for (var f
= 0; f
< files
.length
; f
++) {
289 script
= document
.createElement('script');
290 script
.type
= 'text/javascript';
291 script
.src
= WebUtil
.get_include_uri(root_dir
) + files
[f
];
292 //console.log("loading script: " + script.src);
293 script
.onload
= script
.onreadystatechange
= loadFunc
;
294 // In-order script execution tricks
295 if (Util
.Engine
.trident
) {
296 // For IE wait until readyState is 'loaded' before
297 // appending it which will trigger execution
298 // http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order
301 // For webkit and firefox set async=false and append now
302 // https://developer.mozilla.org/en-US/docs/HTML/Element/script
303 script
.async
= false;
304 head
.appendChild(script
);
311 /* [module] export default WebUtil; */