diff options
author | Olli Tietäväinen <ollit@vaadin.com> | 2017-04-13 10:56:25 +0300 |
---|---|---|
committer | Ilia Motornyi <elmot@vaadin.com> | 2017-04-13 09:56:25 +0200 |
commit | cf93a67297f8936cd3b6456806bcc4a1e804a732 (patch) | |
tree | 636d053b188d4b54cfd5c3ad17eed037c3d2bfcd | |
parent | 22c39d36f81a6d37f729d67135487ef10cb8dc5a (diff) | |
download | vaadin-framework-cf93a67297f8936cd3b6456806bcc4a1e804a732.tar.gz vaadin-framework-cf93a67297f8936cd3b6456806bcc4a1e804a732.zip |
Panel.setScrollTop() fails with impossibly large numbers
Fixes #1149
3 files changed, 110 insertions, 0 deletions
diff --git a/client/src/main/java/com/vaadin/client/ui/panel/PanelConnector.java b/client/src/main/java/com/vaadin/client/ui/panel/PanelConnector.java index 2e5237598f..5e22b9ef32 100644 --- a/client/src/main/java/com/vaadin/client/ui/panel/PanelConnector.java +++ b/client/src/main/java/com/vaadin/client/ui/panel/PanelConnector.java @@ -226,7 +226,14 @@ public class PanelConnector extends AbstractSingleComponentContainerConnector public void postLayout() { VPanel panel = getWidget(); if (uidlScrollTop != null) { + // IE / Safari fix for when scroll top is set to greater than panel + // height + int maxScroll = panel.getWidget().getOffsetHeight(); + if (uidlScrollTop > maxScroll) { + uidlScrollTop = maxScroll; + } panel.contentNode.setScrollTop(uidlScrollTop.intValue()); + // Read actual value back to ensure update logic is correct // TODO Does this trigger reflows? panel.scrollTop = panel.contentNode.getScrollTop(); diff --git a/uitest/src/main/java/com/vaadin/tests/components/panel/PanelSetScrollTopWithLargeNumber.java b/uitest/src/main/java/com/vaadin/tests/components/panel/PanelSetScrollTopWithLargeNumber.java new file mode 100755 index 0000000000..03368de4dc --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/panel/PanelSetScrollTopWithLargeNumber.java @@ -0,0 +1,56 @@ +/* + * Copyright 2000-2017 Vaadin Ltd. + * + * 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.vaadin.tests.components.panel; + +import com.vaadin.server.VaadinRequest; +import com.vaadin.shared.ui.ContentMode; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.Label; +import com.vaadin.ui.Panel; +import com.vaadin.ui.VerticalLayout; + +public class PanelSetScrollTopWithLargeNumber extends AbstractTestUI { + + Panel panel = new Panel(); + + @Override + public String getDescription() { + return "Click the button to scroll down " + Integer.MAX_VALUE + + " pixels"; + } + + @Override + protected Integer getTicketNumber() { + return 1149; + } + + @Override + protected void setup(VaadinRequest request) { + final VerticalLayout layout = new VerticalLayout(); + layout.setSizeUndefined(); + panel.setHeight("500px"); + String s = ""; + for (int i = 0; i < 10000; i++) { + s += i + "<br />"; + } + Label label = new Label(s, ContentMode.HTML); + layout.addComponent(label); + panel.setContent(layout); + panel.setScrollTop(Integer.MAX_VALUE); + addComponent(panel); + } + +} diff --git a/uitest/src/test/java/com/vaadin/tests/components/panel/PanelSetScrollTopWithLargeNumberTest.java b/uitest/src/test/java/com/vaadin/tests/components/panel/PanelSetScrollTopWithLargeNumberTest.java new file mode 100755 index 0000000000..9ddaf71596 --- /dev/null +++ b/uitest/src/test/java/com/vaadin/tests/components/panel/PanelSetScrollTopWithLargeNumberTest.java @@ -0,0 +1,47 @@ +/* + * Copyright 2000-2017 Vaadin Ltd. + * + * 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.vaadin.tests.components.panel; + +import org.junit.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import com.vaadin.testbench.elements.PanelElement; +import com.vaadin.tests.tb3.MultiBrowserTest; + +public class PanelSetScrollTopWithLargeNumberTest extends MultiBrowserTest { + private PanelElement panel; + + @Override + public void setup() throws Exception { + super.setup(); + openTestURL(); + waitForElementPresent(By.className("v-panel")); + panel = $(PanelElement.class).first(); + } + + @Test + public void testSetScrollTopWithLargeNumber() { + WebElement contentNode = panel + .findElement(By.className("v-panel-content")); + int panelContentScrollTop = ((Number) executeScript( + "return arguments[0].scrollTop", contentNode)).intValue(); + assertGreater( + "Panel should scroll when scrollTop is set to a number larger than panel height", + panelContentScrollTop, 0); + } + +} |