Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(468)

Unified Diff: webkit/plugins/ppapi/event_conversion.cc

Issue 8413021: Add functions to generate input events to PPB_Testing_Dev. These make (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/plugins/ppapi/event_conversion.h ('k') | webkit/plugins/ppapi/plugin_module.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/plugins/ppapi/event_conversion.cc
===================================================================
--- webkit/plugins/ppapi/event_conversion.cc (revision 110856)
+++ 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,92 @@
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,
+ WebUChar* text,
+ bool* needs_shift_modifier,
+ bool* generate_char) {
+ WebUChar vk_code = 0;
+ WebUChar vk_text = 0;
+ *needs_shift_modifier = false;
+ *generate_char = false;
+ if ("\n" == char_text) {
+ vk_text = vk_code = VK_RETURN;
+ *generate_char = true;
+ } else if ("rightArrow" == char_text) {
+ vk_code = VK_RIGHT;
+ } else if ("downArrow" == char_text) {
+ vk_code = VK_DOWN;
+ } else if ("leftArrow" == char_text) {
+ vk_code = VK_LEFT;
+ } else if ("upArrow" == char_text) {
+ vk_code = VK_UP;
+ } else if ("insert" == char_text) {
+ vk_code = VK_INSERT;
+ } else if ("delete" == char_text) {
+ vk_code = VK_DELETE;
+ } else if ("pageUp" == char_text) {
+ vk_code = VK_PRIOR;
+ } else if ("pageDown" == char_text) {
+ vk_code = VK_NEXT;
+ } else if ("home" == char_text) {
+ vk_code = VK_HOME;
+ } else if ("end" == char_text) {
+ vk_code = VK_END;
+ } else if ("printScreen" == char_text) {
+ vk_code = VK_SNAPSHOT;
+ } else if ("menu" == char_text) {
+ vk_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) {
+ vk_code = VK_F1 + (i - 1);
+ break;
+ }
+ }
+ if (!vk_code) {
+ WebString web_char_text =
+ WebString::fromUTF8(char_text.data(), char_text.size());
+ DCHECK_EQ(web_char_text.length(), 1U);
+ vk_text = vk_code = web_char_text.data()[0];
+ *needs_shift_modifier =
+ (vk_code & 0xFF) >= 'A' && (vk_code & 0xFF) <= 'Z';
+ if ((vk_code & 0xFF) >= 'a' && (vk_code & 0xFF) <= 'z')
+ vk_code -= 'a' - 'A';
+ *generate_char = true;
+ }
+ }
+
+ *code = vk_code;
+ *text = vk_text;
+}
+
} // namespace
void CreateInputEventData(const WebInputEvent& event,
@@ -315,6 +405,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 = 0, text = 0;
+ bool needs_shift_modifier = false, generate_char = false;
+ 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:
« no previous file with comments | « webkit/plugins/ppapi/event_conversion.h ('k') | webkit/plugins/ppapi/plugin_module.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698