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