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