Title: [208462] trunk
Revision
208462
Author
[email protected]
Date
2016-11-09 12:06:00 -0800 (Wed, 09 Nov 2016)

Log Message

When editing IME, `compositionend` events should fire after input events
https://bugs.webkit.org/show_bug.cgi?id=164324
<rdar://problem/29050438>

Reviewed by Darin Adler.

Source/WebCore:

Moves where we dispatch `compositionend` events to after applying editing commands that fire `beforeinput` or
`input` events. Also augments existing layout tests to verify the change.

* editing/Editor.cpp:
(WebCore::Editor::setComposition):

LayoutTests:

Augments fast/events/input-events-ime-recomposition.html and fast/events/input-events-ime-composition.html to
verify that compositionend events are fired after input events. Also rebaselines
fast/events/ime-composition-events-001.html.

* fast/events/ime-composition-events-001-expected.txt:
* fast/events/input-events-ime-composition-expected.txt:
* fast/events/input-events-ime-composition.html:
* fast/events/input-events-ime-recomposition-expected.txt:
* fast/events/input-events-ime-recomposition.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (208461 => 208462)


--- trunk/LayoutTests/ChangeLog	2016-11-09 20:04:51 UTC (rev 208461)
+++ trunk/LayoutTests/ChangeLog	2016-11-09 20:06:00 UTC (rev 208462)
@@ -1,5 +1,23 @@
 2016-11-09  Wenson Hsieh  <[email protected]>
 
+        When editing IME, `compositionend` events should fire after input events
+        https://bugs.webkit.org/show_bug.cgi?id=164324
+        <rdar://problem/29050438>
+
+        Reviewed by Darin Adler.
+
+        Augments fast/events/input-events-ime-recomposition.html and fast/events/input-events-ime-composition.html to
+        verify that compositionend events are fired after input events. Also rebaselines
+        fast/events/ime-composition-events-001.html.
+
+        * fast/events/ime-composition-events-001-expected.txt:
+        * fast/events/input-events-ime-composition-expected.txt:
+        * fast/events/input-events-ime-composition.html:
+        * fast/events/input-events-ime-recomposition-expected.txt:
+        * fast/events/input-events-ime-recomposition.html:
+
+2016-11-09  Wenson Hsieh  <[email protected]>
+
         Setting foreground color when text is selected should fire an input event with color data
         https://bugs.webkit.org/show_bug.cgi?id=164241
         <rdar://problem/29032759>

Modified: trunk/LayoutTests/fast/events/ime-composition-events-001-expected.txt (208461 => 208462)


--- trunk/LayoutTests/fast/events/ime-composition-events-001-expected.txt	2016-11-09 20:04:51 UTC (rev 208461)
+++ trunk/LayoutTests/fast/events/ime-composition-events-001-expected.txt	2016-11-09 20:06:00 UTC (rev 208462)
@@ -7,8 +7,8 @@
 SUCCESS: INPUT - compositionupdate - "1"
 SUCCESS: INPUT - compositionupdate - "2"
 SUCCESS: INPUT - compositionupdate - "3"
+SUCCESS: INPUT - textInput - "4"
 SUCCESS: INPUT - compositionend - "4"
-SUCCESS: INPUT - textInput - "4"
 SUCCESS: INPUT - compositionstart - ""
 SUCCESS: INPUT - compositionupdate - "5"
 SUCCESS: INPUT - compositionupdate - "6"
@@ -17,10 +17,10 @@
 SUCCESS: INPUT - textInput - "8"
 SUCCESS: INPUT - compositionstart - ""
 SUCCESS: INPUT - compositionupdate - "9"
+SUCCESS: INPUT - textInput - "9"
 SUCCESS: INPUT - compositionend - "9"
-SUCCESS: INPUT - textInput - "9"
 SUCCESS: INPUT - compositionstart - "have"
 SUCCESS: INPUT - compositionupdate - "lost"
+SUCCESS: INPUT - textInput - "made"
 SUCCESS: INPUT - compositionend - "made"
-SUCCESS: INPUT - textInput - "made"
 SUCCESS: I made a pen

Modified: trunk/LayoutTests/fast/events/input-events-ime-composition-expected.txt (208461 => 208462)


--- trunk/LayoutTests/fast/events/input-events-ime-composition-expected.txt	2016-11-09 20:04:51 UTC (rev 208461)
+++ trunk/LayoutTests/fast/events/input-events-ime-composition-expected.txt	2016-11-09 20:06:00 UTC (rev 208462)
@@ -14,6 +14,7 @@
 input(inputType = 'deleteCompositionText', data = '', cancelable = false)
 beforeinput(inputType = 'insertFromComposition', data = '', cancelable = true)
 input(inputType = 'insertFromComposition', data = '', cancelable = false)
+compositionend(data = '')
 * * * Second case: canceling a new composition * * *
 beforeinput(inputType = 'insertCompositionText', data = '', cancelable = false)
 input(inputType = 'insertCompositionText', data = '', cancelable = false)
@@ -23,6 +24,7 @@
 input(inputType = 'insertCompositionText', data = '', cancelable = false)
 beforeinput(inputType = 'deleteCompositionText', data = '', cancelable = false)
 input(inputType = 'deleteCompositionText', data = '', cancelable = false)
+compositionend(data = '')
 * * * Third case: replacing a composition * * *
 beforeinput(inputType = 'insertCompositionText', data = '', cancelable = false)
 input(inputType = 'insertCompositionText', data = '', cancelable = false)
@@ -36,6 +38,7 @@
 input(inputType = 'deleteCompositionText', data = '', cancelable = false)
 beforeinput(inputType = 'insertFromComposition', data = '', cancelable = true)
 input(inputType = 'insertFromComposition', data = '', cancelable = false)
+compositionend(data = '')
 * * * Fourth case: partially committing a composition * * *
 beforeinput(inputType = 'insertCompositionText', data = '', cancelable = false)
 input(inputType = 'insertCompositionText', data = '', cancelable = false)
@@ -47,6 +50,7 @@
 input(inputType = 'deleteCompositionText', data = '', cancelable = false)
 beforeinput(inputType = 'insertFromComposition', data = '', cancelable = true)
 input(inputType = 'insertFromComposition', data = '', cancelable = false)
+compositionend(data = '')
 beforeinput(inputType = 'insertCompositionText', data = '', cancelable = false)
 input(inputType = 'insertCompositionText', data = '', cancelable = false)
 PASS successfullyParsed is true

Modified: trunk/LayoutTests/fast/events/input-events-ime-composition.html (208461 => 208462)


--- trunk/LayoutTests/fast/events/input-events-ime-composition.html	2016-11-09 20:04:51 UTC (rev 208461)
+++ trunk/LayoutTests/fast/events/input-events-ime-composition.html	2016-11-09 20:06:00 UTC (rev 208462)
@@ -10,6 +10,7 @@
         if (window.internals)
             internals.settings.setInputEventsEnabled(true);
 
+        editable.addEventListener("compositionend", logCompositionEvent);
         editable.focus();
 
         if (window.testRunner && window.textInputController) {
@@ -42,6 +43,11 @@
         {
             debug(`${event.type}(inputType = '${event.inputType}', data = '', cancelable = ${event.cancelable})`);
         }
+
+        function logCompositionEvent(event)
+        {
+            debug(`${event.type}(data = '')`);
+        }
     </script>
     <script src=""
 </body>

Modified: trunk/LayoutTests/fast/events/input-events-ime-recomposition-expected.txt (208461 => 208462)


--- trunk/LayoutTests/fast/events/input-events-ime-recomposition-expected.txt	2016-11-09 20:04:51 UTC (rev 208461)
+++ trunk/LayoutTests/fast/events/input-events-ime-recomposition-expected.txt	2016-11-09 20:06:00 UTC (rev 208462)
@@ -15,6 +15,7 @@
 input(inputType = 'deleteCompositionText', data = '', cancelable = false)
 beforeinput(inputType = 'insertFromComposition', data = '', cancelable = true)
 input(inputType = 'insertFromComposition', data = '', cancelable = false)
+compositionend(data = '')
 PASS successfullyParsed is true
 
 TEST COMPLETE

Modified: trunk/LayoutTests/fast/events/input-events-ime-recomposition.html (208461 => 208462)


--- trunk/LayoutTests/fast/events/input-events-ime-recomposition.html	2016-11-09 20:04:51 UTC (rev 208461)
+++ trunk/LayoutTests/fast/events/input-events-ime-recomposition.html	2016-11-09 20:06:00 UTC (rev 208462)
@@ -10,6 +10,7 @@
         if (window.internals)
             internals.settings.setInputEventsEnabled(true);
 
+        editable.addEventListener("compositionend", logCompositionEvent);
         editable.focus();
 
         if (window.testRunner && window.textInputController) {
@@ -24,6 +25,11 @@
         {
             debug(`${event.type}(inputType = '${event.inputType}', data = '', cancelable = ${event.cancelable})`);
         }
+
+        function logCompositionEvent(event)
+        {
+            debug(`${event.type}(data = '')`);
+        }
     </script>
     <script src=""
 </body>

Modified: trunk/Source/WebCore/ChangeLog (208461 => 208462)


--- trunk/Source/WebCore/ChangeLog	2016-11-09 20:04:51 UTC (rev 208461)
+++ trunk/Source/WebCore/ChangeLog	2016-11-09 20:06:00 UTC (rev 208462)
@@ -1,5 +1,19 @@
 2016-11-09  Wenson Hsieh  <[email protected]>
 
+        When editing IME, `compositionend` events should fire after input events
+        https://bugs.webkit.org/show_bug.cgi?id=164324
+        <rdar://problem/29050438>
+
+        Reviewed by Darin Adler.
+
+        Moves where we dispatch `compositionend` events to after applying editing commands that fire `beforeinput` or
+        `input` events. Also augments existing layout tests to verify the change.
+
+        * editing/Editor.cpp:
+        (WebCore::Editor::setComposition):
+
+2016-11-09  Wenson Hsieh  <[email protected]>
+
         Setting foreground color when text is selected should fire an input event with color data
         https://bugs.webkit.org/show_bug.cgi?id=164241
         <rdar://problem/29032759>

Modified: trunk/Source/WebCore/editing/Editor.cpp (208461 => 208462)


--- trunk/Source/WebCore/editing/Editor.cpp	2016-11-09 20:04:51 UTC (rev 208461)
+++ trunk/Source/WebCore/editing/Editor.cpp	2016-11-09 20:06:00 UTC (rev 208462)
@@ -1680,14 +1680,6 @@
         setIgnoreCompositionSelectionChange(false);
         return;
     }
-    
-    // Dispatch a compositionend event to the focused node.
-    // We should send this event before sending a TextEvent as written in Section 6.2.2 and 6.2.3 of
-    // the DOM Event specification.
-    if (Element* target = document().focusedElement()) {
-        Ref<CompositionEvent> event = CompositionEvent::create(eventNames().compositionendEvent, document().domWindow(), text);
-        target->dispatchEvent(event);
-    }
 
     // Always delete the current composition before inserting the finalized composition text if we're confirming our composition.
     // Our default behavior (if the beforeinput event is not prevented) is to insert the finalized composition text back in.
@@ -1700,6 +1692,9 @@
 
     insertTextForConfirmedComposition(text);
 
+    if (auto* target = document().focusedElement())
+        target->dispatchEvent(CompositionEvent::create(eventNames().compositionendEvent, document().domWindow(), text));
+
     if (mode == CancelComposition) {
         // An open typing command that disagrees about current selection would cause issues with typing later on.
         TypingCommand::closeTyping(&m_frame);
@@ -1769,12 +1764,9 @@
                 target->dispatchEvent(CompositionEvent::create(eventNames().compositionstartEvent, document().domWindow(), originalText));
                 event = CompositionEvent::create(eventNames().compositionupdateEvent, document().domWindow(), text);
             }
-        } else {
-            if (!text.isEmpty())
-                event = CompositionEvent::create(eventNames().compositionupdateEvent, document().domWindow(), text);
-            else
-                event = CompositionEvent::create(eventNames().compositionendEvent, document().domWindow(), text);
-        }
+        } else if (!text.isEmpty())
+            event = CompositionEvent::create(eventNames().compositionupdateEvent, document().domWindow(), text);
+
         if (event)
             target->dispatchEvent(*event);
     }
@@ -1781,8 +1773,11 @@
 
     // If text is empty, then delete the old composition here.  If text is non-empty, InsertTextCommand::input
     // will delete the old composition with an optimized replace operation.
-    if (text.isEmpty())
+    if (text.isEmpty()) {
         TypingCommand::deleteSelection(document(), TypingCommand::PreventSpellChecking, TypingCommand::TextCompositionPending);
+        if (target)
+            target->dispatchEvent(CompositionEvent::create(eventNames().compositionendEvent, document().domWindow(), text));
+    }
 
     m_compositionNode = nullptr;
     m_customCompositionUnderlines.clear();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to