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