Chromium Code Reviews| Index: webkit/plugins/ppapi/event_conversion.cc |
| =================================================================== |
| --- webkit/plugins/ppapi/event_conversion.cc (revision 110829) |
| +++ webkit/plugins/ppapi/event_conversion.cc (working copy) |
| @@ -9,12 +9,14 @@ |
| #include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/string_util.h" |
| +#include "base/stringprintf.h" |
| #include "base/utf_string_conversions.h" |
| #include "base/utf_string_conversion_utils.h" |
| #include "ppapi/c/pp_input_event.h" |
| #include "ppapi/shared_impl/input_event_impl.h" |
| #include "ppapi/shared_impl/time_conversion.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" |
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" |
| #include "webkit/plugins/ppapi/common.h" |
| using ppapi::EventTimeToPPTimeTicks; |
| @@ -24,6 +26,8 @@ |
| using WebKit::WebKeyboardEvent; |
| using WebKit::WebMouseEvent; |
| using WebKit::WebMouseWheelEvent; |
| +using WebKit::WebString; |
| +using WebKit::WebUChar; |
| namespace webkit { |
| namespace ppapi { |
| @@ -246,6 +250,89 @@ |
| return mouse_wheel_event; |
| } |
| +#if !defined(OS_WIN) |
| +#define VK_RETURN 0x0D |
| + |
| +#define VK_PRIOR 0x21 |
| +#define VK_NEXT 0x22 |
| +#define VK_END 0x23 |
| +#define VK_HOME 0x24 |
| +#define VK_LEFT 0x25 |
| +#define VK_UP 0x26 |
| +#define VK_RIGHT 0x27 |
| +#define VK_DOWN 0x28 |
| +#define VK_SNAPSHOT 0x2C |
| +#define VK_INSERT 0x2D |
| +#define VK_DELETE 0x2E |
| + |
| +#define VK_APPS 0x5D |
| + |
| +#define VK_F1 0x70 |
| +#endif |
| + |
| +// Convert a character string to a Windows virtual key code. Adapted from |
| +// src/third_party/WebKit/Tools/DumpRenderTree/chromium/EventSender.cpp. This |
| +// is used by CreateSimulatedWebInputEvents to convert keyboard events. |
| +void GetKeyCode(const std::string& char_text, |
| + WebUChar& code, |
|
piman
2011/11/19 22:31:00
Please replace non-const reference parameters by p
bbudge
2011/11/20 02:53:57
Done.
|
| + WebUChar& text, |
| + bool& needs_shift_modifier, |
| + bool& generate_char) { |
| + code = 0; |
| + text = 0; |
| + needs_shift_modifier = false; |
| + generate_char = false; |
| + if ("\n" == char_text) { |
| + text = code = VK_RETURN; |
| + generate_char = true; |
| + } else if ("rightArrow" == char_text) { |
| + code = VK_RIGHT; |
| + } else if ("downArrow" == char_text) { |
| + code = VK_DOWN; |
| + } else if ("leftArrow" == char_text) { |
| + code = VK_LEFT; |
| + } else if ("upArrow" == char_text) { |
| + code = VK_UP; |
| + } else if ("insert" == char_text) { |
| + code = VK_INSERT; |
| + } else if ("delete" == char_text) { |
| + code = VK_DELETE; |
| + } else if ("pageUp" == char_text) { |
| + code = VK_PRIOR; |
| + } else if ("pageDown" == char_text) { |
| + code = VK_NEXT; |
| + } else if ("home" == char_text) { |
| + code = VK_HOME; |
| + } else if ("end" == char_text) { |
| + code = VK_END; |
| + } else if ("printScreen" == char_text) { |
| + code = VK_SNAPSHOT; |
| + } else if ("menu" == char_text) { |
| + code = VK_APPS; |
| + } else { |
| + // Compare the input string with the function-key names defined by the |
| + // DOM spec (i.e. "F1",...,"F24"). |
| + for (int i = 1; i <= 24; ++i) { |
| + std::string functionKeyName = base::StringPrintf("F%d", i); |
| + if (functionKeyName == char_text) { |
| + code = VK_F1 + (i - 1); |
| + break; |
| + } |
| + } |
| + if (!code) { |
| + WebString web_char_text = |
| + WebString::fromUTF8(char_text.data(), char_text.size()); |
| + DCHECK_EQ(web_char_text.length(), 1U); |
| + text = code = web_char_text.data()[0]; |
| + needs_shift_modifier = |
| + (code & 0xFF) >= 'A' && (code & 0xFF) <= 'Z'; |
| + if ((code & 0xFF) >= 'a' && (code & 0xFF) <= 'z') |
| + code -= 'a' - 'A'; |
| + generate_char = true; |
| + } |
| + } |
| +} |
| + |
| } // namespace |
| void CreateInputEventData(const WebInputEvent& event, |
| @@ -315,6 +402,98 @@ |
| return web_input_event.release(); |
| } |
| +// Generate a coherent sequence of input events to simulate a user event. |
| +// From src/third_party/WebKit/Tools/DumpRenderTree/chromium/EventSender.cpp. |
| +std::vector<linked_ptr<WebInputEvent> > CreateSimulatedWebInputEvents( |
| + const ::ppapi::InputEventData& event, |
| + int plugin_x, |
| + int plugin_y) { |
| + std::vector<linked_ptr<WebInputEvent> > events; |
| + linked_ptr<WebInputEvent> original_event(CreateWebInputEvent(event)); |
| + |
| + switch (event.event_type) { |
| + case PP_INPUTEVENT_TYPE_MOUSEDOWN: |
| + case PP_INPUTEVENT_TYPE_MOUSEUP: |
| + case PP_INPUTEVENT_TYPE_MOUSEMOVE: |
| + case PP_INPUTEVENT_TYPE_MOUSEENTER: |
| + case PP_INPUTEVENT_TYPE_MOUSELEAVE: |
| + events.push_back(original_event); |
| + break; |
| + |
| + case PP_INPUTEVENT_TYPE_WHEEL: { |
| + WebMouseWheelEvent* web_mouse_wheel_event = |
| + static_cast<WebMouseWheelEvent*>(original_event.get()); |
| + web_mouse_wheel_event->x = plugin_x; |
| + web_mouse_wheel_event->y = plugin_y; |
| + events.push_back(original_event); |
| + break; |
| + } |
| + |
| + case PP_INPUTEVENT_TYPE_RAWKEYDOWN: |
| + case PP_INPUTEVENT_TYPE_KEYDOWN: |
| + case PP_INPUTEVENT_TYPE_KEYUP: { |
| + // Windows key down events should always be "raw" to avoid an ASSERT. |
| +#if defined(OS_WIN) |
| + WebKeyboardEvent* web_keyboard_event = |
| + static_cast<WebKeyboardEvent*>(original_event.get()); |
| + if (web_keyboard_event->type == WebInputEvent::KeyDown) |
| + web_keyboard_event->type = WebInputEvent::RawKeyDown; |
| +#endif |
| + events.push_back(original_event); |
| + break; |
| + } |
| + |
| + case PP_INPUTEVENT_TYPE_CHAR: { |
| + WebKeyboardEvent* web_char_event = |
| + static_cast<WebKeyboardEvent*>(original_event.get()); |
| + |
| + WebUChar code, text; |
|
piman
2011/11/19 22:31:00
Initialize variables.
bbudge
2011/11/20 02:53:57
Done.
|
| + bool needs_shift_modifier, generate_char; |
| + GetKeyCode(event.character_text, |
| + code, |
| + text, |
| + needs_shift_modifier, |
| + generate_char); |
| + |
| + // Synthesize key down and key up events in all cases. |
| + scoped_ptr<WebKeyboardEvent> key_down_event(new WebKeyboardEvent()); |
| + scoped_ptr<WebKeyboardEvent> key_up_event(new WebKeyboardEvent()); |
| + |
| + key_down_event->type = WebInputEvent::RawKeyDown; |
| + key_down_event->windowsKeyCode = code; |
| + key_down_event->nativeKeyCode = code; |
| + if (needs_shift_modifier) |
| + key_down_event->modifiers |= WebInputEvent::ShiftKey; |
| + |
| + // If a char event is needed, set the text fields. |
| + if (generate_char) { |
| + key_down_event->text[0] = text; |
| + key_down_event->unmodifiedText[0] = text; |
| + } |
| + // Convert the key code to a string identifier. |
| + key_down_event->setKeyIdentifierFromWindowsKeyCode(); |
| + |
| + *key_up_event = *web_char_event = *key_down_event; |
| + |
| + events.push_back(linked_ptr<WebInputEvent>(key_down_event.release())); |
| + |
| + if (generate_char) { |
| + web_char_event->type = WebInputEvent::Char; |
| + web_char_event->keyIdentifier[0] = '\0'; |
| + events.push_back(original_event); |
| + } |
| + |
| + key_up_event->type = WebInputEvent::KeyUp; |
| + events.push_back(linked_ptr<WebInputEvent>(key_up_event.release())); |
| + break; |
| + } |
| + |
| + default: |
| + break; |
| + } |
| + return events; |
| +} |
| + |
| PP_InputEvent_Class ClassifyInputEvent(WebInputEvent::Type type) { |
| switch (type) { |
| case WebInputEvent::MouseDown: |