]> git.proxmox.com Git - mirror_novnc.git/commitdiff
Opera fixes and big Opera performance boost.
authorJoel Martin <github@martintribe.org>
Thu, 1 Jul 2010 16:54:44 +0000 (11:54 -0500)
committerJoel Martin <github@martintribe.org>
Thu, 1 Jul 2010 16:54:44 +0000 (11:54 -0500)
Add message/state pollling in web-socket-js. Since Opera tends to drop
message events, we can dramatically increase performance by polling
every now for message event data.

Also, add more direct calls to update readyState so that it's not
missed when Opera drops events.

docs/TODO
include/vnc.js
include/web-socket-js/web_socket.js

index b828ee0ea48cee6a95f76df1e53d5f1c25687fa5..2fa80c2ef90c9bd3a498ac4894c65a1517447322 100644 (file)
--- 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:
 
index 4de8cef7fbe1c686b042190e5df6c72a9aceade5..dd26443f1fc9334398594685b45509e1ce5416c5 100644 (file)
@@ -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();
index 6be794f8701b818a0f2b59a67e04ac27c4211cc7..936a663b96c22c00fe806e5d9db8bc29c404ae55 100755 (executable)
       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();
       });
 
       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) {
         }
       });
 
-      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) {
     // 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();
   };