Re-apply r5787.
$ svn diff -c5787 | patch -p0 && svn commit user


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5810 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/User.gwt.xml b/user/src/com/google/gwt/user/User.gwt.xml
index 87c4bb7..2e31cd1 100644
--- a/user/src/com/google/gwt/user/User.gwt.xml
+++ b/user/src/com/google/gwt/user/User.gwt.xml
@@ -21,6 +21,7 @@
    <inherits name="com.google.gwt.core.Core"/>
    <inherits name="com.google.gwt.event.Event"/>
    <inherits name="com.google.gwt.animation.Animation"/>
+   <inherits name="com.google.gwt.resources.Resources"/>
    <inherits name="com.google.gwt.user.AsyncProxy"/>
    <inherits name="com.google.gwt.user.RemoteService"/>
    <inherits name="com.google.gwt.user.DocumentRoot" />
diff --git a/user/src/com/google/gwt/user/client/impl/WindowImplIE.java b/user/src/com/google/gwt/user/client/impl/WindowImplIE.java
index 46ec347..386aa35 100644
--- a/user/src/com/google/gwt/user/client/impl/WindowImplIE.java
+++ b/user/src/com/google/gwt/user/client/impl/WindowImplIE.java
@@ -18,6 +18,8 @@
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.ScriptElement;
+import com.google.gwt.resources.client.ClientBundle;
+import com.google.gwt.resources.client.TextResource;
 import com.google.gwt.user.client.Command;
 
 /**
@@ -26,6 +28,31 @@
 public class WindowImplIE extends WindowImpl {
 
   /**
+   * The resources for this implementation.
+   */
+  public interface Resources extends ClientBundle {
+    Resources INSTANCE = GWT.create(Resources.class);
+
+    /**
+     * Contains the function body used to initialize the window close handler.
+     */
+    @Source("initWindowCloseHandler.js")
+    TextResource initWindowCloseHandler();
+
+    /**
+     * Contains the function body used to initialize the window resize handler.
+     */
+    @Source("initWindowResizeHandler.js")
+    TextResource initWindowResizeHandler();
+
+    /**
+     * Contains the function body used to initialize the window scroll handler.
+     */
+    @Source("initWindowScrollHandler.js")
+    TextResource initWindowScrollHandler();
+  }
+
+  /**
    * For IE6, reading from $wnd.location.hash drops part of the fragment if the
    * fragment contains a '?'. To avoid this bug, we use location.href instead.
    */
@@ -54,8 +81,8 @@
 
   @Override
   public void initWindowCloseHandler() {
-    initHandler(getWindowCloseHandlerMethodString(),
-        "__gwt_initWindowCloseHandler", new Command() {
+    initHandler(Resources.INSTANCE.initWindowCloseHandler().getText(),
+        new Command() {
           public void execute() {
             initWindowCloseHandlerImpl();
           }
@@ -64,8 +91,8 @@
 
   @Override
   public void initWindowResizeHandler() {
-    initHandler(getWindowResizeHandlerMethodString(),
-        "__gwt_initWindowResizeHandler", new Command() {
+    initHandler(Resources.INSTANCE.initWindowResizeHandler().getText(),
+        new Command() {
           public void execute() {
             initWindowResizeHandlerImpl();
           }
@@ -74,8 +101,8 @@
 
   @Override
   public void initWindowScrollHandler() {
-    initHandler(getWindowScrollHandlerMethodString(),
-        "__gwt_initWindowScrollHandler", new Command() {
+    initHandler(Resources.INSTANCE.initWindowScrollHandler().getText(),
+        new Command() {
           public void execute() {
             initWindowScrollHandlerImpl();
           }
@@ -83,110 +110,16 @@
   }
 
   /**
-   * This method defines a function that sinks an event on the Window.  However,
-   * this method returns the function as a String so it can be added to the
-   * outer window.
-   * 
-   * We need to declare this method on the outer window because you cannot
-   * attach Window listeners from within an iframe on IE6.
-   * 
-   * Per ECMAScript 262 spec 15.3.4.2, Function.prototype.toString() returns a
-   * string representation of the function that has the syntax of the function.
-   */
-  private native String getWindowCloseHandlerMethodString() /*-{
-    return function(beforeunload, unload) {
-      var wnd = window
-      , oldOnBeforeUnload = wnd.onbeforeunload
-      , oldOnUnload = wnd.onunload;
-      
-      wnd.onbeforeunload = function(evt) {
-        var ret, oldRet;
-        try {
-          ret = beforeunload();
-        } finally {
-          oldRet = oldOnBeforeUnload && oldOnBeforeUnload(evt);
-        }
-        // Avoid returning null as IE6 will coerce it into a string.
-        // Ensure that "" gets returned properly.
-        if (ret != null) {
-          return ret;
-        }
-        if (oldRet != null) {
-          return oldRet;
-        }
-        // returns undefined.
-      };
-      
-      wnd.onunload = function(evt) {
-        try {
-          unload();
-        } finally {
-          oldOnUnload && oldOnUnload(evt);
-          wnd.onresize = null;
-          wnd.onscroll = null;
-          wnd.onbeforeunload = null;
-          wnd.onunload = null;
-        }
-      };
-      
-      // Remove the reference once we've initialize the handler
-      wnd.__gwt_initWindowCloseHandler = undefined;
-    }.toString();
-  }-*/;
-
-  /**
-   * @see #getWindowCloseHandlerMethodString()
-   */
-  private native String getWindowResizeHandlerMethodString() /*-{
-    return function(resize) {
-      var wnd = window, oldOnResize = wnd.onresize;
-      
-      wnd.onresize = function(evt) {
-        try {
-          resize();
-        } finally {
-          oldOnResize && oldOnResize(evt);
-        }
-      };
-      
-      // Remove the reference once we've initialize the handler
-      wnd.__gwt_initWindowResizeHandler = undefined;
-    }.toString();
-  }-*/;
-
-  /**
-   * @see #getWindowCloseHandlerMethodString()
-   */
-  private native String getWindowScrollHandlerMethodString() /*-{
-    return function(scroll) {
-      var wnd = window, oldOnScroll = wnd.onscroll;
-      
-      wnd.onscroll = function(evt) {
-        try {
-          scroll();
-        } finally {
-          oldOnScroll && oldOnScroll(evt);
-        }
-      };
-      
-      // Remove the reference once we've initialize the handler
-      wnd.__gwt_initWindowScrollHandler = undefined;
-    }.toString();
-  }-*/;
-
-  /**
    * IE6 does not allow direct access to event handlers on the parent window,
    * so we must embed a script in the parent window that will set the event
    * handlers in the correct context.
    * 
    * @param initFunc the string representation of the init function
-   * @param funcName the name to assign to the init function
    * @param cmd the command to execute the init function
    */
-  private void initHandler(String initFunc, String funcName, Command cmd) {
+  private void initHandler(String initFunc, Command cmd) {
     if (GWT.isClient()) {
       // Embed the init script on the page
-      initFunc = initFunc.replaceFirst("function", "function " + funcName);
       ScriptElement scriptElem = Document.get().createScriptElement(initFunc);
       Document.get().getBody().appendChild(scriptElem);
   
diff --git a/user/src/com/google/gwt/user/client/impl/initWindowCloseHandler.js b/user/src/com/google/gwt/user/client/impl/initWindowCloseHandler.js
new file mode 100644
index 0000000..f0f923d
--- /dev/null
+++ b/user/src/com/google/gwt/user/client/impl/initWindowCloseHandler.js
@@ -0,0 +1,38 @@
+function __gwt_initWindowCloseHandler(beforeunload, unload) {

+  var wnd = window

+  , oldOnBeforeUnload = wnd.onbeforeunload

+  , oldOnUnload = wnd.onunload;

+  

+  wnd.onbeforeunload = function(evt) {

+    var ret, oldRet;

+    try {

+      ret = beforeunload();

+    } finally {

+      oldRet = oldOnBeforeUnload && oldOnBeforeUnload(evt);

+    }

+    // Avoid returning null as IE6 will coerce it into a string.

+    // Ensure that "" gets returned properly.

+    if (ret != null) {

+      return ret;

+    }

+    if (oldRet != null) {

+      return oldRet;

+    }

+    // returns undefined.

+  };

+  

+  wnd.onunload = function(evt) {

+    try {

+      unload();

+    } finally {

+      oldOnUnload && oldOnUnload(evt);

+      wnd.onresize = null;

+      wnd.onscroll = null;

+      wnd.onbeforeunload = null;

+      wnd.onunload = null;

+    }

+  };

+  

+  // Remove the reference once we've initialize the handler

+  wnd.__gwt_initWindowCloseHandler = undefined;

+}

diff --git a/user/src/com/google/gwt/user/client/impl/initWindowResizeHandler.js b/user/src/com/google/gwt/user/client/impl/initWindowResizeHandler.js
new file mode 100644
index 0000000..f1631be
--- /dev/null
+++ b/user/src/com/google/gwt/user/client/impl/initWindowResizeHandler.js
@@ -0,0 +1,14 @@
+function __gwt_initWindowResizeHandler(resize) {

+  var wnd = window, oldOnResize = wnd.onresize;

+  

+  wnd.onresize = function(evt) {

+    try {

+      resize();

+    } finally {

+      oldOnResize && oldOnResize(evt);

+    }

+  };

+  

+  // Remove the reference once we've initialize the handler

+  wnd.__gwt_initWindowResizeHandler = undefined;

+}

diff --git a/user/src/com/google/gwt/user/client/impl/initWindowScrollHandler.js b/user/src/com/google/gwt/user/client/impl/initWindowScrollHandler.js
new file mode 100644
index 0000000..3713092
--- /dev/null
+++ b/user/src/com/google/gwt/user/client/impl/initWindowScrollHandler.js
@@ -0,0 +1,14 @@
+function __gwt_initWindowScrollHandler(scroll) {

+  var wnd = window, oldOnScroll = wnd.onscroll;

+  

+  wnd.onscroll = function(evt) {

+    try {

+      scroll();

+    } finally {

+      oldOnScroll && oldOnScroll(evt);

+    }

+  };

+  

+  // Remove the reference once we've initialize the handler

+  wnd.__gwt_initWindowScrollHandler = undefined;

+}