From: Artur Signell Date: Tue, 4 Jan 2011 16:55:51 +0000 (+0000) Subject: #6232 ComponentContainers should check that a component is in the container before... X-Git-Tag: 6.7.0.beta1~533 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=f29899a0d82e9ff1d6752355fbc19de370dd8cf5;p=vaadin-framework.git #6232 ComponentContainers should check that a component is in the container before removing it svn changeset:16793/svn branch:6.5 --- diff --git a/src/com/vaadin/ui/CustomLayout.java b/src/com/vaadin/ui/CustomLayout.java index 0c11ff6114..47d1a970ac 100644 --- a/src/com/vaadin/ui/CustomLayout.java +++ b/src/com/vaadin/ui/CustomLayout.java @@ -159,8 +159,7 @@ public class CustomLayout extends AbstractLayout { return; } slots.values().remove(c); - c.setParent(null); - fireComponentDetachEvent(c); + super.removeComponent(c); requestRepaint(); } diff --git a/tests/src/com/vaadin/tests/VaadinClasses.java b/tests/src/com/vaadin/tests/VaadinClasses.java index b876a66c63..9313fb9880 100644 --- a/tests/src/com/vaadin/tests/VaadinClasses.java +++ b/tests/src/com/vaadin/tests/VaadinClasses.java @@ -18,6 +18,10 @@ import com.vaadin.Application; import com.vaadin.tests.components.AbstractComponentTest; import com.vaadin.ui.Component; import com.vaadin.ui.ComponentContainer; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.DragAndDropWrapper; +import com.vaadin.ui.LoginForm; +import com.vaadin.ui.PopupView; public class VaadinClasses { @@ -53,6 +57,17 @@ public class VaadinClasses { } } + public static List> getComponentContainersSupportingAddRemoveComponent() { + List> classes = getComponentContainers(); + classes.remove(PopupView.class); + classes.remove(CustomComponent.class); + classes.remove(DragAndDropWrapper.class); + classes.remove(CustomComponent.class); + classes.remove(LoginForm.class); + + return classes; + } + @SuppressWarnings("unchecked") public static List>> getBasicComponentTests() { try { diff --git a/tests/src/com/vaadin/tests/server/componentcontainer/AddRemoveComponentTest.java b/tests/src/com/vaadin/tests/server/componentcontainer/AddRemoveComponentTest.java new file mode 100644 index 0000000000..828404bd5a --- /dev/null +++ b/tests/src/com/vaadin/tests/server/componentcontainer/AddRemoveComponentTest.java @@ -0,0 +1,40 @@ +package com.vaadin.tests.server.componentcontainer; + +import java.util.List; + +import junit.framework.TestCase; + +import com.vaadin.tests.VaadinClasses; +import com.vaadin.ui.ComponentContainer; +import com.vaadin.ui.CustomLayout; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; + +public class AddRemoveComponentTest extends TestCase { + + public void testRemoveComponentFromWrongContainer() + throws InstantiationException, IllegalAccessException { + List> containerClasses = VaadinClasses + .getComponentContainersSupportingAddRemoveComponent(); + + // No default constructor, special case + containerClasses.remove(CustomLayout.class); + testRemoveComponentFromWrongContainer(new CustomLayout("dummy")); + + for (Class c : containerClasses) { + testRemoveComponentFromWrongContainer(c.newInstance()); + } + } + + private void testRemoveComponentFromWrongContainer( + ComponentContainer componentContainer) { + HorizontalLayout hl = new HorizontalLayout(); + Label label = new Label(); + hl.addComponent(label); + + componentContainer.removeComponent(label); + assertEquals( + "Parent no longer correct for " + componentContainer.getClass(), + hl, label.getParent()); + } +}