From 52b98ccd173682355af9396ce216ce5a98993194 Mon Sep 17 00:00:00 2001 From: Bogdan Udrescu Date: Mon, 11 Aug 2014 13:08:39 +0300 Subject: [PATCH] Prevent browser to scroll when space it pressed on a TabSheet (#14320) Browser page scroll by default when space key is pressed. The TabSheet uses the space key (32) to select the tab when navigating using left/right keys. So when the space is pressed the default browser page scroll behavior is now prevented. Change-Id: I8c3c7c4904109018d2f91447235e30dbd29eec5d --- .../src/com/vaadin/client/ui/VTabsheet.java | 16 ++++- .../tabsheet/TabSpaceNotScroll.java | 67 +++++++++++++++++++ .../tabsheet/TabSpaceNotScrollTest.java | 54 +++++++++++++++ 3 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 uitest/src/com/vaadin/tests/components/tabsheet/TabSpaceNotScroll.java create mode 100644 uitest/src/com/vaadin/tests/components/tabsheet/TabSpaceNotScrollTest.java diff --git a/client/src/com/vaadin/client/ui/VTabsheet.java b/client/src/com/vaadin/client/ui/VTabsheet.java index 15d9c83c49..35fdebf353 100644 --- a/client/src/com/vaadin/client/ui/VTabsheet.java +++ b/client/src/com/vaadin/client/ui/VTabsheet.java @@ -1280,6 +1280,7 @@ public class VTabsheet extends VTabsheetBase implements Focusable, if (event.getSource() instanceof Tab) { int keycode = event.getNativeEvent().getKeyCode(); + // Scroll throw the tabs. if (!event.isAnyModifierKeyDown()) { if (keycode == getPreviousTabKey()) { selectPreviousTab(); @@ -1294,6 +1295,10 @@ public class VTabsheet extends VTabsheetBase implements Focusable, } } else if (keycode == getSelectTabKey()) { loadTabSheet(focusedTabIndex); + + // Prevent the page from scrolling when hitting space + // (select key) to select the current tab. + event.preventDefault(); } } } @@ -1307,8 +1312,17 @@ public class VTabsheet extends VTabsheetBase implements Focusable, return KeyCodes.KEY_LEFT; } + /** + * Gets the key to activate the selected tab when navigating using + * previous/next (left/right) keys. + * + * @return the key to activate the selected tab. + * + * @see #getNextTabKey() + * @see #getPreviousTabKey() + */ protected int getSelectTabKey() { - return 32; // Space key + return KeyCodes.KEY_SPACE; } /** diff --git a/uitest/src/com/vaadin/tests/components/tabsheet/TabSpaceNotScroll.java b/uitest/src/com/vaadin/tests/components/tabsheet/TabSpaceNotScroll.java new file mode 100644 index 0000000000..3a5be51e47 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/tabsheet/TabSpaceNotScroll.java @@ -0,0 +1,67 @@ +/* + * Copyright 2000-2014 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.tabsheet; + +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Component; +import com.vaadin.ui.Label; +import com.vaadin.ui.TabSheet; +import com.vaadin.ui.VerticalLayout; + +/** + * If the space is pressed on the tabs of a tabsheet the browser default scroll + * behavior must be prevented. + * + * @since + * @author Vaadin Ltd + */ +public class TabSpaceNotScroll extends AbstractTestUI { + + @Override + protected void setup(VaadinRequest request) { + TabSheet tabSheet = new TabSheet(); + + for (int i = 0; i < 5; i++) { + String caption = "Tab " + i; + Component c = new Label(caption); + tabSheet.addTab(c, caption); + } + + addComponent(tabSheet); + + Label dontShowThis = new Label("Page scroll. This is bad."); + + VerticalLayout panel = new VerticalLayout(); + panel.setHeight("2000px"); + panel.addComponent(dontShowThis); + panel.setComponentAlignment(dontShowThis, Alignment.MIDDLE_CENTER); + + addComponent(panel); + } + + @Override + protected String getTestDescription() { + return "Pressing space on the tab should not scroll."; + } + + @Override + protected Integer getTicketNumber() { + return 14320; + } + +} diff --git a/uitest/src/com/vaadin/tests/components/tabsheet/TabSpaceNotScrollTest.java b/uitest/src/com/vaadin/tests/components/tabsheet/TabSpaceNotScrollTest.java new file mode 100644 index 0000000000..c35248c1f4 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/tabsheet/TabSpaceNotScrollTest.java @@ -0,0 +1,54 @@ +/* + * Copyright 2000-2014 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.tabsheet; + +import java.io.IOException; + +import org.junit.Assert; +import org.junit.Test; +import org.openqa.selenium.By; +import org.openqa.selenium.Keys; +import org.openqa.selenium.Point; + +import com.vaadin.testbench.TestBenchElement; +import com.vaadin.tests.tb3.MultiBrowserTest; + +/** + * Test if the page scroll when press space on a tabsheet's tab. + * + * @since + * @author Vaadin Ltd + */ +public class TabSpaceNotScrollTest extends MultiBrowserTest { + + @Test + public void testScroll() throws InterruptedException, IOException { + openTestURL(); + + TestBenchElement tab = (TestBenchElement) getDriver().findElement( + By.className("v-tabsheet-tabitemcell")); + tab.click(10, 10); + + Point oldLocation = tab.getLocation(); + + tab.sendKeys(Keys.SPACE); + + Point newLocation = tab.getLocation(); + + Assert.assertEquals(oldLocation, newLocation); + } + +} -- 2.39.5