2011-04-29 Emil A Eklund <eae@chromium.org>
authoreae@chromium.org <eae@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 30 Apr 2011 00:15:01 +0000 (00:15 +0000)
committereae@chromium.org <eae@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 30 Apr 2011 00:15:01 +0000 (00:15 +0000)
        Reviewed by Dimitri Glazkov.

        Onchange on text fields has an incoherent behavior
        https://bugs.webkit.org/show_bug.cgi?id=57330

        Add tests for typing and then deleting text from an empty field.

        * fast/events/onchange-text-form-field-expected.txt:
        * fast/events/onchange-text-form-field.html:
        * platform/gtk/fast/events/onchange-text-form-field-expected.txt: Removed.
2011-04-29  Emil A Eklund  <eae@chromium.org>

        Reviewed by Dimitri Glazkov.

        Onchange on text fields has an incoherent behavior
        https://bugs.webkit.org/show_bug.cgi?id=57330

        * html/HTMLFormControlElement.cpp:
        (WebCore::HTMLTextFormControlElement::insertedIntoDocument):
        Initialize m_textAsOfLastFormControlChangeEvent to empty string rather
        than null for empty fields.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@85373 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/events/onchange-text-form-field-expected.txt
LayoutTests/fast/events/onchange-text-form-field.html
LayoutTests/platform/gtk/fast/events/onchange-text-form-field-expected.txt [deleted file]
Source/WebCore/ChangeLog
Source/WebCore/html/HTMLFormControlElement.cpp

index 8a58dfb..f958d1e 100644 (file)
@@ -1,3 +1,16 @@
+2011-04-29  Emil A Eklund  <eae@chromium.org>
+
+        Reviewed by Dimitri Glazkov.
+
+        Onchange on text fields has an incoherent behavior
+        https://bugs.webkit.org/show_bug.cgi?id=57330
+
+        Add tests for typing and then deleting text from an empty field.
+
+        * fast/events/onchange-text-form-field-expected.txt:
+        * fast/events/onchange-text-form-field.html:
+        * platform/gtk/fast/events/onchange-text-form-field-expected.txt: Removed.
+
 2011-04-29  Kenneth Russell  <kbr@google.com>
 
         Unreviewed. Merged in all downstream Chromium test expectations.
index 6caa63a..ee881c4 100644 (file)
@@ -1,26 +1,32 @@
-      
-PASS simulateTextEntry(elements[0], '', true); is false
-PASS simulateTextEntry(elements[0], 'fo', true); is true
-PASS simulateTextEntry(elements[0], 'o', false); is true
-PASS simulateTextEntry(elements[0], 'foo', true); is false
-PASS simulateTextEntry(elements[0], 'foo', true); is false
-PASS simulateTextEntry(elements[0], ' ', false); is true
-PASS simulateTextEntry(elements[0], 'foo bar', true); is true
-PASS simulateTextEntry(elements[0], 'foo bar', true); is false
+PASS simulateTextEntry(elements[0], '', BEFORE); is false
+PASS simulateTextEntry(elements[0], 'fo', BEFORE); is true
+PASS simulateTextEntry(elements[0], 'o'); is true
+PASS simulateTextEntry(elements[0], 'foo', BEFORE); is false
+PASS simulateTextEntry(elements[0], 'foo', BEFORE); is false
+PASS simulateTextEntry(elements[0], ' '); is true
+PASS simulateTextEntry(elements[0], 'foo bar', BEFORE); is true
+PASS simulateTextEntry(elements[0], 'foo bar', BEFORE); is false
 PASS setTextValue(elements[0], 'foo'); is false
-PASS simulateTextEntry(elements[0], 'foo bar', true); is true
-PASS simulateTextEntry(elements[1], '', true); is true
-PASS simulateTextEntry(elements[1], 'fo', true); is true
-PASS simulateTextEntry(elements[1], 'o', false); is true
-PASS simulateTextEntry(elements[1], 'foo', true); is false
-PASS simulateTextEntry(elements[2], '', true); is false
-PASS simulateTextEntry(elements[2], 'fo', true); is true
-PASS simulateTextEntry(elements[2], 'o', false); is true
-PASS simulateTextEntry(elements[2], 'foo', true); is false
-PASS simulateTextEntry(elements[3], 'foo', true); is false
-PASS simulateTextEntry(elements[3], 'foo', true); is false
+PASS simulateTextEntry(elements[0], 'foo bar', BEFORE); is true
+PASS simulateTextEntry(elements[1], '', BEFORE); is true
+PASS simulateTextEntry(elements[1], 'fo', BEFORE); is true
+PASS simulateTextEntry(elements[1], 'o'); is true
+PASS simulateTextEntry(elements[1], 'foo', BEFORE); is false
+PASS simulateTextEntry(elements[2], 'wee', AFTER); is false
+PASS simulateTextEntry(elements[2], 'foo', BEFORE | AFTER); is false
+PASS simulateTextEntry(elements[2], 'fo', BEFORE); is true
+PASS simulateTextEntry(elements[2], 'o'); is true
+PASS simulateTextEntry(elements[2], 'foo', BEFORE); is false
+PASS simulateTextEntry(elements[3], 'foo', BEFORE); is false
+PASS simulateTextEntry(elements[3], 'foo', BEFORE); is false
 PASS setTextValue(elements[3], ''); is false
-PASS simulateTextEntry(elements[3], 'fo', true); is true
-PASS simulateTextEntry(elements[3], 'o', false); is true
-PASS simulateTextEntry(elements[3], 'foo', true); is false
+PASS simulateTextEntry(elements[3], 'fo', BEFORE); is true
+PASS simulateTextEntry(elements[3], 'o'); is true
+PASS simulateTextEntry(elements[3], 'foo', BEFORE); is false
+PASS simulateTextEntry(elements[4], 'foo', AFTER); is false
+PASS simulateTextEntry(elements[4], 'foo'); is true
+PASS simulateTextEntry(elements[4], 'foo', BEFORE); is false
+PASS simulateTextEntry(elements[4], 'foo', BEFORE | AFTER); is true
+PASS simulateTextEntry(elements[4], '', AFTER); is false
+PASS simulateTextEntry(elements[4], 'foo', AFTER); is false
 
index b2517d1..c6b7438 100644 (file)
@@ -7,12 +7,17 @@
         <input type="text"value="foo">
         <textarea></textarea>
         <textarea>foo</textarea>
+        <input type="text">
     </div>
     <div id="console"></div>
 </body>
 <script>
 
-    function simulateTextEntry(element, text, opt_clear) {
+    var BEFORE = 1;
+    var AFTER = 2;
+
+    function simulateTextEntry(element, text, opt_clear)
+    {
         if (!window.eventSender)
             return null;
             
         }
         element.addEventListener('change', listener, false);
         element.focus();
-        if (opt_clear) {
+        if (opt_clear & BEFORE) {
             element.select();
             eventSender.keyDown('delete');
         }
         for (var i = 0; i < text.length; i++) {
             eventSender.keyDown(text.charAt(i));
         }
+        if (opt_clear & AFTER) {
+            element.select();
+            eventSender.keyDown('delete');
+        }
         element.blur();
         element.removeEventListener('change', listener, false);
         return firedEvent;
     }
 
 
-    function setTextValue(element, text) {
+    function setTextValue(element, text)
+    {
         var firedEvent = false;
         function listener(event) {
             firedEvent = true;
 
     var elements = document.getElementById('test').getElementsByTagName('*');
 
-    shouldBe("simulateTextEntry(elements[0], '', true);", "false");
-    shouldBe("simulateTextEntry(elements[0], 'fo', true);", "true");
-    shouldBe("simulateTextEntry(elements[0], 'o', false);", "true");
-    shouldBe("simulateTextEntry(elements[0], 'foo', true); ", "false");
-    shouldBe("simulateTextEntry(elements[0], 'foo', true); ", "false");
-    shouldBe("simulateTextEntry(elements[0], ' ', false); ", "true");
-    shouldBe("simulateTextEntry(elements[0], 'foo bar', true); ", "true");
-    shouldBe("simulateTextEntry(elements[0], 'foo bar', true); ", "false");
+    shouldBe("simulateTextEntry(elements[0], '', BEFORE);", "false");
+    shouldBe("simulateTextEntry(elements[0], 'fo', BEFORE);", "true");
+    shouldBe("simulateTextEntry(elements[0], 'o');", "true");
+    shouldBe("simulateTextEntry(elements[0], 'foo', BEFORE); ", "false");
+    shouldBe("simulateTextEntry(elements[0], 'foo', BEFORE); ", "false");
+    shouldBe("simulateTextEntry(elements[0], ' '); ", "true");
+    shouldBe("simulateTextEntry(elements[0], 'foo bar', BEFORE); ", "true");
+    shouldBe("simulateTextEntry(elements[0], 'foo bar', BEFORE); ", "false");
     shouldBe("setTextValue(elements[0], 'foo'); ", "false");
-    shouldBe("simulateTextEntry(elements[0], 'foo bar', true);", "true");
+    shouldBe("simulateTextEntry(elements[0], 'foo bar', BEFORE);", "true");
 
-    shouldBe("simulateTextEntry(elements[1], '', true);", "true");
-    shouldBe("simulateTextEntry(elements[1], 'fo', true);", "true");
-    shouldBe("simulateTextEntry(elements[1], 'o', false);", "true");
-    shouldBe("simulateTextEntry(elements[1], 'foo', true); ", "false");
+    shouldBe("simulateTextEntry(elements[1], '', BEFORE);", "true");
+    shouldBe("simulateTextEntry(elements[1], 'fo', BEFORE);", "true");
+    shouldBe("simulateTextEntry(elements[1], 'o');", "true");
+    shouldBe("simulateTextEntry(elements[1], 'foo', BEFORE); ", "false");
 
-    shouldBe("simulateTextEntry(elements[2], '', true);", "false");
-    shouldBe("simulateTextEntry(elements[2], 'fo', true);", "true");
-    shouldBe("simulateTextEntry(elements[2], 'o', false);", "true");
-    shouldBe("simulateTextEntry(elements[2], 'foo', true); ", "false");
+    shouldBe("simulateTextEntry(elements[2], 'wee', AFTER);", "false");
+    shouldBe("simulateTextEntry(elements[2], 'foo', BEFORE | AFTER);", "false");
+    shouldBe("simulateTextEntry(elements[2], 'fo', BEFORE);", "true");
+    shouldBe("simulateTextEntry(elements[2], 'o');", "true");
+    shouldBe("simulateTextEntry(elements[2], 'foo', BEFORE); ", "false");
 
-    shouldBe("simulateTextEntry(elements[3], 'foo', true);", "false");
-    shouldBe("simulateTextEntry(elements[3], 'foo', true);", "false");
+    shouldBe("simulateTextEntry(elements[3], 'foo', BEFORE);", "false");
+    shouldBe("simulateTextEntry(elements[3], 'foo', BEFORE);", "false");
     shouldBe("setTextValue(elements[3], ''); ", "false");
-    shouldBe("simulateTextEntry(elements[3], 'fo', true);", "true");
-    shouldBe("simulateTextEntry(elements[3], 'o', false);", "true");
-    shouldBe("simulateTextEntry(elements[3], 'foo', true); ", "false");
+    shouldBe("simulateTextEntry(elements[3], 'fo', BEFORE);", "true");
+    shouldBe("simulateTextEntry(elements[3], 'o');", "true");
+    shouldBe("simulateTextEntry(elements[3], 'foo', BEFORE); ", "false");
+
+    shouldBe("simulateTextEntry(elements[4], 'foo', AFTER);", "false");
+    shouldBe("simulateTextEntry(elements[4], 'foo');", "true");
+    shouldBe("simulateTextEntry(elements[4], 'foo', BEFORE);", "false");
+    shouldBe("simulateTextEntry(elements[4], 'foo', BEFORE | AFTER);", "true");
+    shouldBe("simulateTextEntry(elements[4], '', AFTER);", "false");
+    shouldBe("simulateTextEntry(elements[4], 'foo', AFTER);", "false");
+
+    // Hide test elements after run to avoid whitespace differences across platforms in the results.
+    document.getElementById('test').style.display = 'none';
 </script>
 </html> 
diff --git a/LayoutTests/platform/gtk/fast/events/onchange-text-form-field-expected.txt b/LayoutTests/platform/gtk/fast/events/onchange-text-form-field-expected.txt
deleted file mode 100644 (file)
index 38a6f9d..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-     
-PASS simulateTextEntry(elements[0], '', true); is false
-PASS simulateTextEntry(elements[0], 'fo', true); is true
-PASS simulateTextEntry(elements[0], 'o', false); is true
-PASS simulateTextEntry(elements[0], 'foo', true); is false
-PASS simulateTextEntry(elements[0], 'foo', true); is false
-PASS simulateTextEntry(elements[0], ' ', false); is true
-PASS simulateTextEntry(elements[0], 'foo bar', true); is true
-PASS simulateTextEntry(elements[0], 'foo bar', true); is false
-PASS setTextValue(elements[0], 'foo'); is false
-PASS simulateTextEntry(elements[0], 'foo bar', true); is true
-PASS simulateTextEntry(elements[1], '', true); is true
-PASS simulateTextEntry(elements[1], 'fo', true); is true
-PASS simulateTextEntry(elements[1], 'o', false); is true
-PASS simulateTextEntry(elements[1], 'foo', true); is false
-PASS simulateTextEntry(elements[2], '', true); is false
-PASS simulateTextEntry(elements[2], 'fo', true); is true
-PASS simulateTextEntry(elements[2], 'o', false); is true
-PASS simulateTextEntry(elements[2], 'foo', true); is false
-PASS simulateTextEntry(elements[3], 'foo', true); is false
-PASS simulateTextEntry(elements[3], 'foo', true); is false
-PASS setTextValue(elements[3], ''); is false
-PASS simulateTextEntry(elements[3], 'fo', true); is true
-PASS simulateTextEntry(elements[3], 'o', false); is true
-PASS simulateTextEntry(elements[3], 'foo', true); is false
-
index 5d8982c..4caf7b9 100644 (file)
@@ -1,3 +1,15 @@
+2011-04-29  Emil A Eklund  <eae@chromium.org>
+
+        Reviewed by Dimitri Glazkov.
+
+        Onchange on text fields has an incoherent behavior
+        https://bugs.webkit.org/show_bug.cgi?id=57330
+
+        * html/HTMLFormControlElement.cpp:
+        (WebCore::HTMLTextFormControlElement::insertedIntoDocument):
+        Initialize m_textAsOfLastFormControlChangeEvent to empty string rather
+        than null for empty fields.
+
 2011-04-29  Csaba Osztrogon√°c  <ossy@webkit.org>
 
         [Qt] Unreviewed buildfix after r85343.
index d5080a0..b125060 100644 (file)
@@ -555,7 +555,8 @@ HTMLTextFormControlElement::~HTMLTextFormControlElement()
 void HTMLTextFormControlElement::insertedIntoDocument()
 {
     HTMLFormControlElement::insertedIntoDocument();
-    setTextAsOfLastFormControlChangeEvent(value());
+    String initialValue = value();
+    setTextAsOfLastFormControlChangeEvent(initialValue.isNull() ? String("") : initialValue);
 }
 
 void HTMLTextFormControlElement::dispatchFocusEvent()