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();