]> source.dussan.org Git - vaadin-framework.git/commitdiff
Allow a resize listener to fire a resize listener (#20338)
authorArtur Signell <artur@vaadin.com>
Sat, 15 Oct 2016 19:05:51 +0000 (22:05 +0300)
committerVaadin Code Review <review@vaadin.com>
Tue, 25 Oct 2016 09:01:04 +0000 (09:01 +0000)
Change-Id: I6b045c3a693e88b3cba182ae9ea68cfa98c914b0

client/src/main/java/com/vaadin/client/LayoutManager.java
uitest/src/main/java/com/vaadin/tests/layoutmanager/ConcurrentModificationUI.java [new file with mode: 0644]
uitest/src/test/java/com/vaadin/tests/layoutmanager/ConcurrentModificationUITest.java [new file with mode: 0644]

index 306cea5ced9a7ad34ac4b89dee3a0ad81439aa4b..5a16da5e1497f61e1066c14b03cd26beee7932b6 100644 (file)
@@ -350,9 +350,12 @@ public class LayoutManager {
 
             int firedListeners = 0;
             if (!listenersToFire.isEmpty()) {
+                HashSet<Element> listenersCopy = new HashSet<Element>(
+                        listenersToFire);
+                listenersToFire.clear();
                 firedListeners = listenersToFire.size();
                 Profiler.enter("Layout fire resize events");
-                for (Element element : listenersToFire) {
+                for (Element element : listenersCopy) {
                     Collection<ElementResizeListener> listeners = elementResizeListeners
                             .get(element);
                     if (listeners != null) {
@@ -393,8 +396,6 @@ public class LayoutManager {
                                 "Layout fire resize events - listeners not null");
                     }
                 }
-                listenersToFire.clear();
-
                 Profiler.leave("Layout fire resize events");
             }
 
diff --git a/uitest/src/main/java/com/vaadin/tests/layoutmanager/ConcurrentModificationUI.java b/uitest/src/main/java/com/vaadin/tests/layoutmanager/ConcurrentModificationUI.java
new file mode 100644 (file)
index 0000000..2a3370e
--- /dev/null
@@ -0,0 +1,29 @@
+package com.vaadin.tests.layoutmanager;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.ui.Alignment;
+import com.vaadin.ui.CssLayout;
+import com.vaadin.ui.FormLayout;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.Panel;
+import com.vaadin.ui.UI;
+
+public class ConcurrentModificationUI extends UI {
+
+    @Override
+    protected void init(VaadinRequest request) {
+        Panel panel = new Panel();
+        setContent(panel);
+
+        FormLayout form = new FormLayout();
+        panel.setContent(form);
+
+        HorizontalLayout horizLyt = new HorizontalLayout();
+        form.addComponent(horizLyt);
+
+        CssLayout cssLyt = new CssLayout();
+        horizLyt.addComponent(cssLyt);
+        horizLyt.setComponentAlignment(cssLyt, Alignment.MIDDLE_LEFT);
+    }
+
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/layoutmanager/ConcurrentModificationUITest.java b/uitest/src/test/java/com/vaadin/tests/layoutmanager/ConcurrentModificationUITest.java
new file mode 100644 (file)
index 0000000..4a64fc3
--- /dev/null
@@ -0,0 +1,16 @@
+package com.vaadin.tests.layoutmanager;
+
+import org.junit.Test;
+
+import com.vaadin.tests.tb3.SingleBrowserTest;
+
+public class ConcurrentModificationUITest extends SingleBrowserTest {
+
+    @Test
+    public void noExceptionWhenEnlarging() {
+        testBench().resizeViewPortTo(100, 100);
+        openTestURL("debug");
+        testBench().resizeViewPortTo(200, 200);
+        assertNoErrorNotifications();
+    }
+}