]> git.proxmox.com Git - mirror_novnc.git/blame - vnc_lite.html
Update generated JS files for translations
[mirror_novnc.git] / vnc_lite.html
CommitLineData
40f281eb 1<!DOCTYPE html>
80c52ba7 2<html lang="en">
e84101b3
3<head>
4
82744aa8 5 <!--
83391ffc 6 noVNC example: lightweight example using minimal UI and features
8c2866df
SM
7
8 This is a self-contained file which doesn't import WebUtil or external CSS.
9
84586c0f 10 Copyright (C) 2018 The noVNC Authors
1d728ace 11 noVNC is licensed under the MPL 2.0 (see LICENSE.txt)
d58f8b51 12 This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
d595e656
JM
13
14 Connect parameters are provided in query string:
51f9f009 15 http://example.com/?host=HOST&port=PORT&scale=true
d595e656 16 -->
e84101b3
17 <title>noVNC</title>
18
2aa3b5bc 19 <meta charset="utf-8">
33f5d3bd 20
45c644a6 21 <style>
e0d4e5a1
SM
22
23 body {
24 margin: 0;
de79ae92 25 background-color: dimgrey;
e0d4e5a1
SM
26 height: 100%;
27 display: flex;
28 flex-direction: column;
29 }
30 html {
e0d4e5a1
SM
31 height: 100%;
32 }
33
8613f6f4 34 #top_bar {
de79ae92 35 background-color: #6e84a3;
011e4bff
SM
36 color: white;
37 font: bold 12px Helvetica;
38 padding: 6px 5px 4px 5px;
de79ae92 39 border-bottom: 1px outset;
e0d4e5a1 40 }
8613f6f4 41 #status {
011e4bff 42 text-align: center;
e0d4e5a1 43 }
011e4bff
SM
44 #sendCtrlAltDelButton {
45 position: fixed;
46 top: 0px;
47 right: 0px;
48 border: 1px outset;
49 padding: 5px 5px 4px 5px;
50 cursor: pointer;
e0d4e5a1
SM
51 }
52
1c945f81
SM
53 #screen {
54 flex: 1; /* fill remaining space */
55 overflow: hidden;
56 }
57
e0d4e5a1 58 </style>
e84101b3 59
8c2866df 60 <!-- Promise polyfill for IE11 -->
7569cdc2 61 <script src="vendor/promise.js"></script>
8c2866df 62
14ecdc62
FC
63 <!-- ES2015/ES6 modules polyfill -->
64 <script type="module">
65 window._noVNC_has_module_support = true;
66 </script>
67 <script>
68 window.addEventListener("load", function() {
69 if (window._noVNC_has_module_support) return;
25551b6b 70 const loader = document.createElement("script");
94e6f8c2 71 loader.src = "vendor/browser-es-module-loader/dist/" +
e20f0ee9 72 "browser-es-module-loader.js";
14ecdc62
FC
73 document.head.appendChild(loader);
74 });
75 </script>
76
77 <!-- actual script modules -->
bf826444 78 <script type="module" crossorigin="anonymous">
8c2866df 79 // RFB holds the API to connect and communicate with a VNC server
7569cdc2 80 import RFB from './core/rfb.js';
6f4b1e40 81
25551b6b
SM
82 let rfb;
83 let desktopName;
8db09746 84
26d51e49
SM
85 // When this function is called we have
86 // successfully connected to a server
87 function connectedToServer(e) {
26d51e49
SM
88 status("Connected to " + desktopName);
89 }
90
91 // This function is called when we are disconnected
92 function disconnectedFromServer(e) {
26d51e49
SM
93 if (e.detail.clean) {
94 status("Disconnected");
95 } else {
96 status("Something went wrong, connection is closed");
97 }
3bb12056 98 }
8c2866df
SM
99
100 // When this function is called, the server requires
101 // credentials to authenticate
c756665e 102 function credentialsAreRequired(e) {
5271e300
SM
103 const password = prompt("Password Required:");
104 rfb.sendCredentials({ password: password });
d890e864 105 }
8c2866df 106
26d51e49
SM
107 // When this function is called we have received
108 // a desktop name from the server
109 function updateDesktopName(e) {
110 desktopName = e.detail.name;
111 }
112
8c2866df
SM
113 // Since most operating systems will catch Ctrl+Alt+Del
114 // before they get a chance to be intercepted by the browser,
115 // we provide a way to emulate this key sequence.
63708ff5 116 function sendCtrlAltDel() {
8db09746 117 rfb.sendCtrlAltDel();
a8edf9d8 118 return false;
63708ff5 119 }
26d51e49 120
8c2866df 121 // Show a status text in the top bar
de79ae92 122 function status(text) {
8613f6f4 123 document.getElementById('status').textContent = text;
3bb12056 124 }
91308399 125
6517c498
SM
126 // This function extracts the value of one variable from the
127 // query string. If the variable isn't defined in the URL
128 // it returns the default value instead.
129 function readQueryVariable(name, defaultValue) {
130 // A URL with a query parameter can look like this:
131 // https://www.example.com?myqueryparam=myvalue
132 //
133 // Note that we use location.href instead of location.search
134 // because Firefox < 53 has a bug w.r.t location.search
135 const re = new RegExp('.*[?&]' + name + '=([^&#]*)'),
136 match = document.location.href.match(re);
137 if (typeof defaultValue === 'undefined') { defaultValue = null; }
138
139 if (match) {
140 // We have to decode the URL since want the cleartext value
141 return decodeURIComponent(match[1]);
142 }
143
144 return defaultValue;
145 }
146
e20f0ee9
SM
147 document.getElementById('sendCtrlAltDelButton')
148 .onclick = sendCtrlAltDel;
91308399 149
6517c498 150 // Read parameters specified in the URL query string
7569cdc2 151 // By default, use the host and port of server that served this file
25551b6b
SM
152 const host = readQueryVariable('host', window.location.hostname);
153 let port = readQueryVariable('port', window.location.port);
154 const password = readQueryVariable('password', '');
155 const path = readQueryVariable('path', 'websockify');
c55f05f6 156
8c2866df
SM
157 // | | | | | |
158 // | | | Connect | | |
159 // v v v v v v
0139b256 160
25551b6b 161 status("Connecting");
91308399 162
25551b6b
SM
163 // Build the websocket URL used to connect
164 let url;
165 if (window.location.protocol === "https:") {
166 url = 'wss';
167 } else {
168 url = 'ws';
169 }
170 url += '://' + host;
171 if(port) {
172 url += ':' + port;
173 }
174 url += '/' + path;
175
176 // Creating a new RFB object will start a new connection
1c945f81 177 rfb = new RFB(document.getElementById('screen'), url,
25551b6b
SM
178 { credentials: { password: password } });
179
180 // Add listeners to important events from the RFB module
c756665e
SM
181 rfb.addEventListener("connect", connectedToServer);
182 rfb.addEventListener("disconnect", disconnectedFromServer);
183 rfb.addEventListener("credentialsrequired", credentialsAreRequired);
25551b6b
SM
184 rfb.addEventListener("desktopname", updateDesktopName);
185
186 // Set parameters that can be changed on an active connection
187 rfb.viewOnly = readQueryVariable('view_only', false);
188 rfb.scaleViewport = readQueryVariable('scale', false);
7569cdc2
SR
189 </script>
190</head>
191
178bf8ec 192<body>
8613f6f4
SM
193 <div id="top_bar">
194 <div id="status">Loading</div>
195 <div id="sendCtrlAltDelButton">Send CtrlAltDel</div>
196 </div>
1c945f81
SM
197 <div id="screen">
198 <!-- This is where the remote screen will appear -->
199 </div>
178bf8ec 200</body>
91308399 201</html>