Merge pull request #1129 from novnc/vnclitecleanup

Cleanup of vnc_lite.html
This commit is contained in:
Samuel Mannehed 2018-08-28 10:46:11 +02:00 committed by GitHub
commit e15950a8ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 141 additions and 252 deletions

View File

@ -1,63 +0,0 @@
/*
* noVNC auto CSS
* Copyright (C) 2012 Joel Martin
* Copyright (C) 2017 Samuel Mannehed for Cendio AB
* noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
* This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
*/
body {
margin:0;
background-color:#313131;
border-bottom-right-radius: 800px 600px;
height:100%;
display: flex;
flex-direction: column;
}
html {
background-color:#494949;
height:100%;
}
#noVNC_status_bar {
width: 100%;
display:flex;
justify-content: space-between;
}
#noVNC_status {
color: #fff;
font: bold 12px Helvetica;
margin: auto;
}
.noVNC_status_normal {
background: linear-gradient(#b2bdcd 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%);
}
.noVNC_status_error {
background: linear-gradient(#c83737 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%);
}
.noVNC_status_warn {
background: linear-gradient(#b4b41e 0%,#899cb3 49%,#7e93af 51%,#6e84a3 100%);
}
.noNVC_shown {
display: inline;
}
.noVNC_hidden {
display: none;
}
#noVNC_left_dummy_elem {
flex: 1;
}
#noVNC_buttons {
padding: 1px;
flex: 1;
display: flex;
justify-content: flex-end;
}

View File

@ -4,59 +4,67 @@
<!-- <!--
noVNC example: lightweight example using minimal UI and features noVNC example: lightweight example using minimal UI and features
This is a self-contained file which doesn't import WebUtil or external CSS.
Copyright (C) 2012 Joel Martin Copyright (C) 2012 Joel Martin
Copyright (C) 2017 Samuel Mannehed for Cendio AB Copyright (C) 2018 Samuel Mannehed for Cendio AB
noVNC is licensed under the MPL 2.0 (see LICENSE.txt) noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
This file is licensed under the 2-Clause BSD license (see LICENSE.txt). This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
Connect parameters are provided in query string: Connect parameters are provided in query string:
http://example.com/?host=HOST&port=PORT&encrypt=1 http://example.com/?host=HOST&port=PORT&scale=true
or the fragment:
http://example.com/#host=HOST&port=PORT&encrypt=1
--> -->
<title>noVNC</title> <title>noVNC</title>
<meta charset="utf-8"> <meta charset="utf-8">
<!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame <!-- Always force latest IE rendering engine (even in intranet) &
Remove this if you use the .htaccess --> Chrome Frame. Remove this if you use the .htaccess -->
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<!-- Icons (see app/images/icons/Makefile for what the sizes are for) --> <style type="text/css">
<link rel="icon" sizes="16x16" type="image/png" href="app/images/icons/novnc-16x16.png">
<link rel="icon" sizes="24x24" type="image/png" href="app/images/icons/novnc-24x24.png">
<link rel="icon" sizes="32x32" type="image/png" href="app/images/icons/novnc-32x32.png">
<link rel="icon" sizes="48x48" type="image/png" href="app/images/icons/novnc-48x48.png">
<link rel="icon" sizes="60x60" type="image/png" href="app/images/icons/novnc-60x60.png">
<link rel="icon" sizes="64x64" type="image/png" href="app/images/icons/novnc-64x64.png">
<link rel="icon" sizes="72x72" type="image/png" href="app/images/icons/novnc-72x72.png">
<link rel="icon" sizes="76x76" type="image/png" href="app/images/icons/novnc-76x76.png">
<link rel="icon" sizes="96x96" type="image/png" href="app/images/icons/novnc-96x96.png">
<link rel="icon" sizes="120x120" type="image/png" href="app/images/icons/novnc-120x120.png">
<link rel="icon" sizes="144x144" type="image/png" href="app/images/icons/novnc-144x144.png">
<link rel="icon" sizes="152x152" type="image/png" href="app/images/icons/novnc-152x152.png">
<link rel="icon" sizes="192x192" type="image/png" href="app/images/icons/novnc-192x192.png">
<!-- Firefox currently mishandles SVG, see #1419039
<link rel="icon" sizes="any" type="image/svg+xml" href="app/images/icons/novnc-icon.svg">
-->
<!-- Repeated last so that legacy handling will pick this -->
<link rel="icon" sizes="16x16" type="image/png" href="app/images/icons/novnc-16x16.png">
<!-- Apple iOS Safari settings --> body {
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> margin: 0;
<meta name="apple-mobile-web-app-capable" content="yes" /> background-color: dimgrey;
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" /> height: 100%;
<!-- Home Screen Icons (favourites and bookmarks use the normal icons) --> display: flex;
<link rel="apple-touch-icon" sizes="60x60" type="image/png" href="app/images/icons/novnc-60x60.png"> flex-direction: column;
<link rel="apple-touch-icon" sizes="76x76" type="image/png" href="app/images/icons/novnc-76x76.png"> }
<link rel="apple-touch-icon" sizes="120x120" type="image/png" href="app/images/icons/novnc-120x120.png"> html {
<link rel="apple-touch-icon" sizes="152x152" type="image/png" href="app/images/icons/novnc-152x152.png"> height: 100%;
}
<!-- Stylesheets --> #top_bar {
<link rel="stylesheet" href="app/styles/lite.css"> background-color: #6e84a3;
color: white;
font: bold 12px Helvetica;
padding: 6px 5px 4px 5px;
border-bottom: 1px outset;
}
#status {
text-align: center;
}
#sendCtrlAltDelButton {
position: fixed;
top: 0px;
right: 0px;
border: 1px outset;
padding: 5px 5px 4px 5px;
cursor: pointer;
}
<!-- promise polyfills promises for IE11 --> #screen {
flex: 1; /* fill remaining space */
overflow: hidden;
}
</style>
<!-- Promise polyfill for IE11 -->
<script src="vendor/promise.js"></script> <script src="vendor/promise.js"></script>
<!-- ES2015/ES6 modules polyfill --> <!-- ES2015/ES6 modules polyfill -->
<script type="module"> <script type="module">
window._noVNC_has_module_support = true; window._noVNC_has_module_support = true;
@ -64,191 +72,135 @@
<script> <script>
window.addEventListener("load", function() { window.addEventListener("load", function() {
if (window._noVNC_has_module_support) return; if (window._noVNC_has_module_support) return;
var loader = document.createElement("script"); const loader = document.createElement("script");
loader.src = "vendor/browser-es-module-loader/dist/browser-es-module-loader.js"; loader.src = "vendor/browser-es-module-loader/dist/" +
"browser-es-module-loader.js";
document.head.appendChild(loader); document.head.appendChild(loader);
}); });
</script> </script>
<!-- actual script modules --> <!-- actual script modules -->
<script type="module" crossorigin="anonymous"> <script type="module" crossorigin="anonymous">
// Load supporting scripts // RFB holds the API to connect and communicate with a VNC server
import * as WebUtil from './app/webutil.js';
import RFB from './core/rfb.js'; import RFB from './core/rfb.js';
var rfb; let rfb;
var desktopName; let desktopName;
// When this function is called we have
// successfully connected to a server
function connectedToServer(e) {
status("Connected to " + desktopName);
}
// This function is called when we are disconnected
function disconnectedFromServer(e) {
if (e.detail.clean) {
status("Disconnected");
} else {
status("Something went wrong, connection is closed");
}
}
// When this function is called, the server requires
// credentials to authenticate
function credentialsAreRequired(e) {
const password = prompt("Password Required:");
rfb.sendCredentials({ password: password });
}
// When this function is called we have received
// a desktop name from the server
function updateDesktopName(e) { function updateDesktopName(e) {
desktopName = e.detail.name; desktopName = e.detail.name;
} }
function credentials(e) {
var html;
var form = document.createElement('form'); // Since most operating systems will catch Ctrl+Alt+Del
form.innerHTML = '<label></label>'; // before they get a chance to be intercepted by the browser,
form.innerHTML += '<input type=password size=10 id="password_input">'; // we provide a way to emulate this key sequence.
form.onsubmit = setPassword;
// bypass status() because it sets text content
document.getElementById('noVNC_status_bar').setAttribute("class", "noVNC_status_warn");
document.getElementById('noVNC_status').innerHTML = '';
document.getElementById('noVNC_status').appendChild(form);
document.getElementById('noVNC_status').querySelector('label').textContent = 'Password Required: ';
}
function setPassword() {
rfb.sendCredentials({ password: document.getElementById('password_input').value });
return false;
}
function sendCtrlAltDel() { function sendCtrlAltDel() {
rfb.sendCtrlAltDel(); rfb.sendCtrlAltDel();
return false; return false;
} }
function machineShutdown() {
rfb.machineShutdown(); // Show a status text in the top bar
return false; function status(text) {
document.getElementById('status').textContent = text;
} }
function machineReboot() {
rfb.machineReboot(); // This function extracts the value of one variable from the
return false; // query string. If the variable isn't defined in the URL
} // it returns the default value instead.
function machineReset() { function readQueryVariable(name, defaultValue) {
rfb.machineReset(); // A URL with a query parameter can look like this:
return false; // https://www.example.com?myqueryparam=myvalue
} //
function status(text, level) { // Note that we use location.href instead of location.search
switch (level) { // because Firefox < 53 has a bug w.r.t location.search
case 'normal': const re = new RegExp('.*[?&]' + name + '=([^&#]*)'),
case 'warn': match = document.location.href.match(re);
case 'error': if (typeof defaultValue === 'undefined') { defaultValue = null; }
break;
default: if (match) {
level = "warn"; // We have to decode the URL since want the cleartext value
return decodeURIComponent(match[1]);
} }
document.getElementById('noVNC_status_bar').className = "noVNC_status_" + level;
document.getElementById('noVNC_status').textContent = text; return defaultValue;
} }
function connected(e) { document.getElementById('sendCtrlAltDelButton')
document.getElementById('sendCtrlAltDelButton').disabled = false; .onclick = sendCtrlAltDel;
if (WebUtil.getConfigVar('encrypt',
(window.location.protocol === "https:"))) {
status("Connected (encrypted) to " + desktopName, "normal");
} else {
status("Connected (unencrypted) to " + desktopName, "normal");
}
}
function disconnected(e) { // Read parameters specified in the URL query string
document.getElementById('sendCtrlAltDelButton').disabled = true;
updatePowerButtons();
if (e.detail.clean) {
status("Disconnected", "normal");
} else {
status("Something went wrong, connection is closed", "error");
}
}
function updatePowerButtons() {
var powerbuttons;
powerbuttons = document.getElementById('noVNC_power_buttons');
if (rfb.capabilities.power) {
powerbuttons.className= "noVNC_shown";
} else {
powerbuttons.className = "noVNC_hidden";
}
}
document.getElementById('sendCtrlAltDelButton').onclick = sendCtrlAltDel;
document.getElementById('machineShutdownButton').onclick = machineShutdown;
document.getElementById('machineRebootButton').onclick = machineReboot;
document.getElementById('machineResetButton').onclick = machineReset;
WebUtil.init_logging(WebUtil.getConfigVar('logging', 'warn'));
document.title = WebUtil.getConfigVar('title', 'noVNC');
// By default, use the host and port of server that served this file // By default, use the host and port of server that served this file
var host = WebUtil.getConfigVar('host', window.location.hostname); const host = readQueryVariable('host', window.location.hostname);
var port = WebUtil.getConfigVar('port', window.location.port); let port = readQueryVariable('port', window.location.port);
const password = readQueryVariable('password', '');
const path = readQueryVariable('path', 'websockify');
// if port == 80 (or 443) then it won't be present and should be // | | | | | |
// set manually // | | | Connect | | |
if (!port) { // v v v v v v
if (window.location.protocol.substring(0,5) == 'https') {
port = 443; status("Connecting");
}
else if (window.location.protocol.substring(0,4) == 'http') { // Build the websocket URL used to connect
port = 80; let url;
} if (window.location.protocol === "https:") {
url = 'wss';
} else {
url = 'ws';
} }
url += '://' + host;
var password = WebUtil.getConfigVar('password', ''); if(port) {
var path = WebUtil.getConfigVar('path', 'websockify'); url += ':' + port;
// If a token variable is passed in, set the parameter in a cookie.
// This is used by nova-novncproxy.
var token = WebUtil.getConfigVar('token', null);
if (token) {
// if token is already present in the path we should use it
path = WebUtil.injectParamIfMissing(path, "token", token);
WebUtil.createCookie('token', token, 1)
} }
url += '/' + path;
(function() { // Creating a new RFB object will start a new connection
rfb = new RFB(document.getElementById('screen'), url,
{ credentials: { password: password } });
status("Connecting", "normal"); // Add listeners to important events from the RFB module
rfb.addEventListener("connect", connectedToServer);
rfb.addEventListener("disconnect", disconnectedFromServer);
rfb.addEventListener("credentialsrequired", credentialsAreRequired);
rfb.addEventListener("desktopname", updateDesktopName);
if ((!host) || (!port)) { // Set parameters that can be changed on an active connection
status('Must specify host and port in URL', 'error'); rfb.viewOnly = readQueryVariable('view_only', false);
} rfb.scaleViewport = readQueryVariable('scale', false);
var url;
if (WebUtil.getConfigVar('encrypt',
(window.location.protocol === "https:"))) {
url = 'wss';
} else {
url = 'ws';
}
url += '://' + host;
if(port) {
url += ':' + port;
}
url += '/' + path;
rfb = new RFB(document.body, url,
{ repeaterID: WebUtil.getConfigVar('repeaterID', ''),
shared: WebUtil.getConfigVar('shared', true),
credentials: { password: password } });
rfb.viewOnly = WebUtil.getConfigVar('view_only', false);
rfb.addEventListener("connect", connected);
rfb.addEventListener("disconnect", disconnected);
rfb.addEventListener("capabilities", updatePowerButtons);
rfb.addEventListener("credentialsrequired", credentials);
rfb.addEventListener("desktopname", updateDesktopName);
rfb.scaleViewport = WebUtil.getConfigVar('scale', false);
rfb.resizeSession = WebUtil.getConfigVar('resize', false);
})();
</script> </script>
</head> </head>
<body> <body>
<div id="noVNC_status_bar"> <div id="top_bar">
<div id="noVNC_left_dummy_elem"></div> <div id="status">Loading</div>
<div id="noVNC_status">Loading</div> <div id="sendCtrlAltDelButton">Send CtrlAltDel</div>
<div id="noVNC_buttons"> </div>
<input type=button value="Send CtrlAltDel" <div id="screen">
id="sendCtrlAltDelButton" class="noVNC_shown"> <!-- This is where the remote screen will appear -->
<span id="noVNC_power_buttons" class="noVNC_hidden">
<input type=button value="Shutdown"
id="machineShutdownButton">
<input type=button value="Reboot"
id="machineRebootButton">
<input type=button value="Reset"
id="machineResetButton">
</span>
</div> </div>
</div>
</body> </body>
</html> </html>