diff options
author | Mehdi Javan <32511762+mehdi-vaadin@users.noreply.github.com> | 2018-07-10 11:09:53 +0300 |
---|---|---|
committer | Ilia Motornyi <elmot@vaadin.com> | 2018-07-10 11:09:53 +0300 |
commit | efb6403e5b64cec40728f30f49543fa8aa48d891 (patch) | |
tree | b581344818a7cff423a9596d32bf3f4573153996 | |
parent | e6807bf8dc701263fa062a80d09708b54f6dba49 (diff) | |
download | vaadin-framework-efb6403e5b64cec40728f30f49543fa8aa48d891.tar.gz vaadin-framework-efb6403e5b64cec40728f30f49543fa8aa48d891.zip |
Improve ComboBox keyboard behavior when an item is selected (#11031)
Ignoring filtering options when right arrow, left arrow, home or end key is pressed.
Fixes #11016
3 files changed, 98 insertions, 0 deletions
diff --git a/client/src/main/java/com/vaadin/client/ui/VComboBox.java b/client/src/main/java/com/vaadin/client/ui/VComboBox.java index 6e0c400baa..f80927ec1d 100644 --- a/client/src/main/java/com/vaadin/client/ui/VComboBox.java +++ b/client/src/main/java/com/vaadin/client/ui/VComboBox.java @@ -2361,9 +2361,13 @@ public class VComboBox extends Composite implements Field, KeyDownHandler, case KeyCodes.KEY_ALT: case KeyCodes.KEY_DOWN: case KeyCodes.KEY_UP: + case KeyCodes.KEY_RIGHT: + case KeyCodes.KEY_LEFT: case KeyCodes.KEY_PAGEDOWN: case KeyCodes.KEY_PAGEUP: case KeyCodes.KEY_ESCAPE: + case KeyCodes.KEY_HOME: + case KeyCodes.KEY_END: // NOP break; default: diff --git a/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxCaretNavigation.java b/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxCaretNavigation.java new file mode 100644 index 0000000000..cecd836bd4 --- /dev/null +++ b/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxCaretNavigation.java @@ -0,0 +1,14 @@ +package com.vaadin.tests.components.combobox; + +import com.vaadin.server.VaadinRequest; +import com.vaadin.tests.components.AbstractTestUI; +import com.vaadin.ui.ComboBox; + +public class ComboBoxCaretNavigation extends AbstractTestUI { + @Override + protected void setup(VaadinRequest request) { + ComboBox<String> comboBox = new ComboBox<>(); + comboBox.setItems("Badminton", "Chess", "Biking", "Running"); + addComponent(comboBox); + } +} diff --git a/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxCaretNavigationTest.java b/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxCaretNavigationTest.java new file mode 100644 index 0000000000..a1e0396107 --- /dev/null +++ b/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxCaretNavigationTest.java @@ -0,0 +1,80 @@ +package com.vaadin.tests.components.combobox; + +import com.vaadin.testbench.elements.ComboBoxElement; +import com.vaadin.tests.tb3.SingleBrowserTest; +import org.junit.Before; +import org.junit.Test; +import org.openqa.selenium.Keys; +import org.openqa.selenium.WebElement; + +import java.util.List; + +import static org.junit.Assert.assertArrayEquals; + +public class ComboBoxCaretNavigationTest extends SingleBrowserTest { + + @Override + @Before + public void setup() throws Exception { + super.setup(); + openTestURL(); + } + + @Test + public void testHomeAndEndKeys() { + ComboBoxElement comboBox = $(ComboBoxElement.class).first(); + String text = comboBox.getPopupSuggestions().get(1); + comboBox.selectByText(text); + comboBox.sendKeys(Keys.HOME); + assertCaretPosition("Home key didn't work well.", 0, comboBox); + comboBox.sendKeys(Keys.END); + assertCaretPosition("End key didn't work well.", text.length(), comboBox); + } + + @Test + public void testLeftAndRightKeys() { + ComboBoxElement comboBox = $(ComboBoxElement.class).first(); + String text = comboBox.getPopupSuggestions().get(1); + comboBox.selectByText(text); + comboBox.sendKeys(Keys.ARROW_LEFT); + assertCaretPosition("Left Arrow key didn't work well.", text.length() - 1, comboBox); + comboBox.sendKeys(Keys.ARROW_RIGHT); + assertCaretPosition("Right Arrow key didn't work well.", text.length(), comboBox); + } + + @Test + public void testHomeAndRightKeys() { + ComboBoxElement comboBox = $(ComboBoxElement.class).first(); + String text = comboBox.getPopupSuggestions().get(1); + comboBox.selectByText(text); + comboBox.sendKeys(Keys.HOME); + assertCaretPosition("Home key didn't work well.", 0, comboBox); + comboBox.sendKeys(Keys.ARROW_RIGHT); + assertCaretPosition("Right Arrow key didn't work well.", 1, comboBox); + } + + @Test + public void testLeftAndEndKeys() { + ComboBoxElement comboBox = $(ComboBoxElement.class).first(); + String text = comboBox.getPopupSuggestions().get(1); + comboBox.selectByText(text); + comboBox.sendKeys(Keys.ARROW_LEFT); + assertCaretPosition("Left Arrow key didn't work well.", text.length() - 1, comboBox); + comboBox.sendKeys(Keys.END); + assertCaretPosition("End key didn't work well.", text.length(), comboBox); + } + + private void assertCaretPosition(String message, int position, ComboBoxElement comboBox) { + assertArrayEquals(message, new int[]{position, position}, + getSelection(comboBox.getInputField())); + } + + private int[] getSelection(WebElement element) { + @SuppressWarnings("unchecked") + List<Long> range = (List<Long>) executeScript( + "return [arguments[0].selectionStart,arguments[0].selectionEnd]", + element); + return new int[]{range.get(0).intValue(), range.get(1).intValue()}; + } + +} |