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 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; | |
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 |
OLD | NEW |