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 <danku...@google.com>

--
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 google-web-toolkit-contributors+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to