Author: johnh
Date: Thu May 28 00:48:45 2009
New Revision: 779380

URL: http://svn.apache.org/viewvc?rev=779380&view=rev
Log:
Slight robustness additions, making it possible to setAuthToken before 
rendering a target IFRAME - not recommended practice, but widely used.


Modified:
    
incubator/shindig/trunk/features/src/main/javascript/features/rpc/fe.transport.js
    incubator/shindig/trunk/features/src/main/javascript/features/rpc/rpc.js
    incubator/shindig/trunk/javascript/container/rpctest_container.html

Modified: 
incubator/shindig/trunk/features/src/main/javascript/features/rpc/fe.transport.js
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/src/main/javascript/features/rpc/fe.transport.js?rev=779380&r1=779379&r2=779380&view=diff
==============================================================================
--- 
incubator/shindig/trunk/features/src/main/javascript/features/rpc/fe.transport.js
 (original)
+++ 
incubator/shindig/trunk/features/src/main/javascript/features/rpc/fe.transport.js
 Thu May 28 00:48:45 2009
@@ -79,7 +79,6 @@
         }
       }
     } catch (e) {
-      return false;
     }
     return true;
   }
@@ -118,14 +117,11 @@
         var ackFn = function() {
           window.setTimeout(function() {
             gadgets.rpc.call(receiverId, gadgets.rpc.ACK)
-          }, 0);
-        }
-        if (document.body) {
-          // TODO Consider moving document.body check to registerOnLoadHandler
-          ackFn();
-        } else {
-          gadgets.util.registerOnLoadHandler(ackFn);
+          }, 500);
         }
+        // Setup to container always happens before onload.
+        // If it didn't, the correct fix would be in gadgets.util.
+        gadgets.util.registerOnLoadHandler(ackFn);
       }
       return true;
     },

Modified: 
incubator/shindig/trunk/features/src/main/javascript/features/rpc/rpc.js
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/features/src/main/javascript/features/rpc/rpc.js?rev=779380&r1=779379&r2=779380&view=diff
==============================================================================
--- incubator/shindig/trunk/features/src/main/javascript/features/rpc/rpc.js 
(original)
+++ incubator/shindig/trunk/features/src/main/javascript/features/rpc/rpc.js 
Thu May 28 00:48:45 2009
@@ -68,6 +68,11 @@
   // Special service name for acknowledgements.
   var ACK = '__ack';
 
+  // Timeout and number of setup attempts between each
+  // for when setAuthToken is called before the target it specifies exists.
+  var SETUP_FRAME_TIMEOUT = 500;
+  var SETUP_FRAME_MAX_TRIES = 10;
+
   var services = {};
   var relayUrl = {};
   var useLegacyProtocol = {};
@@ -283,15 +288,31 @@
    * of the channel once they send their first messages.
    */
   function setupFrame(frameId, token) {
-    if (setup[frameId]) {
+    if (setup[frameId] === true) {
       return;
     }
 
-    if (transport.setup(frameId, token) === false) {
-      transport = fallbackTransport;
+    if (typeof setup[frameId] === 'undefined') {
+      setup[frameId] = 0;
+    }
+
+    var tgtFrame = document.getElementById(frameId);
+    if (frameId === '..' || tgtFrame != null) {
+      if (transport.setup(frameId, token) === true) {
+        setup[frameId] = true;
+        return;
+      }
     }
 
-    setup[frameId] = true;
+    if (setup[frameId] !== true && setup[frameId]++ < SETUP_FRAME_MAX_TRIES) {
+      // Try again in a bit, assuming that frame will soon exist.
+      window.setTimeout(function() { setupFrame(frameId, token) },
+                        SETUP_FRAME_TIMEOUT);
+    } else {
+      // Fail: fall back.
+      transport = fallbackTransport;
+      setup[frameId] = true;
+    }
   }
 
   /**

Modified: incubator/shindig/trunk/javascript/container/rpctest_container.html
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/container/rpctest_container.html?rev=779380&r1=779379&r2=779380&view=diff
==============================================================================
--- incubator/shindig/trunk/javascript/container/rpctest_container.html 
(original)
+++ incubator/shindig/trunk/javascript/container/rpctest_container.html Thu May 
28 00:48:45 2009
@@ -63,8 +63,15 @@
       function appendGadget() {
         var secret = Math.round(Math.random() * 10000000);
         var container = document.getElementById("container");
-        container.innerHTML = "<iframe id='gadget' name='gadget' height=400 
width=800 src='" + gadgetUrl + "?parent=" + containerRelay + "#rpctoken=" + 
secret + "'></iframe>";
-        gadgets.rpc.setAuthToken('gadget', secret);
+        if (window.location.search.indexOf('&ua=backward') !== -1) {
+          // incorrect but likely widely used
+          gadgets.rpc.setAuthToken('gadget', secret);
+          container.innerHTML = "<iframe id='gadget' name='gadget' height=400 
width=800 src='" + gadgetUrl + "?parent=" + containerRelay + "#rpctoken=" + 
secret + "'></iframe>";
+        } else {
+          // "correct" way.
+          container.innerHTML = "<iframe id='gadget' name='gadget' height=400 
width=800 src='" + gadgetUrl + "?parent=" + containerRelay + "#rpctoken=" + 
secret + "'></iframe>";
+          gadgets.rpc.setAuthToken('gadget', secret);
+        }
       }
 
       function initTest() {


Reply via email to