Fixes a memory leak on IE with the cross-site fragment loading strategy.
Now the callbacks on script tags are removed when they are invoked.

Review at http://gwt-code-reviews.appspot.com/544801

Review by: jlabanca@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@8200 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/core/client/impl/CrossSiteLoadingStrategy.java b/user/src/com/google/gwt/core/client/impl/CrossSiteLoadingStrategy.java
index fb158fb..b8f2633 100644
--- a/user/src/com/google/gwt/core/client/impl/CrossSiteLoadingStrategy.java
+++ b/user/src/com/google/gwt/core/client/impl/CrossSiteLoadingStrategy.java
@@ -60,6 +60,18 @@
       "Code download terminated");
 
   /**
+   * Clear callbacks on script objects. This is important on IE 6 and 7 to
+   * prevent a memory leak. If the callbacks aren't cleared, there is a cyclical
+   * chain of references between the script tag and the function callback, and
+   * IE 6/7 can't garbage collect them.
+   */
+  @SuppressWarnings("unused")
+  private static native void clearCallbacks(JavaScriptObject script) /*-{
+    var nop = new Function('');
+    script.onerror = script.onload = script.onreadystatechange = nop;
+  }-*/;
+
+  /**
    * Clear the success callback for fragment <code>fragment</code>.
    */
   @SuppressWarnings("unused")
@@ -88,8 +100,9 @@
          return;
        }
        var head = document.getElementsByTagName('head').item(0);
-       head.removeChild(tag);
        @com.google.gwt.core.client.impl.CrossSiteLoadingStrategy::clearOnSuccess(*)(fragment);
+       @com.google.gwt.core.client.impl.CrossSiteLoadingStrategy::clearCallbacks(*)(tag);
+       head.removeChild(tag);
        loadFinishedHandler.@com.google.gwt.core.client.impl.AsyncFragmentLoader.LoadTerminatedHandler::loadTerminated(*)(
          exception);
      }
@@ -99,8 +112,9 @@
       JavaScriptObject tag) /*-{
      return function(code) {
        var head = document.getElementsByTagName('head').item(0);
-       head.removeChild(tag);
        @com.google.gwt.core.client.impl.CrossSiteLoadingStrategy::clearOnSuccess(*)(fragment);
+       @com.google.gwt.core.client.impl.CrossSiteLoadingStrategy::clearCallbacks(*)(tag);
+       head.removeChild(tag);
        __gwtModuleFunction.installCode(code);
      }
    }-*/;