]> source.dussan.org Git - vaadin-framework.git/commitdiff
Add IE11 workaround for ListSelect multiselection. (#11631)
authorAnna Koskinen <Ansku@users.noreply.github.com>
Thu, 20 Jun 2019 12:27:54 +0000 (15:27 +0300)
committerZhe Sun <31067185+ZheSun88@users.noreply.github.com>
Tue, 25 Jun 2019 12:58:20 +0000 (15:58 +0300)
Fixes #11608

client/src/main/java/com/vaadin/client/ui/VListSelect.java
uitest/src/test/java/com/vaadin/tests/components/listselect/ListSelectMultiSelectionTest.java [new file with mode: 0644]

index f1a0b868baa51ae1a289af128e35fcee5b0bef6b..2a3b98996eff7734d8fae83973f94791e4a4cb67 100644 (file)
@@ -26,6 +26,7 @@ import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.FlowPanel;
 import com.google.gwt.user.client.ui.HasEnabled;
 import com.google.gwt.user.client.ui.ListBox;
+import com.vaadin.client.BrowserInfo;
 import com.vaadin.client.FastStringSet;
 import com.vaadin.client.Focusable;
 import com.vaadin.client.connectors.AbstractMultiSelectConnector.MultiSelectWidget;
@@ -119,7 +120,12 @@ public class VListSelect extends Composite
         for (int i = 0; i < items.size(); i++) {
             final JsonObject item = items.get(i);
             // reuse existing option if possible
-            final String key = MultiSelectWidget.getKey(item);
+            String key = MultiSelectWidget.getKey(item);
+            if (BrowserInfo.get().isIE11() && key != null) {
+                // IE11 doesn't handle numerical keys well on Win7,
+                // prevent incorrect type handling with extra character
+                key += " ";
+            }
             if (i < select.getItemCount()) {
                 select.setItemText(i, MultiSelectWidget.getCaption(item));
                 select.setValue(i, key);
@@ -148,7 +154,12 @@ public class VListSelect extends Composite
         final FastStringSet selectedItemKeys = FastStringSet.create();
         for (int i = 0; i < select.getItemCount(); i++) {
             if (select.isItemSelected(i)) {
-                selectedItemKeys.add(select.getValue(i));
+                String key = select.getValue(i);
+                if (BrowserInfo.get().isIE11() && key != null) {
+                    // remove the IE11 workaround
+                    key = key.trim();
+                }
+                selectedItemKeys.add(key);
             }
         }
         return selectedItemKeys;
diff --git a/uitest/src/test/java/com/vaadin/tests/components/listselect/ListSelectMultiSelectionTest.java b/uitest/src/test/java/com/vaadin/tests/components/listselect/ListSelectMultiSelectionTest.java
new file mode 100644 (file)
index 0000000..a5b2c63
--- /dev/null
@@ -0,0 +1,56 @@
+package com.vaadin.tests.components.listselect;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+
+import org.junit.Test;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Actions;
+import org.openqa.selenium.support.ui.Select;
+
+import com.vaadin.testbench.By;
+import com.vaadin.testbench.elements.ListSelectElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class ListSelectMultiSelectionTest extends MultiBrowserTest {
+
+    @Override
+    protected Class<?> getUIClass() {
+        return ListSelectTestUI.class;
+    }
+
+    @Test
+    public void testShiftSelect() {
+        openTestURL();
+
+        ListSelectElement listSelect = $(ListSelectElement.class).first();
+        Select select = new Select(listSelect.getSelectElement());
+        List<WebElement> options = listSelect
+                .findElements(By.tagName("option"));
+        options.get(0).click();
+
+        List<WebElement> selected = select.getAllSelectedOptions();
+        assertEquals(1, selected.size());
+        assertEquals("Item 0", selected.get(0).getText());
+
+        new Actions(getDriver()).keyDown(Keys.SHIFT).perform();
+        options.get(1).click();
+        new Actions(getDriver()).keyUp(Keys.SHIFT).perform();
+
+        selected = select.getAllSelectedOptions();
+        assertEquals(2, selected.size());
+        assertEquals("Item 1", selected.get(1).getText());
+
+        new Actions(getDriver()).keyDown(Keys.SHIFT).perform();
+        options.get(2).click();
+        new Actions(getDriver()).keyUp(Keys.SHIFT).perform();
+
+        // ensure second shift selection added instead of moved
+        selected = select.getAllSelectedOptions();
+        assertEquals(3, selected.size());
+        assertEquals("Item 2", selected.get(2).getText());
+        assertEquals("Item 0", selected.get(0).getText());
+    }
+}