]> source.dussan.org Git - vaadin-framework.git/commitdiff
Remove element explicitly when reordering tree grid rows (#9952)
authorAdam Wagner <wbadam@users.noreply.github.com>
Mon, 11 Sep 2017 09:02:20 +0000 (12:02 +0300)
committerHenri Sara <henri.sara@gmail.com>
Mon, 11 Sep 2017 09:02:20 +0000 (12:02 +0300)
Under certain circumstances IE 11 (11.0.45 / 11.0.9600.18762) produces an exception when collapsing/expanding rows (particularly the first child after the very first element) in a TreeGrid within a Window.

This workaround removes the row explicitly before inserting, instead of letting JS handle it.

Fixes #9850

client/src/main/java/com/vaadin/client/widgets/Escalator.java
uitest/src/main/java/com/vaadin/tests/components/treegrid/TreeGridInWindow.java [new file with mode: 0644]
uitest/src/test/java/com/vaadin/tests/components/treegrid/TreeGridInWindowTest.java [new file with mode: 0644]

index 0c9fdd224a08d9c443713b614321d94c17741be3..178f3a422212ebf0a8a481a78ee248ab68bb75bc 100644 (file)
@@ -3898,6 +3898,11 @@ public class Escalator extends Widget
                 if (tr == focusedRow) {
                     insertFirst = true;
                 } else if (insertFirst) {
+                    // remove row explicitly to work around an IE11 bug (#9850)
+                    if (BrowserInfo.get().isIE11() && tr
+                            .equals(root.getFirstChildElement())) {
+                        root.removeChild(tr);
+                    }
                     root.insertFirst(tr);
                 } else {
                     root.insertAfter(tr, focusedRow);
diff --git a/uitest/src/main/java/com/vaadin/tests/components/treegrid/TreeGridInWindow.java b/uitest/src/main/java/com/vaadin/tests/components/treegrid/TreeGridInWindow.java
new file mode 100644 (file)
index 0000000..11afe6b
--- /dev/null
@@ -0,0 +1,35 @@
+package com.vaadin.tests.components.treegrid;
+
+import com.vaadin.data.TreeData;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.TreeGrid;
+import com.vaadin.ui.UI;
+import com.vaadin.ui.Window;
+
+public class TreeGridInWindow extends AbstractTestUI {
+
+    @Override
+    protected void setup(VaadinRequest request) {
+        TreeGrid<String> treeGrid = new TreeGrid<>();
+        treeGrid.addColumn(Object::toString).setCaption("Column");
+
+        TreeData<String> data = treeGrid.getTreeData();
+
+        data.addRootItems("parent");
+        data.addItems("parent", "child1", "child2");
+        data.addItems("child1", "grandchild1", "grandchild2");
+        data.addItems("child2", "grandchild3", "grandchild4");
+
+        treeGrid.expand("parent", "child1", "child2");
+
+        Window window = new Window("Window", treeGrid);
+
+        Button openWindow = new Button("Open window", event -> {
+            UI.getCurrent().addWindow(window);
+        });
+
+        getLayout().addComponent(openWindow);
+    }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/treegrid/TreeGridInWindowTest.java b/uitest/src/test/java/com/vaadin/tests/components/treegrid/TreeGridInWindowTest.java
new file mode 100644 (file)
index 0000000..7a1e861
--- /dev/null
@@ -0,0 +1,33 @@
+package com.vaadin.tests.components.treegrid;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.TreeGridElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class TreeGridInWindowTest extends MultiBrowserTest {
+
+    @Test
+    public void collapse_and_expand_first_child_multiple_times() {
+        setDebug(true);
+        openTestURL();
+
+        ButtonElement openWindowButton = $(ButtonElement.class).first();
+        openWindowButton.click();
+
+        TreeGridElement grid = $(TreeGridElement.class).first();
+
+        for (int i = 0; i < 10; i++) {
+            // Collapse first child node
+            grid.getExpandElement(1, 0).click();
+            waitUntil(webDriver -> grid.getRowCount() == 5);
+
+            // Expand first child node
+            grid.getExpandElement(1, 0).click();
+            waitUntil(webDriver -> grid.getRowCount() == 7);
+        }
+
+        assertNoErrorNotifications();
+    }
+}