| /* |
| * Copyright 2009 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.gwt.user.client.ui; |
| |
| import com.google.gwt.dom.client.DivElement; |
| import com.google.gwt.dom.client.Document; |
| import com.google.gwt.dom.client.Element; |
| import com.google.gwt.junit.client.GWTTestCase; |
| |
| /** |
| * Tests {@link RootPanel}. |
| */ |
| public class RootPanelTest extends GWTTestCase { |
| |
| @Override |
| public String getModuleName() { |
| return "com.google.gwt.user.User"; |
| } |
| |
| public void testDetachNowWithErrorOnDetach() { |
| BadWidget w = BadWidget.wrap(createAttachedDivElement()); |
| w.setFailOnUnload(true); |
| assertTrue(RootPanel.isInDetachList(w)); |
| assertTrue(RootPanel.getBodyElement().isOrHasChild(w.getElement())); |
| |
| try { |
| RootPanel.detachNow(w); |
| fail("Expected IllegalArgumentException"); |
| } catch (IllegalArgumentException e) { |
| // Expected. |
| } |
| assertFalse(RootPanel.isInDetachList(w)); |
| } |
| |
| public void testDetachWidgetsWithErrorOnDetach() { |
| BadWidget bad0 = BadWidget.wrap(createAttachedDivElement()); |
| bad0.setFailOnUnload(true); |
| BadWidget bad1 = BadWidget.wrap(createAttachedDivElement()); |
| bad1.setFailOnUnload(true); |
| assertTrue(RootPanel.isInDetachList(bad0)); |
| assertTrue(RootPanel.isInDetachList(bad1)); |
| assertTrue(RootPanel.getBodyElement().isOrHasChild(bad0.getElement())); |
| assertTrue(RootPanel.getBodyElement().isOrHasChild(bad1.getElement())); |
| |
| try { |
| RootPanel.detachWidgets(); |
| fail("Expected AttachDetachException"); |
| } catch (AttachDetachException e) { |
| // Expected. |
| assertEquals(2, e.getCauses().size()); |
| } |
| assertFalse(RootPanel.isInDetachList(bad0)); |
| assertFalse(RootPanel.isInDetachList(bad1)); |
| } |
| |
| /** |
| * Ensures that {@link RootPanel#get(String)} behaves properly. |
| */ |
| public void testGetById() { |
| Document doc = Document.get(); |
| DivElement div = doc.createDivElement(); |
| doc.getBody().appendChild(div); |
| div.setInnerHTML("<div id='a'></div><div id='b'></div>"); |
| |
| // You should get the same RootPanel for subsequent calls to get() with the |
| // same id. But you should get *different* RootPanels for calls with |
| // different ids. |
| RootPanel aRoot = RootPanel.get("a"); |
| RootPanel bRoot = RootPanel.get("b"); |
| |
| assertSame( |
| "RootPanel.get() should return the same instancefor the same id", |
| aRoot, RootPanel.get("a")); |
| assertSame( |
| "RootPanel.get() should return the same instancefor the same id", |
| bRoot, RootPanel.get("b")); |
| assertNotSame("RootPanels a and b should be different", aRoot, bRoot); |
| |
| // If a RootPanel's element is replaced in the DOM, you should get a |
| // new RootPanel instance if you ask for it again (see issue 1937). |
| Element aElem = doc.getElementById("a"); |
| Element newAElem = doc.createDivElement(); |
| newAElem.setId("a"); |
| aElem.getParentElement().replaceChild(newAElem, aElem); |
| |
| RootPanel newARoot = RootPanel.get("a"); |
| assertNotSame("New RootPanel should not be same as old", newARoot, aRoot); |
| } |
| |
| public void testRemoveWithError() { |
| // Create a widget that will throw an exception onUnload. |
| BadWidget badWidget = new BadWidget(); |
| badWidget.setFailOnUnload(true); |
| |
| // Add the widget to a panel. |
| RootPanel.get().add(badWidget); |
| assertTrue(badWidget.isAttached()); |
| |
| // Remove the widget from the panel. |
| try { |
| RootPanel.get().remove(badWidget); |
| fail("Expected IllegalArgumentException"); |
| } catch (IllegalArgumentException e) { |
| // Expected. |
| } |
| assertFalse(badWidget.isAttached()); |
| assertNull(badWidget.getParent()); |
| assertNull(badWidget.getElement().getParentElement()); |
| } |
| |
| /** |
| * Create a div and attach it to the {@link RootPanel}. |
| * |
| * @return the new div |
| */ |
| private Element createAttachedDivElement() { |
| DivElement elem = Document.get().createDivElement(); |
| RootPanel.getBodyElement().appendChild(elem); |
| return elem; |
| } |
| } |