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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/plugins/ppapi/event_conversion.h ('k') | webkit/plugins/ppapi/plugin_module.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "webkit/plugins/ppapi/event_conversion.h" 5 #include "webkit/plugins/ppapi/event_conversion.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/i18n/char_iterator.h" 8 #include "base/i18n/char_iterator.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "base/string_util.h" 11 #include "base/string_util.h"
12 #include "base/stringprintf.h"
12 #include "base/utf_string_conversions.h" 13 #include "base/utf_string_conversions.h"
13 #include "base/utf_string_conversion_utils.h" 14 #include "base/utf_string_conversion_utils.h"
14 #include "ppapi/c/pp_input_event.h" 15 #include "ppapi/c/pp_input_event.h"
15 #include "ppapi/shared_impl/input_event_impl.h" 16 #include "ppapi/shared_impl/input_event_impl.h"
16 #include "ppapi/shared_impl/time_conversion.h" 17 #include "ppapi/shared_impl/time_conversion.h"
17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
19 #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
18 #include "webkit/plugins/ppapi/common.h" 20 #include "webkit/plugins/ppapi/common.h"
19 21
20 using ppapi::EventTimeToPPTimeTicks; 22 using ppapi::EventTimeToPPTimeTicks;
21 using ppapi::InputEventData; 23 using ppapi::InputEventData;
22 using ppapi::PPTimeTicksToEventTime; 24 using ppapi::PPTimeTicksToEventTime;
23 using WebKit::WebInputEvent; 25 using WebKit::WebInputEvent;
24 using WebKit::WebKeyboardEvent; 26 using WebKit::WebKeyboardEvent;
25 using WebKit::WebMouseEvent; 27 using WebKit::WebMouseEvent;
26 using WebKit::WebMouseWheelEvent; 28 using WebKit::WebMouseWheelEvent;
29 using WebKit::WebString;
30 using WebKit::WebUChar;
27 31
28 namespace webkit { 32 namespace webkit {
29 namespace ppapi { 33 namespace ppapi {
30 34
31 namespace { 35 namespace {
32 36
33 PP_InputEvent_Type ConvertEventTypes(WebInputEvent::Type wetype) { 37 PP_InputEvent_Type ConvertEventTypes(WebInputEvent::Type wetype) {
34 switch (wetype) { 38 switch (wetype) {
35 case WebInputEvent::MouseDown: 39 case WebInputEvent::MouseDown:
36 return PP_INPUTEVENT_TYPE_MOUSEDOWN; 40 return PP_INPUTEVENT_TYPE_MOUSEDOWN;
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 PPTimeTicksToEventTime(event.event_time_stamp); 243 PPTimeTicksToEventTime(event.event_time_stamp);
240 mouse_wheel_event->modifiers = event.event_modifiers; 244 mouse_wheel_event->modifiers = event.event_modifiers;
241 mouse_wheel_event->deltaX = event.wheel_delta.x; 245 mouse_wheel_event->deltaX = event.wheel_delta.x;
242 mouse_wheel_event->deltaY = event.wheel_delta.y; 246 mouse_wheel_event->deltaY = event.wheel_delta.y;
243 mouse_wheel_event->wheelTicksX = event.wheel_ticks.x; 247 mouse_wheel_event->wheelTicksX = event.wheel_ticks.x;
244 mouse_wheel_event->wheelTicksY = event.wheel_ticks.y; 248 mouse_wheel_event->wheelTicksY = event.wheel_ticks.y;
245 mouse_wheel_event->scrollByPage = event.wheel_scroll_by_page; 249 mouse_wheel_event->scrollByPage = event.wheel_scroll_by_page;
246 return mouse_wheel_event; 250 return mouse_wheel_event;
247 } 251 }
248 252
253 #if !defined(OS_WIN)
254 #define VK_RETURN 0x0D
255
256 #define VK_PRIOR 0x21
257 #define VK_NEXT 0x22
258 #define VK_END 0x23
259 #define VK_HOME 0x24
260 #define VK_LEFT 0x25
261 #define VK_UP 0x26
262 #define VK_RIGHT 0x27
263 #define VK_DOWN 0x28
264 #define VK_SNAPSHOT 0x2C
265 #define VK_INSERT 0x2D
266 #define VK_DELETE 0x2E
267
268 #define VK_APPS 0x5D
269
270 #define VK_F1 0x70
271 #endif
272
273 // Convert a character string to a Windows virtual key code. Adapted from
274 // src/third_party/WebKit/Tools/DumpRenderTree/chromium/EventSender.cpp. This
275 // is used by CreateSimulatedWebInputEvents to convert keyboard events.
276 void GetKeyCode(const std::string& char_text,
277 WebUChar* code,
278 WebUChar* text,
279 bool* needs_shift_modifier,
280 bool* generate_char) {
281 WebUChar vk_code = 0;
282 WebUChar vk_text = 0;
283 *needs_shift_modifier = false;
284 *generate_char = false;
285 if ("\n" == char_text) {
286 vk_text = vk_code = VK_RETURN;
287 *generate_char = true;
288 } else if ("rightArrow" == char_text) {
289 vk_code = VK_RIGHT;
290 } else if ("downArrow" == char_text) {
291 vk_code = VK_DOWN;
292 } else if ("leftArrow" == char_text) {
293 vk_code = VK_LEFT;
294 } else if ("upArrow" == char_text) {
295 vk_code = VK_UP;
296 } else if ("insert" == char_text) {
297 vk_code = VK_INSERT;
298 } else if ("delete" == char_text) {
299 vk_code = VK_DELETE;
300 } else if ("pageUp" == char_text) {
301 vk_code = VK_PRIOR;
302 } else if ("pageDown" == char_text) {
303 vk_code = VK_NEXT;
304 } else if ("home" == char_text) {
305 vk_code = VK_HOME;
306 } else if ("end" == char_text) {
307 vk_code = VK_END;
308 } else if ("printScreen" == char_text) {
309 vk_code = VK_SNAPSHOT;
310 } else if ("menu" == char_text) {
311 vk_code = VK_APPS;
312 } else {
313 // Compare the input string with the function-key names defined by the
314 // DOM spec (i.e. "F1",...,"F24").
315 for (int i = 1; i <= 24; ++i) {
316 std::string functionKeyName = base::StringPrintf("F%d", i);
317 if (functionKeyName == char_text) {
318 vk_code = VK_F1 + (i - 1);
319 break;
320 }
321 }
322 if (!vk_code) {
323 WebString web_char_text =
324 WebString::fromUTF8(char_text.data(), char_text.size());
325 DCHECK_EQ(web_char_text.length(), 1U);
326 vk_text = vk_code = web_char_text.data()[0];
327 *needs_shift_modifier =
328 (vk_code & 0xFF) >= 'A' && (vk_code & 0xFF) <= 'Z';
329 if ((vk_code & 0xFF) >= 'a' && (vk_code & 0xFF) <= 'z')
330 vk_code -= 'a' - 'A';
331 *generate_char = true;
332 }
333 }
334
335 *code = vk_code;
336 *text = vk_text;
337 }
338
249 } // namespace 339 } // namespace
250 340
251 void CreateInputEventData(const WebInputEvent& event, 341 void CreateInputEventData(const WebInputEvent& event,
252 std::vector<InputEventData>* result) { 342 std::vector<InputEventData>* result) {
253 result->clear(); 343 result->clear();
254 344
255 switch (event.type) { 345 switch (event.type) {
256 case WebInputEvent::MouseDown: 346 case WebInputEvent::MouseDown:
257 case WebInputEvent::MouseUp: 347 case WebInputEvent::MouseUp:
258 case WebInputEvent::MouseMove: 348 case WebInputEvent::MouseMove:
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 case PP_INPUTEVENT_TYPE_IME_TEXT: 398 case PP_INPUTEVENT_TYPE_IME_TEXT:
309 // TODO(kinaba) implement in WebKit an event structure to handle 399 // TODO(kinaba) implement in WebKit an event structure to handle
310 // composition events. 400 // composition events.
311 NOTREACHED(); 401 NOTREACHED();
312 break; 402 break;
313 } 403 }
314 404
315 return web_input_event.release(); 405 return web_input_event.release();
316 } 406 }
317 407
408 // Generate a coherent sequence of input events to simulate a user event.
409 // From src/third_party/WebKit/Tools/DumpRenderTree/chromium/EventSender.cpp.
410 std::vector<linked_ptr<WebInputEvent> > CreateSimulatedWebInputEvents(
411 const ::ppapi::InputEventData& event,
412 int plugin_x,
413 int plugin_y) {
414 std::vector<linked_ptr<WebInputEvent> > events;
415 linked_ptr<WebInputEvent> original_event(CreateWebInputEvent(event));
416
417 switch (event.event_type) {
418 case PP_INPUTEVENT_TYPE_MOUSEDOWN:
419 case PP_INPUTEVENT_TYPE_MOUSEUP:
420 case PP_INPUTEVENT_TYPE_MOUSEMOVE:
421 case PP_INPUTEVENT_TYPE_MOUSEENTER:
422 case PP_INPUTEVENT_TYPE_MOUSELEAVE:
423 events.push_back(original_event);
424 break;
425
426 case PP_INPUTEVENT_TYPE_WHEEL: {
427 WebMouseWheelEvent* web_mouse_wheel_event =
428 static_cast<WebMouseWheelEvent*>(original_event.get());
429 web_mouse_wheel_event->x = plugin_x;
430 web_mouse_wheel_event->y = plugin_y;
431 events.push_back(original_event);
432 break;
433 }
434
435 case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
436 case PP_INPUTEVENT_TYPE_KEYDOWN:
437 case PP_INPUTEVENT_TYPE_KEYUP: {
438 // Windows key down events should always be "raw" to avoid an ASSERT.
439 #if defined(OS_WIN)
440 WebKeyboardEvent* web_keyboard_event =
441 static_cast<WebKeyboardEvent*>(original_event.get());
442 if (web_keyboard_event->type == WebInputEvent::KeyDown)
443 web_keyboard_event->type = WebInputEvent::RawKeyDown;
444 #endif
445 events.push_back(original_event);
446 break;
447 }
448
449 case PP_INPUTEVENT_TYPE_CHAR: {
450 WebKeyboardEvent* web_char_event =
451 static_cast<WebKeyboardEvent*>(original_event.get());
452
453 WebUChar code = 0, text = 0;
454 bool needs_shift_modifier = false, generate_char = false;
455 GetKeyCode(event.character_text,
456 &code,
457 &text,
458 &needs_shift_modifier,
459 &generate_char);
460
461 // Synthesize key down and key up events in all cases.
462 scoped_ptr<WebKeyboardEvent> key_down_event(new WebKeyboardEvent());
463 scoped_ptr<WebKeyboardEvent> key_up_event(new WebKeyboardEvent());
464
465 key_down_event->type = WebInputEvent::RawKeyDown;
466 key_down_event->windowsKeyCode = code;
467 key_down_event->nativeKeyCode = code;
468 if (needs_shift_modifier)
469 key_down_event->modifiers |= WebInputEvent::ShiftKey;
470
471 // If a char event is needed, set the text fields.
472 if (generate_char) {
473 key_down_event->text[0] = text;
474 key_down_event->unmodifiedText[0] = text;
475 }
476 // Convert the key code to a string identifier.
477 key_down_event->setKeyIdentifierFromWindowsKeyCode();
478
479 *key_up_event = *web_char_event = *key_down_event;
480
481 events.push_back(linked_ptr<WebInputEvent>(key_down_event.release()));
482
483 if (generate_char) {
484 web_char_event->type = WebInputEvent::Char;
485 web_char_event->keyIdentifier[0] = '\0';
486 events.push_back(original_event);
487 }
488
489 key_up_event->type = WebInputEvent::KeyUp;
490 events.push_back(linked_ptr<WebInputEvent>(key_up_event.release()));
491 break;
492 }
493
494 default:
495 break;
496 }
497 return events;
498 }
499
318 PP_InputEvent_Class ClassifyInputEvent(WebInputEvent::Type type) { 500 PP_InputEvent_Class ClassifyInputEvent(WebInputEvent::Type type) {
319 switch (type) { 501 switch (type) {
320 case WebInputEvent::MouseDown: 502 case WebInputEvent::MouseDown:
321 case WebInputEvent::MouseUp: 503 case WebInputEvent::MouseUp:
322 case WebInputEvent::MouseMove: 504 case WebInputEvent::MouseMove:
323 case WebInputEvent::MouseEnter: 505 case WebInputEvent::MouseEnter:
324 case WebInputEvent::MouseLeave: 506 case WebInputEvent::MouseLeave:
325 case WebInputEvent::ContextMenu: 507 case WebInputEvent::ContextMenu:
326 return PP_INPUTEVENT_CLASS_MOUSE; 508 return PP_INPUTEVENT_CLASS_MOUSE;
327 case WebInputEvent::MouseWheel: 509 case WebInputEvent::MouseWheel:
328 return PP_INPUTEVENT_CLASS_WHEEL; 510 return PP_INPUTEVENT_CLASS_WHEEL;
329 case WebInputEvent::RawKeyDown: 511 case WebInputEvent::RawKeyDown:
330 case WebInputEvent::KeyDown: 512 case WebInputEvent::KeyDown:
331 case WebInputEvent::KeyUp: 513 case WebInputEvent::KeyUp:
332 case WebInputEvent::Char: 514 case WebInputEvent::Char:
333 return PP_INPUTEVENT_CLASS_KEYBOARD; 515 return PP_INPUTEVENT_CLASS_KEYBOARD;
334 case WebInputEvent::Undefined: 516 case WebInputEvent::Undefined:
335 default: 517 default:
336 NOTREACHED(); 518 NOTREACHED();
337 return PP_InputEvent_Class(0); 519 return PP_InputEvent_Class(0);
338 } 520 }
339 } 521 }
340 522
341 } // namespace ppapi 523 } // namespace ppapi
342 } // namespace webkit 524 } // namespace webkit
OLDNEW
« 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