<!--
noVNC example: lightweight example using minimal UI and features
Copyright (C) 2012 Joel Martin
- Copyright (C) 2013 Samuel Mannehed for Cendio AB
+ 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).
<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">
import RFB from './core/rfb.js';
var rfb;
- var doneInitialResize;
- var resizeTimeout;
var desktopName;
- function UIresize() {
- if (WebUtil.getConfigVar('resize', false)) {
- var innerW = window.innerWidth;
- var innerH = window.innerHeight;
- var controlbarH = document.getElementById('noVNC_status_bar').offsetHeight;
- if (innerW !== undefined && innerH !== undefined)
- rfb.requestDesktopSize(innerW, innerH - controlbarH);
- }
- }
- function initialResize() {
- if (doneInitialResize) return;
- UIresize();
- doneInitialResize = true;
+ function updateDesktopName(e) {
+ desktopName = e.detail.name;
}
- function updateDesktopName(rfb, name) {
- desktopName = name;
- }
- function credentials(rfb, types) {
+ function credentials(e) {
var html;
var form = document.createElement('form');
- form.style = 'margin-bottom: 0px';
- form.innerHTML = '<label></label>'
- form.innerHTML += '<input type=password size=10 id="password_input" class="noVNC_status">';
+ form.innerHTML = '<label></label>';
+ form.innerHTML += '<input type=password size=10 id="password_input">';
form.onsubmit = setPassword;
// bypass status() because it sets text content
default:
level = "warn";
}
- document.getElementById('noVNC_status_bar').setAttribute("class", "noVNC_status_" + level);
+ document.getElementById('noVNC_status_bar').className = "noVNC_status_" + level;
document.getElementById('noVNC_status').textContent = text;
}
- function updateState(rfb, state, oldstate) {
- var cad = document.getElementById('sendCtrlAltDelButton');
- switch (state) {
- case 'connecting':
- status("Connecting", "normal");
- break;
- case 'connected':
- doneInitialResize = false;
- if (rfb && rfb.get_encrypt()) {
- status("Connected (encrypted) to " +
- desktopName, "normal");
- } else {
- status("Connected (unencrypted) to " +
- desktopName, "normal");
- }
- break;
- case 'disconnecting':
- status("Disconnecting", "normal");
- break;
- case 'disconnected':
- status("Disconnected", "normal");
- break;
- default:
- status(state, "warn");
- break;
- }
- if (state === 'connected') {
- cad.disabled = false;
+ function connected(e) {
+ document.getElementById('sendCtrlAltDelButton').disabled = false;
+ if (WebUtil.getConfigVar('encrypt',
+ (window.location.protocol === "https:"))) {
+ status("Connected (encrypted) to " + desktopName, "normal");
} else {
- cad.disabled = true;
- updatePowerButtons();
+ status("Connected (unencrypted) to " + desktopName, "normal");
}
-
}
- function disconnected(rfb, reason) {
- if (typeof(reason) !== 'undefined') {
- status(reason, "error");
+
+ function disconnected(e) {
+ document.getElementById('sendCtrlAltDelButton').disabled = true;
+ updatePowerButtons();
+ if (e.detail.clean) {
+ status("Disconnected", "normal");
+ } else {
+ status("Something went wrong, connection is closed", "error");
}
}
- function notification(rfb, msg, level, options) {
- status(msg, level);
- }
-
- window.onresize = function () {
- // When the window has been resized, wait until the size remains
- // the same for 0.5 seconds before sending the request for changing
- // the resolution of the session
- clearTimeout(resizeTimeout);
- resizeTimeout = setTimeout(function(){
- UIresize();
- }, 500);
- };
function updatePowerButtons() {
var powerbuttons;
powerbuttons = document.getElementById('noVNC_power_buttons');
- if (rfb.get_capabilities().power) {
- powerbuttons.style.display = 'inline';
+ if (rfb.capabilities.power) {
+ powerbuttons.className= "noVNC_shown";
} else {
- powerbuttons.style.display = 'none';
+ powerbuttons.className = "noVNC_hidden";
}
}
- document.getElementById('sendCtrlAltDelButton').style.display = "inline";
document.getElementById('sendCtrlAltDelButton').onclick = sendCtrlAltDel;
document.getElementById('machineShutdownButton').onclick = machineShutdown;
document.getElementById('machineRebootButton').onclick = machineReboot;
(function() {
+ status("Connecting", "normal");
+
if ((!host) || (!port)) {
status('Must specify host and port in URL', 'error');
}
- try {
- rfb = new RFB({'target': document.getElementById('noVNC_canvas'),
- 'encrypt': WebUtil.getConfigVar('encrypt',
- (window.location.protocol === "https:")),
- 'repeaterID': WebUtil.getConfigVar('repeaterID', ''),
- 'local_cursor': WebUtil.getConfigVar('cursor', true),
- 'shared': WebUtil.getConfigVar('shared', true),
- 'view_only': WebUtil.getConfigVar('view_only', false),
- 'onNotification': notification,
- 'onUpdateState': updateState,
- 'onDisconnected': disconnected,
- 'onCapabilities': function () { updatePowerButtons(); initialResize(); },
- 'onCredentialsRequired': credentials,
- 'onDesktopName': updateDesktopName});
- } catch (exc) {
- status('Unable to create RFB client -- ' + exc, 'error');
- return; // don't continue trying to connect
+ var url;
+
+ if (WebUtil.getConfigVar('encrypt',
+ (window.location.protocol === "https:"))) {
+ url = 'wss';
+ } else {
+ url = 'ws';
}
- rfb.connect(host, port, { password: password }, path);
+ 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", function () { updatePowerButtons(); });
+ rfb.addEventListener("credentialsrequired", credentials);
+ rfb.addEventListener("desktopname", updateDesktopName);
+ rfb.scaleViewport = WebUtil.getConfigVar('scale', false);
+ rfb.resizeSession = WebUtil.getConfigVar('resize', false);
})();
</script>
</head>
-<body style="margin: 0px;">
- <div id="noVNC_container">
- <div id="noVNC_status_bar" class="noVNC_status_bar" style="margin-top: 0px;">
- <table border=0 width="100%"><tr>
- <td><div id="noVNC_status" style="position: relative; height: auto;">
- Loading
- </div></td>
- <td width="1%"><div id="noVNC_buttons">
- <input type=button value="Send CtrlAltDel"
- id="sendCtrlAltDelButton">
- <span id="noVNC_power_buttons">
- <input type=button value="Shutdown"
- id="machineShutdownButton">
- <input type=button value="Reboot"
- id="machineRebootButton">
- <input type=button value="Reset"
- id="machineResetButton">
- </span>
- </div></td>
- </tr></table>
- </div>
- <canvas id="noVNC_canvas" width="640px" height="20px">
- Canvas not supported.
- </canvas>
- </div>
-
- </body>
+<body>
+ <div id="noVNC_status_bar">
+ <div id="noVNC_left_dummy_elem"></div>
+ <div id="noVNC_status">Loading</div>
+ <div id="noVNC_buttons">
+ <input type=button value="Send CtrlAltDel"
+ id="sendCtrlAltDelButton" class="noVNC_shown">
+ <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>
+</body>
</html>