]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix scrolling problem in table in Chrome 56+ (#12015) pr12027/r11
authorAnna Koskinen <Ansku@users.noreply.github.com>
Tue, 19 May 2020 12:21:56 +0000 (15:21 +0300)
committerGitHub <noreply@github.com>
Tue, 19 May 2020 12:21:56 +0000 (15:21 +0300)
* Fix scrolling problem in table in Chrome 56+

Issue #8707, slightly modified cherry-pick of #10492

compatibility-themes/src/main/themes/VAADIN/themes/base/table/table.scss
themes/src/main/themes/VAADIN/themes/valo/components/_table.scss
uitest/src/main/java/com/vaadin/tests/components/table/TableScrollsOnRefresh.java [new file with mode: 0644]
uitest/src/test/java/com/vaadin/tests/components/table/TableScrollsOnRefreshTest.java [new file with mode: 0644]

index 22ffdffa4de0d8a8f4768f7645ebd5bfe3c23fe3..64f700c882f5a0391f0fec27fc407894c1cda105 100644 (file)
 }
 .#{$primaryStyleName}-body {
        border: 1px solid #aaa;
+       overflow-anchor: none; /* In Chrome 56+ */
 }
 .#{$primaryStyleName}-row-spacer {
        height: 10px;
index 4a88c925ff1b47d5558bf07ac3df8cd879743a59..8443438fe29eedafe548c225d3b79cb8fbdfc92f 100644 (file)
@@ -268,6 +268,7 @@ $v-table-background-color: null !default;
 
   .#{$primary-stylename}-body {
     border: $v-table-border-width solid $border-color;
+    overflow-anchor: none; /* In Chrome 56+ */
     @include user-select(text);
   }
 
diff --git a/uitest/src/main/java/com/vaadin/tests/components/table/TableScrollsOnRefresh.java b/uitest/src/main/java/com/vaadin/tests/components/table/TableScrollsOnRefresh.java
new file mode 100644 (file)
index 0000000..8d4ff11
--- /dev/null
@@ -0,0 +1,86 @@
+package com.vaadin.tests.components.table;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.VerticalLayout;
+import com.vaadin.v7.data.util.BeanItemContainer;
+import com.vaadin.v7.ui.Table;
+
+public class TableScrollsOnRefresh extends AbstractTestUI {
+    private Table table = new Table(
+            "scroll down table, so it loads next page, and then click 'refresh' button");
+    private Button refresh = new Button("refresh");
+    private BeanItemContainer<TableItem> container = new BeanItemContainer<TableItem>(
+            TableItem.class);
+
+    @Override
+    protected void setup(VaadinRequest request) {
+        refresh.addClickListener(new Button.ClickListener() {
+
+            @Override
+            public void buttonClick(Button.ClickEvent event) {
+                table.refreshRowCache();
+            }
+        });
+        table.setSizeFull();
+        addComponents(refresh, table);
+        VerticalLayout vl = getLayout();
+        vl.setExpandRatio(table, 1f);
+        vl.setSizeFull();
+        vl.getParent().setSizeFull();
+        table.setContainerDataSource(container);
+        populateContainer();
+    }
+
+    private void populateContainer() {
+        List<TableItem> items = new ArrayList<TableItem>();
+        for (int i = 0; i < 1000; i++) {
+            items.add(new TableItem("Item " + Integer.toString(i),
+                    "Item description " + Integer.toString(i)));
+
+        }
+        container.addAll(items);
+    }
+
+    @Override
+    protected String getTestDescription() {
+        return "Refreshing row cache shouldn't change scroll position.";
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 8707;
+    }
+
+    public class TableItem {
+
+        private String name;
+        private String description;
+
+        public TableItem(String name, String description) {
+            this.name = name;
+            this.description = description;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public void setDescription(String description) {
+            this.description = description;
+        }
+
+    }
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/table/TableScrollsOnRefreshTest.java b/uitest/src/test/java/com/vaadin/tests/components/table/TableScrollsOnRefreshTest.java
new file mode 100644 (file)
index 0000000..b078d00
--- /dev/null
@@ -0,0 +1,48 @@
+package com.vaadin.tests.components.table;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.elements.ButtonElement;
+import com.vaadin.testbench.elements.TableElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class TableScrollsOnRefreshTest extends MultiBrowserTest {
+
+    @Test
+    public void ensureNoScrolling() throws InterruptedException {
+        openTestURL();
+        TableElement table = $(TableElement.class).first();
+        table.scroll(10000);
+        sleep(500); // wait for both data requests
+        String firstCellText = getFirstVisibleCell(table).getText();
+
+        ButtonElement refresh = $(ButtonElement.class).first();
+        refresh.click();
+        sleep(500); // wait for both data requests
+        Assert.assertEquals(firstCellText,
+                getFirstVisibleCell(table).getText());
+
+        refresh.click();
+        sleep(500); // wait for both data requests
+        Assert.assertEquals(firstCellText,
+                getFirstVisibleCell(table).getText());
+    }
+
+    private WebElement getFirstVisibleCell(TableElement table) {
+        int tableBodyTop = table.findElement(By.className("v-table-body"))
+                .getLocation().getY();
+        List<WebElement> cells = table
+                .findElements(By.className("v-table-cell-content"));
+        for (WebElement cell : cells) {
+            if (cell.getLocation().getY() > tableBodyTop) {
+                return cell;
+            }
+        }
+        return null;
+    }
+}