Index: third_party/WebKit/Source/core/editing/Editor.cpp |
diff --git a/third_party/WebKit/Source/core/editing/Editor.cpp b/third_party/WebKit/Source/core/editing/Editor.cpp |
index 5cd82372fa772f46d460fcb7c7ec2bc0bf70a594..94e721a3f32b09668b00a622770dced56e740848 100644 |
--- a/third_party/WebKit/Source/core/editing/Editor.cpp |
+++ b/third_party/WebKit/Source/core/editing/Editor.cpp |
@@ -96,6 +96,66 @@ using namespace HTMLNames; |
using namespace WTF; |
using namespace Unicode; |
+namespace { |
+ |
+void dispatchInputEvent(Element* target, InputEvent::InputType inputType, const String& data, InputEvent::EventIsComposing isComposing) |
+{ |
+ if (!RuntimeEnabledFeatures::inputEventEnabled()) |
+ return; |
+ if (!target) |
+ return; |
+ // TODO(chongz): Pass appreciate |ranges| after it's defined on spec. |
+ // http://w3c.github.io/editing/input-events.html#dom-inputevent-inputtype |
+ InputEvent* inputEvent = InputEvent::createInput(inputType, data, isComposing, nullptr); |
+ target->dispatchScopedEvent(inputEvent); |
chongz
2016/06/22 05:16:52
I have to check |FrameSelection::isAvailable()| if
yosin_UTC9
2016/06/22 06:29:25
Not sure. Why should we need to check |FrameSelect
chongz
2016/06/23 00:32:06
It's about test "editing/pasteboard/paste-removing
|
+} |
+ |
+void dispatchInputEventEditableContentChanged(Element* startRoot, Element* endRoot, InputEvent::InputType inputType, const String& data, InputEvent::EventIsComposing isComposing) |
+{ |
+ if (startRoot) |
+ dispatchInputEvent(startRoot, inputType, data, isComposing); |
+ if (endRoot && endRoot != startRoot) |
+ dispatchInputEvent(endRoot, inputType, data, isComposing); |
+} |
+ |
+InputEvent::InputType inputTypeFromCommand(CompositeEditCommand* command) |
tkent
2016/06/22 06:53:21
The argument type should be |const CompositeEditCo
chongz
2016/06/23 00:32:06
Done.
|
+{ |
+ if (command->isTypingCommand()) { |
+ TypingCommand* typingCommand = static_cast<TypingCommand*>(command); |
tkent
2016/06/22 06:53:21
Please avoid bare static_cast<>. TypingCommand sh
chongz
2016/06/23 00:32:06
Done.
|
+ // TODO(chongz): Separate command types into more detailed InputType. |
+ switch (typingCommand->commandTypeOfOpenCommand()) { |
+ case TypingCommand::DeleteSelection: |
+ case TypingCommand::DeleteKey: |
+ case TypingCommand::ForwardDeleteKey: |
+ return InputEvent::InputType::DeleteContent; |
+ case TypingCommand::InsertText: |
+ case TypingCommand::InsertLineBreak: |
+ case TypingCommand::InsertParagraphSeparator: |
+ case TypingCommand::InsertParagraphSeparatorInQuotedContent: |
+ return InputEvent::InputType::InsertText; |
+ default: |
+ return InputEvent::InputType::None; |
+ } |
+ } |
+ |
+ switch (command->editingAction()) { |
+ // TODO(chongz): Handle other edit actions. |
+ case EditActionBold: |
+ return InputEvent::InputType::Bold; |
chongz
2016/06/23 00:32:06
Actually text styling commands are a little bit co
|
+ default: |
+ return InputEvent::InputType::None; |
+ } |
+} |
+ |
+InputEvent::EventIsComposing isComposingFromCommand(CompositeEditCommand* command) |
tkent
2016/06/22 06:53:21
The argument type should be |const CompositeEditCo
chongz
2016/06/23 00:32:06
Done.
|
+{ |
+ if (command->isTypingCommand() && static_cast<TypingCommand*>(command)->compositionType() != TypingCommand::TextCompositionNone) |
tkent
2016/06/22 06:53:21
We should use toTypingCommand(command).
chongz
2016/06/23 00:32:06
Done.
|
+ return InputEvent::EventIsComposing::IsComposing; |
+ return InputEvent::EventIsComposing::NotComposing; |
+} |
+ |
+} // anonymous namespace |
+ |
Editor::RevealSelectionScope::RevealSelectionScope(Editor* editor) |
: m_editor(editor) |
{ |
@@ -702,6 +762,9 @@ void Editor::appliedEditing(CompositeEditCommand* cmd) |
EditCommandComposition* composition = cmd->composition(); |
DCHECK(composition); |
dispatchEditableContentChangedEvents(composition->startingRootEditableElement(), composition->endingRootEditableElement()); |
+ // TODO(chongz): Filter empty InputType after spec is finalized. |
+ // TODO(chongz): Fill in |data| field. |
+ dispatchInputEventEditableContentChanged(composition->startingRootEditableElement(), composition->endingRootEditableElement(), inputTypeFromCommand(cmd), emptyString(), isComposingFromCommand(cmd)); |
VisibleSelection newSelection(cmd->endingSelection()); |
// Don't clear the typing style with this selection change. We do those things elsewhere if necessary. |
@@ -730,6 +793,7 @@ void Editor::unappliedEditing(EditCommandComposition* cmd) |
frame().document()->updateStyleAndLayout(); |
dispatchEditableContentChangedEvents(cmd->startingRootEditableElement(), cmd->endingRootEditableElement()); |
+ dispatchInputEventEditableContentChanged(cmd->startingRootEditableElement(), cmd->endingRootEditableElement(), InputEvent::InputType::Undo, emptyString(), InputEvent::EventIsComposing::NotComposing); |
VisibleSelection newSelection(cmd->startingSelection()); |
newSelection.validatePositionsIfNeeded(); |
@@ -748,6 +812,7 @@ void Editor::reappliedEditing(EditCommandComposition* cmd) |
frame().document()->updateStyleAndLayout(); |
dispatchEditableContentChangedEvents(cmd->startingRootEditableElement(), cmd->endingRootEditableElement()); |
+ dispatchInputEventEditableContentChanged(cmd->startingRootEditableElement(), cmd->endingRootEditableElement(), InputEvent::InputType::Redo, emptyString(), InputEvent::EventIsComposing::NotComposing); |
VisibleSelection newSelection(cmd->endingSelection()); |
changeSelectionAfterCommand(newSelection, FrameSelection::CloseTyping | FrameSelection::ClearTypingStyle); |