Title: [89624] trunk
Revision
89624
Author
[email protected]
Date
2011-06-23 15:13:30 -0700 (Thu, 23 Jun 2011)

Log Message

2011-06-23  Emil A Eklund  <[email protected]>

        Reviewed by Dimitri Glazkov.

        input/textarea onchange doesn't fire if value is set in key listener
        https://bugs.webkit.org/show_bug.cgi?id=63092

        Add test for text field onchange when setting the value in a key listener.

        * fast/events/onchange-setvalue-expected.txt: Added.
        * fast/events/onchange-setvalue.html: Added.
2011-06-23  Emil A Eklund  <[email protected]>

        Reviewed by Darin Adler.

        input/textarea onchange doesn't fire if value is set in key listener
        https://bugs.webkit.org/show_bug.cgi?id=63092

        Change setValue implementation of HTMLInputElement and HTMLTextAreaElement to
        not call setTextAsOfLastFormControlChangeEvent unless the value truly changed.
        Thus element.value = element.value will no longer reset the state
        m_textAsOfLastFormControlChangeEvent field and suppress the change event.

        Test: fast/events/onchange-setvalue.html

        * html/HTMLInputElement.cpp:
        (WebCore::HTMLInputElement::setValue):
        * html/HTMLTextAreaElement.cpp:
        (WebCore::HTMLTextAreaElement::setValue):
        (WebCore::HTMLTextAreaElement::setNonDirtyValue):
        (WebCore::HTMLTextAreaElement::setValueCommon):

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (89623 => 89624)


--- trunk/LayoutTests/ChangeLog	2011-06-23 22:11:50 UTC (rev 89623)
+++ trunk/LayoutTests/ChangeLog	2011-06-23 22:13:30 UTC (rev 89624)
@@ -1,3 +1,15 @@
+2011-06-23  Emil A Eklund  <[email protected]>
+
+        Reviewed by Dimitri Glazkov.
+
+        input/textarea onchange doesn't fire if value is set in key listener
+        https://bugs.webkit.org/show_bug.cgi?id=63092
+
+        Add test for text field onchange when setting the value in a key listener.
+
+        * fast/events/onchange-setvalue-expected.txt: Added.
+        * fast/events/onchange-setvalue.html: Added.
+
 2011-06-23  Wyatt Carss  <[email protected]>
 
         Reviewed by Ryosuke Niwa.

Added: trunk/LayoutTests/fast/events/onchange-setvalue-expected.txt (0 => 89624)


--- trunk/LayoutTests/fast/events/onchange-setvalue-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/events/onchange-setvalue-expected.txt	2011-06-23 22:13:30 UTC (rev 89624)
@@ -0,0 +1,14 @@
+PASS events.length is 2
+PASS events[0] is 'change e'
+PASS events[1] is 'change es'
+PASS events.length is 3
+PASS events[0] is 'change a'
+PASS events[1] is 'change ab'
+PASS events[2] is 'change abc'
+PASS events.length is 2
+PASS events[0] is 'change e'
+PASS events[1] is 'change es'
+PASS events.length is 2
+PASS events[0] is 'change e'
+PASS events[1] is 'change es'
+

Added: trunk/LayoutTests/fast/events/onchange-setvalue.html (0 => 89624)


--- trunk/LayoutTests/fast/events/onchange-setvalue.html	                        (rev 0)
+++ trunk/LayoutTests/fast/events/onchange-setvalue.html	2011-06-23 22:13:30 UTC (rev 89624)
@@ -0,0 +1,99 @@
+<html>
+<head>
+<script src=""
+<body>
+    <div id="test">
+        <input type="text">
+        <textarea type="text"></textarea>
+    </div>
+    <div id="console"></div>
+</body>
+<script>
+
+    if (window.layoutTestController)
+        layoutTestController.dumpAsText();
+
+    var events = [];
+
+    var UPPER_CASE_T_KEY_CODE = 84;
+    var LOWER_CASE_T_CHAR_CODE = 116;
+
+    function keyListener(event)
+    {
+        if (event.keyCode == UPPER_CASE_T_KEY_CODE || event.keyCode == LOWER_CASE_T_CHAR_CODE) 
+            event.preventDefault();
+        event.target.value = event.target.value.replace('t', '');
+    }
+    
+    function changeListener(event)
+    {
+        events.push(event.type + ' ' + event.target.value);
+    }
+
+    function sendKeysForString(target, str)
+    {
+        for (var i = 0; i < str.length; i++) {
+            target.focus();
+            eventSender.keyDown(str[i]);
+            target.blur();
+        }
+    }
+
+    // Replace value on keyup.
+    var inputElement = document.body.getElementsByTagName('input')[0];
+    inputElement.addEventListener('keyup', keyListener, false);
+    inputElement.addEventListener('change', changeListener, false);
+
+    if (window.eventSender)
+        sendKeysForString(inputElement, 'test');
+
+    shouldBe("events.length", "2");
+    shouldBe("events[0]", "'change e'");
+    shouldBe("events[1]", "'change es'");
+
+    var textAreaElement = document.body.getElementsByTagName('textarea')[0];
+    textAreaElement.addEventListener('keyup', keyListener, false);
+    textAreaElement.addEventListener('change', changeListener, false);
+    events.length = 0;
+
+    if (window.eventSender)
+        sendKeysForString(textAreaElement, 'atttbttc');
+
+    shouldBe("events.length", "3");
+    shouldBe("events[0]", "'change a'");
+    shouldBe("events[1]", "'change ab'");
+    shouldBe("events[2]", "'change abc'");
+
+
+    // Prevent default on keydown.
+    inputElement.removeEventListener('keyup', keyListener, false);
+    inputElement.addEventListener('keydown', keyListener, false);
+    inputElement.value = '';
+    events.length = 0;
+
+    if (window.eventSender)
+        sendKeysForString(inputElement, 'test');
+
+    shouldBe("events.length", "2");
+    shouldBe("events[0]", "'change e'");
+    shouldBe("events[1]", "'change es'");
+
+
+    // Prevent default on keypress.
+    inputElement.removeEventListener('keydown', keyListener, false);
+    inputElement.addEventListener('keypress', keyListener, false);
+    inputElement.value = '';
+    events.length = 0;
+
+    if (window.eventSender)
+        sendKeysForString(inputElement, 'test');
+
+    shouldBe("events.length", "2");
+    shouldBe("events[0]", "'change e'");
+    shouldBe("events[1]", "'change es'");
+    
+    // Hide test elements after run to avoid whitespace differences across platforms in the results.
+    document.getElementById('test').style.display = 'none';
+</script>
+</html> 
+

Modified: trunk/Source/WebCore/ChangeLog (89623 => 89624)


--- trunk/Source/WebCore/ChangeLog	2011-06-23 22:11:50 UTC (rev 89623)
+++ trunk/Source/WebCore/ChangeLog	2011-06-23 22:13:30 UTC (rev 89624)
@@ -1,3 +1,24 @@
+2011-06-23  Emil A Eklund  <[email protected]>
+
+        Reviewed by Darin Adler.
+
+        input/textarea onchange doesn't fire if value is set in key listener
+        https://bugs.webkit.org/show_bug.cgi?id=63092
+
+        Change setValue implementation of HTMLInputElement and HTMLTextAreaElement to
+        not call setTextAsOfLastFormControlChangeEvent unless the value truly changed.
+        Thus element.value = element.value will no longer reset the state 
+        m_textAsOfLastFormControlChangeEvent field and suppress the change event.
+
+        Test: fast/events/onchange-setvalue.html
+
+        * html/HTMLInputElement.cpp:
+        (WebCore::HTMLInputElement::setValue):
+        * html/HTMLTextAreaElement.cpp:
+        (WebCore::HTMLTextAreaElement::setValue):
+        (WebCore::HTMLTextAreaElement::setNonDirtyValue):
+        (WebCore::HTMLTextAreaElement::setValueCommon):
+
 2011-06-23  Alexis Menard  <[email protected]>
 
         Reviewed by Eric Carlson.

Modified: trunk/Source/WebCore/html/HTMLInputElement.cpp (89623 => 89624)


--- trunk/Source/WebCore/html/HTMLInputElement.cpp	2011-06-23 22:11:50 UTC (rev 89623)
+++ trunk/Source/WebCore/html/HTMLInputElement.cpp	2011-06-23 22:13:30 UTC (rev 89624)
@@ -976,19 +976,22 @@
     if (!m_inputType->canSetValue(value))
         return;
 
+    String sanitizedValue = sanitizeValue(value);
+    bool valueChanged = sanitizedValue != this->value();
+
     setFormControlValueMatchesRenderer(false);
     if (m_inputType->storesValueSeparateFromAttribute()) {
         if (files())
             files()->clear();
         else {
-            m_valueIfDirty = sanitizeValue(value);
+            m_valueIfDirty = sanitizedValue;
             m_wasModifiedByUser = sendChangeEvent;
             if (isTextField())
                 updatePlaceholderVisibility(false);
         }
         setNeedsStyleRecalc();
     } else
-        setAttribute(valueAttr, sanitizeValue(value));
+        setAttribute(valueAttr, sanitizedValue);
 
     setNeedsValidityCheck();
 
@@ -1000,6 +1003,10 @@
             cacheSelection(max, max);
         m_suggestedValue = String();
     }
+
+    if (!valueChanged)
+        return;
+    
     m_inputType->valueChanged();
 
     if (sendChangeEvent) {

Modified: trunk/Source/WebCore/html/HTMLTextAreaElement.cpp (89623 => 89624)


--- trunk/Source/WebCore/html/HTMLTextAreaElement.cpp	2011-06-23 22:11:50 UTC (rev 89623)
+++ trunk/Source/WebCore/html/HTMLTextAreaElement.cpp	2011-06-23 22:13:30 UTC (rev 89624)
@@ -303,7 +303,6 @@
     setValueCommon(value);
     m_isDirty = true;
     setNeedsValidityCheck();
-    setTextAsOfLastFormControlChangeEvent(value);
 }
 
 void HTMLTextAreaElement::setNonDirtyValue(const String& value)
@@ -311,7 +310,6 @@
     setValueCommon(value);
     m_isDirty = false;
     setNeedsValidityCheck();
-    setTextAsOfLastFormControlChangeEvent(value);
 }
 
 void HTMLTextAreaElement::setValueCommon(const String& value)
@@ -340,6 +338,7 @@
     }
 
     notifyFormStateChanged(this);
+    setTextAsOfLastFormControlChangeEvent(normalizedValue);
 }
 
 String HTMLTextAreaElement::defaultValue() const
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to