Index: webkit/plugins/ppapi/ppapi_plugin_instance.cc |
=================================================================== |
--- webkit/plugins/ppapi/ppapi_plugin_instance.cc (revision 110385) |
+++ webkit/plugins/ppapi/ppapi_plugin_instance.cc (working copy) |
@@ -100,6 +100,7 @@ |
#endif |
using base::StringPrintf; |
+using ppapi::InputEventData; |
using ppapi::InputEventImpl; |
using ppapi::PpapiGlobals; |
using ppapi::StringVar; |
@@ -119,8 +120,12 @@ |
using WebKit::WebFrame; |
using WebKit::WebElement; |
using WebKit::WebInputEvent; |
+using WebKit::WebKeyboardEvent; |
+using WebKit::WebMouseWheelEvent; |
using WebKit::WebPluginContainer; |
+using WebKit::WebPoint; |
using WebKit::WebString; |
+using WebKit::WebUChar; |
using WebKit::WebURLRequest; |
using WebKit::WebView; |
@@ -251,6 +256,89 @@ |
return true; |
} |
+#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 SimulateInputEvent to convert keyboard events. |
+void GetKeyCode(const std::string& char_text, |
dmichael (off chromium)
2011/11/17 19:27:57
Can you put all this stuff somewhere else, like ev
bbudge
2011/11/17 21:58:24
Done.
|
+ WebUChar& code, |
+ 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 |
// static |
@@ -1599,6 +1687,97 @@ |
plugin_mouse_lock_interface_->MouseLockLost(pp_instance()); |
} |
+void PluginInstance::SimulateInputEvent(const InputEventData& input_event) { |
+ WebView* web_view = container()->element().document().frame()->view(); |
+ if (!web_view) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ |
+ scoped_ptr<WebInputEvent> web_input_event(CreateWebInputEvent(input_event)); |
+ switch (input_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: |
+ web_view->handleInputEvent(*web_input_event); |
+ break; |
+ |
+ case PP_INPUTEVENT_TYPE_WHEEL: { |
+ // Mouse wheel events need a position inside the plugin area in order to |
+ // be routed back to the plugin. Choose the midpoint of the plugin |
+ // instance's area on screen. |
+ WebMouseWheelEvent* web_mouse_wheel_event = |
+ static_cast<WebMouseWheelEvent*>(web_input_event.get()); |
+ web_mouse_wheel_event->x = position().x() + position().width() / 2; |
+ web_mouse_wheel_event->y = position().y() + position().height() / 2; |
+ web_view->handleInputEvent(*web_mouse_wheel_event); |
+ break; |
+ } |
+ |
+ case PP_INPUTEVENT_TYPE_RAWKEYDOWN: |
+ case PP_INPUTEVENT_TYPE_KEYDOWN: |
+ case PP_INPUTEVENT_TYPE_KEYUP: { |
+ WebKeyboardEvent* web_keyboard_event = |
+ static_cast<WebKeyboardEvent*>(web_input_event.get()); |
+ // Windows key down events should always be "raw" to avoid an ASSERT. |
+#if defined(OS_WIN) |
+ if (web_keyboard_event->type == WebInputEvent::KeyDown) |
+ web_keyboard_event->type = WebInputEvent::RawKeyDown; |
+#endif |
+ web_view->handleInputEvent(*web_keyboard_event); |
+ break; |
+ } |
+ |
+ case PP_INPUTEVENT_TYPE_CHAR: { |
+ WebKeyboardEvent* web_char_event = |
+ static_cast<WebKeyboardEvent*>(web_input_event.get()); |
+ |
+ WebUChar code, text; |
+ bool needs_shift_modifier, generate_char; |
+ GetKeyCode(input_event.character_text, |
+ code, |
+ text, |
+ needs_shift_modifier, |
+ generate_char); |
+ |
+ // We synthesize key down and key up events in all cases. |
+ WebKeyboardEvent key_down_event, key_up_event; |
+ 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; |
+ |
+ web_view->handleInputEvent(key_down_event); |
+ |
+ if (generate_char) { |
+ web_char_event->type = WebInputEvent::Char; |
+ web_char_event->keyIdentifier[0] = '\0'; |
+ web_view->handleInputEvent(*web_char_event); |
+ } |
+ |
+ key_up_event.type = WebInputEvent::KeyUp; |
+ web_view->handleInputEvent(key_up_event); |
+ break; |
+ } |
+ |
+ default: |
+ break; |
+ } |
+} |
+ |
PPB_Instance_FunctionAPI* PluginInstance::AsPPB_Instance_FunctionAPI() { |
return this; |
} |