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