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);
}
}-*/;