Author: sco...@google.com
Date: Tue May 26 11:40:15 2009
New Revision: 5471

Modified:
    branches/snapshot-2009.05.12-r5406/branch-info.txt
     
branches/snapshot-2009.05.12-r5406/dev/core/src/com/google/gwt/core/ext/linker/impl/hosted.html
     
branches/snapshot-2009.05.12-r5406/dev/core/src/com/google/gwt/core/linker/IFrameTemplate.js

Log:
Rolling tr...@5393 out of this branch.  The IFRAME XHR change is broken on  
IE6 hosted and Safari 3.

Modified: branches/snapshot-2009.05.12-r5406/branch-info.txt
==============================================================================
--- branches/snapshot-2009.05.12-r5406/branch-info.txt  (original)
+++ branches/snapshot-2009.05.12-r5406/branch-info.txt  Tue May 26 11:40:15  
2009
@@ -12,4 +12,4 @@
    svn merge -c5450 https://google-web-toolkit.googlecode.com/svn/trunk .
  /trunk c5466,5467 were merged (r5468) into this branch
    svn merge -c5466,5467 http://google-web-toolkit.googlecode.com/svn/trunk/
-
+/trunk c5393 was ROLLED BACK in this branch

Modified:  
branches/snapshot-2009.05.12-r5406/dev/core/src/com/google/gwt/core/ext/linker/impl/hosted.html
==============================================================================
---  
branches/snapshot-2009.05.12-r5406/dev/core/src/com/google/gwt/core/ext/linker/impl/hosted.html
  
(original)
+++  
branches/snapshot-2009.05.12-r5406/dev/core/src/com/google/gwt/core/ext/linker/impl/hosted.html
  
Tue May 26 11:40:15 2009
@@ -241,13 +241,6 @@
    }
  }

-// The module to be loaded can be specified either through the url query
-// parameter (as done by the legacy HostedModeTemplate.js), or by  
specifying
-// window.__gwt_module (as done by IFrameTemplate.js). When the former  
approach
-// is removed, we can drop the 'query' part of this logic.
  query = window.location.search.substring(1);
  if (query && $wnd[query]) setTimeout($wnd[query].onScriptLoad, 1);
-
-var module  = window.__gwt_module;
-if (module && $wnd[module]) setTimeout($wnd[module].onScriptLoad, 1);
  --></script></body></html>

Modified:  
branches/snapshot-2009.05.12-r5406/dev/core/src/com/google/gwt/core/linker/IFrameTemplate.js
==============================================================================
---  
branches/snapshot-2009.05.12-r5406/dev/core/src/com/google/gwt/core/linker/IFrameTemplate.js
     
(original)
+++  
branches/snapshot-2009.05.12-r5406/dev/core/src/com/google/gwt/core/linker/IFrameTemplate.js
     
Tue May 26 11:40:15 2009
@@ -41,13 +41,9 @@
    // the strong name of the cache.js file to load.
    ,answers = []

-  // Error functions.  Default unset in compiled mode, may be set by meta  
props
+  // Error functions.  Default unset in compiled mode, may be set by meta  
props.
    ,onLoadErrorFunc, propertyErrorFunc

-  // The frame that will contain the compiled script (created in
-  // fetchCompiledScript())
-  ,scriptFrame
-
    ; // end of global vars

    $stats && $stats({
@@ -86,13 +82,10 @@
    // Called by onScriptLoad(), onInjectionDone(), and onload(). It causes
    // the specified module to be cranked up.
    //
-  var moduleStarted = false;
    function maybeStartModule() {
-    if (bodyDone && scriptsDone && loadDone && !moduleStarted) {
-      moduleStarted = true;
-
-      var frameWnd = scriptFrame.contentWindow;
-
+    if (scriptsDone && loadDone) {
+      var iframe = $doc.getElementById('__MODULE_NAME__');
+      var frameWnd = iframe.contentWindow;
        // inject hosted mode property evaluation function
        if (isHostedMode()) {
          frameWnd.__gwt_getProperty = function(name) {
@@ -281,71 +274,35 @@
      throw null;
    }

-  // Creates a new XMLHttpRequest object. Used by fetchCompiledScript().
-  //
-  function newXhr() {
-    // This is the same logic as in GWT's XMLHttpRequest wrapper.  
The 'else'
-    // case is needed primarily for old IEs.
-    if (window.XMLHttpRequest) {
-      return new XMLHttpRequest();
-    } else {
-      try {
-        return new ActiveXObject('MSXML2.XMLHTTP.3.0');
-      } catch (e) {
-        return new ActiveXObject("Microsoft.XMLHTTP");
-      }
+  var frameInjected;
+  function maybeInjectFrame() {
+    if (!frameInjected) {
+      frameInjected = true;
+      var iframe = $doc.createElement('iframe');
+      // Prevents mixed mode security in IE6/7.
+      iframe.src = "javascript:''";
+      iframe.id = "__MODULE_NAME__";
+      iframe.style.cssText  
= "position:absolute;width:0;height:0;border:none";
+      iframe.tabIndex = -1;
+      // Due to an IE6/7 refresh quirk, this must be an appendChild.
+      $doc.body.appendChild(iframe);
+
+      /*
+       * The src has to be set after the iframe is attached to the DOM to  
avoid
+       * refresh quirks in Safari.  We have to use the location.replace  
trick to
+       * avoid FF2 refresh quirks.
+       */
+      $stats && $stats({
+        moduleName:'__MODULE_NAME__',
+        subSystem:'startup',
+        evtGroup: 'moduleStartup',
+        millis:(new Date()).getTime(),
+        type: 'moduleRequested'
+      });
+      iframe.contentWindow.location.replace(base + initialHtml);
      }
    }

-  // Fetches the compiled script via XHR, dropping it into 'scriptFrame'  
via
-  // document.write().
-  //
-  function fetchCompiledScript() {
-    $stats && $stats({
-      moduleName:'__MODULE_NAME__',
-      subSystem:'startup',
-      evtGroup: 'moduleStartup',
-      millis:(new Date()).getTime(),
-      type: 'moduleRequested'
-    });
-
-    // Fetch the contents via XHR.
-    var xhr = newXhr();
-    xhr.open('GET', base + initialHtml);
-    xhr.onreadystatechange = function() {
-      // 4 == DONE
-      if (xhr.readyState == 4) {
-        // Create the script frame, making sure it's invisible, but not
-        // "display:none", which keeps some browsers from running code in  
it.
-        scriptFrame = document.createElement('iframe');
-        scriptFrame.src = 'javascript:""';
-        scriptFrame.id = '__MODULE_NAME__';
-        scriptFrame.style.cssText = 'position:absolute; width:0; height:0;  
border:none';
-        scriptFrame.tabIndex = -1;
-        document.body.appendChild(scriptFrame);
-
-        // Expose the module function via an expando on the iframe's  
window.
-        // (this is needed for the compiled script to call back into
-        //  onScriptLoad()).
-        var win = scriptFrame.contentWindow;
-        if (isHostedMode()) {
-          win.__gwt_module = '__MODULE_FUNC__';
-        }
-
-        // Inject the fetched script into the script frame.
-        // (this script will call onScriptLoad())
-        var doc = win.document;
-        doc.open();
-        doc.write(xhr.responseText);
-        doc.close();
-
-        // Make sure we don't leak the xhr object.
-        xhr = null;
-      }
-    };
-    xhr.send(null);
-  }
-
    // --------------- PROPERTY PROVIDERS ---------------

  // __PROPERTIES_BEGIN__
@@ -356,10 +313,14 @@
    // Called when the compiled script identified by moduleName is done  
loading.
    //
    __MODULE_FUNC__.onScriptLoad = function() {
-    // Mark this module's script as done loading and (possibly) start the
-    // module.
-    loadDone = true;
-    maybeStartModule();
+    // IE7 bookmark bug. A phantom (presumably cached) version of our  
compiled iframe
+    // can call onScriptLoad before we even properly inject the iframe. So  
if this is
+    // called before the frame was injected ... it is completely bogus.
+    if (frameInjected) {
+      // Mark this module's script as done loading and (possibly) start  
the module.
+      loadDone = true;
+      maybeStartModule();
+    }
    }

    // Called when the script injection is complete.
@@ -390,14 +351,13 @@
        $wnd.location.reload();
        return;
      }
-
-    initialHtml = "hosted.html";
+    initialHtml = "hosted.html?__MODULE_FUNC__";
      strongName = "";
    }

    processMetas();

-  // ------- SELECT PERMUTATION AND FETCH SCRIPT -------
+  // --------------- WINDOW ONLOAD HOOK ---------------

    $stats && $stats({
      moduleName:'__MODULE_NAME__',
@@ -419,11 +379,6 @@
      }
    }

-  // Start the request for the compiled script.
-  fetchCompiledScript();
-
-  // --------------- WINDOW ONLOAD HOOK ---------------
-
    var onBodyDoneTimerId;
    function onBodyDone() {
      if (!bodyDone) {
@@ -445,6 +400,7 @@
    // For everyone that supports DOMContentLoaded.
    if ($doc.addEventListener) {
      $doc.addEventListener("DOMContentLoaded", function() {
+      maybeInjectFrame();
        onBodyDone();
      }, false);
    }
@@ -452,6 +408,7 @@
    // Fallback. If onBodyDone() gets fired twice, it's not a big deal.
    var onBodyDoneTimerId = setInterval(function() {
      if (/loaded|complete/.test($doc.readyState)) {
+      maybeInjectFrame();
        onBodyDone();
      }
    }, 50);

--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Reply via email to