Instead of relying on FABridge AS -> JS event delivery, we just use the events to notify JS of pending data. The message handler then calls the AS readSocketData routine which sends back an array of the pending WebSocket frames. There is still a minor bug somewhere that happens after the first connect where the web-socket-js throws an "INVALID_STATE_ERR: Web Socket connection has not been established". But, Opera is now usable and we should be able to drop the packet sequence numbering and re-ordering code. Another minor issue to better support Opera is to move JS script includes to the <head> of the page instead of after the body.
94 lines
3.4 KiB
HTML
94 lines
3.4 KiB
HTML
<!--
|
|
noVNC Example: Automatically connect on page load.
|
|
|
|
Connect parameters are provided in query string:
|
|
http://example.com/?host=HOST&port=PORT&encrypt=1&true_color=1
|
|
-->
|
|
<html>
|
|
<head>
|
|
<title>VNC Client</title>
|
|
<link rel="stylesheet" href="include/plain.css">
|
|
<!--
|
|
<script type='text/javascript'
|
|
src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>
|
|
-->
|
|
<script src="include/vnc.js"></script>
|
|
</head>
|
|
|
|
<body style="margin: 0px;">
|
|
<div id="VNC_screen">
|
|
<div id="VNC_status_bar" class="VNC_status_bar" style="margin-top: 0px;">
|
|
<table border=0 width=100%><tr>
|
|
<td><div id="VNC_status">Loading</div></td>
|
|
<td width=10%><div id="VNC_buttons">
|
|
<input type=button value="Send CtrlAltDel"
|
|
id="sendCtrlAltDelButton"
|
|
onclick="sendCtrlAltDel();"></div></td>
|
|
</tr></table>
|
|
</div>
|
|
<canvas id="VNC_canvas" width="640px" height="20px">
|
|
Canvas not supported.
|
|
</canvas>
|
|
</div>
|
|
</body>
|
|
|
|
<script>
|
|
function setPassword() {
|
|
RFB.sendPassword($('password_input').value);
|
|
return false;
|
|
}
|
|
function sendCtrlAltDel() {
|
|
RFB.sendCtrlAltDel();
|
|
}
|
|
function updateState(state, msg) {
|
|
var s, sb, klass, html;
|
|
s = $('VNC_status');
|
|
sb = $('VNC_status_bar');
|
|
cad = $('sendCtrlAltDelButton');
|
|
switch (state) {
|
|
case 'failed': klass = "VNC_status_error"; break;
|
|
case 'normal': klass = "VNC_status_normal"; break;
|
|
case 'disconnected': klass = "VNC_status_normal"; break;
|
|
default: klass = "VNC_status_warn"; break;
|
|
}
|
|
|
|
if (state === "normal") { cad.disabled = false; }
|
|
else { cad.disabled = true; }
|
|
|
|
if (typeof(msg) !== 'undefined') {
|
|
sb.setAttribute("class", klass);
|
|
s.innerHTML = msg;
|
|
}
|
|
if (state === 'password') {
|
|
html = '<form onsubmit="return setPassword();"';
|
|
html += ' style="margin-bottom: 0px">';
|
|
html += 'Password Required: ';
|
|
html += '<input type=password size=10 id="password_input" class="VNC_status">';
|
|
html += '</form>';
|
|
s.innerHTML = html;
|
|
}
|
|
}
|
|
|
|
window.onload = function () {
|
|
var host, port, password, encrypt;
|
|
|
|
url = document.location.href;
|
|
host = (url.match(/host=([A-Za-z0-9.\-]*)/) || ['',''])[1];
|
|
port = (url.match(/port=([0-9]*)/) || ['',''])[1];
|
|
password = (url.match(/password=([^&#]*)/) || ['',''])[1];
|
|
encrypt = (url.match(/encrypt=([A-Za-z0-9]*)/) || ['',1])[1];
|
|
true_color = (url.match(/true_color=([A-Za-z0-9]*)/) || ['',1])[1];
|
|
if ((!host) || (!port)) {
|
|
updateState('failed',
|
|
"Must specify host and port in URL");
|
|
return;
|
|
}
|
|
|
|
RFB.setUpdateState(updateState);
|
|
RFB.load();
|
|
RFB.connect(host, port, password, encrypt, true_color);
|
|
}
|
|
</script>
|
|
</html>
|
|
|