Daniel Kurka has uploaded a new change for review.

  https://gwt-review.googlesource.com/3430


Change subject: making RootPanel.clear(true) respects GWT loader iframei
......................................................................

making RootPanel.clear(true) respects GWT loader iframei

fixes issue 8200

Change-Id: If876b04c453a1d4e170870e97f3a82d0d86599d5
---
M user/src/com/google/gwt/user/client/ui/RootPanel.java
M user/test/com/google/gwt/user/client/ui/RootPanelTest.java
2 files changed, 49 insertions(+), 2 deletions(-)



diff --git a/user/src/com/google/gwt/user/client/ui/RootPanel.java b/user/src/com/google/gwt/user/client/ui/RootPanel.java
index c4929c6..6cf2e06 100644
--- a/user/src/com/google/gwt/user/client/ui/RootPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/RootPanel.java
@@ -15,11 +15,13 @@
  */
 package com.google.gwt.user.client.ui;

+import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.impl.Disposable;
 import com.google.gwt.core.client.impl.Impl;
 import com.google.gwt.dom.client.BodyElement;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.Node;
 import com.google.gwt.event.logical.shared.CloseEvent;
 import com.google.gwt.event.logical.shared.CloseHandler;
 import com.google.gwt.i18n.client.BidiUtils;
@@ -28,8 +30,10 @@
 import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.Window;

+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;

@@ -317,10 +321,32 @@
     clear();

     if (clearDom) {
-      com.google.gwt.user.client.Element containerElement = getElement();
+      List<Node> nodesToReAttach = new ArrayList<Node>();
+      Element containerElement = getElement();
       while (containerElement.hasChildNodes()) {
-        containerElement.removeChild(containerElement.getFirstChild());
+        Node child = containerElement.getFirstChild();
+
+        if (!shouldNodeBeRemoved(child)) {
+          nodesToReAttach.add(child);
+        }
+        containerElement.removeChild(child);
+      }
+
+      for (Node node : nodesToReAttach) {
+        containerElement.appendChild(node);
       }
     }
   }
+
+  private boolean shouldNodeBeRemoved(Node child) {
+    if (Element.is(child)) {
+      Element childElement = (Element) child;
+      // do not remove GWT's iframe that is used for loading code
+      if ("iframe".equalsIgnoreCase(childElement.getTagName())
+          && GWT.getModuleName().equals(childElement.getId())) {
+        return false;
+      }
+    }
+    return true;
+  }
 }
diff --git a/user/test/com/google/gwt/user/client/ui/RootPanelTest.java b/user/test/com/google/gwt/user/client/ui/RootPanelTest.java
index d455bd1..5a3ad2e 100644
--- a/user/test/com/google/gwt/user/client/ui/RootPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/RootPanelTest.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.user.client.ui;

+import com.google.gwt.core.client.GWT;
 import com.google.gwt.dom.client.DivElement;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Element;
@@ -69,6 +70,26 @@
     assertEquals(0, rootPanel.getElement().getChildCount());
   }

+  public void testClearRootPanelWithGWTFrame() {
+
+    RootPanel rootPanel = createDOM("testClearRootPanel");
+
+    rootPanel.add(new Button("a"));
+    rootPanel.add(new Button("b"));
+
+    rootPanel.clear(true);
+    assertEquals(0, rootPanel.getElement().getChildCount());
+
+    Element iFrame = DOM.createIFrame();
+    iFrame.setId(GWT.getModuleName());
+    rootPanel.getElement().appendChild(iFrame);
+
+    assertEquals(1, rootPanel.getElement().getChildCount());
+
+    rootPanel.clear(true);
+    assertEquals(1, rootPanel.getElement().getChildCount());
+  }
+
   public void testClearRootPanelContainingTextNodes() {

     RootPanel rootPanel = createDOM("testClearRootPanelAndDOM");

--
To view, visit https://gwt-review.googlesource.com/3430
To unsubscribe, visit https://gwt-review.googlesource.com/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: If876b04c453a1d4e170870e97f3a82d0d86599d5
Gerrit-PatchSet: 1
Gerrit-Project: gwt
Gerrit-Branch: master
Gerrit-Owner: Daniel Kurka <[email protected]>

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors
--- You received this message because you are subscribed to the Google Groups "GWT Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to