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

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
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 code = 0;
282 text = 0;
283 needs_shift_modifier = false;
284 generate_char = false;
285 if ("\n" == char_text) {
286 text = code = VK_RETURN;
287 generate_char = true;
288 } else if ("rightArrow" == char_text) {
289 code = VK_RIGHT;
290 } else if ("downArrow" == char_text) {
291 code = VK_DOWN;
292 } else if ("leftArrow" == char_text) {
293 code = VK_LEFT;
294 } else if ("upArrow" == char_text) {
295 code = VK_UP;
296 } else if ("insert" == char_text) {
297 code = VK_INSERT;
298 } else if ("delete" == char_text) {
299 code = VK_DELETE;
300 } else if ("pageUp" == char_text) {
301 code = VK_PRIOR;
302 } else if ("pageDown" == char_text) {
303 code = VK_NEXT;
304 } else if ("home" == char_text) {
305 code = VK_HOME;
306 } else if ("end" == char_text) {
307 code = VK_END;
308 } else if ("printScreen" == char_text) {
309 code = VK_SNAPSHOT;
310 } else if ("menu" == char_text) {
311 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 code = VK_F1 + (i - 1);
319 break;
320 }
321 }
322 if (!code) {
323 WebString web_char_text =
324 WebString::fromUTF8(char_text.data(), char_text.size());
325 DCHECK_EQ(web_char_text.length(), 1U);
326 text = code = web_char_text.data()[0];
327 needs_shift_modifier =
328 (code & 0xFF) >= 'A' && (code & 0xFF) <= 'Z';
329 if ((code & 0xFF) >= 'a' && (code & 0xFF) <= 'z')
330 code -= 'a' - 'A';
331 generate_char = true;
332 }
333 }
334 }
335
249 } // namespace 336 } // namespace
250 337
251 void CreateInputEventData(const WebInputEvent& event, 338 void CreateInputEventData(const WebInputEvent& event,
252 std::vector<InputEventData>* result) { 339 std::vector<InputEventData>* result) {
253 result->clear(); 340 result->clear();
254 341
255 switch (event.type) { 342 switch (event.type) {
256 case WebInputEvent::MouseDown: 343 case WebInputEvent::MouseDown:
257 case WebInputEvent::MouseUp: 344 case WebInputEvent::MouseUp:
258 case WebInputEvent::MouseMove: 345 case WebInputEvent::MouseMove:
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 case PP_INPUTEVENT_TYPE_IME_TEXT: 395 case PP_INPUTEVENT_TYPE_IME_TEXT:
309 // TODO(kinaba) implement in WebKit an event structure to handle 396 // TODO(kinaba) implement in WebKit an event structure to handle
310 // composition events. 397 // composition events.
311 NOTREACHED(); 398 NOTREACHED();
312 break; 399 break;
313 } 400 }
314 401
315 return web_input_event.release(); 402 return web_input_event.release();
316 } 403 }
317 404
405 // Generate a coherent sequence of input events to simulate a user event.
406 // From src/third_party/WebKit/Tools/DumpRenderTree/chromium/EventSender.cpp.
407 std::vector<linked_ptr<WebInputEvent> > CreateSimulatedWebInputEvents(
408 const ::ppapi::InputEventData& event,
409 int plugin_x,
410 int plugin_y) {
411 std::vector<linked_ptr<WebInputEvent> > events;
412 linked_ptr<WebInputEvent> original_event(CreateWebInputEvent(event));
413
414 switch (event.event_type) {
415 case PP_INPUTEVENT_TYPE_MOUSEDOWN:
416 case PP_INPUTEVENT_TYPE_MOUSEUP:
417 case PP_INPUTEVENT_TYPE_MOUSEMOVE:
418 case PP_INPUTEVENT_TYPE_MOUSEENTER:
419 case PP_INPUTEVENT_TYPE_MOUSELEAVE:
420 events.push_back(original_event);
421 break;
422
423 case PP_INPUTEVENT_TYPE_WHEEL: {
424 WebMouseWheelEvent* web_mouse_wheel_event =
425 static_cast<WebMouseWheelEvent*>(original_event.get());
426 web_mouse_wheel_event->x = plugin_x;
427 web_mouse_wheel_event->y = plugin_y;
428 events.push_back(original_event);
429 break;
430 }
431
432 case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
433 case PP_INPUTEVENT_TYPE_KEYDOWN:
434 case PP_INPUTEVENT_TYPE_KEYUP: {
435 // Windows key down events should always be "raw" to avoid an ASSERT.
436 #if defined(OS_WIN)
437 WebKeyboardEvent* web_keyboard_event =
438 static_cast<WebKeyboardEvent*>(original_event.get());
439 if (web_keyboard_event->type == WebInputEvent::KeyDown)
440 web_keyboard_event->type = WebInputEvent::RawKeyDown;
441 #endif
442 events.push_back(original_event);
443 break;
444 }
445
446 case PP_INPUTEVENT_TYPE_CHAR: {
447 WebKeyboardEvent* web_char_event =
448 static_cast<WebKeyboardEvent*>(original_event.get());
449
450 WebUChar code, text;
451 bool needs_shift_modifier, generate_char;
452 GetKeyCode(event.character_text,
453 code,
454 text,
455 needs_shift_modifier,
456 generate_char);
457
458 // Synthesize key down and key up events in all cases.
459 scoped_ptr<WebKeyboardEvent> key_down_event(new WebKeyboardEvent());
460 scoped_ptr<WebKeyboardEvent> key_up_event(new WebKeyboardEvent());
461
462 key_down_event->type = WebInputEvent::RawKeyDown;
463 key_down_event->windowsKeyCode = code;
464 key_down_event->nativeKeyCode = code;
465 if (needs_shift_modifier)
466 key_down_event->modifiers |= WebInputEvent::ShiftKey;
467
468 // If a char event is needed, set the text fields.
469 if (generate_char) {
470 key_down_event->text[0] = text;
471 key_down_event->unmodifiedText[0] = text;
dmichael (off chromium) 2011/11/18 03:44:45 nit: looks like WebKit spacing here (and the if be
bbudge 2011/11/18 19:00:06 Done.
472 }
473 // Convert the key code to a string identifier.
474 key_down_event->setKeyIdentifierFromWindowsKeyCode();
475
476 *key_up_event = *web_char_event = *key_down_event;
477
478 events.push_back(linked_ptr<WebInputEvent>(key_down_event.release()));
479
480 if (generate_char) {
481 web_char_event->type = WebInputEvent::Char;
482 web_char_event->keyIdentifier[0] = '\0';
483 events.push_back(original_event);
484 }
485
486 key_up_event->type = WebInputEvent::KeyUp;
487 events.push_back(linked_ptr<WebInputEvent>(key_up_event.release()));
488 break;
489 }
490
491 default:
492 break;
493 }
494 return events;
495 }
496
318 PP_InputEvent_Class ClassifyInputEvent(WebInputEvent::Type type) { 497 PP_InputEvent_Class ClassifyInputEvent(WebInputEvent::Type type) {
319 switch (type) { 498 switch (type) {
320 case WebInputEvent::MouseDown: 499 case WebInputEvent::MouseDown:
321 case WebInputEvent::MouseUp: 500 case WebInputEvent::MouseUp:
322 case WebInputEvent::MouseMove: 501 case WebInputEvent::MouseMove:
323 case WebInputEvent::MouseEnter: 502 case WebInputEvent::MouseEnter:
324 case WebInputEvent::MouseLeave: 503 case WebInputEvent::MouseLeave:
325 case WebInputEvent::ContextMenu: 504 case WebInputEvent::ContextMenu:
326 return PP_INPUTEVENT_CLASS_MOUSE; 505 return PP_INPUTEVENT_CLASS_MOUSE;
327 case WebInputEvent::MouseWheel: 506 case WebInputEvent::MouseWheel:
328 return PP_INPUTEVENT_CLASS_WHEEL; 507 return PP_INPUTEVENT_CLASS_WHEEL;
329 case WebInputEvent::RawKeyDown: 508 case WebInputEvent::RawKeyDown:
330 case WebInputEvent::KeyDown: 509 case WebInputEvent::KeyDown:
331 case WebInputEvent::KeyUp: 510 case WebInputEvent::KeyUp:
332 case WebInputEvent::Char: 511 case WebInputEvent::Char:
333 return PP_INPUTEVENT_CLASS_KEYBOARD; 512 return PP_INPUTEVENT_CLASS_KEYBOARD;
334 case WebInputEvent::Undefined: 513 case WebInputEvent::Undefined:
335 default: 514 default:
336 NOTREACHED(); 515 NOTREACHED();
337 return PP_InputEvent_Class(0); 516 return PP_InputEvent_Class(0);
338 } 517 }
339 } 518 }
340 519
341 } // namespace ppapi 520 } // namespace ppapi
342 } // namespace webkit 521 } // namespace webkit
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698