From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [IPv6:2a0f:8001:1:32::40]) by lore.proxmox.com (Postfix) with ESMTPS id 5F76B1FF0A7 for ; Wed, 02 Sep 2026 09:44:09 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 4331921269; Wed, 02 Sep 2026 09:44:06 +0200 (CEST) From: Dominik Csapak To: pve-devel@lists.proxmox.com Subject: [PATCH pve-xtermjs 2/3] xterm.js: run make tidy Date: Wed, 2 Sep 2026 09:40:38 +0200 Message-ID: <20260902074338.914500-3-d.csapak@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260902074338.914500-1-d.csapak@proxmox.com> References: <20260902074338.914500-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.421 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) POISEN_SPAM_PILL 0.1 Meta: its spam POISEN_SPAM_PILL_1 0.1 random spam to be learned in bayes POISEN_SPAM_PILL_3 0.1 random spam to be learned in bayes RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: QWJNTNCIK5KMNEEWSM67EVXF6S5NWSUT X-Message-ID-Hash: QWJNTNCIK5KMNEEWSM67EVXF6S5NWSUT X-MailFrom: d.csapak@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Signed-off-by: Dominik Csapak --- xterm.js/src/main.js | 538 +++++++++++++++++++++-------------------- xterm.js/src/style.css | 121 ++++----- xterm.js/src/util.js | 158 ++++++------ 3 files changed, 421 insertions(+), 396 deletions(-) diff --git a/xterm.js/src/main.js b/xterm.js/src/main.js index 534e8cf..e9097f1 100644 --- a/xterm.js/src/main.js +++ b/xterm.js/src/main.js @@ -1,12 +1,12 @@ console.log('xtermjs: starting'); var states = { - start: 1, - connecting: 2, - connected: 3, + start: 1, + connecting: 2, + connected: 3, disconnecting: 4, - disconnected: 5, - reconnecting: 6, + disconnected: 5, + reconnecting: 6, }; var term, @@ -31,90 +31,90 @@ var cmdOpts = getQueryParameter('cmd-opts'); function getBaseUrl() { var baseUrl = ''; if (remote) { - baseUrl += `/${remote_type}/remotes/${remote}`; + baseUrl += `/${remote_type}/remotes/${remote}`; } else { - baseUrl += `/nodes/${nodename}`; + baseUrl += `/nodes/${nodename}`; } if (type === 'kvm') { - baseUrl += `/qemu/${vmid}`; + baseUrl += `/qemu/${vmid}`; } else if (type === 'lxc') { - baseUrl += `/lxc/${vmid}`; + baseUrl += `/lxc/${vmid}`; } else if (remote) { - baseUrl += `/nodes/${nodename}`; + baseUrl += `/nodes/${nodename}`; } return baseUrl; } const baseUrl = getBaseUrl(); -const statusUrlSuffix = (remote ? '/status' : '/status/current'); -const startUrlSuffix = (remote ? '/start' : '/status/start'); +const statusUrlSuffix = remote ? '/status' : '/status/current'; +const startUrlSuffix = remote ? '/start' : '/status/start'; function updateState(newState, msg, code) { var timeout, severity, message; switch (newState) { - case states.connecting: - message = "Connecting..."; - timeout = 0; - severity = severities.warning; - break; - case states.connected: - window.onbeforeunload = windowUnload; - message = "Connected"; - break; - case states.disconnecting: - window.onbeforeunload = undefined; - message = "Disconnecting..."; - timeout = 0; - severity = severities.warning; - break; - case states.reconnecting: - window.onbeforeunload = undefined; - message = "Reconnecting..."; - timeout = 0; - severity = severities.warning; - break; - case states.disconnected: - window.onbeforeunload = undefined; - switch (state) { - case states.start: - case states.connecting: - case states.reconnecting: - message = "Connection failed"; - timeout = 0; - severity = severities.error; - break; - case states.connected: - case states.disconnecting: - var time_since_started = new Date() - starttime; - timeout = 5000; - if (time_since_started > 5*1000 || type === 'shell') { - message = "Connection closed"; - } else { - message = "Connection failed"; - severity = severities.error; - } - break; - case states.disconnected: - // no state change - break; - default: - throw "unknown state"; - } - break; - default: - throw "unknown state"; + case states.connecting: + message = 'Connecting...'; + timeout = 0; + severity = severities.warning; + break; + case states.connected: + window.onbeforeunload = windowUnload; + message = 'Connected'; + break; + case states.disconnecting: + window.onbeforeunload = undefined; + message = 'Disconnecting...'; + timeout = 0; + severity = severities.warning; + break; + case states.reconnecting: + window.onbeforeunload = undefined; + message = 'Reconnecting...'; + timeout = 0; + severity = severities.warning; + break; + case states.disconnected: + window.onbeforeunload = undefined; + switch (state) { + case states.start: + case states.connecting: + case states.reconnecting: + message = 'Connection failed'; + timeout = 0; + severity = severities.error; + break; + case states.connected: + case states.disconnecting: + var time_since_started = new Date() - starttime; + timeout = 5000; + if (time_since_started > 5 * 1000 || type === 'shell') { + message = 'Connection closed'; + } else { + message = 'Connection failed'; + severity = severities.error; + } + break; + case states.disconnected: + // no state change + break; + default: + throw 'unknown state'; + } + break; + default: + throw 'unknown state'; } let msgArr = []; if (msg) { - msgArr.push(msg); + msgArr.push(msg); } if (code !== undefined) { - msgArr.push(`Code: ${code}`); + msgArr.push(`Code: ${code}`); } if (msgArr.length > 0) { - message += ` (${msgArr.join(', ')})`; + message += ` (${msgArr.join(', ')})`; } state = newState; showMsg(message, timeout, severity); @@ -129,47 +129,56 @@ createTerminal(); function startConnection(params, term) { API2Request({ - method: 'POST', - params: params, - url: baseUrl + '/termproxy', - success: function(result) { - var port = encodeURIComponent(result.data.port); - ticket = result.data.ticket; - socketURL = protocol + location.hostname + ((location.port) ? (':' + location.port) : '') + '/api2/json' + baseUrl + '/vncwebsocket?port=' + port + '&vncticket=' + encodeURIComponent(ticket); - - socket = new WebSocket(socketURL, 'binary'); - socket.binaryType = 'arraybuffer'; - socket.onopen = runTerminal; - socket.onclose = tryReconnect; - socket.onerror = tryReconnect; - updateState(states.connecting); - }, - failure: function(msg) { - updateState(states.disconnected,msg); - } + method: 'POST', + params: params, + url: baseUrl + '/termproxy', + success: function (result) { + var port = encodeURIComponent(result.data.port); + ticket = result.data.ticket; + socketURL = + protocol + + location.hostname + + (location.port ? ':' + location.port : '') + + '/api2/json' + + baseUrl + + '/vncwebsocket?port=' + + port + + '&vncticket=' + + encodeURIComponent(ticket); + + socket = new WebSocket(socketURL, 'binary'); + socket.binaryType = 'arraybuffer'; + socket.onopen = runTerminal; + socket.onclose = tryReconnect; + socket.onerror = tryReconnect; + updateState(states.connecting); + }, + failure: function (msg) { + updateState(states.disconnected, msg); + }, }); } function startGuest() { API2Request({ - method: 'POST', - url: baseUrl + startUrlSuffix, - success: function(result) { - showMsg('Guest started successfully', 0); - setTimeout(function() { - location.reload(); - }, 1000); - }, - failure: function(msg) { - if (msg.match(/already running/)) { - showMsg('Guest started successfully', 0); - setTimeout(function() { - location.reload(); - }, 1000); - } else { - updateState(states.disconnected,msg); - } - } + method: 'POST', + url: baseUrl + startUrlSuffix, + success: function (result) { + showMsg('Guest started successfully', 0); + setTimeout(function () { + location.reload(); + }, 1000); + }, + failure: function (msg) { + if (msg.match(/already running/)) { + showMsg('Guest started successfully', 0); + setTimeout(function () { + location.reload(); + }, 1000); + } else { + updateState(states.disconnected, msg); + } + }, }); } @@ -179,94 +188,97 @@ function createTerminal() { term.loadAddon(fitAddon); let loadedWebgl = false; try { - if (detectWebgl()) { - const webglAddon = new WebglAddon.WebglAddon(); - term.loadAddon(webglAddon); - loadedWebgl = true; - } - } catch (_e) { } + if (detectWebgl()) { + const webglAddon = new WebglAddon.WebglAddon(); + term.loadAddon(webglAddon); + loadedWebgl = true; + } + } catch (_e) {} if (!loadedWebgl) { - console.warn("webgl-addon loading failed, falling back to regular dom renderer"); + console.warn('webgl-addon loading failed, falling back to regular dom renderer'); } term.onResize(function (size) { - if (state === states.connected) { - socket.send("1:" + size.cols + ":" + size.rows + ":"); - } + if (state === states.connected) { + socket.send('1:' + size.cols + ':' + size.rows + ':'); + } }); - protocol = (location.protocol === 'https:') ? 'wss://' : 'ws://'; + protocol = location.protocol === 'https:' ? 'wss://' : 'ws://'; var params = {}; switch (type) { - case 'upgrade': - params.cmd = 'upgrade'; - break; - case 'cmd': - params.cmd = decodeURI(cmd); - if (cmdOpts !== undefined && cmdOpts !== null && cmdOpts !== "") { - params['cmd-opts'] = decodeURI(cmdOpts); - } - break; + case 'upgrade': + params.cmd = 'upgrade'; + break; + case 'cmd': + params.cmd = decodeURI(cmd); + if (cmdOpts !== undefined && cmdOpts !== null && cmdOpts !== '') { + params['cmd-opts'] = decodeURI(cmdOpts); + } + break; } if (type === 'kvm' || type === 'lxc') { - API2Request({ - method: 'GET', - url: baseUrl + statusUrlSuffix, - success: function(result) { - if (result.data.status === 'running') { - startConnection(params, term); - } else { - document.getElementById('connect_dlg').classList.add('pve_open'); - } - }, - failure: function(msg) { - updateState(states.disconnected, msg); - }, - }); + API2Request({ + method: 'GET', + url: baseUrl + statusUrlSuffix, + success: function (result) { + if (result.data.status === 'running') { + startConnection(params, term); + } else { + document.getElementById('connect_dlg').classList.add('pve_open'); + } + }, + failure: function (msg) { + updateState(states.disconnected, msg); + }, + }); } else { - startConnection(params, term); + startConnection(params, term); } } function runTerminal() { - socket.onmessage = function(event) { - var answer = new Uint8Array(event.data); - if (state === states.connected) { - term.write(answer); - } else if(state === states.connecting) { - if (answer[0] === 79 && answer[1] === 75) { // "OK" - updateState(states.connected); - term.write(answer.slice(2)); - - // delay initial focus and resize to after next frame - requestAnimationFrame(() => requestAnimationFrame(() => { - term.focus(); - fitAddon.fit(); - })); - } else { - socket.close(); - } - } + socket.onmessage = function (event) { + var answer = new Uint8Array(event.data); + if (state === states.connected) { + term.write(answer); + } else if (state === states.connecting) { + if (answer[0] === 79 && answer[1] === 75) { + // "OK" + updateState(states.connected); + term.write(answer.slice(2)); + + // delay initial focus and resize to after next frame + requestAnimationFrame(() => + requestAnimationFrame(() => { + term.focus(); + fitAddon.fit(); + }), + ); + } else { + socket.close(); + } + } }; - term.onData(function(data) { - if (state === states.connected) { - socket.send("0:" + unescape(encodeURIComponent(data)).length.toString() + ":" + data); - } + term.onData(function (data) { + if (state === states.connected) { + socket.send('0:' + unescape(encodeURIComponent(data)).length.toString() + ':' + data); + } }); - ping = setInterval(function() { - socket.send("2"); - }, 30*1000); + ping = setInterval(function () { + socket.send('2'); + }, 30 * 1000); - window.addEventListener('resize', function() { - clearTimeout(resize); - resize = setTimeout(function() { - // done resizing - fitAddon.fit(); - }, 250); + window.addEventListener('resize', function () { + clearTimeout(resize); + resize = setTimeout(function () { + // done resizing + fitAddon.fit(); + }, 250); }); // for remote sessions, this line needs to be sent by PDM @@ -277,111 +289,121 @@ function runTerminal() { function getLxcStatus(callback) { API2Request({ - method: 'GET', - url: baseUrl + statusUrlSuffix, - success: function(result) { - if (typeof callback === 'function') { - callback(true, result); - } - }, - failure: function(msg) { - if (typeof callback === 'function') { - callback(false, msg); - } - } + method: 'GET', + url: baseUrl + statusUrlSuffix, + success: function (result) { + if (typeof callback === 'function') { + callback(true, result); + } + }, + failure: function (msg) { + if (typeof callback === 'function') { + callback(false, msg); + } + }, }); } function checkMigration() { var apitype = type; if (apitype === 'kvm') { - apitype = 'qemu'; + apitype = 'qemu'; } var url = '/cluster/resources'; if (remote) { - url = `/${remote_type}/remotes/${remote}/resources`; + url = `/${remote_type}/remotes/${remote}/resources`; } API2Request({ - method: 'GET', - params: { - type: 'vm' - }, - url: url, - success: function(result) { - // if not yet migrated , wait and try again - // if not migrating and stopped, cancel - // if started, connect - result.data.forEach(function(entity) { - if (entity.id === (apitype + '/' + vmid)) { - var started = entity.status === 'running'; - var migrated = entity.node !== nodename; - if (migrated) { - if (started) { - // goto different node - let url = '?console=' + type + - '&xtermjs=1&vmid=' + vmid + '&vmname=' + - vmname + '&node=' + entity.node; - if (remote) { - url += '&remote=' + remote + '&remote-type=' + remote_type; - } - location.href = url; - } else { - // wait again - updateState(states.reconnecting, 'waiting for migration to finish...'); - setTimeout(checkMigration, 5000); - } - } else { - if (type === 'lxc') { - // we have to check the status of the - // container to know if it has the - // migration lock - getLxcStatus(function(success, result) { - if (success) { - if (result.data.lock === 'migrate') { - // still waiting - updateState(states.reconnecting, 'waiting for migration to finish...'); - setTimeout(checkMigration, 5000); - } else if (started) { - // container was rebooted - location.reload(); - } else { - stopTerminal(); - } - } else { - // probably the status call failed because - // the ct is already somewhere else, so retry - setTimeout(checkMigration, 1000); - } - }); - } else if (started) { - // this happens if we have old data in - // /cluster/resources, or the connection - // disconnected, so simply try to reload here - location.reload(); - } else if (type === 'kvm') { - // it seems the guest simply stopped - stopTerminal(); - } - } - - return; - } - }); - }, - failure: function(msg) { - errorTerminal({msg: msg}); - } + method: 'GET', + params: { + type: 'vm', + }, + url: url, + success: function (result) { + // if not yet migrated , wait and try again + // if not migrating and stopped, cancel + // if started, connect + result.data.forEach(function (entity) { + if (entity.id === apitype + '/' + vmid) { + var started = entity.status === 'running'; + var migrated = entity.node !== nodename; + if (migrated) { + if (started) { + // goto different node + let url = + '?console=' + + type + + '&xtermjs=1&vmid=' + + vmid + + '&vmname=' + + vmname + + '&node=' + + entity.node; + if (remote) { + url += '&remote=' + remote + '&remote-type=' + remote_type; + } + location.href = url; + } else { + // wait again + updateState(states.reconnecting, 'waiting for migration to finish...'); + setTimeout(checkMigration, 5000); + } + } else { + if (type === 'lxc') { + // we have to check the status of the + // container to know if it has the + // migration lock + getLxcStatus(function (success, result) { + if (success) { + if (result.data.lock === 'migrate') { + // still waiting + updateState( + states.reconnecting, + 'waiting for migration to finish...', + ); + setTimeout(checkMigration, 5000); + } else if (started) { + // container was rebooted + location.reload(); + } else { + stopTerminal(); + } + } else { + // probably the status call failed because + // the ct is already somewhere else, so retry + setTimeout(checkMigration, 1000); + } + }); + } else if (started) { + // this happens if we have old data in + // /cluster/resources, or the connection + // disconnected, so simply try to reload here + location.reload(); + } else if (type === 'kvm') { + // it seems the guest simply stopped + stopTerminal(); + } + } + + return; + } + }); + }, + failure: function (msg) { + errorTerminal({ msg: msg }); + }, }); } function tryReconnect(event) { var time_since_started = new Date() - starttime; var type = getQueryParameter('console'); - if (time_since_started < 5*1000 || type === 'shell' || type === 'cmd') { // 5 seconds - stopTerminal(event); - return; + if (time_since_started < 5 * 1000 || type === 'shell' || type === 'cmd') { + // 5 seconds + stopTerminal(event); + return; } updateState(states.disconnecting, 'Detecting migration...'); @@ -394,11 +416,11 @@ function clearEvents() { } function windowUnload(e) { - let message = "Are you sure you want to leave this page?"; + let message = 'Are you sure you want to leave this page?'; e = e || window.event; if (e) { - e.returnValue = message; + e.returnValue = message; } return message; @@ -428,7 +450,7 @@ function errorTerminal(event) { // // firefox will fail on the getContext anyway if there is not hardware support function detectWebgl() { - const canvas = document.createElement("canvas"); - const gl = canvas.getContext("webgl2", { failIfMajorPerformanceCaveat: true }); + const canvas = document.createElement('canvas'); + const gl = canvas.getContext('webgl2', { failIfMajorPerformanceCaveat: true }); return !!gl; } diff --git a/xterm.js/src/style.css b/xterm.js/src/style.css index 04db7d5..7962ae3 100644 --- a/xterm.js/src/style.css +++ b/xterm.js/src/style.css @@ -1,10 +1,11 @@ -html,body { +html, +body { height: 100%; min-height: 100%; margin: 0; padding: 0; overflow: hidden; - font-family: Consolas,"DejaVu Sans Mono","Liberation Mono",Courier,monospace; + font-family: Consolas, "DejaVu Sans Mono", "Liberation Mono", Courier, monospace; background-color: #101010; } @@ -12,7 +13,7 @@ html,body { background-color: #101010; color: #f0f0f0; font-size: 10pt; - font-family: Consolas,"DejaVu Sans Mono","Liberation Mono",Courier,monospace; + font-family: Consolas, "DejaVu Sans Mono", "Liberation Mono", Courier, monospace; font-variant-ligatures: none; -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; @@ -43,45 +44,45 @@ html,body { } #status_bar { - position: fixed; - top: 0; - left: 0; - width: 100%; - z-index: 500; - transform: translateY(-100%); + position: fixed; + top: 0; + left: 0; + width: 100%; + z-index: 500; + transform: translateY(-100%); - transition: 0.25s ease-in-out; + transition: 0.25s ease-in-out; - visibility: hidden; - opacity: 0; + visibility: hidden; + opacity: 0; - padding: 5px; + padding: 5px; - display: flex; - flex-direction: row; - justify-content: center; - align-content: center; + display: flex; + flex-direction: row; + justify-content: center; + align-content: center; - line-height: 25px; - color: #fff; + line-height: 25px; + color: #fff; - border-bottom: 1px solid rgba(0, 0, 0, 0.9); + border-bottom: 1px solid rgba(0, 0, 0, 0.9); } #status_bar.open { - transform: translateY(0); - visibility: visible; - opacity: 1; + transform: translateY(0); + visibility: visible; + opacity: 1; } #status_bar.normal { - background: rgba(128,128,128,0.9); + background: rgba(128, 128, 128, 0.9); } #status_bar.error { - background: rgba(200,55,55,0.9); + background: rgba(200, 55, 55, 0.9); } #status_bar.warning { - background: rgba(180,180,30,0.9); + background: rgba(180, 180, 30, 0.9); } #pve_start_info { @@ -92,53 +93,53 @@ html,body { } #connect_dlg { - transition: 0.2s ease-in-out; + transition: 0.2s ease-in-out; - transform: scale(0, 0); - visibility: hidden; - opacity: 0; - font-family: Helvetica; + transform: scale(0, 0); + visibility: hidden; + opacity: 0; + font-family: Helvetica; } #connect_dlg.pve_open { - transform: scale(1, 1); - visibility: visible; - opacity: 1; + transform: scale(1, 1); + visibility: visible; + opacity: 1; } #connect_btn { - cursor: pointer; - padding: 6px; - color: white; - background:#4c4c4c;; - border-radius: 8px; - text-align: center; - font-size: 20px; - box-shadow: 4px 4px 0px rgba(0, 0, 0, 0.5); + cursor: pointer; + padding: 6px; + color: white; + background: #4c4c4c; + border-radius: 8px; + text-align: center; + font-size: 20px; + box-shadow: 4px 4px 0px rgba(0, 0, 0, 0.5); } #connect_btn div { - margin: 2px; - padding: 5px 30px; - border: 1px solid #2f2f2f; - border-bottom-width: 2px; - border-radius: 5px; - background:#4c4c4c;; + margin: 2px; + padding: 5px 30px; + border: 1px solid #2f2f2f; + border-bottom-width: 2px; + border-radius: 5px; + background: #4c4c4c; - /* This avoids it jumping around when :active */ - vertical-align: middle; + /* This avoids it jumping around when :active */ + vertical-align: middle; } #connect_btn div:active { - border-bottom-width: 1px; - margin-top: 3px; + border-bottom-width: 1px; + margin-top: 3px; } div.center { - display: flex; - align-items: center; - justify-content: center; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; + display: flex; + align-items: center; + justify-content: center; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; } diff --git a/xterm.js/src/util.js b/xterm.js/src/util.js index 464af2f..8c290d0 100644 --- a/xterm.js/src/util.js +++ b/xterm.js/src/util.js @@ -1,12 +1,14 @@ function urlEncode(object) { - var i,value, params = []; + var i, + value, + params = []; for (i in object) { - if (object.hasOwnProperty(i)) { - value = object[i]; - if (value === undefined) value = ''; - params.push(encodeURIComponent(i) + '=' + encodeURIComponent(String(value))); - } + if (object.hasOwnProperty(i)) { + value = object[i]; + if (value === undefined) value = ''; + params.push(encodeURIComponent(i) + '=' + encodeURIComponent(String(value))); + } } return params.join('&'); @@ -14,9 +16,9 @@ function urlEncode(object) { var msgtimeout; var severities = { - normal: 1, + normal: 1, warning: 2, - error: 3, + error: 3, }; function showMsg(message, timeout, severity) { @@ -32,23 +34,23 @@ function showMsg(message, timeout, severity) { severity = severity || severities.normal; switch (severity) { - case severities.normal: - status_bar.classList.add('normal'); - break; - case severities.warning: - status_bar.classList.add('warning'); - break; - case severities.error: - status_bar.classList.add('error'); - break; - default: - throw "unknown severity"; + case severities.normal: + status_bar.classList.add('normal'); + break; + case severities.warning: + status_bar.classList.add('warning'); + break; + case severities.error: + status_bar.classList.add('error'); + break; + default: + throw 'unknown severity'; } status_bar.classList.add('open'); if (timeout !== 0) { - msgtimeout = setTimeout(hideMsg, timeout || 1500); + msgtimeout = setTimeout(hideMsg, timeout || 1500); } } @@ -59,12 +61,12 @@ function hideMsg() { function getQueryParameter(name) { var params = location.search.slice(1).split('&'); - var result = ""; - params.forEach(function(param) { - var components = param.split('='); - if (components[0] === name) { - result = components.slice(1).join('='); - } + var result = ''; + params.forEach(function (param) { + var components = param.split('='); + if (components[0] === name) { + result = components.slice(1).join('='); + } }); return result; } @@ -76,56 +78,56 @@ function API2Request(reqOpts) { var xhr = new XMLHttpRequest(); - xhr.onload = function() { - var scope = reqOpts.scope || this; - var result; - var errmsg; - - if (xhr.readyState === 4) { - var ctype = xhr.getResponseHeader('Content-Type'); - if (xhr.status === 200) { - if (ctype.match(/application\/json;/)) { - result = JSON.parse(xhr.responseText); - } else { - errmsg = 'got unexpected content type ' + ctype; - } - } else { - errmsg = 'Error ' + xhr.status + ': ' + xhr.statusText; - } - } else { - errmsg = 'Connection error - server offline?'; - } - - if (errmsg !== undefined) { - if (reqOpts.failure) { - reqOpts.failure.call(scope, errmsg); - } - } else { - if (reqOpts.success) { - reqOpts.success.call(scope, result); - } - } - if (reqOpts.callback) { - reqOpts.callback.call(scope, errmsg === undefined); - } - } + xhr.onload = function () { + var scope = reqOpts.scope || this; + var result; + var errmsg; + + if (xhr.readyState === 4) { + var ctype = xhr.getResponseHeader('Content-Type'); + if (xhr.status === 200) { + if (ctype.match(/application\/json;/)) { + result = JSON.parse(xhr.responseText); + } else { + errmsg = 'got unexpected content type ' + ctype; + } + } else { + errmsg = 'Error ' + xhr.status + ': ' + xhr.statusText; + } + } else { + errmsg = 'Connection error - server offline?'; + } + + if (errmsg !== undefined) { + if (reqOpts.failure) { + reqOpts.failure.call(scope, errmsg); + } + } else { + if (reqOpts.success) { + reqOpts.success.call(scope, result); + } + } + if (reqOpts.callback) { + reqOpts.callback.call(scope, errmsg === undefined); + } + }; var data = urlEncode(reqOpts.params || {}); if (reqOpts.method === 'GET') { - xhr.open(reqOpts.method, "/api2/json" + reqOpts.url + '?' + data); + xhr.open(reqOpts.method, '/api2/json' + reqOpts.url + '?' + data); } else { - xhr.open(reqOpts.method, "/api2/json" + reqOpts.url); + xhr.open(reqOpts.method, '/api2/json' + reqOpts.url); } xhr.setRequestHeader('Cache-Control', 'no-cache'); if (reqOpts.method === 'POST' || reqOpts.method === 'PUT') { - xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - xhr.setRequestHeader('CSRFPreventionToken', PVE.CSRFPreventionToken); - xhr.send(data); + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + xhr.setRequestHeader('CSRFPreventionToken', PVE.CSRFPreventionToken); + xhr.send(data); } else if (reqOpts.method === 'GET') { - xhr.send(); + xhr.send(); } else { - throw "unknown method"; + throw 'unknown method'; } } @@ -133,18 +135,18 @@ function getTerminalSettings() { var res = {}; var settings = ['fontSize', 'fontFamily', 'letterSpacing', 'lineHeight', 'scrollback']; var booleanSettings = ['reflowCursorLine', 'rescaleOverlappingGlyphs']; - if(localStorage) { - settings.forEach(function(setting) { - var val = localStorage.getItem('pve-xterm-' + setting); - if (val !== undefined && val !== null) { - res[setting] = val; - } - }); - booleanSettings.forEach(function(setting) { - if (localStorage.getItem('pve-xterm-' + setting) === 'true') { - res[setting] = true; - } - }); + if (localStorage) { + settings.forEach(function (setting) { + var val = localStorage.getItem('pve-xterm-' + setting); + if (val !== undefined && val !== null) { + res[setting] = val; + } + }); + booleanSettings.forEach(function (setting) { + if (localStorage.getItem('pve-xterm-' + setting) === 'true') { + res[setting] = true; + } + }); } return res; } -- 2.47.3