Index: third_party/WebKit/Source/core/events/InputEvent.cpp |
diff --git a/third_party/WebKit/Source/core/events/InputEvent.cpp b/third_party/WebKit/Source/core/events/InputEvent.cpp |
index f7eb07a65d040c9cb0071ccc8a29dc660983bf09..c8cb04e80d1a1d9d6f41b3db2ffc47ea9ac75e17 100644 |
--- a/third_party/WebKit/Source/core/events/InputEvent.cpp |
+++ b/third_party/WebKit/Source/core/events/InputEvent.cpp |
@@ -5,9 +5,48 @@ |
#include "core/events/InputEvent.h" |
#include "core/events/EventDispatcher.h" |
+#include "public/platform/WebEditingCommandType.h" |
namespace blink { |
+namespace { |
+ |
+const struct { |
+ InputEvent::InputType inputType; |
+ const char* stringName; |
+} kInputTypeStringNameMap[] = { |
+ {InputEvent::InputType::None, ""}, |
+ {InputEvent::InputType::InsertText, "insertText"}, |
+ {InputEvent::InputType::ReplaceContent, "replaceContent"}, |
+ {InputEvent::InputType::DeleteContent, "deleteContent"}, |
+ {InputEvent::InputType::DeleteComposedCharacter, "deleteComposedCharacter"}, |
+ {InputEvent::InputType::Undo, "undo"}, |
+ {InputEvent::InputType::Redo, "redo"}, |
ojan
2016/04/16 00:11:46
We will need the spec to make sure to list all the
chongz
2016/04/18 22:54:47
Posted question in https://github.com/w3c/editing/
|
+}; |
+ |
+static_assert(arraysize(kInputTypeStringNameMap) == static_cast<size_t>(InputEvent::InputType::NumberOfInputTypes), |
+ "must handle all InputEvent::InputType"); |
+ |
+String convertInputTypeToString(InputEvent::InputType inputType) |
+{ |
+ const auto& it = std::begin(kInputTypeStringNameMap) + static_cast<size_t>(inputType); |
+ if (it >= std::begin(kInputTypeStringNameMap) && it < std::end(kInputTypeStringNameMap)) |
+ return AtomicString(it->stringName); |
+ return emptyString(); |
+} |
+ |
+InputEvent::InputType convertStringToInputType(const String& stringName) |
+{ |
+ // TODO(chongz): Use binary search if the map goes larger. |
+ for (const auto& entry : kInputTypeStringNameMap) { |
+ if (codePointCompareIgnoringASCIICase(stringName, entry.stringName) == 0) |
ojan
2016/04/16 00:11:46
Why do we need to ignore case?
chongz
2016/04/18 22:54:48
I was trying to match the style of |execCommand()|
|
+ return entry.inputType; |
+ } |
+ return InputEvent::InputType::None; |
+} |
+ |
+} // anonymous namespace |
+ |
InputEvent::InputEvent() |
{ |
} |
@@ -15,6 +54,54 @@ InputEvent::InputEvent() |
InputEvent::InputEvent(const AtomicString& type, const InputEventInit& initializer) |
: UIEvent(type, initializer) |
{ |
+ if (initializer.hasInputType()) |
+ m_inputType = convertStringToInputType(initializer.inputType()); |
ojan
2016/04/16 00:11:45
TODO: ojan
chongz
2016/04/18 22:54:47
Done.
|
+ if (initializer.hasData()) |
+ m_data = initializer.data(); |
+} |
+ |
+/* static */ |
+InputEvent* InputEvent::createBeforeInputTyping(InputType inputType, const String& data) |
+{ |
+ InputEventInit inputEventInit; |
+ |
+ inputEventInit.setBubbles(true); |
+ inputEventInit.setCancelable(true); |
+ inputEventInit.setInputType(convertInputTypeToString(inputType)); |
ojan
2016/04/16 00:11:46
It seems pretty silly for us to convert the enum t
chongz
2016/04/18 22:54:47
Done.
|
+ inputEventInit.setData(data); |
+ |
+ return InputEvent::create(EventTypeNames::beforeinput, inputEventInit); |
+} |
+ |
+/* static */ |
+InputEvent* InputEvent::createBeforeInputFromComposition(InputType inputType, const String& data) |
+{ |
+ InputEventInit inputEventInit; |
+ |
+ inputEventInit.setBubbles(true); |
+ inputEventInit.setCancelable(false); |
+ inputEventInit.setInputType(convertInputTypeToString(inputType)); |
+ inputEventInit.setData(data); |
+ |
+ return InputEvent::create(EventTypeNames::beforeinput, inputEventInit); |
+} |
+ |
+/* static */ |
+InputEvent* InputEvent::createBeforeInputEditorCommand(InputType inputType, const String& data) |
ojan
2016/04/16 00:11:46
This looks the same as createBeforeInputTyping. Ca
chongz
2016/04/18 22:54:47
Done.
|
+{ |
+ InputEventInit inputEventInit; |
+ |
+ inputEventInit.setBubbles(true); |
+ inputEventInit.setCancelable(true); |
+ inputEventInit.setInputType(convertInputTypeToString(inputType)); |
+ inputEventInit.setData(data); |
+ |
+ return InputEvent::create(EventTypeNames::beforeinput, inputEventInit); |
+} |
+ |
+String InputEvent::inputType() const |
+{ |
+ return convertInputTypeToString(m_inputType); |
} |
bool InputEvent::isInputEvent() const |