]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix ComboBox in read-only mode allowing value change by user (#12022) pr12027/r15
authorTarek Oraby <42799254+tarekoraby@users.noreply.github.com>
Mon, 25 May 2020 09:21:11 +0000 (12:21 +0300)
committerGitHub <noreply@github.com>
Mon, 25 May 2020 09:21:11 +0000 (12:21 +0300)
* Fix ComboBox in read-only mode allowing value change by user

Fixes #12021

* Fix popup hiding condition

Co-authored-by: Tatu Lund <tatu@vaadin.com>
client/src/main/java/com/vaadin/client/ui/VComboBox.java
uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxReadOnlyPopup.java [new file with mode: 0644]
uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxReadOnlyPopupTest.java [new file with mode: 0644]

index 08c57f888aecef1f72b4a30de0e6a70d7a7395cf..6ff2f31a9a44c60849966502cd62d0598b298518 100644 (file)
@@ -2028,6 +2028,9 @@ public class VComboBox extends Composite implements Field, KeyDownHandler,
 
     /** For internal use only. May be removed or replaced in the future. */
     public void updateReadOnly() {
+        if (readonly) {
+            suggestionPopup.hide();
+        }
         debug("VComboBox: updateReadOnly()");
         tb.setReadOnly(readonly || !textInputEnabled);
     }
diff --git a/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxReadOnlyPopup.java b/uitest/src/main/java/com/vaadin/tests/components/combobox/ComboBoxReadOnlyPopup.java
new file mode 100644 (file)
index 0000000..a174a9a
--- /dev/null
@@ -0,0 +1,45 @@
+package com.vaadin.tests.components.combobox;
+
+import com.vaadin.event.ShortcutAction;
+import com.vaadin.event.ShortcutListener;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractReindeerTestUI;
+import com.vaadin.ui.ComboBox;
+
+public class ComboBoxReadOnlyPopup extends AbstractReindeerTestUI {
+
+    static final String[] ITEMS = { "First", "Second", "Third" };
+
+    @Override
+    protected void setup(VaadinRequest request) {
+        String boxLabel = String
+                .format("Press 'Q' to toggle ComboBox's read-only mode");
+        final ComboBox<String> comboBox = new ComboBox<>(boxLabel);
+
+        comboBox.setItems(ITEMS);
+        comboBox.setSelectedItem(ITEMS[0]);
+
+        ShortcutListener shortcutListener = new ShortcutListener("", null,
+                ShortcutAction.KeyCode.Q) {
+            @Override
+            public void handleAction(Object sender, Object target) {
+                comboBox.setReadOnly(!comboBox.isReadOnly());
+            }
+        };
+        comboBox.addShortcutListener(shortcutListener);
+
+        addComponents(comboBox);
+    }
+
+    @Override
+    protected String getTestDescription() {
+        return "ComboBox that turns to read-only mode while expanded "
+                + "should have its popup set to hidden.";
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 12021;
+    }
+
+}
diff --git a/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxReadOnlyPopupTest.java b/uitest/src/test/java/com/vaadin/tests/components/combobox/ComboBoxReadOnlyPopupTest.java
new file mode 100644 (file)
index 0000000..578f2b5
--- /dev/null
@@ -0,0 +1,26 @@
+package com.vaadin.tests.components.combobox;
+
+import static org.junit.Assert.assertFalse;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.ComboBoxElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class ComboBoxReadOnlyPopupTest extends MultiBrowserTest {
+
+    @Test
+    public void expandedComboBoxSetToReadOnlyShouldHidePopup() {
+        openTestURL();
+
+        ComboBoxElement comboBox = $(ComboBoxElement.class).first();
+        comboBox.openPopup();
+
+        // Calls comboBox.setReadOnly(true);
+        comboBox.sendKeys(String.valueOf('q'));
+
+        assertFalse("Read-only ComboBox's popup should be hidden!",
+                comboBox.isPopupOpen());
+    }
+
+}