event_conversion.cc revision bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3
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) 7bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include <map> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/char_iterator.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/utf_string_conversion_utils.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 17bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/common.h" 18bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/usb_key_code_conversion.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_input_event.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_input_event_shared.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/time_conversion.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGamepads.h" 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::EventTimeToPPTimeTicks; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::InputEventData; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PPTimeTicksToEventTime; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebInputEvent; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebKeyboardEvent; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMouseEvent; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMouseWheelEvent; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebString; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebTouchEvent; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebTouchPoint; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebUChar; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace webkit { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify the modifier flags WebKit uses match the Pepper ones. If these start 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not matching, we'll need to write conversion code to preserve the Pepper 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// values (since plugins will be depending on them). 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_SHIFTKEY) == 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(WebInputEvent::ShiftKey), 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShiftKeyMatches); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_CONTROLKEY) == 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(WebInputEvent::ControlKey), 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ControlKeyMatches); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ALTKEY) == 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(WebInputEvent::AltKey), 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AltKeyMatches); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_METAKEY) == 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(WebInputEvent::MetaKey), 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MetaKeyMatches); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISKEYPAD) == 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(WebInputEvent::IsKeyPad), 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyPadMatches); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT) == 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(WebInputEvent::IsAutoRepeat), 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutoRepeatMatches); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_LEFTBUTTONDOWN) == 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(WebInputEvent::LeftButtonDown), 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LeftButtonMatches); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN) == 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(WebInputEvent::MiddleButtonDown), 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MiddleButtonMatches); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_RIGHTBUTTONDOWN) == 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(WebInputEvent::RightButtonDown), 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RightButtonMatches); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_CAPSLOCKKEY) == 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(WebInputEvent::CapsLockOn), 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapsLockMatches); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_NUMLOCKKEY) == 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(WebInputEvent::NumLockOn), 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NumLockMatches); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISLEFT) == 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(WebInputEvent::IsLeft), 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LeftMatches); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISRIGHT) == 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(WebInputEvent::IsRight), 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RightMatches); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_InputEvent_Type ConvertEventTypes(WebInputEvent::Type wetype) { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (wetype) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseDown: 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_MOUSEDOWN; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseUp: 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_MOUSEUP; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseMove: 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_MOUSEMOVE; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseEnter: 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_MOUSEENTER; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseLeave: 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_MOUSELEAVE; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::ContextMenu: 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_CONTEXTMENU; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseWheel: 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_WHEEL; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::RawKeyDown: 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_RAWKEYDOWN; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyDown: 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_KEYDOWN; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyUp: 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_KEYUP; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Char: 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_CHAR; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchStart: 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_TOUCHSTART; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchMove: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_TOUCHMOVE; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchEnd: 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_TOUCHEND; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchCancel: 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_TOUCHCANCEL; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Undefined: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_TYPE_UNDEFINED; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generates a PP_InputEvent with the fields common to all events, as well as 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the event type from the given web event. Event-specific fields will be zero 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// initialized. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InputEventData GetEventWithCommonFieldsAndType(const WebInputEvent& web_event) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_type = ConvertEventTypes(web_event.type); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_time_stamp = EventTimeToPPTimeTicks(web_event.timeStampSeconds); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.usb_key_code = 0; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendKeyEvent(const WebInputEvent& event, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result_events) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKeyboardEvent& key_event = 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const WebKeyboardEvent&>(event); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result = GetEventWithCommonFieldsAndType(event); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_modifiers = key_event.modifiers; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.key_code = key_event.windowsKeyCode; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.usb_key_code = UsbKeyCodeForKeyboardEvent(key_event); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_events->push_back(result); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendCharEvent(const WebInputEvent& event, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result_events) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKeyboardEvent& key_event = 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const WebKeyboardEvent&>(event); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is a bit complex, the input event will normally just have one 16-bit 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // character in it, but may be zero or more than one. The text array is 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just padded with 0 values for the unused ones, but is not necessarily 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // null-terminated. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Here we see how many UTF-16 characters we have. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t utf16_char_count = 0; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (utf16_char_count < WebKeyboardEvent::textLengthCap && 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event.text[utf16_char_count]) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utf16_char_count++; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make a separate InputEventData for each Unicode character in the input. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::UTF16CharIterator iter(key_event.text, utf16_char_count); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!iter.end()) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result = GetEventWithCommonFieldsAndType(event); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_modifiers = key_event.modifiers; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WriteUnicodeCharacter(iter.get(), &result.character_text); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_events->push_back(result); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter.Advance(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendMouseEvent(const WebInputEvent& event, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result_events) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonNone) == 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_NONE), 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseNone); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonLeft) == 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_LEFT), 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseLeft); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonRight) == 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_RIGHT), 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseRight); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonMiddle) == 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_MIDDLE), 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseMiddle); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebMouseEvent& mouse_event = 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const WebMouseEvent&>(event); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result = GetEventWithCommonFieldsAndType(event); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_modifiers = mouse_event.modifiers; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_event.type == WebInputEvent::MouseDown || 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mouse_event.type == WebInputEvent::MouseMove || 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.type == WebInputEvent::MouseUp) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_button = 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<PP_InputEvent_MouseButton>(mouse_event.button); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_position.x = mouse_event.x; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_position.y = mouse_event.y; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_click_count = mouse_event.clickCount; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_movement.x = mouse_event.movementX; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_movement.y = mouse_event.movementY; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_events->push_back(result); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendMouseWheelEvent(const WebInputEvent& event, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result_events) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebMouseWheelEvent& mouse_wheel_event = 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const WebMouseWheelEvent&>(event); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result = GetEventWithCommonFieldsAndType(event); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_modifiers = mouse_wheel_event.modifiers; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.wheel_delta.x = mouse_wheel_event.deltaX; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.wheel_delta.y = mouse_wheel_event.deltaY; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.wheel_ticks.x = mouse_wheel_event.wheelTicksX; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.wheel_ticks.y = mouse_wheel_event.wheelTicksY; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.wheel_scroll_by_page = !!mouse_wheel_event.scrollByPage; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_events->push_back(result); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetPPTouchPoints(const WebTouchPoint* touches, uint32_t touches_length, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PP_TouchPoint>* result) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32_t i = 0; i < touches_length; i++) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebTouchPoint& touch_point = touches[i]; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_TouchPoint pp_pt; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.id = touch_point.id; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.position.x = touch_point.position.x; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.position.y = touch_point.position.y; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.radius.x = touch_point.radiusX; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.radius.y = touch_point.radiusY; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.rotation_angle = touch_point.rotationAngle; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.pressure = touch_point.force; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->push_back(pp_pt); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendTouchEvent(const WebInputEvent& event, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result_events) { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebTouchEvent& touch_event = 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const WebTouchEvent&>(event); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result = GetEventWithCommonFieldsAndType(event); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPPTouchPoints(touch_event.touches, touch_event.touchesLength, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result.touches); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPPTouchPoints(touch_event.changedTouches, touch_event.changedTouchesLength, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result.changed_touches); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetPPTouchPoints(touch_event.targetTouches, touch_event.targetTouchesLength, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result.target_touches); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_events->push_back(result); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Structure used to map touch point id's to touch states. Since the pepper 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// touch event structure does not have states for individual touch points and 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instead relies on the event type in combination with the set of touch lists, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we have to set the state for the changed touches to be the same as the event 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type and all others to be 'stationary.' 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<uint32_t, WebTouchPoint::State> TouchStateMap; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetWebTouchPoints(const std::vector<PP_TouchPoint>& pp_touches, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TouchStateMap& states_map, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTouchPoint* web_touches, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t* web_touches_length) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32_t i = 0; i < pp_touches.size() && 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i < WebTouchEvent::touchesLengthCap; i++) { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTouchPoint pt; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_TouchPoint& pp_pt = pp_touches[i]; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.id = pp_pt.id; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states_map.find(pt.id) == states_map.end()) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.state = WebTouchPoint::StateStationary; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.state = states_map.find(pt.id)->second; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.position.x = pp_pt.position.x; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.position.y = pp_pt.position.y; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO bug:http://code.google.com/p/chromium/issues/detail?id=93902 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.screenPosition.x = 0; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.screenPosition.y = 0; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.force = pp_pt.pressure; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.radiusX = pp_pt.radius.x; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.radiusY = pp_pt.radius.y; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.rotationAngle = pp_pt.rotation_angle; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_touches[i] = pt; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*web_touches_length)++; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebTouchEvent* BuildTouchEvent(const InputEventData& event) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTouchEvent* web_event = new WebTouchEvent(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTouchPoint::State state = WebTouchPoint::StateUndefined; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.event_type) { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHSTART: 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_event->type = WebInputEvent::TouchStart; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = WebTouchPoint::StatePressed; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHMOVE: 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_event->type = WebInputEvent::TouchMove; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = WebTouchPoint::StateMoved; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHEND: 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_event->type = WebInputEvent::TouchEnd; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = WebTouchPoint::StateReleased; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHCANCEL: 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_event->type = WebInputEvent::TouchCancel; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = WebTouchPoint::StateCancelled; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TouchStateMap states_map; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32_t i = 0; i < event.changed_touches.size(); i++) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states_map[event.changed_touches[i].id] = state; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_event->timeStampSeconds = PPTimeTicksToEventTime(event.event_time_stamp); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWebTouchPoints(event.changed_touches, states_map, 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_event->changedTouches, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_event->changedTouchesLength); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWebTouchPoints(event.touches, states_map, web_event->touches, 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_event->touchesLength); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWebTouchPoints(event.target_touches, states_map, web_event->targetTouches, 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_event->targetTouchesLength); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_event->type == WebInputEvent::TouchEnd || 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_event->type == WebInputEvent::TouchCancel) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWebTouchPoints(event.changed_touches, states_map, 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_event->touches, &web_event->touchesLength); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetWebTouchPoints(event.changed_touches, states_map, 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_event->targetTouches, 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_event->targetTouchesLength); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_event; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKeyboardEvent* BuildKeyEvent(const InputEventData& event) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKeyboardEvent* key_event = new WebKeyboardEvent(); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.event_type) { 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_RAWKEYDOWN: 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->type = WebInputEvent::RawKeyDown; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYDOWN: 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->type = WebInputEvent::KeyDown; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYUP: 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->type = WebInputEvent::KeyUp; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->timeStampSeconds = PPTimeTicksToEventTime(event.event_time_stamp); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->modifiers = event.event_modifiers; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->windowsKeyCode = event.key_code; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->setKeyIdentifierFromWindowsKeyCode(); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return key_event; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKeyboardEvent* BuildCharEvent(const InputEventData& event) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKeyboardEvent* key_event = new WebKeyboardEvent(); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->type = WebInputEvent::Char; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->timeStampSeconds = PPTimeTicksToEventTime(event.event_time_stamp); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->modifiers = event.event_modifiers; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure to not read beyond the buffer in case some bad code doesn't 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL-terminate it (this is called from plugins). 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t text_length_cap = WebKeyboardEvent::textLengthCap; 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text16 = UTF8ToUTF16(event.character_text); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(key_event->text, 0, text_length_cap); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(key_event->unmodifiedText, 0, text_length_cap); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i < std::min(text_length_cap, text16.size()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++i) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->text[i] = text16[i]; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return key_event; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMouseEvent* BuildMouseEvent(const InputEventData& event) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebMouseEvent* mouse_event = new WebMouseEvent(); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.event_type) { 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEDOWN: 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::MouseDown; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEUP: 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::MouseUp; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEMOVE: 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::MouseMove; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEENTER: 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::MouseEnter; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSELEAVE: 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::MouseLeave; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_CONTEXTMENU: 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::ContextMenu; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->timeStampSeconds = 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPTimeTicksToEventTime(event.event_time_stamp); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->modifiers = event.event_modifiers; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->button = 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebMouseEvent::Button>(event.mouse_button); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_event->type == WebInputEvent::MouseMove) { 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_event->modifiers & WebInputEvent::LeftButtonDown) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->button = WebMouseEvent::ButtonLeft; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (mouse_event->modifiers & WebInputEvent::MiddleButtonDown) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->button = WebMouseEvent::ButtonMiddle; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (mouse_event->modifiers & WebInputEvent::RightButtonDown) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->button = WebMouseEvent::ButtonRight; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->x = event.mouse_position.x; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->y = event.mouse_position.y; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->clickCount = event.mouse_click_count; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->movementX = event.mouse_movement.x; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->movementY = event.mouse_movement.y; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mouse_event; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMouseWheelEvent* BuildMouseWheelEvent(const InputEventData& event) { 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebMouseWheelEvent* mouse_wheel_event = new WebMouseWheelEvent(); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->type = WebInputEvent::MouseWheel; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->timeStampSeconds = 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPTimeTicksToEventTime(event.event_time_stamp); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->modifiers = event.event_modifiers; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->deltaX = event.wheel_delta.x; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->deltaY = event.wheel_delta.y; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->wheelTicksX = event.wheel_ticks.x; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->wheelTicksY = event.wheel_ticks.y; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->scrollByPage = event.wheel_scroll_by_page; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mouse_wheel_event; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_WIN) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VK_RETURN 0x0D 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VK_PRIOR 0x21 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VK_NEXT 0x22 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VK_END 0x23 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VK_HOME 0x24 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VK_LEFT 0x25 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VK_UP 0x26 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VK_RIGHT 0x27 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VK_DOWN 0x28 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VK_SNAPSHOT 0x2C 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VK_INSERT 0x2D 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VK_DELETE 0x2E 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VK_APPS 0x5D 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VK_F1 0x70 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convert a character string to a Windows virtual key code. Adapted from 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// src/third_party/WebKit/Tools/DumpRenderTree/chromium/EventSender.cpp. This 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is used by CreateSimulatedWebInputEvents to convert keyboard events. 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetKeyCode(const std::string& char_text, 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUChar* code, 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUChar* text, 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* needs_shift_modifier, 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* generate_char) { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUChar vk_code = 0; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUChar vk_text = 0; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *needs_shift_modifier = false; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *generate_char = false; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ("\n" == char_text) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_text = vk_code = VK_RETURN; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *generate_char = true; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("rightArrow" == char_text) { 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_RIGHT; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("downArrow" == char_text) { 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_DOWN; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("leftArrow" == char_text) { 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_LEFT; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("upArrow" == char_text) { 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_UP; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("insert" == char_text) { 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_INSERT; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("delete" == char_text) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_DELETE; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("pageUp" == char_text) { 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_PRIOR; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("pageDown" == char_text) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_NEXT; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("home" == char_text) { 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_HOME; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("end" == char_text) { 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_END; 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("printScreen" == char_text) { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_SNAPSHOT; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("menu" == char_text) { 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_APPS; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compare the input string with the function-key names defined by the 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DOM spec (i.e. "F1",...,"F24"). 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 1; i <= 24; ++i) { 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string functionKeyName = base::StringPrintf("F%d", i); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (functionKeyName == char_text) { 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_F1 + (i - 1); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!vk_code) { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString web_char_text = 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString::fromUTF8(char_text.data(), char_text.size()); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(web_char_text.length(), 1U); 51690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) vk_text = vk_code = web_char_text.at(0); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *needs_shift_modifier = 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (vk_code & 0xFF) >= 'A' && (vk_code & 0xFF) <= 'Z'; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((vk_code & 0xFF) >= 'a' && (vk_code & 0xFF) <= 'z') 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code -= 'a' - 'A'; 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *generate_char = true; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *code = vk_code; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = vk_text; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CreateInputEventData(const WebInputEvent& event, 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result) { 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->clear(); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.type) { 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseDown: 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseUp: 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseMove: 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseEnter: 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseLeave: 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::ContextMenu: 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMouseEvent(event, result); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseWheel: 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMouseWheelEvent(event, result); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::RawKeyDown: 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyDown: 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyUp: 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendKeyEvent(event, result); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Char: 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendCharEvent(event, result); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchStart: 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchMove: 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchEnd: 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchCancel: 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendTouchEvent(event, result); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Undefined: 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebInputEvent* CreateWebInputEvent(const InputEventData& event) { 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebInputEvent> web_input_event; 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.event_type) { 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_UNDEFINED: 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEDOWN: 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEUP: 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEMOVE: 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEENTER: 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSELEAVE: 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_CONTEXTMENU: 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_input_event.reset(BuildMouseEvent(event)); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_WHEEL: 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_input_event.reset(BuildMouseWheelEvent(event)); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_RAWKEYDOWN: 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYDOWN: 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYUP: 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_input_event.reset(BuildKeyEvent(event)); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_CHAR: 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_input_event.reset(BuildCharEvent(event)); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_COMPOSITION_START: 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE: 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_COMPOSITION_END: 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_TEXT: 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kinaba) implement in WebKit an event structure to handle 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // composition events. 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHSTART: 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHMOVE: 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHEND: 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHCANCEL: 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_input_event.reset(BuildTouchEvent(event)); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_input_event.release(); 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate a coherent sequence of input events to simulate a user event. 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// From src/third_party/WebKit/Tools/DumpRenderTree/chromium/EventSender.cpp. 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<linked_ptr<WebInputEvent> > CreateSimulatedWebInputEvents( 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ::ppapi::InputEventData& event, 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int plugin_x, 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int plugin_y) { 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<WebInputEvent> > events; 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<WebInputEvent> original_event(CreateWebInputEvent(event)); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.event_type) { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEDOWN: 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEUP: 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEMOVE: 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEENTER: 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSELEAVE: 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHSTART: 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHMOVE: 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHEND: 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHCANCEL: 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(original_event); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_WHEEL: { 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebMouseWheelEvent* web_mouse_wheel_event = 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebMouseWheelEvent*>(original_event.get()); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_mouse_wheel_event->x = plugin_x; 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_mouse_wheel_event->y = plugin_y; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(original_event); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_RAWKEYDOWN: 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYDOWN: 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYUP: { 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Windows key down events should always be "raw" to avoid an ASSERT. 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKeyboardEvent* web_keyboard_event = 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebKeyboardEvent*>(original_event.get()); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_keyboard_event->type == WebInputEvent::KeyDown) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_keyboard_event->type = WebInputEvent::RawKeyDown; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(original_event); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_CHAR: { 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKeyboardEvent* web_char_event = 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebKeyboardEvent*>(original_event.get()); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUChar code = 0, text = 0; 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool needs_shift_modifier = false, generate_char = false; 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetKeyCode(event.character_text, 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &code, 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &text, 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &needs_shift_modifier, 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &generate_char); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Synthesize key down and key up events in all cases. 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebKeyboardEvent> key_down_event(new WebKeyboardEvent()); 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebKeyboardEvent> key_up_event(new WebKeyboardEvent()); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->type = WebInputEvent::RawKeyDown; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->windowsKeyCode = code; 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->nativeKeyCode = code; 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (needs_shift_modifier) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->modifiers |= WebInputEvent::ShiftKey; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a char event is needed, set the text fields. 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (generate_char) { 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->text[0] = text; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->unmodifiedText[0] = text; 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert the key code to a string identifier. 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->setKeyIdentifierFromWindowsKeyCode(); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *key_up_event = *web_char_event = *key_down_event; 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(linked_ptr<WebInputEvent>(key_down_event.release())); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (generate_char) { 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_char_event->type = WebInputEvent::Char; 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_char_event->keyIdentifier[0] = '\0'; 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(original_event); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_up_event->type = WebInputEvent::KeyUp; 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(linked_ptr<WebInputEvent>(key_up_event.release())); 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return events; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_InputEvent_Class ClassifyInputEvent(WebInputEvent::Type type) { 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseDown: 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseUp: 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseMove: 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseEnter: 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseLeave: 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::ContextMenu: 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_CLASS_MOUSE; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseWheel: 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_CLASS_WHEEL; 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::RawKeyDown: 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyDown: 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyUp: 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Char: 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_CLASS_KEYBOARD; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchCancel: 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchEnd: 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchMove: 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchStart: 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_CLASS_TOUCH; 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Undefined: 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_InputEvent_Class(0); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace webkit 736