]> source.dussan.org Git - vaadin-framework.git/commitdiff
Prevent field from updating when removing text change listener. (#16270)
authorSauli Tähkäpää <sauli@vaadin.com>
Fri, 16 Jan 2015 21:19:06 +0000 (23:19 +0200)
committerVaadin Code Review <review@vaadin.com>
Mon, 8 Jun 2015 14:19:19 +0000 (14:19 +0000)
Change-Id: I65c598ae71414550eb648fabf6e94fb1dabbef97

client/src/com/vaadin/client/ui/textfield/TextFieldConnector.java
server/src/com/vaadin/ui/AbstractTextField.java
uitest/src/com/vaadin/tests/components/textfield/RemoveTextChangeListener.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/components/textfield/RemoveTextChangeListenerTest.java [new file with mode: 0644]

index 0d85e98ee310d359a04bb77c52ab58667f33663c..fad094b87fa7a13ae8644bfa32c233031304ac8c 100644 (file)
@@ -89,10 +89,9 @@ public class TextFieldConnector extends AbstractFieldConnector implements
          * side value). <input> is updated only when it looses focus, so we
          * force updating if not focused. Lost focus issue appeared in (#15144)
          */
-        if (!(Util.getFocusedElement() == getWidget().getElement())
+        if (Util.getFocusedElement() != getWidget().getElement()
                 || !uidl.getBooleanAttribute(TextFieldConstants.ATTR_NO_VALUE_CHANGE_BETWEEN_PAINTS)
-                || getWidget().valueBeforeEdit == null
-                || !text.equals(getWidget().valueBeforeEdit)) {
+                || getWidget().valueBeforeEdit == null) {
             getWidget().updateFieldContent(text);
         }
 
index 93025ac0fdd7fad9614a9f6deeb326403f5b433d..14c135228c9d30ad8740dca642659766670fd82d 100644 (file)
@@ -126,25 +126,22 @@ public abstract class AbstractTextField extends AbstractField<String> implements
             selectionPosition = -1;
         }
 
-        if (hasListeners(TextChangeEvent.class)) {
-            target.addAttribute(TextFieldConstants.ATTR_TEXTCHANGE_EVENTMODE,
-                    getTextChangeEventMode().toString());
-            target.addAttribute(TextFieldConstants.ATTR_TEXTCHANGE_TIMEOUT,
-                    getTextChangeTimeout());
-            if (lastKnownTextContent != null) {
-                /*
-                 * The field has be repainted for some reason (e.g. caption,
-                 * size, stylename), but the value has not been changed since
-                 * the last text change event. Let the client side know about
-                 * the value the server side knows. Client side may then ignore
-                 * the actual value, depending on its state.
-                 */
-                target.addAttribute(
-                        TextFieldConstants.ATTR_NO_VALUE_CHANGE_BETWEEN_PAINTS,
-                        true);
-            }
+        target.addAttribute(TextFieldConstants.ATTR_TEXTCHANGE_EVENTMODE,
+                getTextChangeEventMode().toString());
+        target.addAttribute(TextFieldConstants.ATTR_TEXTCHANGE_TIMEOUT,
+                getTextChangeTimeout());
+        if (lastKnownTextContent != null) {
+            /*
+             * The field has be repainted for some reason (e.g. caption, size,
+             * stylename), but the value has not been changed since the last
+             * text change event. Let the client side know about the value the
+             * server side knows. Client side may then ignore the actual value,
+             * depending on its state.
+             */
+            target.addAttribute(
+                    TextFieldConstants.ATTR_NO_VALUE_CHANGE_BETWEEN_PAINTS,
+                    true);
         }
-
     }
 
     @Override
diff --git a/uitest/src/com/vaadin/tests/components/textfield/RemoveTextChangeListener.java b/uitest/src/com/vaadin/tests/components/textfield/RemoveTextChangeListener.java
new file mode 100644 (file)
index 0000000..339160e
--- /dev/null
@@ -0,0 +1,32 @@
+package com.vaadin.tests.components.textfield;
+
+import com.vaadin.event.FieldEvents;
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.TextField;
+
+public class RemoveTextChangeListener extends AbstractTestUI {
+    @Override
+    protected void setup(VaadinRequest request) {
+        final TextField textfield = new TextField();
+
+        textfield.addTextChangeListener(new FieldEvents.TextChangeListener() {
+            @Override
+            public void textChange(FieldEvents.TextChangeEvent event) {
+                textfield.removeTextChangeListener(this);
+            }
+        });
+
+        addComponent(textfield);
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 16270;
+    }
+
+    @Override
+    protected String getTestDescription() {
+        return "Removing text change listener on text change event should not reset the input.";
+    }
+}
diff --git a/uitest/src/com/vaadin/tests/components/textfield/RemoveTextChangeListenerTest.java b/uitest/src/com/vaadin/tests/components/textfield/RemoveTextChangeListenerTest.java
new file mode 100644 (file)
index 0000000..0b87686
--- /dev/null
@@ -0,0 +1,24 @@
+package com.vaadin.tests.components.textfield;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import org.junit.Test;
+
+import com.vaadin.testbench.elements.TextFieldElement;
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class RemoveTextChangeListenerTest extends MultiBrowserTest {
+
+    @Test
+    public void serverValueIsUpdated() {
+        openTestURL();
+
+        TextFieldElement textfield = $(TextFieldElement.class).first();
+
+        textfield.sendKeys("f");
+
+        assertThat(textfield.getValue(), is("f"));
+    }
+
+}
\ No newline at end of file