]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fix ComboBox cleared suggestion popup on ItemSetChange (#13635)
authorTeemu Suo-Anttila <teemusa@vaadin.com>
Mon, 28 Apr 2014 11:26:26 +0000 (14:26 +0300)
committerTeemu Suo-Anttila <teemusa@vaadin.com>
Wed, 30 Apr 2014 08:15:52 +0000 (11:15 +0300)
Change-Id: I77285e17819daf1b8328a8aea6d62a6b6b53510c

client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java
uitest/src/com/vaadin/tests/components/combobox/ComboBoxItemAddingWithFocusListener.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/components/combobox/ComboBoxItemAddingWithFocusListenerTest.java [new file with mode: 0644]

index 34c140fbe39f7e31584471bbbe0a93d61daecb8c..6c8ccf32a819317212d53b71431fa6b8017639a9 100644 (file)
@@ -121,6 +121,10 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
         boolean suggestionsChanged = !getWidget().initDone
                 || !newSuggestions.equals(getWidget().currentSuggestions);
 
+        // An ItemSetChangeEvent on server side clears the current suggestion
+        // popup. Popup needs to be repopulated with suggestions from UIDL.
+        boolean popupOpenAndCleared = false;
+
         oldSuggestionTextMatchTheOldSelection = false;
 
         if (suggestionsChanged) {
@@ -141,6 +145,7 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
                  * menu might not necessary exist in select at all anymore.
                  */
                 getWidget().suggestionPopup.menu.clearItems();
+                popupOpenAndCleared = getWidget().suggestionPopup.isAttached();
 
             }
 
@@ -159,9 +164,9 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
             }
         }
 
-        if (getWidget().waitingForFilteringResponse
-                && getWidget().lastFilter.toLowerCase().equals(
-                        uidl.getStringVariable("filter"))) {
+        if ((getWidget().waitingForFilteringResponse && getWidget().lastFilter
+                .toLowerCase().equals(uidl.getStringVariable("filter")))
+                || popupOpenAndCleared) {
             getWidget().suggestionPopup.showSuggestions(
                     getWidget().currentSuggestions, getWidget().currentPage,
                     getWidget().totalMatches);
diff --git a/uitest/src/com/vaadin/tests/components/combobox/ComboBoxItemAddingWithFocusListener.java b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxItemAddingWithFocusListener.java
new file mode 100644 (file)
index 0000000..730be1e
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * 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.combobox;
+
+import com.vaadin.event.FieldEvents.FocusEvent;
+import com.vaadin.event.FieldEvents.FocusListener;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.ComboBox;
+
+/**
+ * Test UI to verify that focus event actually update the ComboBox suggestion
+ * popup
+ * 
+ * @author Vaadin Ltd
+ */
+public class ComboBoxItemAddingWithFocusListener extends AbstractTestUI {
+
+    private ComboBox cBox;
+
+    @Override
+    protected void setup(VaadinRequest request) {
+        cBox = new ComboBox();
+        addComponent(cBox);
+        cBox.setImmediate(true);
+        cBox.addItem("Foo");
+        cBox.addItem("Bar");
+        cBox.addFocusListener(new FocusListener() {
+
+            int x = 0;
+
+            @Override
+            public void focus(FocusEvent event) {
+                cBox.addItem("Focus" + (x++));
+            }
+
+        });
+        addComponent(new Button("Focus Target"));
+    }
+
+    @Override
+    protected String getTestDescription() {
+        return "Item adding in focus listener causes popup to clear";
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 13635;
+    }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/combobox/ComboBoxItemAddingWithFocusListenerTest.java b/uitest/src/com/vaadin/tests/components/combobox/ComboBoxItemAddingWithFocusListenerTest.java
new file mode 100644 (file)
index 0000000..6184fed
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * 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.combobox;
+
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.testbench.By;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class ComboBoxItemAddingWithFocusListenerTest extends MultiBrowserTest {
+
+    private final String comboBoxSelector = "/VVerticalLayout[0]/VVerticalLayout[0]/VFilterSelect[0]";
+
+    @Test
+    public void testPopupViewContainsAddedItem() {
+        openTestURL();
+        WebElement cbTextbox = driver.findElement(By.vaadin(comboBoxSelector
+                + "#textbox"));
+        WebElement focusTarget = driver.findElement(By
+                .vaadin("/VVerticalLayout[0]/VVerticalLayout[0]/VButton[0]"));
+        driver.findElement(By.vaadin(comboBoxSelector + "#button")).click();
+        int i = 0;
+        while (i < 3) {
+            assertTrue("No item added on focus", getPopupSuggestions()
+                    .contains("Focus" + i++));
+            focus(focusTarget);
+            focus(cbTextbox);
+        }
+        assertTrue("No item added on focus",
+                getPopupSuggestions().contains("Focus" + i));
+    }
+
+    /**
+     * @param focusTarget
+     *            Element to focus
+     */
+    private void focus(WebElement focusTarget) {
+        JavascriptExecutor jse = (JavascriptExecutor) driver;
+
+        Object ret = jse.executeScript(
+                "try { arguments[0].focus() } catch(e) {}; return null;",
+                focusTarget);
+    }
+
+    /**
+     * @return List of Suggestion in Popup
+     */
+    private List<String> getPopupSuggestions() {
+        List<String> suggestionsTexts = new ArrayList<String>();
+        List<WebElement> suggestions = driver.findElement(
+                By.vaadin(comboBoxSelector + "#popup")).findElements(
+                By.tagName("span"));
+        for (WebElement suggestion : suggestions) {
+            String text = suggestion.getText();
+            if (!text.isEmpty()) {
+                suggestionsTexts.add(text);
+            }
+        }
+        return suggestionsTexts;
+    }
+}