diff --git a/docs/TODO b/docs/TODO index b828ee0ea48cee6a95f76df1e53d5f1c25687fa5..2fa80c2ef90c9bd3a498ac4894c65a1517447322 100644 --- a/docs/TODO +++ b/docs/TODO @@ -2,9 +2,6 @@ Short Term: - Test on IE 9 preview 3. -- Track down "INVALID_STATE_ERR" when reconnecting using - web-socket-js. - - Possibly support IE <= 8.0 using excanvas or fxcanvas: http://excanvas.sourceforge.net/ http://code.google.com/p/fxcanvas/ @@ -12,6 +9,8 @@ Short Term: - Timing delta between frames in proxy record log, for playback support (for demo and test). +- Track down hang in Opera after second disconnect. + Medium Term: diff --git a/include/vnc.js b/include/vnc.js index 4de8cef7fbe1c686b042190e5df6c72a9aceade5..dd26443f1fc9334398594685b45509e1ce5416c5 100644 --- a/include/vnc.js +++ b/include/vnc.js @@ -194,9 +194,9 @@ connect: function (host, port, password, encrypt, true_color) { disconnect: function () { //console.log(">> disconnect"); if ((RFB.ws) && (RFB.ws.readyState === WebSocket.OPEN)) { + RFB.ws.close(); RFB.updateState('closed'); RFB.ws.onmessage = function (e) { return; }; - RFB.ws.close(); } if (Canvas.ctx) { Canvas.stop(); diff --git a/include/web-socket-js/web_socket.js b/include/web-socket-js/web_socket.js index 6be794f8701b818a0f2b59a67e04ac27c4211cc7..936a663b96c22c00fe806e5d9db8bc29c404ae55 100755 --- a/include/web-socket-js/web_socket.js +++ b/include/web-socket-js/web_socket.js @@ -35,8 +35,40 @@ self.__flash = WebSocket.__flash.create(url, protocol, proxyHost || null, proxyPort || 0, headers || null); + self.__messageHandler = function() { + var i, arr, data; + arr = self.__flash.readSocketData(); + for (i=0; i < arr.length; i++) { + data = decodeURIComponent(arr[i]); + try { + if (self.onmessage) { + var e; + if (window.MessageEvent) { + e = document.createEvent("MessageEvent"); + e.initMessageEvent("message", false, false, data, null, null, window, null); + } else { // IE + e = {data: data}; + } + self.onmessage(e); + } + } catch (e) { + console.error(e.toString()); + } + } + }; + self.__flash.addEventListener("open", function(fe) { - console.log("web-socket.js open"); + self.readyState = self.__flash.getReadyState(); + + // For browsers (like Opera) that drop events, also poll for + // message data + if (self.__messageHandlerID) { + clearInterval(self.__messageHandlerID); + } + self.__messageHandlerID = setInterval(function () { + //console.log("polling for message data"); + self.__messageHandler; }, 500); + try { if (self.onopen) { self.onopen(); @@ -52,6 +84,11 @@ }); self.__flash.addEventListener("close", function(fe) { + self.readyState = self.__flash.getReadyState(); + + if (self.__messageHandlerID) { + clearInterval(self.__messageHandlerID); + } try { if (self.onclose) self.onclose(); } catch (e) { @@ -59,29 +96,12 @@ } }); - self.__flash.addEventListener("message", function(fe) { - var i, arr, data; - arr = self.__flash.readSocketData(); - for (i=0; i < arr.length; i++) { - data = decodeURIComponent(arr[i]); - try { - if (self.onmessage) { - var e; - if (window.MessageEvent) { - e = document.createEvent("MessageEvent"); - e.initMessageEvent("message", false, false, data, null, null, window, null); - } else { // IE - e = {data: data}; - } - self.onmessage(e); - } - } catch (e) { - console.error(e.toString()); - } - } - }); + self.__flash.addEventListener("message", self.__messageHandler); self.__flash.addEventListener("error", function(fe) { + if (self.__messageHandlerID) { + clearInterval(self.__messageHandlerID); + } try { if (self.onerror) self.onerror(); } catch (e) { @@ -125,6 +145,9 @@ // which causes weird error: // > You are trying to call recursively into the Flash Player which is not allowed. this.readyState = WebSocket.CLOSED; + if (this.__messageHandlerID) { + clearInterval(this.__messageHandlerID); + } if (this.onclose) this.onclose(); };