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: I8c3c7c4904109018d2f91447235e30dbd29eec5dtags/7.2.7
@@ -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; | |||
} | |||
/** |
@@ -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; | |||
} | |||
} |
@@ -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); | |||
} | |||
} |