LayoutTests:
authoradele <adele@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Apr 2007 21:15:48 +0000 (21:15 +0000)
committeradele <adele@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Apr 2007 21:15:48 +0000 (21:15 +0000)
        Reviewed by Hyatt & Adam.

        Tests for <rdar://problem/4807799> REGRESSION: calling select() in onSearch handler doesn't work if you hit enter to trigger the event

        * fast/events/onchange-passwordfield-expected.txt:
        * fast/events/onchange-passwordfield.html:
        * fast/events/onchange-searchfield-expected.txt:
        * fast/events/onchange-searchfield.html:
        * fast/events/onchange-select-popup-expected.txt: Added.
        * fast/events/onchange-select-popup.html: Added.
        * fast/events/onchange-textfield-expected.txt:
        * fast/events/onchange-textfield.html:
        * fast/forms/onchange-enter-submit-expected.txt:

WebCore:

        Reviewed by Hyatt & Adam.

        Fix for <rdar://problem/4807799> REGRESSION: calling select() in onSearch handler doesn't work if you hit enter to trigger the event
        Fix for <rdar://problem/5153970> onChange doesn't fire when focusing a popup, using type-ahead to select, and leaving

        This previous behavior to blur controls when hitting enter was added to achieve the result of firing the change event.  Firefox does not
        fire blur- just the change event, so this fix will match Firefox behavior.

        This also fixes a bug where we didn't fire the change event when using type-ahead selection with the popup menu.

        * html/HTMLInputElement.cpp: (WebCore::HTMLInputElement::defaultEventHandler): Fire change event instead of blur event when hitting enter.

        * html/HTMLSelectElement.cpp:
        (WebCore::HTMLSelectElement::dispatchFocusEvent): Now that we have type-ahead selection for popups that can be opened with the arrow keys,
         we should always save the last selection when a popup gets focus, so it can be compared to the current selection when it loses focus.
        (WebCore::HTMLSelectElement::dispatchBlurEvent): For the same reasons as above, we should fire onChange for all popups on blur.

        (WebCore::HTMLSelectElement::menuListDefaultEventHandler): Fire change event instead of blur event when hitting enter.  Removed an unnecessary
         check for form() before calling menuListOnChange().  Removed an unnecessary check for renderer() and usesMenuList().
        (WebCore::HTMLSelectElement::listBoxDefaultEventHandler): Remove call to blur.  Since list boxes fire the change event immediately after an
         action is taken, we don't need to fire anything after hitting enter.
        (WebCore::HTMLSelectElement::menuListOnChange): Reset m_lastOnChangeIndex after firing the change event.

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

13 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/events/onchange-passwordfield-expected.txt
LayoutTests/fast/events/onchange-passwordfield.html
LayoutTests/fast/events/onchange-searchfield-expected.txt
LayoutTests/fast/events/onchange-searchfield.html
LayoutTests/fast/events/onchange-select-popup-expected.txt [new file with mode: 0644]
LayoutTests/fast/events/onchange-select-popup.html [new file with mode: 0644]
LayoutTests/fast/events/onchange-textfield-expected.txt
LayoutTests/fast/events/onchange-textfield.html
LayoutTests/fast/forms/onchange-enter-submit-expected.txt
WebCore/ChangeLog
WebCore/html/HTMLInputElement.cpp
WebCore/html/HTMLSelectElement.cpp

index 4b1e4c5..19f5a93 100644 (file)
@@ -1,3 +1,19 @@
+2007-04-23  Adele Peterson  <adele@apple.com>
+
+        Reviewed by Hyatt & Adam.
+
+        Tests for <rdar://problem/4807799> REGRESSION: calling select() in onSearch handler doesn't work if you hit enter to trigger the event
+
+        * fast/events/onchange-passwordfield-expected.txt:
+        * fast/events/onchange-passwordfield.html:
+        * fast/events/onchange-searchfield-expected.txt:
+        * fast/events/onchange-searchfield.html:
+        * fast/events/onchange-select-popup-expected.txt: Added.
+        * fast/events/onchange-select-popup.html: Added.
+        * fast/events/onchange-textfield-expected.txt:
+        * fast/events/onchange-textfield.html:
+        * fast/forms/onchange-enter-submit-expected.txt:
+
 2007-04-23  Darin Adler  <darin@apple.com>
 
         Reviewed by Maciej.
index 2ecee15..30e6a4e 100644 (file)
@@ -1,10 +1,6 @@
-This test verifies that the ENTER key fires the change and then the blur event.
+This test verifies that the ENTER key fires the change event.
 
 
 PASS: change event fired.
 
-PASS: blur event fired.
-
-PASS: blur event fired last.
-
 
index aa2de1c..852ca65 100644 (file)
@@ -1,4 +1,4 @@
-<p>This test verifies that the ENTER key fires the change and then the blur event.</p>
+<p>This test verifies that the ENTER key fires the change event.</p>
 <hr>
 <input id="input" type="password" onchange="changeHandler()" onblur="blurHandler()"></input>
 <pre id="console"></pre>
@@ -11,14 +11,12 @@ function log(s)
 
 function changeHandler()
 {
-    lastEvent = "change";
     log ('PASS: change event fired.\n');
 }
 
 function blurHandler()
 {
-    lastEvent = "blur";
-    log ('PASS: blur event fired.\n');
+    log ('blur event fired.\n');
 }
 
 if (window.layoutTestController)
@@ -33,7 +31,4 @@ var enterEvent = document.createEvent("KeyboardEvents");
 enterEvent.initKeyboardEvent("keypress", true, false, window, "Enter", 0, false, false, false, false, false); // This is not at all like pulling teeth
 input.dispatchEvent(enterEvent);
 
-// test that blur happened last
-if (lastEvent == "blur")
-    log('PASS: blur event fired last.\n');
 </script>
index 2ecee15..30e6a4e 100644 (file)
@@ -1,10 +1,6 @@
-This test verifies that the ENTER key fires the change and then the blur event.
+This test verifies that the ENTER key fires the change event.
 
 
 PASS: change event fired.
 
-PASS: blur event fired.
-
-PASS: blur event fired last.
-
 
index 07d4bdf..84fb467 100644 (file)
@@ -1,4 +1,4 @@
-<p>This test verifies that the ENTER key fires the change and then the blur event.</p>
+<p>This test verifies that the ENTER key fires the change event.</p>
 <hr>
 <input id="input" type="search" onchange="changeHandler()" onblur="blurHandler()"></input>
 <pre id="console"></pre>
@@ -11,14 +11,12 @@ function log(s)
 
 function changeHandler()
 {
-    window.lastEvent = "change";
     log ('PASS: change event fired.\n');
 }
 
 function blurHandler()
 {
-    window.lastEvent = "blur";
-    log ('PASS: blur event fired.\n');
+    log ('blur event fired.\n');
 }
 
 if (window.layoutTestController)
@@ -26,14 +24,11 @@ if (window.layoutTestController)
 
 // change the field
 document.getElementById('input').focus();
-document.execCommand("InsertText", false, "foo bar baz"); // Won't work until searchfield becomes a non-AppKit control
+document.execCommand("InsertText", false, "foo bar baz");
 
 // hit enter
 var enterEvent = document.createEvent("KeyboardEvents");
 enterEvent.initKeyboardEvent("keypress", true, false, window, "Enter", 0, false, false, false, false, false); // This is not at all like pulling teeth
 input.dispatchEvent(enterEvent);
 
-// test that blur happened last
-if (window.lastEvent == "blur")
-    log('PASS: blur event fired last.\n');
 </script>
diff --git a/LayoutTests/fast/events/onchange-select-popup-expected.txt b/LayoutTests/fast/events/onchange-select-popup-expected.txt
new file mode 100644 (file)
index 0000000..33e2648
--- /dev/null
@@ -0,0 +1,6 @@
+This test verifies that the ENTER key fires the change event for popups.
+
+
+PASS: change event fired.
+
+
diff --git a/LayoutTests/fast/events/onchange-select-popup.html b/LayoutTests/fast/events/onchange-select-popup.html
new file mode 100644 (file)
index 0000000..969a7e9
--- /dev/null
@@ -0,0 +1,46 @@
+<html>
+<head>
+    <script>
+    function log(s)
+    {
+        document.getElementById('console').appendChild(document.createTextNode(s + "\n"));
+    }
+
+    function changeHandler()
+    {
+        log ('PASS: change event fired.\n');
+    }
+
+    function blurHandler()
+    {
+        log ('blur event fired.\n');
+    }
+
+    function test()
+    {
+        var menu = document.getElementById('menu');
+        menu.focus();
+
+        if (window.layoutTestController) {
+            layoutTestController.dumpAsText();
+
+            // change the option selection
+            eventSender.keyDown('e');
+        }
+
+        // hit enter
+        var enterEvent = document.createEvent("KeyboardEvents");
+        enterEvent.initKeyboardEvent("keypress", true, false, window, "Enter", 0, false, false, false, false, false);
+        menu.dispatchEvent(enterEvent);
+    }
+    </script>
+</head>
+<body onload="test()">
+    <p>This test verifies that the ENTER key fires the change event for popups.</p>
+    <hr>
+    <form>
+        <select id="menu" onchange="changeHandler()" onblur="blurHandler()"><option>abcd</option><option>efgh</option></select>
+    </form>
+    <pre id="console"></pre>
+</body>
+</html>
index 2ecee15..30e6a4e 100644 (file)
@@ -1,10 +1,6 @@
-This test verifies that the ENTER key fires the change and then the blur event.
+This test verifies that the ENTER key fires the change event.
 
 
 PASS: change event fired.
 
-PASS: blur event fired.
-
-PASS: blur event fired last.
-
 
index 103433c..98f9eea 100644 (file)
@@ -1,4 +1,4 @@
-<p>This test verifies that the ENTER key fires the change and then the blur event.</p>
+<p>This test verifies that the ENTER key fires the change event.</p>
 <hr>
 <input id="input" type="text" onchange="changeHandler()" onblur="blurHandler()"></input>
 <pre id="console"></pre>
@@ -11,14 +11,12 @@ function log(s)
 
 function changeHandler()
 {
-    window.lastEvent = "change";
     log ('PASS: change event fired.\n');
 }
 
 function blurHandler()
 {
-    window.lastEvent = "blur";
-    log ('PASS: blur event fired.\n');
+    log ('blur event fired.\n');
 }
 
 if (window.layoutTestController)
@@ -33,7 +31,4 @@ var enterEvent = document.createEvent("KeyboardEvents");
 enterEvent.initKeyboardEvent("keypress", true, false, window, "Enter", 0, false, false, false, false, false); // This is not at all like pulling teeth
 input.dispatchEvent(enterEvent);
 
-// test that blur happened last
-if (window.lastEvent == "blur")
-    log('PASS: blur event fired last.\n');
 </script>
index 117d3ca..d3c3457 100644 (file)
@@ -1,6 +1,5 @@
 This tests that onchange fires when you press Enter to submit a form.
 
 text onchange
-text onblur
 on submit
 
index e6d2a6e..6d70859 100644 (file)
@@ -1,3 +1,28 @@
+2007-04-23  Adele Peterson  <adele@apple.com>
+
+        Reviewed by Hyatt & Adam.
+
+        Fix for <rdar://problem/4807799> REGRESSION: calling select() in onSearch handler doesn't work if you hit enter to trigger the event
+        Fix for <rdar://problem/5153970> onChange doesn't fire when focusing a popup, using type-ahead to select, and leaving
+
+        This previous behavior to blur controls when hitting enter was added to achieve the result of firing the change event.  Firefox does not
+        fire blur- just the change event, so this fix will match Firefox behavior.
+
+        This also fixes a bug where we didn't fire the change event when using type-ahead selection with the popup menu.
+
+        * html/HTMLInputElement.cpp: (WebCore::HTMLInputElement::defaultEventHandler): Fire change event instead of blur event when hitting enter.
+
+        * html/HTMLSelectElement.cpp:
+        (WebCore::HTMLSelectElement::dispatchFocusEvent): Now that we have type-ahead selection for popups that can be opened with the arrow keys,
+         we should always save the last selection when a popup gets focus, so it can be compared to the current selection when it loses focus.
+        (WebCore::HTMLSelectElement::dispatchBlurEvent): For the same reasons as above, we should fire onChange for all popups on blur.
+
+        (WebCore::HTMLSelectElement::menuListDefaultEventHandler): Fire change event instead of blur event when hitting enter.  Removed an unnecessary
+         check for form() before calling menuListOnChange().  Removed an unnecessary check for renderer() and usesMenuList().
+        (WebCore::HTMLSelectElement::listBoxDefaultEventHandler): Remove call to blur.  Since list boxes fire the change event immediately after an
+         action is taken, we don't need to fire anything after hitting enter.
+        (WebCore::HTMLSelectElement::menuListOnChange): Reset m_lastOnChangeIndex after firing the change event.
+
 2007-04-23  Anders Carlsson  <andersca@apple.com>
 
         Reviewed by Ada.
index 830f4e2..8269fbb 100644 (file)
@@ -1281,8 +1281,13 @@ void HTMLInputElement::defaultEventHandler(Event* evt)
             addSearchResult();
             onSearch();
         }
-        blur();
-        // Form may never have been present, or may have been destroyed by the blur event.
+        // Fire onChange for text fields.
+        RenderObject* r = renderer();
+        if (r && r->isTextField() && r->isEdited()) {
+            onChange();
+            r->setEdited(false);
+        }
+        // Form may never have been present, or may have been destroyed by the change event.
         if (form())
             form()->submitClick(evt);
         evt->setDefaultHandled();
index 7e8095f..2739711 100644 (file)
@@ -575,22 +575,18 @@ void HTMLSelectElement::reset()
 
 void HTMLSelectElement::dispatchFocusEvent()
 {
-#if !ARROW_KEYS_POP_MENU
     if (usesMenuList())
         // Save the selection so it can be compared to the new selection when we call onChange during dispatchBlurEvent.
         saveLastSelection();
-#endif
     HTMLGenericFormElement::dispatchFocusEvent();
 }
 
 void HTMLSelectElement::dispatchBlurEvent()
 {
-#if !ARROW_KEYS_POP_MENU
     // We only need to fire onChange here for menu lists, because we fire onChange for list boxes whenever the selection change is actually made.
     // This matches other browsers' behavior.
     if (usesMenuList())
         menuListOnChange();
-#endif
     HTMLGenericFormElement::dispatchBlurEvent();
 }
 
@@ -630,14 +626,13 @@ void HTMLSelectElement::menuListDefaultEventHandler(Event* evt)
         String keyIdentifier = static_cast<KeyboardEvent*>(evt)->keyIdentifier();
         bool handled = false;
 #if ARROW_KEYS_POP_MENU
-        if (form() && keyIdentifier == "Enter") {
-            blur();
-            // Make sure the form hasn't been destroyed during the blur.
+        if (keyIdentifier == "Enter") {
+            menuListOnChange();
             if (form())
                 form()->submitClick(evt);
             handled = true;
         }
-        if ((keyIdentifier == "Down" || keyIdentifier == "Up" || keyIdentifier == "U+000020") && renderer() && usesMenuList()) {
+        if (keyIdentifier == "Down" || keyIdentifier == "Up" || keyIdentifier == "U+000020") {
             focus();
             // Save the selection so it can be compared to the new selection when we call onChange during setSelectedIndex,
             // which gets called from RenderMenuList::valueChanged, which gets called after the user makes a selection from the menu.
@@ -762,9 +757,7 @@ void HTMLSelectElement::listBoxDefaultEventHandler(Event* evt)
             return;
         String keyIdentifier = static_cast<KeyboardEvent*>(evt)->keyIdentifier();
 
-        if (form() && keyIdentifier == "Enter") {
-            blur();
-            // Make sure the form hasn't been destroyed during the blur.
+        if (keyIdentifier == "Enter") {
             if (form())
                 form()->submitClick(evt);
             evt->setDefaultHandled();
@@ -857,8 +850,11 @@ void HTMLSelectElement::updateListBoxSelection(bool deselectOtherOptions)
 void HTMLSelectElement::menuListOnChange()
 {
     ASSERT(usesMenuList());
-    if (m_lastOnChangeIndex != selectedIndex())
+    int selected = selectedIndex();
+    if (m_lastOnChangeIndex != selected) {
         onChange();
+        m_lastOnChangeIndex = selected;
+    }
 }
 
 void HTMLSelectElement::listBoxOnChange()