]> git.proxmox.com Git - mirror_novnc.git/blobdiff - vnc_auto.html
Change server example
[mirror_novnc.git] / vnc_auto.html
index 7704bf69dd2ffbb34aef860fc4c37098f3ed6c10..e4fc46769d818cf6be2a9fba3dd80cd36cabaf82 100644 (file)
@@ -11,6 +11,8 @@
 
     Connect parameters are provided in query string:
         http://example.com/?host=HOST&port=PORT&encrypt=1&true_color=1
+    or the fragment:
+        http://example.com/#host=HOST&port=PORT&encrypt=1&true_color=1
     -->
     <title>noVNC</title>
 
     <meta name="apple-mobile-web-app-capable" content="yes" />
     <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
     <!-- App Start Icon  -->
-    <link rel="apple-touch-startup-image" href="images/screen_320x460.png" />
+    <link rel="apple-touch-startup-image" href="app/images/screen_320x460.png" />
     <!-- For iOS devices set the icon to use if user bookmarks app on their homescreen -->
-    <link rel="apple-touch-icon" href="images/screen_57x57.png">
+    <link rel="apple-touch-icon" href="app/images/screen_57x57.png">
     <!--
-    <link rel="apple-touch-icon-precomposed" href="images/screen_57x57.png" />
+    <link rel="apple-touch-icon-precomposed" href="app/images/screen_57x57.png" />
     -->
 
 
     <!-- Stylesheets -->
-    <link rel="stylesheet" href="include/base.css" title="plain">
+    <link rel="stylesheet" href="app/styles/auto.css">
 
      <!--
     <script type='text/javascript'
         src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>
     -->
-        <script src="include/util.js"></script>
+        <script src="core/util.js"></script>
+        <script src="app/webutil.js"></script>
 </head>
 
 <body style="margin: 0px;">
-    <div id="noVNC_screen">
+    <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;">
                     <td width="1%"><div id="noVNC_buttons">
                         <input type=button value="Send CtrlAltDel"
                             id="sendCtrlAltDelButton">
+                        <span id="noVNC_xvp_buttons">
+                        <input type=button value="Shutdown"
+                            id="xvpShutdownButton">
+                        <input type=button value="Reboot"
+                            id="xvpRebootButton">
+                        <input type=button value="Reset"
+                            id="xvpResetButton">
+                        </span>
                             </div></td>
                 </tr></table>
             </div>
         "use strict";
 
         // Load supporting scripts
-        Util.load_scripts(["webutil.js", "base64.js", "websock.js", "des.js",
-                           "input.js", "display.js", "jsunzip.js", "rfb.js"]);
+        WebUtil.load_scripts({
+            'core': ["base64.js", "websock.js", "des.js", "input/keysymdef.js",
+                     "input/xtscancodes.js", "input/util.js", "input/devices.js",
+                     "display.js", "inflator.js", "rfb.js", "input/keysym.js"]});
 
         var rfb;
+        var resizeTimeout;
+        var desktopName;
 
-        function passwordRequired(rfb) {
-            var msg;
-            msg = '<form onsubmit="return setPassword();"';
-            msg += '  style="margin-bottom: 0px">';
-            msg += 'Password Required: ';
-            msg += '<input type=password size=10 id="password_input" class="noVNC_status">';
-            msg += '<\/form>';
-            $D('noVNC_status_bar').setAttribute("class", "noVNC_status_warn");
-            $D('noVNC_status').innerHTML = msg;
+
+        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 FBUComplete(rfb, fbu) {
+            UIresize();
+            rfb.set_onFBUComplete(function() { });
+        }
+        function updateDesktopName(rfb, name) {
+            desktopName = name;
+        }
+        function passwordRequired(rfb, msg) {
+            if (typeof msg === 'undefined') {
+                msg = 'Password Required: ';
+            }
+            var html;
+            html = '<form onsubmit="return setPassword();"';
+            html += '  style="margin-bottom: 0px">';
+            html += '<label></label>'
+            html += '<input type=password size=10 id="password_input" class="noVNC_status">';
+            html += '<\/form>';
+
+            // bypass status() because it sets text content
+            document.getElementById('noVNC_status_bar').setAttribute("class", "noVNC_status_warn");
+            document.getElementById('noVNC_status').innerHTML = html;
+            document.getElementById('noVNC_status').querySelector('label').textContent = msg;
         }
         function setPassword() {
-            rfb.sendPassword($D('password_input').value);
+            rfb.sendPassword(document.getElementById('password_input').value);
             return false;
         }
         function sendCtrlAltDel() {
             rfb.sendCtrlAltDel();
             return false;
         }
-        function updateState(rfb, state, oldstate, msg) {
-            var s, sb, cad, level;
-            s = $D('noVNC_status');
-            sb = $D('noVNC_status_bar');
-            cad = $D('sendCtrlAltDelButton');
+        function xvpShutdown() {
+            rfb.xvpShutdown();
+            return false;
+        }
+        function xvpReboot() {
+            rfb.xvpReboot();
+            return false;
+        }
+        function xvpReset() {
+            rfb.xvpReset();
+            return false;
+        }
+        function status(text, level) {
+            switch (level) {
+                case 'normal':
+                case 'warn':
+                case 'error':
+                    break;
+                default:
+                    level = "warn";
+            }
+            document.getElementById('noVNC_status_bar').setAttribute("class", "noVNC_status_" + level);
+            document.getElementById('noVNC_status').textContent = text;
+        }
+        function updateState(rfb, state, oldstate) {
+            var cad = document.getElementById('sendCtrlAltDelButton');
             switch (state) {
-                case 'failed':       level = "error";  break;
-                case 'fatal':        level = "error";  break;
-                case 'normal':       level = "normal"; break;
-                case 'disconnected': level = "normal"; break;
-                case 'loaded':       level = "normal"; break;
-                default:             level = "warn";   break;
+                case 'connecting':
+                    status("Connecting", "normal");
+                    break;
+                case 'connected':
+                    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 === "normal") { cad.disabled = false; }
-            else                    { cad.disabled = true; }
+            if (state === 'connected') {
+                cad.disabled = false;
+            } else {
+                cad.disabled = true;
+                xvpInit(0);
+            }
+
+        }
+        function disconnected(rfb, reason) {
+            if (typeof(reason) !== 'undefined') {
+                status(reason, "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);
+        };
 
-            if (typeof(msg) !== 'undefined') {
-                sb.setAttribute("class", "noVNC_status_" + level);
-                s.innerHTML = msg;
+        function xvpInit(ver) {
+            var xvpbuttons;
+            xvpbuttons = document.getElementById('noVNC_xvp_buttons');
+            if (ver >= 1) {
+                xvpbuttons.style.display = 'inline';
+            } else {
+                xvpbuttons.style.display = 'none';
             }
         }
 
         window.onscriptsload = function () {
             var host, port, password, path, token;
 
-            $D('sendCtrlAltDelButton').style.display = "inline";
-            $D('sendCtrlAltDelButton').onclick = sendCtrlAltDel;
+            document.getElementById('sendCtrlAltDelButton').style.display = "inline";
+            document.getElementById('sendCtrlAltDelButton').onclick = sendCtrlAltDel;
+            document.getElementById('xvpShutdownButton').onclick = xvpShutdown;
+            document.getElementById('xvpRebootButton').onclick = xvpReboot;
+            document.getElementById('xvpResetButton').onclick = xvpReset;
 
-            WebUtil.init_logging(WebUtil.getQueryVar('logging', 'warn'));
-            document.title = unescape(WebUtil.getQueryVar('title', 'noVNC'));
+            WebUtil.init_logging(WebUtil.getConfigVar('logging', 'warn'));
+            document.title = unescape(WebUtil.getConfigVar('title', 'noVNC'));
             // By default, use the host and port of server that served this file
-            host = WebUtil.getQueryVar('host', window.location.hostname);
-            port = WebUtil.getQueryVar('port', window.location.port);
+            host = WebUtil.getConfigVar('host', window.location.hostname);
+            port = WebUtil.getConfigVar('port', window.location.port);
 
             // if port == 80 (or 443) then it won't be present and should be
             // set manually
                 }
             }
 
+            password = WebUtil.getConfigVar('password', '');
+            path = WebUtil.getConfigVar('path', 'websockify');
+
             // If a token variable is passed in, set the parameter in a cookie.
             // This is used by nova-novncproxy.
-            token = WebUtil.getQueryVar('token', null);
+            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)
             }
 
-            password = WebUtil.getQueryVar('password', '');
-            path = WebUtil.getQueryVar('path', 'websockify');
-
             if ((!host) || (!port)) {
-                updateState('failed',
-                    "Must specify host and port in URL");
+                status('Must specify host and port in URL', 'error');
                 return;
             }
 
-            rfb = new RFB({'target':       $D('noVNC_canvas'),
-                           'encrypt':      WebUtil.getQueryVar('encrypt',
-                                    (window.location.protocol === "https:")),
-                           'repeaterID':   WebUtil.getQueryVar('repeaterID', ''),
-                           'true_color':   WebUtil.getQueryVar('true_color', true),
-                           'local_cursor': WebUtil.getQueryVar('cursor', true),
-                           'shared':       WebUtil.getQueryVar('shared', true),
-                           'view_only':    WebUtil.getQueryVar('view_only', false),
-                           'updateState':  updateState,
-                           'onPasswordRequired':  passwordRequired});
+            try {
+                rfb = new RFB({'target':       document.getElementById('noVNC_canvas'),
+                               'encrypt':      WebUtil.getConfigVar('encrypt',
+                                        (window.location.protocol === "https:")),
+                               'repeaterID':   WebUtil.getConfigVar('repeaterID', ''),
+                               'true_color':   WebUtil.getConfigVar('true_color', true),
+                               'local_cursor': WebUtil.getConfigVar('cursor', true),
+                               'shared':       WebUtil.getConfigVar('shared', true),
+                               'view_only':    WebUtil.getConfigVar('view_only', false),
+                               'onNotification':  notification,
+                               'onUpdateState':  updateState,
+                               'onDisconnected': disconnected,
+                               'onXvpInit':    xvpInit,
+                               'onPasswordRequired':  passwordRequired,
+                               'onFBUComplete': FBUComplete,
+                               'onDesktopName': updateDesktopName});
+            } catch (exc) {
+                status('Unable to create RFB client -- ' + exc, 'error');
+                return; // don't continue trying to connect
+            }
+
             rfb.connect(host, port, password, path);
         };
         </script>