event_conversion.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/event_conversion.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/char_iterator.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/utf_string_conversion_utils.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/common/input/web_touch_event_traits.h" 16bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/usb_key_code_conversion.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_input_event.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_input_event_shared.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/time_conversion.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGamepads.h" 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::EventTimeToPPTimeTicks; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::InputEventData; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PPTimeTicksToEventTime; 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent; 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebKeyboardEvent; 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseEvent; 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseWheelEvent; 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchEvent; 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchPoint; 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebUChar; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify the modifier flags WebKit uses match the Pepper ones. If these start 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not matching, we'll need to write conversion code to preserve the Pepper 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// values (since plugins will be depending on them). 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_SHIFTKEY) == 44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::ShiftKey), 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShiftKeyMatches); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_CONTROLKEY) == 47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::ControlKey), 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ControlKeyMatches); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ALTKEY) == 50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::AltKey), 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AltKeyMatches); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_METAKEY) == 53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::MetaKey), 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MetaKeyMatches); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISKEYPAD) == 56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::IsKeyPad), 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyPadMatches); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT) == 59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::IsAutoRepeat), 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutoRepeatMatches); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_LEFTBUTTONDOWN) == 62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::LeftButtonDown), 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LeftButtonMatches); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN) == 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::MiddleButtonDown), 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MiddleButtonMatches); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_RIGHTBUTTONDOWN) == 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::RightButtonDown), 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RightButtonMatches); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_CAPSLOCKKEY) == 71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::CapsLockOn), 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapsLockMatches); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_NUMLOCKKEY) == 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::NumLockOn), 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NumLockMatches); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISLEFT) == 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::IsLeft), 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LeftMatches); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISRIGHT) == 80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::IsRight), 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RightMatches); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_InputEvent_Type ConvertEventTypes(WebInputEvent::Type wetype) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (wetype) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseDown: 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_MOUSEDOWN; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseUp: 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_MOUSEUP; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseMove: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_MOUSEMOVE; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseEnter: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_MOUSEENTER; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseLeave: 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_MOUSELEAVE; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::ContextMenu: 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_CONTEXTMENU; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseWheel: 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_WHEEL; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::RawKeyDown: 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_RAWKEYDOWN; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyDown: 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_KEYDOWN; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyUp: 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_KEYUP; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Char: 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_CHAR; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchStart: 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_TOUCHSTART; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchMove: 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_TOUCHMOVE; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchEnd: 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_TOUCHEND; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchCancel: 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_TOUCHCANCEL; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Undefined: 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_UNDEFINED; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generates a PP_InputEvent with the fields common to all events, as well as 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the event type from the given web event. Event-specific fields will be zero 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// initialized. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InputEventData GetEventWithCommonFieldsAndType(const WebInputEvent& web_event) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_type = ConvertEventTypes(web_event.type); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_time_stamp = EventTimeToPPTimeTicks(web_event.timeStampSeconds); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendKeyEvent(const WebInputEvent& event, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result_events) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKeyboardEvent& key_event = 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const WebKeyboardEvent&>(event); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result = GetEventWithCommonFieldsAndType(event); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_modifiers = key_event.modifiers; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.key_code = key_event.windowsKeyCode; 138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result.code = CodeForKeyboardEvent(key_event); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_events->push_back(result); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendCharEvent(const WebInputEvent& event, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result_events) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKeyboardEvent& key_event = 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const WebKeyboardEvent&>(event); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is a bit complex, the input event will normally just have one 16-bit 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // character in it, but may be zero or more than one. The text array is 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just padded with 0 values for the unused ones, but is not necessarily 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // null-terminated. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Here we see how many UTF-16 characters we have. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t utf16_char_count = 0; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (utf16_char_count < WebKeyboardEvent::textLengthCap && 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event.text[utf16_char_count]) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utf16_char_count++; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make a separate InputEventData for each Unicode character in the input. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::UTF16CharIterator iter(key_event.text, utf16_char_count); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!iter.end()) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result = GetEventWithCommonFieldsAndType(event); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_modifiers = key_event.modifiers; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WriteUnicodeCharacter(iter.get(), &result.character_text); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_events->push_back(result); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter.Advance(); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendMouseEvent(const WebInputEvent& event, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result_events) { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonNone) == 173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_NONE), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseNone); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonLeft) == 176a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_LEFT), 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseLeft); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonRight) == 179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_RIGHT), 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseRight); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonMiddle) == 182a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_MIDDLE), 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseMiddle); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const WebMouseEvent& mouse_event = static_cast<const WebMouseEvent&>(event); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result = GetEventWithCommonFieldsAndType(event); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_modifiers = mouse_event.modifiers; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_event.type == WebInputEvent::MouseDown || 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mouse_event.type == WebInputEvent::MouseMove || 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.type == WebInputEvent::MouseUp) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_button = 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<PP_InputEvent_MouseButton>(mouse_event.button); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_position.x = mouse_event.x; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_position.y = mouse_event.y; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_click_count = mouse_event.clickCount; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_movement.x = mouse_event.movementX; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_movement.y = mouse_event.movementY; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_events->push_back(result); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendMouseWheelEvent(const WebInputEvent& event, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result_events) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebMouseWheelEvent& mouse_wheel_event = 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const WebMouseWheelEvent&>(event); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result = GetEventWithCommonFieldsAndType(event); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_modifiers = mouse_wheel_event.modifiers; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.wheel_delta.x = mouse_wheel_event.deltaX; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.wheel_delta.y = mouse_wheel_event.deltaY; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.wheel_ticks.x = mouse_wheel_event.wheelTicksX; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.wheel_ticks.y = mouse_wheel_event.wheelTicksY; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.wheel_scroll_by_page = !!mouse_wheel_event.scrollByPage; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_events->push_back(result); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccienum IncludedTouchPointTypes { 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ALL, // All pointers targetting the plugin. 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ACTIVE, // Only pointers that are currently down. 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHANGED // Only pointers that have changed since the previous event. 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 221a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid SetPPTouchPoints(const WebTouchPoint* touches, 222a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint32_t touches_length, 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci IncludedTouchPointTypes included_types, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PP_TouchPoint>* result) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32_t i = 0; i < touches_length; i++) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebTouchPoint& touch_point = touches[i]; 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (included_types == ACTIVE && 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (touch_point.state == WebTouchPoint::StateReleased || 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci touch_point.state == WebTouchPoint::StateCancelled)) { 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci continue; 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (included_types == CHANGED && 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (touch_point.state == WebTouchPoint::StateUndefined || 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci touch_point.state == WebTouchPoint::StateStationary)) { 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci continue; 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_TouchPoint pp_pt; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.id = touch_point.id; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.position.x = touch_point.position.x; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.position.y = touch_point.position.y; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.radius.x = touch_point.radiusX; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.radius.y = touch_point.radiusY; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.rotation_angle = touch_point.rotationAngle; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.pressure = touch_point.force; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->push_back(pp_pt); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendTouchEvent(const WebInputEvent& event, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result_events) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebTouchEvent& touch_event = 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const WebTouchEvent&>(event); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result = GetEventWithCommonFieldsAndType(event); 255a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetPPTouchPoints( 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci touch_event.touches, touch_event.touchesLength, ACTIVE, &result.touches); 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetPPTouchPoints(touch_event.touches, 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci touch_event.touchesLength, 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHANGED, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result.changed_touches); 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetPPTouchPoints(touch_event.touches, 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci touch_event.touchesLength, 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ALL, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result.target_touches); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_events->push_back(result); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciWebTouchPoint CreateWebTouchPoint(const PP_TouchPoint& pp_pt, 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebTouchPoint::State state) { 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebTouchPoint pt; 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pt.id = pp_pt.id; 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pt.position.x = pp_pt.position.x; 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pt.position.y = pp_pt.position.y; 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO bug:http://code.google.com/p/chromium/issues/detail?id=93902 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pt.screenPosition.x = 0; 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pt.screenPosition.y = 0; 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pt.force = pp_pt.pressure; 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pt.radiusX = pp_pt.radius.x; 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pt.radiusY = pp_pt.radius.y; 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pt.rotationAngle = pp_pt.rotation_angle; 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pt.state = state; 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return pt; 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool HasTouchPointWithId(const WebTouchPoint* web_touches, 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint32_t web_touches_length, 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint32_t id) { 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Note: A brute force search to find the (potentially) existing touch point 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // is cheap given the small bound on |WebTouchEvent::touchesLengthCap|. 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (uint32_t i = 0; i < web_touches_length; ++i) { 2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (web_touches[i].id == static_cast<int>(id)) 2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid SetWebTouchPointsIfNotYetSet(const std::vector<PP_TouchPoint>& pp_touches, 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebTouchPoint::State state, 3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebTouchPoint* web_touches, 3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint32_t* web_touches_length) { 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const uint32_t initial_web_touches_length = *web_touches_length; 3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const uint32_t touches_length = 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::min(static_cast<uint32_t>(pp_touches.size()), 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static_cast<uint32_t>(WebTouchEvent::touchesLengthCap)); 3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (uint32_t i = 0; i < touches_length; ++i) { 3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const uint32_t touch_index = *web_touches_length; 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (touch_index >= static_cast<uint32_t>(WebTouchEvent::touchesLengthCap)) 3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_TouchPoint& pp_pt = pp_touches[i]; 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (HasTouchPointWithId(web_touches, initial_web_touches_length, pp_pt.id)) 3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci continue; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_touches[touch_index] = CreateWebTouchPoint(pp_pt, state); 3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++(*web_touches_length); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebTouchEvent* BuildTouchEvent(const InputEventData& event) { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTouchEvent* web_event = new WebTouchEvent(); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTouchPoint::State state = WebTouchPoint::StateUndefined; 3235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebInputEvent::Type type = WebInputEvent::Undefined; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.event_type) { 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHSTART: 3265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu type = WebInputEvent::TouchStart; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = WebTouchPoint::StatePressed; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHMOVE: 3305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu type = WebInputEvent::TouchMove; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = WebTouchPoint::StateMoved; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHEND: 3345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu type = WebInputEvent::TouchEnd; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = WebTouchPoint::StateReleased; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHCANCEL: 3385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu type = WebInputEvent::TouchCancel; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = WebTouchPoint::StateCancelled; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebTouchEventTraits::ResetType( 3455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu type, PPTimeTicksToEventTime(event.event_time_stamp), web_event); 3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_event->touchesLength = 0; 3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // First add all changed touches, then add only the remaining unset 3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // (stationary) touches. 3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetWebTouchPointsIfNotYetSet(event.changed_touches, 3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci state, 3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_event->touches, 3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &web_event->touchesLength); 3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SetWebTouchPointsIfNotYetSet(event.touches, 3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebTouchPoint::StateStationary, 3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci web_event->touches, 3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &web_event->touchesLength); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_event; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKeyboardEvent* BuildKeyEvent(const InputEventData& event) { 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKeyboardEvent* key_event = new WebKeyboardEvent(); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.event_type) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_RAWKEYDOWN: 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->type = WebInputEvent::RawKeyDown; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYDOWN: 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->type = WebInputEvent::KeyDown; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYUP: 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->type = WebInputEvent::KeyUp; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->timeStampSeconds = PPTimeTicksToEventTime(event.event_time_stamp); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->modifiers = event.event_modifiers; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->windowsKeyCode = event.key_code; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->setKeyIdentifierFromWindowsKeyCode(); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return key_event; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKeyboardEvent* BuildCharEvent(const InputEventData& event) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKeyboardEvent* key_event = new WebKeyboardEvent(); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->type = WebInputEvent::Char; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->timeStampSeconds = PPTimeTicksToEventTime(event.event_time_stamp); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->modifiers = event.event_modifiers; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure to not read beyond the buffer in case some bad code doesn't 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL-terminate it (this is called from plugins). 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t text_length_cap = WebKeyboardEvent::textLengthCap; 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 text16 = base::UTF8ToUTF16(event.character_text); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(key_event->text, 0, text_length_cap); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(key_event->unmodifiedText, 0, text_length_cap); 397a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (size_t i = 0; i < std::min(text_length_cap, text16.size()); ++i) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->text[i] = text16[i]; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return key_event; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMouseEvent* BuildMouseEvent(const InputEventData& event) { 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebMouseEvent* mouse_event = new WebMouseEvent(); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.event_type) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEDOWN: 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::MouseDown; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEUP: 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::MouseUp; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEMOVE: 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::MouseMove; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEENTER: 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::MouseEnter; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSELEAVE: 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::MouseLeave; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_CONTEXTMENU: 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::ContextMenu; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->timeStampSeconds = 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPTimeTicksToEventTime(event.event_time_stamp); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->modifiers = event.event_modifiers; 429a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch mouse_event->button = static_cast<WebMouseEvent::Button>(event.mouse_button); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_event->type == WebInputEvent::MouseMove) { 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_event->modifiers & WebInputEvent::LeftButtonDown) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->button = WebMouseEvent::ButtonLeft; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (mouse_event->modifiers & WebInputEvent::MiddleButtonDown) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->button = WebMouseEvent::ButtonMiddle; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (mouse_event->modifiers & WebInputEvent::RightButtonDown) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->button = WebMouseEvent::ButtonRight; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->x = event.mouse_position.x; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->y = event.mouse_position.y; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->clickCount = event.mouse_click_count; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->movementX = event.mouse_movement.x; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->movementY = event.mouse_movement.y; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mouse_event; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMouseWheelEvent* BuildMouseWheelEvent(const InputEventData& event) { 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebMouseWheelEvent* mouse_wheel_event = new WebMouseWheelEvent(); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->type = WebInputEvent::MouseWheel; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->timeStampSeconds = 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPTimeTicksToEventTime(event.event_time_stamp); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->modifiers = event.event_modifiers; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->deltaX = event.wheel_delta.x; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->deltaY = event.wheel_delta.y; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->wheelTicksX = event.wheel_ticks.x; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->wheelTicksY = event.wheel_ticks.y; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->scrollByPage = event.wheel_scroll_by_page; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mouse_wheel_event; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_WIN) 461a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_RETURN 0x0D 462a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 463a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_PRIOR 0x21 464a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_NEXT 0x22 465a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_END 0x23 466a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_HOME 0x24 467a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_LEFT 0x25 468a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_UP 0x26 469a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_RIGHT 0x27 470a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_DOWN 0x28 471a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_SNAPSHOT 0x2C 472a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_INSERT 0x2D 473a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_DELETE 0x2E 474a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 475a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_APPS 0x5D 476a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 477a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_F1 0x70 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convert a character string to a Windows virtual key code. Adapted from 481effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// src/content/shell/renderer/test_runner/event_sender.cc. This 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is used by CreateSimulatedWebInputEvents to convert keyboard events. 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetKeyCode(const std::string& char_text, 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUChar* code, 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUChar* text, 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* needs_shift_modifier, 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* generate_char) { 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUChar vk_code = 0; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUChar vk_text = 0; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *needs_shift_modifier = false; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *generate_char = false; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ("\n" == char_text) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_text = vk_code = VK_RETURN; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *generate_char = true; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("rightArrow" == char_text) { 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_RIGHT; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("downArrow" == char_text) { 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_DOWN; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("leftArrow" == char_text) { 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_LEFT; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("upArrow" == char_text) { 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_UP; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("insert" == char_text) { 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_INSERT; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("delete" == char_text) { 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_DELETE; 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("pageUp" == char_text) { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_PRIOR; 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("pageDown" == char_text) { 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_NEXT; 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("home" == char_text) { 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_HOME; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("end" == char_text) { 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_END; 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("printScreen" == char_text) { 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_SNAPSHOT; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("menu" == char_text) { 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_APPS; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compare the input string with the function-key names defined by the 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DOM spec (i.e. "F1",...,"F24"). 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 1; i <= 24; ++i) { 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string functionKeyName = base::StringPrintf("F%d", i); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (functionKeyName == char_text) { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_F1 + (i - 1); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!vk_code) { 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString web_char_text = 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString::fromUTF8(char_text.data(), char_text.size()); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(web_char_text.length(), 1U); 53390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) vk_text = vk_code = web_char_text.at(0); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *needs_shift_modifier = 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (vk_code & 0xFF) >= 'A' && (vk_code & 0xFF) <= 'Z'; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((vk_code & 0xFF) >= 'a' && (vk_code & 0xFF) <= 'z') 537a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch vk_code -= 'a' - 'A'; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *generate_char = true; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *code = vk_code; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = vk_text; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CreateInputEventData(const WebInputEvent& event, 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result) { 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->clear(); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.type) { 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseDown: 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseUp: 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseMove: 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseEnter: 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseLeave: 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::ContextMenu: 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMouseEvent(event, result); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseWheel: 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMouseWheelEvent(event, result); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::RawKeyDown: 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyDown: 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyUp: 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendKeyEvent(event, result); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Char: 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendCharEvent(event, result); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchStart: 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchMove: 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchEnd: 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchCancel: 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendTouchEvent(event, result); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Undefined: 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebInputEvent* CreateWebInputEvent(const InputEventData& event) { 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebInputEvent> web_input_event; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.event_type) { 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_UNDEFINED: 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEDOWN: 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEUP: 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEMOVE: 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEENTER: 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSELEAVE: 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_CONTEXTMENU: 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_input_event.reset(BuildMouseEvent(event)); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_WHEEL: 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_input_event.reset(BuildMouseWheelEvent(event)); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_RAWKEYDOWN: 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYDOWN: 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYUP: 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_input_event.reset(BuildKeyEvent(event)); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_CHAR: 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_input_event.reset(BuildCharEvent(event)); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_COMPOSITION_START: 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE: 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_COMPOSITION_END: 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_TEXT: 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kinaba) implement in WebKit an event structure to handle 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // composition events. 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHSTART: 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHMOVE: 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHEND: 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHCANCEL: 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_input_event.reset(BuildTouchEvent(event)); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_input_event.release(); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate a coherent sequence of input events to simulate a user event. 628effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// From src/content/shell/renderer/test_runner/event_sender.cc. 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<linked_ptr<WebInputEvent> > CreateSimulatedWebInputEvents( 630ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const ppapi::InputEventData& event, 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int plugin_x, 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int plugin_y) { 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<WebInputEvent> > events; 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<WebInputEvent> original_event(CreateWebInputEvent(event)); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.event_type) { 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEDOWN: 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEUP: 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEMOVE: 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEENTER: 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSELEAVE: 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHSTART: 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHMOVE: 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHEND: 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHCANCEL: 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(original_event); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_WHEEL: { 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebMouseWheelEvent* web_mouse_wheel_event = 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebMouseWheelEvent*>(original_event.get()); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_mouse_wheel_event->x = plugin_x; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_mouse_wheel_event->y = plugin_y; 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(original_event); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_RAWKEYDOWN: 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYDOWN: 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYUP: { 661a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Windows key down events should always be "raw" to avoid an ASSERT. 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKeyboardEvent* web_keyboard_event = 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebKeyboardEvent*>(original_event.get()); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_keyboard_event->type == WebInputEvent::KeyDown) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_keyboard_event->type = WebInputEvent::RawKeyDown; 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(original_event); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_CHAR: { 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKeyboardEvent* web_char_event = 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebKeyboardEvent*>(original_event.get()); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUChar code = 0, text = 0; 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool needs_shift_modifier = false, generate_char = false; 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetKeyCode(event.character_text, 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &code, 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &text, 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &needs_shift_modifier, 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &generate_char); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Synthesize key down and key up events in all cases. 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebKeyboardEvent> key_down_event(new WebKeyboardEvent()); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebKeyboardEvent> key_up_event(new WebKeyboardEvent()); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->type = WebInputEvent::RawKeyDown; 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->windowsKeyCode = code; 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->nativeKeyCode = code; 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (needs_shift_modifier) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->modifiers |= WebInputEvent::ShiftKey; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a char event is needed, set the text fields. 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (generate_char) { 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->text[0] = text; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->unmodifiedText[0] = text; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert the key code to a string identifier. 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->setKeyIdentifierFromWindowsKeyCode(); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *key_up_event = *web_char_event = *key_down_event; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(linked_ptr<WebInputEvent>(key_down_event.release())); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (generate_char) { 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_char_event->type = WebInputEvent::Char; 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_char_event->keyIdentifier[0] = '\0'; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(original_event); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_up_event->type = WebInputEvent::KeyUp; 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(linked_ptr<WebInputEvent>(key_up_event.release())); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return events; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_InputEvent_Class ClassifyInputEvent(WebInputEvent::Type type) { 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseDown: 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseUp: 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseMove: 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseEnter: 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseLeave: 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::ContextMenu: 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_CLASS_MOUSE; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseWheel: 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_CLASS_WHEEL; 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::RawKeyDown: 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyDown: 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyUp: 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Char: 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_CLASS_KEYBOARD; 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchCancel: 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchEnd: 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchMove: 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchStart: 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_CLASS_TOUCH; 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Undefined: 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 74603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CHECK(WebInputEvent::isGestureEventType(type)); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_InputEvent_Class(0); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} // namespace content 752