| Index: webkit/plugins/ppapi/event_conversion.cc
|
| ===================================================================
|
| --- webkit/plugins/ppapi/event_conversion.cc (revision 213561)
|
| +++ webkit/plugins/ppapi/event_conversion.cc (working copy)
|
| @@ -1,735 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include <map>
|
| -
|
| -#include "webkit/plugins/ppapi/event_conversion.h"
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/i18n/char_iterator.h"
|
| -#include "base/logging.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "base/strings/utf_string_conversion_utils.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "ppapi/c/pp_input_event.h"
|
| -#include "ppapi/shared_impl/ppb_input_event_shared.h"
|
| -#include "ppapi/shared_impl/time_conversion.h"
|
| -#include "third_party/WebKit/public/platform/WebGamepads.h"
|
| -#include "third_party/WebKit/public/platform/WebString.h"
|
| -#include "third_party/WebKit/public/web/WebInputEvent.h"
|
| -#include "webkit/plugins/ppapi/common.h"
|
| -#include "webkit/plugins/ppapi/usb_key_code_conversion.h"
|
| -
|
| -using ppapi::EventTimeToPPTimeTicks;
|
| -using ppapi::InputEventData;
|
| -using ppapi::PPTimeTicksToEventTime;
|
| -using WebKit::WebInputEvent;
|
| -using WebKit::WebKeyboardEvent;
|
| -using WebKit::WebMouseEvent;
|
| -using WebKit::WebMouseWheelEvent;
|
| -using WebKit::WebString;
|
| -using WebKit::WebTouchEvent;
|
| -using WebKit::WebTouchPoint;
|
| -using WebKit::WebUChar;
|
| -
|
| -namespace webkit {
|
| -namespace ppapi {
|
| -
|
| -namespace {
|
| -
|
| -// Verify the modifier flags WebKit uses match the Pepper ones. If these start
|
| -// not matching, we'll need to write conversion code to preserve the Pepper
|
| -// values (since plugins will be depending on them).
|
| -COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_SHIFTKEY) ==
|
| - static_cast<int>(WebInputEvent::ShiftKey),
|
| - ShiftKeyMatches);
|
| -COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_CONTROLKEY) ==
|
| - static_cast<int>(WebInputEvent::ControlKey),
|
| - ControlKeyMatches);
|
| -COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ALTKEY) ==
|
| - static_cast<int>(WebInputEvent::AltKey),
|
| - AltKeyMatches);
|
| -COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_METAKEY) ==
|
| - static_cast<int>(WebInputEvent::MetaKey),
|
| - MetaKeyMatches);
|
| -COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISKEYPAD) ==
|
| - static_cast<int>(WebInputEvent::IsKeyPad),
|
| - KeyPadMatches);
|
| -COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISAUTOREPEAT) ==
|
| - static_cast<int>(WebInputEvent::IsAutoRepeat),
|
| - AutoRepeatMatches);
|
| -COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_LEFTBUTTONDOWN) ==
|
| - static_cast<int>(WebInputEvent::LeftButtonDown),
|
| - LeftButtonMatches);
|
| -COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN) ==
|
| - static_cast<int>(WebInputEvent::MiddleButtonDown),
|
| - MiddleButtonMatches);
|
| -COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_RIGHTBUTTONDOWN) ==
|
| - static_cast<int>(WebInputEvent::RightButtonDown),
|
| - RightButtonMatches);
|
| -COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_CAPSLOCKKEY) ==
|
| - static_cast<int>(WebInputEvent::CapsLockOn),
|
| - CapsLockMatches);
|
| -COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_NUMLOCKKEY) ==
|
| - static_cast<int>(WebInputEvent::NumLockOn),
|
| - NumLockMatches);
|
| -COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISLEFT) ==
|
| - static_cast<int>(WebInputEvent::IsLeft),
|
| - LeftMatches);
|
| -COMPILE_ASSERT(static_cast<int>(PP_INPUTEVENT_MODIFIER_ISRIGHT) ==
|
| - static_cast<int>(WebInputEvent::IsRight),
|
| - RightMatches);
|
| -
|
| -PP_InputEvent_Type ConvertEventTypes(WebInputEvent::Type wetype) {
|
| - switch (wetype) {
|
| - case WebInputEvent::MouseDown:
|
| - return PP_INPUTEVENT_TYPE_MOUSEDOWN;
|
| - case WebInputEvent::MouseUp:
|
| - return PP_INPUTEVENT_TYPE_MOUSEUP;
|
| - case WebInputEvent::MouseMove:
|
| - return PP_INPUTEVENT_TYPE_MOUSEMOVE;
|
| - case WebInputEvent::MouseEnter:
|
| - return PP_INPUTEVENT_TYPE_MOUSEENTER;
|
| - case WebInputEvent::MouseLeave:
|
| - return PP_INPUTEVENT_TYPE_MOUSELEAVE;
|
| - case WebInputEvent::ContextMenu:
|
| - return PP_INPUTEVENT_TYPE_CONTEXTMENU;
|
| - case WebInputEvent::MouseWheel:
|
| - return PP_INPUTEVENT_TYPE_WHEEL;
|
| - case WebInputEvent::RawKeyDown:
|
| - return PP_INPUTEVENT_TYPE_RAWKEYDOWN;
|
| - case WebInputEvent::KeyDown:
|
| - return PP_INPUTEVENT_TYPE_KEYDOWN;
|
| - case WebInputEvent::KeyUp:
|
| - return PP_INPUTEVENT_TYPE_KEYUP;
|
| - case WebInputEvent::Char:
|
| - return PP_INPUTEVENT_TYPE_CHAR;
|
| - case WebInputEvent::TouchStart:
|
| - return PP_INPUTEVENT_TYPE_TOUCHSTART;
|
| - case WebInputEvent::TouchMove:
|
| - return PP_INPUTEVENT_TYPE_TOUCHMOVE;
|
| - case WebInputEvent::TouchEnd:
|
| - return PP_INPUTEVENT_TYPE_TOUCHEND;
|
| - case WebInputEvent::TouchCancel:
|
| - return PP_INPUTEVENT_TYPE_TOUCHCANCEL;
|
| - case WebInputEvent::Undefined:
|
| - default:
|
| - return PP_INPUTEVENT_TYPE_UNDEFINED;
|
| - }
|
| -}
|
| -
|
| -// Generates a PP_InputEvent with the fields common to all events, as well as
|
| -// the event type from the given web event. Event-specific fields will be zero
|
| -// initialized.
|
| -InputEventData GetEventWithCommonFieldsAndType(const WebInputEvent& web_event) {
|
| - InputEventData result;
|
| - result.event_type = ConvertEventTypes(web_event.type);
|
| - result.event_time_stamp = EventTimeToPPTimeTicks(web_event.timeStampSeconds);
|
| - result.usb_key_code = 0;
|
| - return result;
|
| -}
|
| -
|
| -void AppendKeyEvent(const WebInputEvent& event,
|
| - std::vector<InputEventData>* result_events) {
|
| - const WebKeyboardEvent& key_event =
|
| - static_cast<const WebKeyboardEvent&>(event);
|
| - InputEventData result = GetEventWithCommonFieldsAndType(event);
|
| - result.event_modifiers = key_event.modifiers;
|
| - result.key_code = key_event.windowsKeyCode;
|
| - result.usb_key_code = UsbKeyCodeForKeyboardEvent(key_event);
|
| - result_events->push_back(result);
|
| -}
|
| -
|
| -void AppendCharEvent(const WebInputEvent& event,
|
| - std::vector<InputEventData>* result_events) {
|
| - const WebKeyboardEvent& key_event =
|
| - static_cast<const WebKeyboardEvent&>(event);
|
| -
|
| - // This is a bit complex, the input event will normally just have one 16-bit
|
| - // character in it, but may be zero or more than one. The text array is
|
| - // just padded with 0 values for the unused ones, but is not necessarily
|
| - // null-terminated.
|
| - //
|
| - // Here we see how many UTF-16 characters we have.
|
| - size_t utf16_char_count = 0;
|
| - while (utf16_char_count < WebKeyboardEvent::textLengthCap &&
|
| - key_event.text[utf16_char_count])
|
| - utf16_char_count++;
|
| -
|
| - // Make a separate InputEventData for each Unicode character in the input.
|
| - base::i18n::UTF16CharIterator iter(key_event.text, utf16_char_count);
|
| - while (!iter.end()) {
|
| - InputEventData result = GetEventWithCommonFieldsAndType(event);
|
| - result.event_modifiers = key_event.modifiers;
|
| - base::WriteUnicodeCharacter(iter.get(), &result.character_text);
|
| -
|
| - result_events->push_back(result);
|
| - iter.Advance();
|
| - }
|
| -}
|
| -
|
| -void AppendMouseEvent(const WebInputEvent& event,
|
| - std::vector<InputEventData>* result_events) {
|
| - COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonNone) ==
|
| - static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_NONE),
|
| - MouseNone);
|
| - COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonLeft) ==
|
| - static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_LEFT),
|
| - MouseLeft);
|
| - COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonRight) ==
|
| - static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_RIGHT),
|
| - MouseRight);
|
| - COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonMiddle) ==
|
| - static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_MIDDLE),
|
| - MouseMiddle);
|
| -
|
| - const WebMouseEvent& mouse_event =
|
| - static_cast<const WebMouseEvent&>(event);
|
| - InputEventData result = GetEventWithCommonFieldsAndType(event);
|
| - result.event_modifiers = mouse_event.modifiers;
|
| - if (mouse_event.type == WebInputEvent::MouseDown ||
|
| - mouse_event.type == WebInputEvent::MouseMove ||
|
| - mouse_event.type == WebInputEvent::MouseUp) {
|
| - result.mouse_button =
|
| - static_cast<PP_InputEvent_MouseButton>(mouse_event.button);
|
| - }
|
| - result.mouse_position.x = mouse_event.x;
|
| - result.mouse_position.y = mouse_event.y;
|
| - result.mouse_click_count = mouse_event.clickCount;
|
| - result.mouse_movement.x = mouse_event.movementX;
|
| - result.mouse_movement.y = mouse_event.movementY;
|
| - result_events->push_back(result);
|
| -}
|
| -
|
| -void AppendMouseWheelEvent(const WebInputEvent& event,
|
| - std::vector<InputEventData>* result_events) {
|
| - const WebMouseWheelEvent& mouse_wheel_event =
|
| - static_cast<const WebMouseWheelEvent&>(event);
|
| - InputEventData result = GetEventWithCommonFieldsAndType(event);
|
| - result.event_modifiers = mouse_wheel_event.modifiers;
|
| - result.wheel_delta.x = mouse_wheel_event.deltaX;
|
| - result.wheel_delta.y = mouse_wheel_event.deltaY;
|
| - result.wheel_ticks.x = mouse_wheel_event.wheelTicksX;
|
| - result.wheel_ticks.y = mouse_wheel_event.wheelTicksY;
|
| - result.wheel_scroll_by_page = !!mouse_wheel_event.scrollByPage;
|
| - result_events->push_back(result);
|
| -}
|
| -
|
| -void SetPPTouchPoints(const WebTouchPoint* touches, uint32_t touches_length,
|
| - std::vector<PP_TouchPoint>* result) {
|
| - for (uint32_t i = 0; i < touches_length; i++) {
|
| - const WebTouchPoint& touch_point = touches[i];
|
| - PP_TouchPoint pp_pt;
|
| - pp_pt.id = touch_point.id;
|
| - pp_pt.position.x = touch_point.position.x;
|
| - pp_pt.position.y = touch_point.position.y;
|
| - pp_pt.radius.x = touch_point.radiusX;
|
| - pp_pt.radius.y = touch_point.radiusY;
|
| - pp_pt.rotation_angle = touch_point.rotationAngle;
|
| - pp_pt.pressure = touch_point.force;
|
| - result->push_back(pp_pt);
|
| - }
|
| -}
|
| -
|
| -void AppendTouchEvent(const WebInputEvent& event,
|
| - std::vector<InputEventData>* result_events) {
|
| - const WebTouchEvent& touch_event =
|
| - reinterpret_cast<const WebTouchEvent&>(event);
|
| -
|
| - InputEventData result = GetEventWithCommonFieldsAndType(event);
|
| - SetPPTouchPoints(touch_event.touches, touch_event.touchesLength,
|
| - &result.touches);
|
| - SetPPTouchPoints(touch_event.changedTouches, touch_event.changedTouchesLength,
|
| - &result.changed_touches);
|
| - SetPPTouchPoints(touch_event.targetTouches, touch_event.targetTouchesLength,
|
| - &result.target_touches);
|
| -
|
| - result_events->push_back(result);
|
| -}
|
| -
|
| -// Structure used to map touch point id's to touch states. Since the pepper
|
| -// touch event structure does not have states for individual touch points and
|
| -// instead relies on the event type in combination with the set of touch lists,
|
| -// we have to set the state for the changed touches to be the same as the event
|
| -// type and all others to be 'stationary.'
|
| -typedef std::map<uint32_t, WebTouchPoint::State> TouchStateMap;
|
| -
|
| -void SetWebTouchPoints(const std::vector<PP_TouchPoint>& pp_touches,
|
| - const TouchStateMap& states_map,
|
| - WebTouchPoint* web_touches,
|
| - uint32_t* web_touches_length) {
|
| -
|
| - for (uint32_t i = 0; i < pp_touches.size() &&
|
| - i < WebTouchEvent::touchesLengthCap; i++) {
|
| - WebTouchPoint pt;
|
| - const PP_TouchPoint& pp_pt = pp_touches[i];
|
| - pt.id = pp_pt.id;
|
| -
|
| - if (states_map.find(pt.id) == states_map.end())
|
| - pt.state = WebTouchPoint::StateStationary;
|
| - else
|
| - pt.state = states_map.find(pt.id)->second;
|
| -
|
| - pt.position.x = pp_pt.position.x;
|
| - pt.position.y = pp_pt.position.y;
|
| - // TODO bug:http://code.google.com/p/chromium/issues/detail?id=93902
|
| - pt.screenPosition.x = 0;
|
| - pt.screenPosition.y = 0;
|
| - pt.force = pp_pt.pressure;
|
| - pt.radiusX = pp_pt.radius.x;
|
| - pt.radiusY = pp_pt.radius.y;
|
| - pt.rotationAngle = pp_pt.rotation_angle;
|
| - web_touches[i] = pt;
|
| - (*web_touches_length)++;
|
| - }
|
| -}
|
| -
|
| -WebTouchEvent* BuildTouchEvent(const InputEventData& event) {
|
| - WebTouchEvent* web_event = new WebTouchEvent();
|
| - WebTouchPoint::State state = WebTouchPoint::StateUndefined;
|
| - switch (event.event_type) {
|
| - case PP_INPUTEVENT_TYPE_TOUCHSTART:
|
| - web_event->type = WebInputEvent::TouchStart;
|
| - state = WebTouchPoint::StatePressed;
|
| - break;
|
| - case PP_INPUTEVENT_TYPE_TOUCHMOVE:
|
| - web_event->type = WebInputEvent::TouchMove;
|
| - state = WebTouchPoint::StateMoved;
|
| - break;
|
| - case PP_INPUTEVENT_TYPE_TOUCHEND:
|
| - web_event->type = WebInputEvent::TouchEnd;
|
| - state = WebTouchPoint::StateReleased;
|
| - break;
|
| - case PP_INPUTEVENT_TYPE_TOUCHCANCEL:
|
| - web_event->type = WebInputEvent::TouchCancel;
|
| - state = WebTouchPoint::StateCancelled;
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| -
|
| - TouchStateMap states_map;
|
| - for (uint32_t i = 0; i < event.changed_touches.size(); i++)
|
| - states_map[event.changed_touches[i].id] = state;
|
| -
|
| - web_event->timeStampSeconds = PPTimeTicksToEventTime(event.event_time_stamp);
|
| -
|
| - SetWebTouchPoints(event.changed_touches, states_map,
|
| - web_event->changedTouches,
|
| - &web_event->changedTouchesLength);
|
| -
|
| - SetWebTouchPoints(event.touches, states_map, web_event->touches,
|
| - &web_event->touchesLength);
|
| -
|
| - SetWebTouchPoints(event.target_touches, states_map, web_event->targetTouches,
|
| - &web_event->targetTouchesLength);
|
| -
|
| - if (web_event->type == WebInputEvent::TouchEnd ||
|
| - web_event->type == WebInputEvent::TouchCancel) {
|
| - SetWebTouchPoints(event.changed_touches, states_map,
|
| - web_event->touches, &web_event->touchesLength);
|
| - SetWebTouchPoints(event.changed_touches, states_map,
|
| - web_event->targetTouches,
|
| - &web_event->targetTouchesLength);
|
| - }
|
| -
|
| - return web_event;
|
| -}
|
| -
|
| -WebKeyboardEvent* BuildKeyEvent(const InputEventData& event) {
|
| - WebKeyboardEvent* key_event = new WebKeyboardEvent();
|
| - switch (event.event_type) {
|
| - case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
|
| - key_event->type = WebInputEvent::RawKeyDown;
|
| - break;
|
| - case PP_INPUTEVENT_TYPE_KEYDOWN:
|
| - key_event->type = WebInputEvent::KeyDown;
|
| - break;
|
| - case PP_INPUTEVENT_TYPE_KEYUP:
|
| - key_event->type = WebInputEvent::KeyUp;
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| - key_event->timeStampSeconds = PPTimeTicksToEventTime(event.event_time_stamp);
|
| - key_event->modifiers = event.event_modifiers;
|
| - key_event->windowsKeyCode = event.key_code;
|
| - key_event->setKeyIdentifierFromWindowsKeyCode();
|
| - return key_event;
|
| -}
|
| -
|
| -WebKeyboardEvent* BuildCharEvent(const InputEventData& event) {
|
| - WebKeyboardEvent* key_event = new WebKeyboardEvent();
|
| - key_event->type = WebInputEvent::Char;
|
| - key_event->timeStampSeconds = PPTimeTicksToEventTime(event.event_time_stamp);
|
| - key_event->modifiers = event.event_modifiers;
|
| -
|
| - // Make sure to not read beyond the buffer in case some bad code doesn't
|
| - // NULL-terminate it (this is called from plugins).
|
| - size_t text_length_cap = WebKeyboardEvent::textLengthCap;
|
| - base::string16 text16 = UTF8ToUTF16(event.character_text);
|
| -
|
| - memset(key_event->text, 0, text_length_cap);
|
| - memset(key_event->unmodifiedText, 0, text_length_cap);
|
| - for (size_t i = 0;
|
| - i < std::min(text_length_cap, text16.size());
|
| - ++i)
|
| - key_event->text[i] = text16[i];
|
| - return key_event;
|
| -}
|
| -
|
| -WebMouseEvent* BuildMouseEvent(const InputEventData& event) {
|
| - WebMouseEvent* mouse_event = new WebMouseEvent();
|
| - switch (event.event_type) {
|
| - case PP_INPUTEVENT_TYPE_MOUSEDOWN:
|
| - mouse_event->type = WebInputEvent::MouseDown;
|
| - break;
|
| - case PP_INPUTEVENT_TYPE_MOUSEUP:
|
| - mouse_event->type = WebInputEvent::MouseUp;
|
| - break;
|
| - case PP_INPUTEVENT_TYPE_MOUSEMOVE:
|
| - mouse_event->type = WebInputEvent::MouseMove;
|
| - break;
|
| - case PP_INPUTEVENT_TYPE_MOUSEENTER:
|
| - mouse_event->type = WebInputEvent::MouseEnter;
|
| - break;
|
| - case PP_INPUTEVENT_TYPE_MOUSELEAVE:
|
| - mouse_event->type = WebInputEvent::MouseLeave;
|
| - break;
|
| - case PP_INPUTEVENT_TYPE_CONTEXTMENU:
|
| - mouse_event->type = WebInputEvent::ContextMenu;
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - }
|
| - mouse_event->timeStampSeconds =
|
| - PPTimeTicksToEventTime(event.event_time_stamp);
|
| - mouse_event->modifiers = event.event_modifiers;
|
| - mouse_event->button =
|
| - static_cast<WebMouseEvent::Button>(event.mouse_button);
|
| - if (mouse_event->type == WebInputEvent::MouseMove) {
|
| - if (mouse_event->modifiers & WebInputEvent::LeftButtonDown)
|
| - mouse_event->button = WebMouseEvent::ButtonLeft;
|
| - else if (mouse_event->modifiers & WebInputEvent::MiddleButtonDown)
|
| - mouse_event->button = WebMouseEvent::ButtonMiddle;
|
| - else if (mouse_event->modifiers & WebInputEvent::RightButtonDown)
|
| - mouse_event->button = WebMouseEvent::ButtonRight;
|
| - }
|
| - mouse_event->x = event.mouse_position.x;
|
| - mouse_event->y = event.mouse_position.y;
|
| - mouse_event->clickCount = event.mouse_click_count;
|
| - mouse_event->movementX = event.mouse_movement.x;
|
| - mouse_event->movementY = event.mouse_movement.y;
|
| - return mouse_event;
|
| -}
|
| -
|
| -WebMouseWheelEvent* BuildMouseWheelEvent(const InputEventData& event) {
|
| - WebMouseWheelEvent* mouse_wheel_event = new WebMouseWheelEvent();
|
| - mouse_wheel_event->type = WebInputEvent::MouseWheel;
|
| - mouse_wheel_event->timeStampSeconds =
|
| - PPTimeTicksToEventTime(event.event_time_stamp);
|
| - mouse_wheel_event->modifiers = event.event_modifiers;
|
| - mouse_wheel_event->deltaX = event.wheel_delta.x;
|
| - mouse_wheel_event->deltaY = event.wheel_delta.y;
|
| - mouse_wheel_event->wheelTicksX = event.wheel_ticks.x;
|
| - mouse_wheel_event->wheelTicksY = event.wheel_ticks.y;
|
| - mouse_wheel_event->scrollByPage = event.wheel_scroll_by_page;
|
| - return mouse_wheel_event;
|
| -}
|
| -
|
| -#if !defined(OS_WIN)
|
| -#define VK_RETURN 0x0D
|
| -
|
| -#define VK_PRIOR 0x21
|
| -#define VK_NEXT 0x22
|
| -#define VK_END 0x23
|
| -#define VK_HOME 0x24
|
| -#define VK_LEFT 0x25
|
| -#define VK_UP 0x26
|
| -#define VK_RIGHT 0x27
|
| -#define VK_DOWN 0x28
|
| -#define VK_SNAPSHOT 0x2C
|
| -#define VK_INSERT 0x2D
|
| -#define VK_DELETE 0x2E
|
| -
|
| -#define VK_APPS 0x5D
|
| -
|
| -#define VK_F1 0x70
|
| -#endif
|
| -
|
| -// Convert a character string to a Windows virtual key code. Adapted from
|
| -// src/third_party/WebKit/Tools/DumpRenderTree/chromium/EventSender.cpp. This
|
| -// is used by CreateSimulatedWebInputEvents to convert keyboard events.
|
| -void GetKeyCode(const std::string& char_text,
|
| - WebUChar* code,
|
| - WebUChar* text,
|
| - bool* needs_shift_modifier,
|
| - bool* generate_char) {
|
| - WebUChar vk_code = 0;
|
| - WebUChar vk_text = 0;
|
| - *needs_shift_modifier = false;
|
| - *generate_char = false;
|
| - if ("\n" == char_text) {
|
| - vk_text = vk_code = VK_RETURN;
|
| - *generate_char = true;
|
| - } else if ("rightArrow" == char_text) {
|
| - vk_code = VK_RIGHT;
|
| - } else if ("downArrow" == char_text) {
|
| - vk_code = VK_DOWN;
|
| - } else if ("leftArrow" == char_text) {
|
| - vk_code = VK_LEFT;
|
| - } else if ("upArrow" == char_text) {
|
| - vk_code = VK_UP;
|
| - } else if ("insert" == char_text) {
|
| - vk_code = VK_INSERT;
|
| - } else if ("delete" == char_text) {
|
| - vk_code = VK_DELETE;
|
| - } else if ("pageUp" == char_text) {
|
| - vk_code = VK_PRIOR;
|
| - } else if ("pageDown" == char_text) {
|
| - vk_code = VK_NEXT;
|
| - } else if ("home" == char_text) {
|
| - vk_code = VK_HOME;
|
| - } else if ("end" == char_text) {
|
| - vk_code = VK_END;
|
| - } else if ("printScreen" == char_text) {
|
| - vk_code = VK_SNAPSHOT;
|
| - } else if ("menu" == char_text) {
|
| - vk_code = VK_APPS;
|
| - } else {
|
| - // Compare the input string with the function-key names defined by the
|
| - // DOM spec (i.e. "F1",...,"F24").
|
| - for (int i = 1; i <= 24; ++i) {
|
| - std::string functionKeyName = base::StringPrintf("F%d", i);
|
| - if (functionKeyName == char_text) {
|
| - vk_code = VK_F1 + (i - 1);
|
| - break;
|
| - }
|
| - }
|
| - if (!vk_code) {
|
| - WebString web_char_text =
|
| - WebString::fromUTF8(char_text.data(), char_text.size());
|
| - DCHECK_EQ(web_char_text.length(), 1U);
|
| - vk_text = vk_code = web_char_text.at(0);
|
| - *needs_shift_modifier =
|
| - (vk_code & 0xFF) >= 'A' && (vk_code & 0xFF) <= 'Z';
|
| - if ((vk_code & 0xFF) >= 'a' && (vk_code & 0xFF) <= 'z')
|
| - vk_code -= 'a' - 'A';
|
| - *generate_char = true;
|
| - }
|
| - }
|
| -
|
| - *code = vk_code;
|
| - *text = vk_text;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -void CreateInputEventData(const WebInputEvent& event,
|
| - std::vector<InputEventData>* result) {
|
| - result->clear();
|
| -
|
| - switch (event.type) {
|
| - case WebInputEvent::MouseDown:
|
| - case WebInputEvent::MouseUp:
|
| - case WebInputEvent::MouseMove:
|
| - case WebInputEvent::MouseEnter:
|
| - case WebInputEvent::MouseLeave:
|
| - case WebInputEvent::ContextMenu:
|
| - AppendMouseEvent(event, result);
|
| - break;
|
| - case WebInputEvent::MouseWheel:
|
| - AppendMouseWheelEvent(event, result);
|
| - break;
|
| - case WebInputEvent::RawKeyDown:
|
| - case WebInputEvent::KeyDown:
|
| - case WebInputEvent::KeyUp:
|
| - AppendKeyEvent(event, result);
|
| - break;
|
| - case WebInputEvent::Char:
|
| - AppendCharEvent(event, result);
|
| - break;
|
| - case WebInputEvent::TouchStart:
|
| - case WebInputEvent::TouchMove:
|
| - case WebInputEvent::TouchEnd:
|
| - case WebInputEvent::TouchCancel:
|
| - AppendTouchEvent(event, result);
|
| - break;
|
| - case WebInputEvent::Undefined:
|
| - default:
|
| - break;
|
| - }
|
| -}
|
| -
|
| -WebInputEvent* CreateWebInputEvent(const InputEventData& event) {
|
| - scoped_ptr<WebInputEvent> web_input_event;
|
| - switch (event.event_type) {
|
| - case PP_INPUTEVENT_TYPE_UNDEFINED:
|
| - return NULL;
|
| - case PP_INPUTEVENT_TYPE_MOUSEDOWN:
|
| - case PP_INPUTEVENT_TYPE_MOUSEUP:
|
| - case PP_INPUTEVENT_TYPE_MOUSEMOVE:
|
| - case PP_INPUTEVENT_TYPE_MOUSEENTER:
|
| - case PP_INPUTEVENT_TYPE_MOUSELEAVE:
|
| - case PP_INPUTEVENT_TYPE_CONTEXTMENU:
|
| - web_input_event.reset(BuildMouseEvent(event));
|
| - break;
|
| - case PP_INPUTEVENT_TYPE_WHEEL:
|
| - web_input_event.reset(BuildMouseWheelEvent(event));
|
| - break;
|
| - case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
|
| - case PP_INPUTEVENT_TYPE_KEYDOWN:
|
| - case PP_INPUTEVENT_TYPE_KEYUP:
|
| - web_input_event.reset(BuildKeyEvent(event));
|
| - break;
|
| - case PP_INPUTEVENT_TYPE_CHAR:
|
| - web_input_event.reset(BuildCharEvent(event));
|
| - break;
|
| - case PP_INPUTEVENT_TYPE_IME_COMPOSITION_START:
|
| - case PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE:
|
| - case PP_INPUTEVENT_TYPE_IME_COMPOSITION_END:
|
| - case PP_INPUTEVENT_TYPE_IME_TEXT:
|
| - // TODO(kinaba) implement in WebKit an event structure to handle
|
| - // composition events.
|
| - NOTREACHED();
|
| - break;
|
| - case PP_INPUTEVENT_TYPE_TOUCHSTART:
|
| - case PP_INPUTEVENT_TYPE_TOUCHMOVE:
|
| - case PP_INPUTEVENT_TYPE_TOUCHEND:
|
| - case PP_INPUTEVENT_TYPE_TOUCHCANCEL:
|
| - web_input_event.reset(BuildTouchEvent(event));
|
| - break;
|
| - }
|
| -
|
| - return web_input_event.release();
|
| -}
|
| -
|
| -// Generate a coherent sequence of input events to simulate a user event.
|
| -// From src/third_party/WebKit/Tools/DumpRenderTree/chromium/EventSender.cpp.
|
| -std::vector<linked_ptr<WebInputEvent> > CreateSimulatedWebInputEvents(
|
| - const ::ppapi::InputEventData& event,
|
| - int plugin_x,
|
| - int plugin_y) {
|
| - std::vector<linked_ptr<WebInputEvent> > events;
|
| - linked_ptr<WebInputEvent> original_event(CreateWebInputEvent(event));
|
| -
|
| - switch (event.event_type) {
|
| - case PP_INPUTEVENT_TYPE_MOUSEDOWN:
|
| - case PP_INPUTEVENT_TYPE_MOUSEUP:
|
| - case PP_INPUTEVENT_TYPE_MOUSEMOVE:
|
| - case PP_INPUTEVENT_TYPE_MOUSEENTER:
|
| - case PP_INPUTEVENT_TYPE_MOUSELEAVE:
|
| - case PP_INPUTEVENT_TYPE_TOUCHSTART:
|
| - case PP_INPUTEVENT_TYPE_TOUCHMOVE:
|
| - case PP_INPUTEVENT_TYPE_TOUCHEND:
|
| - case PP_INPUTEVENT_TYPE_TOUCHCANCEL:
|
| - events.push_back(original_event);
|
| - break;
|
| -
|
| - case PP_INPUTEVENT_TYPE_WHEEL: {
|
| - WebMouseWheelEvent* web_mouse_wheel_event =
|
| - static_cast<WebMouseWheelEvent*>(original_event.get());
|
| - web_mouse_wheel_event->x = plugin_x;
|
| - web_mouse_wheel_event->y = plugin_y;
|
| - events.push_back(original_event);
|
| - break;
|
| - }
|
| -
|
| - case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
|
| - case PP_INPUTEVENT_TYPE_KEYDOWN:
|
| - case PP_INPUTEVENT_TYPE_KEYUP: {
|
| - // Windows key down events should always be "raw" to avoid an ASSERT.
|
| -#if defined(OS_WIN)
|
| - WebKeyboardEvent* web_keyboard_event =
|
| - static_cast<WebKeyboardEvent*>(original_event.get());
|
| - if (web_keyboard_event->type == WebInputEvent::KeyDown)
|
| - web_keyboard_event->type = WebInputEvent::RawKeyDown;
|
| -#endif
|
| - events.push_back(original_event);
|
| - break;
|
| - }
|
| -
|
| - case PP_INPUTEVENT_TYPE_CHAR: {
|
| - WebKeyboardEvent* web_char_event =
|
| - static_cast<WebKeyboardEvent*>(original_event.get());
|
| -
|
| - WebUChar code = 0, text = 0;
|
| - bool needs_shift_modifier = false, generate_char = false;
|
| - GetKeyCode(event.character_text,
|
| - &code,
|
| - &text,
|
| - &needs_shift_modifier,
|
| - &generate_char);
|
| -
|
| - // Synthesize key down and key up events in all cases.
|
| - scoped_ptr<WebKeyboardEvent> key_down_event(new WebKeyboardEvent());
|
| - scoped_ptr<WebKeyboardEvent> key_up_event(new WebKeyboardEvent());
|
| -
|
| - key_down_event->type = WebInputEvent::RawKeyDown;
|
| - key_down_event->windowsKeyCode = code;
|
| - key_down_event->nativeKeyCode = code;
|
| - if (needs_shift_modifier)
|
| - key_down_event->modifiers |= WebInputEvent::ShiftKey;
|
| -
|
| - // If a char event is needed, set the text fields.
|
| - if (generate_char) {
|
| - key_down_event->text[0] = text;
|
| - key_down_event->unmodifiedText[0] = text;
|
| - }
|
| - // Convert the key code to a string identifier.
|
| - key_down_event->setKeyIdentifierFromWindowsKeyCode();
|
| -
|
| - *key_up_event = *web_char_event = *key_down_event;
|
| -
|
| - events.push_back(linked_ptr<WebInputEvent>(key_down_event.release()));
|
| -
|
| - if (generate_char) {
|
| - web_char_event->type = WebInputEvent::Char;
|
| - web_char_event->keyIdentifier[0] = '\0';
|
| - events.push_back(original_event);
|
| - }
|
| -
|
| - key_up_event->type = WebInputEvent::KeyUp;
|
| - events.push_back(linked_ptr<WebInputEvent>(key_up_event.release()));
|
| - break;
|
| - }
|
| -
|
| - default:
|
| - break;
|
| - }
|
| - return events;
|
| -}
|
| -
|
| -PP_InputEvent_Class ClassifyInputEvent(WebInputEvent::Type type) {
|
| - switch (type) {
|
| - case WebInputEvent::MouseDown:
|
| - case WebInputEvent::MouseUp:
|
| - case WebInputEvent::MouseMove:
|
| - case WebInputEvent::MouseEnter:
|
| - case WebInputEvent::MouseLeave:
|
| - case WebInputEvent::ContextMenu:
|
| - return PP_INPUTEVENT_CLASS_MOUSE;
|
| - case WebInputEvent::MouseWheel:
|
| - return PP_INPUTEVENT_CLASS_WHEEL;
|
| - case WebInputEvent::RawKeyDown:
|
| - case WebInputEvent::KeyDown:
|
| - case WebInputEvent::KeyUp:
|
| - case WebInputEvent::Char:
|
| - return PP_INPUTEVENT_CLASS_KEYBOARD;
|
| - case WebInputEvent::TouchCancel:
|
| - case WebInputEvent::TouchEnd:
|
| - case WebInputEvent::TouchMove:
|
| - case WebInputEvent::TouchStart:
|
| - return PP_INPUTEVENT_CLASS_TOUCH;
|
| - case WebInputEvent::Undefined:
|
| - default:
|
| - NOTREACHED();
|
| - return PP_InputEvent_Class(0);
|
| - }
|
| -}
|
| -
|
| -} // namespace ppapi
|
| -} // namespace webkit
|
|
|