OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |