event_conversion.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
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" 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/common/input/web_touch_event_traits.h" 18bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/common.h" 19bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/usb_key_code_conversion.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_input_event.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_input_event_shared.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/time_conversion.h" 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGamepads.h" 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::EventTimeToPPTimeTicks; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::InputEventData; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PPTimeTicksToEventTime; 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent; 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebKeyboardEvent; 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseEvent; 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseWheelEvent; 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchEvent; 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTouchPoint; 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebUChar; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content { 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) == 47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::ShiftKey), 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShiftKeyMatches); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_CONTROLKEY) == 50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::ControlKey), 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ControlKeyMatches); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ALTKEY) == 53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::AltKey), 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AltKeyMatches); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_METAKEY) == 56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::MetaKey), 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MetaKeyMatches); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISKEYPAD) == 59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::IsKeyPad), 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyPadMatches); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT) == 62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::IsAutoRepeat), 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutoRepeatMatches); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_LEFTBUTTONDOWN) == 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::LeftButtonDown), 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LeftButtonMatches); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN) == 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::MiddleButtonDown), 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MiddleButtonMatches); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_RIGHTBUTTONDOWN) == 71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::RightButtonDown), 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RightButtonMatches); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_CAPSLOCKKEY) == 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::CapsLockOn), 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapsLockMatches); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_NUMLOCKKEY) == 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::NumLockOn), 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NumLockMatches); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISLEFT) == 80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(WebInputEvent::IsLeft), 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LeftMatches); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISRIGHT) == 83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 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) return result; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendKeyEvent(const WebInputEvent& event, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result_events) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKeyboardEvent& key_event = 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const WebKeyboardEvent&>(event); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result = GetEventWithCommonFieldsAndType(event); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_modifiers = key_event.modifiers; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.key_code = key_event.windowsKeyCode; 141d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result.code = CodeForKeyboardEvent(key_event); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_events->push_back(result); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendCharEvent(const WebInputEvent& event, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result_events) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKeyboardEvent& key_event = 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const WebKeyboardEvent&>(event); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is a bit complex, the input event will normally just have one 16-bit 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // character in it, but may be zero or more than one. The text array is 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just padded with 0 values for the unused ones, but is not necessarily 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // null-terminated. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Here we see how many UTF-16 characters we have. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t utf16_char_count = 0; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (utf16_char_count < WebKeyboardEvent::textLengthCap && 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event.text[utf16_char_count]) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utf16_char_count++; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make a separate InputEventData for each Unicode character in the input. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::UTF16CharIterator iter(key_event.text, utf16_char_count); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!iter.end()) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result = GetEventWithCommonFieldsAndType(event); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_modifiers = key_event.modifiers; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WriteUnicodeCharacter(iter.get(), &result.character_text); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_events->push_back(result); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter.Advance(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendMouseEvent(const WebInputEvent& event, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result_events) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonNone) == 176a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_NONE), 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseNone); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonLeft) == 179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_LEFT), 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseLeft); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonRight) == 182a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_RIGHT), 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseRight); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonMiddle) == 185a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_MIDDLE), 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseMiddle); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 188a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const WebMouseEvent& mouse_event = static_cast<const WebMouseEvent&>(event); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result = GetEventWithCommonFieldsAndType(event); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_modifiers = mouse_event.modifiers; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_event.type == WebInputEvent::MouseDown || 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mouse_event.type == WebInputEvent::MouseMove || 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.type == WebInputEvent::MouseUp) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_button = 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<PP_InputEvent_MouseButton>(mouse_event.button); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_position.x = mouse_event.x; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_position.y = mouse_event.y; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_click_count = mouse_event.clickCount; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_movement.x = mouse_event.movementX; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.mouse_movement.y = mouse_event.movementY; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_events->push_back(result); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendMouseWheelEvent(const WebInputEvent& event, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result_events) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebMouseWheelEvent& mouse_wheel_event = 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const WebMouseWheelEvent&>(event); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result = GetEventWithCommonFieldsAndType(event); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.event_modifiers = mouse_wheel_event.modifiers; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.wheel_delta.x = mouse_wheel_event.deltaX; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.wheel_delta.y = mouse_wheel_event.deltaY; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.wheel_ticks.x = mouse_wheel_event.wheelTicksX; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.wheel_ticks.y = mouse_wheel_event.wheelTicksY; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result.wheel_scroll_by_page = !!mouse_wheel_event.scrollByPage; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_events->push_back(result); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 219a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid SetPPTouchPoints(const WebTouchPoint* touches, 220a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch uint32_t touches_length, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<PP_TouchPoint>* result) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32_t i = 0; i < touches_length; i++) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebTouchPoint& touch_point = touches[i]; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_TouchPoint pp_pt; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.id = touch_point.id; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.position.x = touch_point.position.x; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.position.y = touch_point.position.y; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.radius.x = touch_point.radiusX; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.radius.y = touch_point.radiusY; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.rotation_angle = touch_point.rotationAngle; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_pt.pressure = touch_point.force; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->push_back(pp_pt); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendTouchEvent(const WebInputEvent& event, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result_events) { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebTouchEvent& touch_event = 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const WebTouchEvent&>(event); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputEventData result = GetEventWithCommonFieldsAndType(event); 242a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetPPTouchPoints( 243a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch touch_event.touches, touch_event.touchesLength, &result.touches); 244a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetPPTouchPoints(touch_event.changedTouches, 245a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch touch_event.changedTouchesLength, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result.changed_touches); 247a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetPPTouchPoints(touch_event.targetTouches, 248a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch touch_event.targetTouchesLength, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result.target_touches); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_events->push_back(result); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Structure used to map touch point id's to touch states. Since the pepper 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// touch event structure does not have states for individual touch points and 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instead relies on the event type in combination with the set of touch lists, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we have to set the state for the changed touches to be the same as the event 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type and all others to be 'stationary.' 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::map<uint32_t, WebTouchPoint::State> TouchStateMap; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetWebTouchPoints(const std::vector<PP_TouchPoint>& pp_touches, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TouchStateMap& states_map, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTouchPoint* web_touches, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t* web_touches_length) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 266a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (uint32_t i = 0; 267a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch i < pp_touches.size() && i < WebTouchEvent::touchesLengthCap; 268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch i++) { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTouchPoint pt; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_TouchPoint& pp_pt = pp_touches[i]; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.id = pp_pt.id; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (states_map.find(pt.id) == states_map.end()) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.state = WebTouchPoint::StateStationary; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.state = states_map.find(pt.id)->second; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.position.x = pp_pt.position.x; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.position.y = pp_pt.position.y; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO bug:http://code.google.com/p/chromium/issues/detail?id=93902 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.screenPosition.x = 0; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.screenPosition.y = 0; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.force = pp_pt.pressure; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.radiusX = pp_pt.radius.x; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.radiusY = pp_pt.radius.y; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pt.rotationAngle = pp_pt.rotation_angle; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_touches[i] = pt; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*web_touches_length)++; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebTouchEvent* BuildTouchEvent(const InputEventData& event) { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTouchEvent* web_event = new WebTouchEvent(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebTouchPoint::State state = WebTouchPoint::StateUndefined; 2955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebInputEvent::Type type = WebInputEvent::Undefined; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.event_type) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHSTART: 2985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu type = WebInputEvent::TouchStart; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = WebTouchPoint::StatePressed; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHMOVE: 3025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu type = WebInputEvent::TouchMove; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = WebTouchPoint::StateMoved; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHEND: 3065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu type = WebInputEvent::TouchEnd; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = WebTouchPoint::StateReleased; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHCANCEL: 3105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu type = WebInputEvent::TouchCancel; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state = WebTouchPoint::StateCancelled; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu WebTouchEventTraits::ResetType( 3175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu type, PPTimeTicksToEventTime(event.event_time_stamp), web_event); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TouchStateMap states_map; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32_t i = 0; i < event.changed_touches.size(); i++) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) states_map[event.changed_touches[i].id] = state; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 323a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetWebTouchPoints(event.changed_touches, 324a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch states_map, 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_event->changedTouches, 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_event->changedTouchesLength); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 328a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetWebTouchPoints( 329a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch event.touches, states_map, web_event->touches, &web_event->touchesLength); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 331a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetWebTouchPoints(event.target_touches, 332a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch states_map, 333a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch web_event->targetTouches, 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_event->targetTouchesLength); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_event->type == WebInputEvent::TouchEnd || 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_event->type == WebInputEvent::TouchCancel) { 338a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetWebTouchPoints(event.changed_touches, 339a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch states_map, 340a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch web_event->touches, 341a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch &web_event->touchesLength); 342a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetWebTouchPoints(event.changed_touches, 343a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch states_map, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_event->targetTouches, 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &web_event->targetTouchesLength); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_event; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKeyboardEvent* BuildKeyEvent(const InputEventData& event) { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKeyboardEvent* key_event = new WebKeyboardEvent(); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.event_type) { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_RAWKEYDOWN: 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->type = WebInputEvent::RawKeyDown; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYDOWN: 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->type = WebInputEvent::KeyDown; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYUP: 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->type = WebInputEvent::KeyUp; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->timeStampSeconds = PPTimeTicksToEventTime(event.event_time_stamp); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->modifiers = event.event_modifiers; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->windowsKeyCode = event.key_code; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->setKeyIdentifierFromWindowsKeyCode(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return key_event; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKeyboardEvent* BuildCharEvent(const InputEventData& event) { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKeyboardEvent* key_event = new WebKeyboardEvent(); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->type = WebInputEvent::Char; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->timeStampSeconds = PPTimeTicksToEventTime(event.event_time_stamp); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->modifiers = event.event_modifiers; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure to not read beyond the buffer in case some bad code doesn't 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL-terminate it (this is called from plugins). 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t text_length_cap = WebKeyboardEvent::textLengthCap; 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 text16 = base::UTF8ToUTF16(event.character_text); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(key_event->text, 0, text_length_cap); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(key_event->unmodifiedText, 0, text_length_cap); 386a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (size_t i = 0; i < std::min(text_length_cap, text16.size()); ++i) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_event->text[i] = text16[i]; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return key_event; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMouseEvent* BuildMouseEvent(const InputEventData& event) { 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebMouseEvent* mouse_event = new WebMouseEvent(); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.event_type) { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEDOWN: 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::MouseDown; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEUP: 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::MouseUp; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEMOVE: 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::MouseMove; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEENTER: 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::MouseEnter; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSELEAVE: 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::MouseLeave; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_CONTEXTMENU: 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->type = WebInputEvent::ContextMenu; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->timeStampSeconds = 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPTimeTicksToEventTime(event.event_time_stamp); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->modifiers = event.event_modifiers; 418a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch mouse_event->button = static_cast<WebMouseEvent::Button>(event.mouse_button); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_event->type == WebInputEvent::MouseMove) { 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mouse_event->modifiers & WebInputEvent::LeftButtonDown) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->button = WebMouseEvent::ButtonLeft; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (mouse_event->modifiers & WebInputEvent::MiddleButtonDown) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->button = WebMouseEvent::ButtonMiddle; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (mouse_event->modifiers & WebInputEvent::RightButtonDown) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->button = WebMouseEvent::ButtonRight; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->x = event.mouse_position.x; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->y = event.mouse_position.y; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->clickCount = event.mouse_click_count; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->movementX = event.mouse_movement.x; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event->movementY = event.mouse_movement.y; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mouse_event; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebMouseWheelEvent* BuildMouseWheelEvent(const InputEventData& event) { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebMouseWheelEvent* mouse_wheel_event = new WebMouseWheelEvent(); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->type = WebInputEvent::MouseWheel; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->timeStampSeconds = 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPTimeTicksToEventTime(event.event_time_stamp); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->modifiers = event.event_modifiers; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->deltaX = event.wheel_delta.x; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->deltaY = event.wheel_delta.y; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->wheelTicksX = event.wheel_ticks.x; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->wheelTicksY = event.wheel_ticks.y; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_wheel_event->scrollByPage = event.wheel_scroll_by_page; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mouse_wheel_event; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_WIN) 450a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_RETURN 0x0D 451a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 452a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_PRIOR 0x21 453a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_NEXT 0x22 454a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_END 0x23 455a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_HOME 0x24 456a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_LEFT 0x25 457a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_UP 0x26 458a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_RIGHT 0x27 459a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_DOWN 0x28 460a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_SNAPSHOT 0x2C 461a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_INSERT 0x2D 462a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_DELETE 0x2E 463a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 464a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_APPS 0x5D 465a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 466a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define VK_F1 0x70 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convert a character string to a Windows virtual key code. Adapted from 470effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// src/content/shell/renderer/test_runner/event_sender.cc. This 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is used by CreateSimulatedWebInputEvents to convert keyboard events. 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetKeyCode(const std::string& char_text, 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUChar* code, 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUChar* text, 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* needs_shift_modifier, 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* generate_char) { 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUChar vk_code = 0; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUChar vk_text = 0; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *needs_shift_modifier = false; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *generate_char = false; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ("\n" == char_text) { 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_text = vk_code = VK_RETURN; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *generate_char = true; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("rightArrow" == char_text) { 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_RIGHT; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("downArrow" == char_text) { 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_DOWN; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("leftArrow" == char_text) { 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_LEFT; 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("upArrow" == char_text) { 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_UP; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("insert" == char_text) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_INSERT; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("delete" == char_text) { 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_DELETE; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("pageUp" == char_text) { 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_PRIOR; 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("pageDown" == char_text) { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_NEXT; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("home" == char_text) { 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_HOME; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("end" == char_text) { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_END; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("printScreen" == char_text) { 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_SNAPSHOT; 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if ("menu" == char_text) { 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_APPS; 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compare the input string with the function-key names defined by the 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DOM spec (i.e. "F1",...,"F24"). 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 1; i <= 24; ++i) { 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string functionKeyName = base::StringPrintf("F%d", i); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (functionKeyName == char_text) { 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vk_code = VK_F1 + (i - 1); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!vk_code) { 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString web_char_text = 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString::fromUTF8(char_text.data(), char_text.size()); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(web_char_text.length(), 1U); 52290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) vk_text = vk_code = web_char_text.at(0); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *needs_shift_modifier = 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (vk_code & 0xFF) >= 'A' && (vk_code & 0xFF) <= 'Z'; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((vk_code & 0xFF) >= 'a' && (vk_code & 0xFF) <= 'z') 526a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch vk_code -= 'a' - 'A'; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *generate_char = true; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *code = vk_code; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = vk_text; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CreateInputEventData(const WebInputEvent& event, 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<InputEventData>* result) { 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->clear(); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.type) { 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseDown: 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseUp: 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseMove: 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseEnter: 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseLeave: 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::ContextMenu: 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMouseEvent(event, result); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseWheel: 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendMouseWheelEvent(event, result); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::RawKeyDown: 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyDown: 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyUp: 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendKeyEvent(event, result); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Char: 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendCharEvent(event, result); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchStart: 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchMove: 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchEnd: 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchCancel: 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendTouchEvent(event, result); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Undefined: 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebInputEvent* CreateWebInputEvent(const InputEventData& event) { 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebInputEvent> web_input_event; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.event_type) { 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_UNDEFINED: 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEDOWN: 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEUP: 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEMOVE: 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEENTER: 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSELEAVE: 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_CONTEXTMENU: 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_input_event.reset(BuildMouseEvent(event)); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_WHEEL: 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_input_event.reset(BuildMouseWheelEvent(event)); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_RAWKEYDOWN: 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYDOWN: 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYUP: 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_input_event.reset(BuildKeyEvent(event)); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_CHAR: 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_input_event.reset(BuildCharEvent(event)); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_COMPOSITION_START: 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE: 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_COMPOSITION_END: 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_TEXT: 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kinaba) implement in WebKit an event structure to handle 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // composition events. 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHSTART: 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHMOVE: 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHEND: 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHCANCEL: 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_input_event.reset(BuildTouchEvent(event)); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_input_event.release(); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate a coherent sequence of input events to simulate a user event. 617effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// From src/content/shell/renderer/test_runner/event_sender.cc. 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::vector<linked_ptr<WebInputEvent> > CreateSimulatedWebInputEvents( 619ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const ppapi::InputEventData& event, 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int plugin_x, 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int plugin_y) { 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<WebInputEvent> > events; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<WebInputEvent> original_event(CreateWebInputEvent(event)); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.event_type) { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEDOWN: 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEUP: 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEMOVE: 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEENTER: 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSELEAVE: 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHSTART: 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHMOVE: 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHEND: 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_TOUCHCANCEL: 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(original_event); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_WHEEL: { 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebMouseWheelEvent* web_mouse_wheel_event = 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebMouseWheelEvent*>(original_event.get()); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_mouse_wheel_event->x = plugin_x; 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_mouse_wheel_event->y = plugin_y; 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(original_event); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_RAWKEYDOWN: 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYDOWN: 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_KEYUP: { 650a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Windows key down events should always be "raw" to avoid an ASSERT. 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKeyboardEvent* web_keyboard_event = 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebKeyboardEvent*>(original_event.get()); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_keyboard_event->type == WebInputEvent::KeyDown) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_keyboard_event->type = WebInputEvent::RawKeyDown; 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(original_event); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_CHAR: { 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKeyboardEvent* web_char_event = 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<WebKeyboardEvent*>(original_event.get()); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUChar code = 0, text = 0; 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool needs_shift_modifier = false, generate_char = false; 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetKeyCode(event.character_text, 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &code, 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &text, 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &needs_shift_modifier, 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &generate_char); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Synthesize key down and key up events in all cases. 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebKeyboardEvent> key_down_event(new WebKeyboardEvent()); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebKeyboardEvent> key_up_event(new WebKeyboardEvent()); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->type = WebInputEvent::RawKeyDown; 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->windowsKeyCode = code; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->nativeKeyCode = code; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (needs_shift_modifier) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->modifiers |= WebInputEvent::ShiftKey; 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If a char event is needed, set the text fields. 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (generate_char) { 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->text[0] = text; 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->unmodifiedText[0] = text; 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert the key code to a string identifier. 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_down_event->setKeyIdentifierFromWindowsKeyCode(); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *key_up_event = *web_char_event = *key_down_event; 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(linked_ptr<WebInputEvent>(key_down_event.release())); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (generate_char) { 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_char_event->type = WebInputEvent::Char; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_char_event->keyIdentifier[0] = '\0'; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(original_event); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_up_event->type = WebInputEvent::KeyUp; 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events.push_back(linked_ptr<WebInputEvent>(key_up_event.release())); 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return events; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_InputEvent_Class ClassifyInputEvent(WebInputEvent::Type type) { 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseDown: 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseUp: 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseMove: 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseEnter: 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseLeave: 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::ContextMenu: 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_CLASS_MOUSE; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::MouseWheel: 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_CLASS_WHEEL; 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::RawKeyDown: 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyDown: 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::KeyUp: 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Char: 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_CLASS_KEYBOARD; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchCancel: 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchEnd: 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchMove: 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::TouchStart: 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_INPUTEVENT_CLASS_TOUCH; 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::Undefined: 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_InputEvent_Class(0); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} // namespace content 741