X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=app%2Fwebutil.js;h=a099f9d7026cc0e11cfb1a188ff1fa97f1b1c096;hb=756af5b44c74a6a4b29d1a5846b2b0771e0daa29;hp=1087b330a22ebad7c540e19b471cce6573738677;hpb=e62b4ccb5ea4dccc51b7712981e4442dc54171c6;p=mirror_novnc.git diff --git a/app/webutil.js b/app/webutil.js index 1087b33..a099f9d 100644 --- a/app/webutil.js +++ b/app/webutil.js @@ -1,70 +1,73 @@ /* * noVNC: HTML5 VNC client - * Copyright (C) 2012 Joel Martin - * Copyright (C) 2013 NTT corp. + * Copyright (C) 2019 The noVNC Authors * Licensed under MPL 2.0 (see LICENSE.txt) * * See README.md for usage and integration instructions. */ -import { init_logging as main_init_logging } from '../core/util/logging.js'; +import { initLogging as mainInitLogging } from '../core/util/logging.js'; // init log level reading the logging HTTP param -export function init_logging (level) { +export function initLogging(level) { "use strict"; if (typeof level !== "undefined") { - main_init_logging(level); + mainInitLogging(level); } else { - var param = document.location.href.match(/logging=([A-Za-z0-9\._\-]*)/); - main_init_logging(param || undefined); + const param = document.location.href.match(/logging=([A-Za-z0-9._-]*)/); + mainInitLogging(param || undefined); } -}; +} // Read a query string variable -export function getQueryVar (name, defVal) { +export function getQueryVar(name, defVal) { "use strict"; - var re = new RegExp('.*[?&]' + name + '=([^&#]*)'), + const re = new RegExp('.*[?&]' + name + '=([^&#]*)'), match = document.location.href.match(re); if (typeof defVal === 'undefined') { defVal = null; } + if (match) { return decodeURIComponent(match[1]); - } else { - return defVal; } -}; + + return defVal; +} // Read a hash fragment variable -export function getHashVar (name, defVal) { +export function getHashVar(name, defVal) { "use strict"; - var re = new RegExp('.*[&#]' + name + '=([^&]*)'), + const re = new RegExp('.*[&#]' + name + '=([^&]*)'), match = document.location.hash.match(re); if (typeof defVal === 'undefined') { defVal = null; } + if (match) { return decodeURIComponent(match[1]); - } else { - return defVal; } -}; + + return defVal; +} // Read a variable from the fragment or the query string // Fragment takes precedence -export function getConfigVar (name, defVal) { +export function getConfigVar(name, defVal) { "use strict"; - var val = getHashVar(name); + const val = getHashVar(name); + if (val === null) { - val = getQueryVar(name, defVal); + return getQueryVar(name, defVal); } + return val; -}; +} /* * Cookie handling. Dervied from: http://www.quirksmode.org/js/cookies.html */ // No days means only for this browser session -export function createCookie (name, value, days) { +export function createCookie(name, value, days) { "use strict"; - var date, expires; + let date, expires; if (days) { date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); @@ -73,64 +76,61 @@ export function createCookie (name, value, days) { expires = ""; } - var secure; + let secure; if (document.location.protocol === "https:") { secure = "; secure"; } else { secure = ""; } document.cookie = name + "=" + value + expires + "; path=/" + secure; -}; +} -export function readCookie (name, defaultValue) { +export function readCookie(name, defaultValue) { "use strict"; - var nameEQ = name + "=", - ca = document.cookie.split(';'); + const nameEQ = name + "="; + const ca = document.cookie.split(';'); - for (var i = 0; i < ca.length; i += 1) { - var c = ca[i]; - while (c.charAt(0) === ' ') { c = c.substring(1, c.length); } - if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length, c.length); } + for (let i = 0; i < ca.length; i += 1) { + let c = ca[i]; + while (c.charAt(0) === ' ') { + c = c.substring(1, c.length); + } + if (c.indexOf(nameEQ) === 0) { + return c.substring(nameEQ.length, c.length); + } } + return (typeof defaultValue !== 'undefined') ? defaultValue : null; -}; +} -export function eraseCookie (name) { +export function eraseCookie(name) { "use strict"; createCookie(name, "", -1); -}; +} /* * Setting handling. */ -var settings = {}; +let settings = {}; -export function initSettings (callback /*, ...callbackArgs */) { - "use strict"; - var callbackArgs = Array.prototype.slice.call(arguments, 1); - if (window.chrome && window.chrome.storage) { - window.chrome.storage.sync.get(function (cfg) { - settings = cfg; - if (callback) { - callback.apply(this, callbackArgs); - } - }); - } else { +export function initSettings() { + if (!window.chrome || !window.chrome.storage) { settings = {}; - if (callback) { - callback.apply(this, callbackArgs); - } + return Promise.resolve(); } -}; + + return new Promise(resolve => window.chrome.storage.sync.get(resolve)) + .then((cfg) => { settings = cfg; }); +} // Update the settings cache, but do not write to permanent storage -export function setSetting (name, value) { +export function setSetting(name, value) { settings[name] = value; -}; +} // No days means only for this browser session -export function writeSetting (name, value) { +export function writeSetting(name, value) { "use strict"; if (settings[name] === value) return; settings[name] = value; @@ -139,11 +139,11 @@ export function writeSetting (name, value) { } else { localStorage.setItem(name, value); } -}; +} -export function readSetting (name, defaultValue) { +export function readSetting(name, defaultValue) { "use strict"; - var value; + let value; if ((name in settings) || (window.chrome && window.chrome.storage)) { value = settings[name]; } else { @@ -153,14 +153,15 @@ export function readSetting (name, defaultValue) { if (typeof value === "undefined") { value = null; } + if (value === null && typeof defaultValue !== "undefined") { return defaultValue; - } else { - return value; } -}; -export function eraseSetting (name) { + return value; +} + +export function eraseSetting(name) { "use strict"; // Deleting here means that next time the setting is read when using local // storage, it will be pulled from local storage again. @@ -173,26 +174,26 @@ export function eraseSetting (name) { } else { localStorage.removeItem(name); } -}; +} -export function injectParamIfMissing (path, param, value) { +export function injectParamIfMissing(path, param, value) { // force pretend that we're dealing with a relative path // (assume that we wanted an extra if we pass one in) path = "/" + path; - var elem = document.createElement('a'); + const elem = document.createElement('a'); elem.href = path; - var param_eq = encodeURIComponent(param) + "="; - var query; + const paramEq = encodeURIComponent(param) + "="; + let query; if (elem.search) { query = elem.search.slice(1).split('&'); } else { query = []; } - if (!query.some(function (v) { return v.startsWith(param_eq); })) { - query.push(param_eq + encodeURIComponent(value)); + if (!query.some(v => v.startsWith(paramEq))) { + query.push(paramEq + encodeURIComponent(value)); elem.search = "?" + query.join("&"); } @@ -200,41 +201,39 @@ export function injectParamIfMissing (path, param, value) { // in the elem.pathname string. Handle that case gracefully. if (elem.pathname.charAt(0) == "/") { return elem.pathname.slice(1) + elem.search + elem.hash; - } else { - return elem.pathname + elem.search + elem.hash; } -}; + + return elem.pathname + elem.search + elem.hash; +} // sadly, we can't use the Fetch API until we decide to drop // IE11 support or polyfill promises and fetch in IE11. // resolve will receive an object on success, while reject // will receive either an event or an error on failure. -export function fetchJSON(path, resolve, reject) { - // NB: IE11 doesn't support JSON as a responseType - var req = new XMLHttpRequest(); - req.open('GET', path); - - req.onload = function () { - if (req.status === 200) { - try { - var resObj = JSON.parse(req.responseText); - } catch (err) { - reject(err); - return; +export function fetchJSON(path) { + return new Promise((resolve, reject) => { + // NB: IE11 doesn't support JSON as a responseType + const req = new XMLHttpRequest(); + req.open('GET', path); + + req.onload = () => { + if (req.status === 200) { + let resObj; + try { + resObj = JSON.parse(req.responseText); + } catch (err) { + reject(err); + } + resolve(resObj); + } else { + reject(new Error("XHR got non-200 status while trying to load '" + path + "': " + req.status)); } - resolve(resObj); - } else { - reject(new Error("XHR got non-200 status while trying to load '" + path + "': " + req.status)); - } - }; + }; - req.onerror = function (evt) { - reject(new Error("XHR encountered an error while trying to load '" + path + "': " + evt.message)); - }; + req.onerror = evt => reject(new Error("XHR encountered an error while trying to load '" + path + "': " + evt.message)); - req.ontimeout = function (evt) { - reject(new Error("XHR timed out while trying to load '" + path + "'")); - }; + req.ontimeout = evt => reject(new Error("XHR timed out while trying to load '" + path + "'")); - req.send(); + req.send(); + }); }