Chromium Code Reviews| 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, | |
|
piman
2011/11/19 22:31:00
Please replace non-const reference parameters by p
bbudge
2011/11/20 02:53:57
Done.
| |
| 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 Loading... | |
| 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; | |
|
piman
2011/11/19 22:31:00
Initialize variables.
bbudge
2011/11/20 02:53:57
Done.
| |
| 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; | |
| 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 |
| OLD | NEW |