1bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch// found in the LICENSE file.
4bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// MSVC++ requires this to be set before any other includes to get M_PI.
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define _USE_MATH_DEFINES
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/browser/renderer_host/input/web_input_event_util.h"
9bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <cmath>
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
12bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/strings/string_util.h"
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/common/input/web_touch_event_traits.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/events/event_constants.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/gesture_detection/gesture_event_data.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/gesture_detection/motion_event.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using blink::WebGestureEvent;
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using blink::WebInputEvent;
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using blink::WebTouchEvent;
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using blink::WebTouchPoint;
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using ui::MotionEvent;
23bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
24bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochnamespace {
25bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
26bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochconst char* GetKeyIdentifier(ui::KeyboardCode key_code) {
27bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  switch (key_code) {
28bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_MENU:
29bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Alt";
30bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_CONTROL:
31bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Control";
32bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_SHIFT:
33bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Shift";
34bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_CAPITAL:
35bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "CapsLock";
36bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_LWIN:
37bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_RWIN:
38bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Win";
39bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_CLEAR:
40bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Clear";
41bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_DOWN:
42bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Down";
43bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_END:
44bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "End";
45bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_RETURN:
46bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Enter";
47bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_EXECUTE:
48bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Execute";
49bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F1:
50bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F1";
51bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F2:
52bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F2";
53bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F3:
54bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F3";
55bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F4:
56bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F4";
57bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F5:
58bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F5";
59bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F6:
60bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F6";
61bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F7:
62bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F7";
63bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F8:
64bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F8";
65bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F9:
66bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F9";
67bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F10:
68bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F10";
69bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F11:
70bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F11";
71bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F12:
72bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F12";
73bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F13:
74bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F13";
75bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F14:
76bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F14";
77bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F15:
78bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F15";
79bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F16:
80bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F16";
81bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F17:
82bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F17";
83bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F18:
84bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F18";
85bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F19:
86bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F19";
87bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F20:
88bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F20";
89bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F21:
90bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F21";
91bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F22:
92bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F22";
93bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F23:
94bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F23";
95bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F24:
96bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F24";
97bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_HELP:
98bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Help";
99bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_HOME:
100bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Home";
101bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_INSERT:
102bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Insert";
103bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_LEFT:
104bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Left";
105bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_NEXT:
106bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "PageDown";
107bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_PRIOR:
108bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "PageUp";
109bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_PAUSE:
110bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Pause";
111bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_SNAPSHOT:
112bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "PrintScreen";
113bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_RIGHT:
114bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Right";
115bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_SCROLL:
116bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Scroll";
117bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_SELECT:
118bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Select";
119bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_UP:
120bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Up";
121bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_DELETE:
122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      return "U+007F";  // Standard says that DEL becomes U+007F.
123bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_MEDIA_NEXT_TRACK:
124bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "MediaNextTrack";
125bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_MEDIA_PREV_TRACK:
126bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "MediaPreviousTrack";
127bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_MEDIA_STOP:
128bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "MediaStop";
129bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_MEDIA_PLAY_PAUSE:
130bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "MediaPlayPause";
131bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_VOLUME_MUTE:
132bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "VolumeMute";
133bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_VOLUME_DOWN:
134bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "VolumeDown";
135bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_VOLUME_UP:
136bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "VolumeUp";
137bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    default:
138bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return NULL;
139bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  };
140bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
141bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)WebInputEvent::Type ToWebInputEventType(MotionEvent::Action action) {
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  switch (action) {
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_DOWN:
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebInputEvent::TouchStart;
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_MOVE:
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebInputEvent::TouchMove;
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_UP:
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebInputEvent::TouchEnd;
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_CANCEL:
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebInputEvent::TouchCancel;
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_POINTER_DOWN:
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebInputEvent::TouchStart;
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_POINTER_UP:
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebInputEvent::TouchEnd;
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NOTREACHED() << "Invalid MotionEvent::Action.";
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return WebInputEvent::Undefined;
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Note that |is_action_pointer| is meaningful only in the context of
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// |ACTION_POINTER_UP| and |ACTION_POINTER_DOWN|; other actions map directly to
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// WebTouchPoint::State.
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)WebTouchPoint::State ToWebTouchPointState(MotionEvent::Action action,
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                          bool is_action_pointer) {
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  switch (action) {
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_DOWN:
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebTouchPoint::StatePressed;
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_MOVE:
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebTouchPoint::StateMoved;
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_UP:
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebTouchPoint::StateReleased;
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_CANCEL:
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebTouchPoint::StateCancelled;
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_POINTER_DOWN:
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return is_action_pointer ? WebTouchPoint::StatePressed
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               : WebTouchPoint::StateStationary;
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_POINTER_UP:
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return is_action_pointer ? WebTouchPoint::StateReleased
180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               : WebTouchPoint::StateStationary;
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NOTREACHED() << "Invalid MotionEvent::Action.";
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return WebTouchPoint::StateUndefined;
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)WebTouchPoint CreateWebTouchPoint(const MotionEvent& event,
187a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                  size_t pointer_index) {
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  WebTouchPoint touch;
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  touch.id = event.GetPointerId(pointer_index);
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  touch.state = ToWebTouchPointState(
191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      event.GetAction(),
192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      static_cast<int>(pointer_index) == event.GetActionIndex());
193a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  touch.position.x = event.GetX(pointer_index);
194a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  touch.position.y = event.GetY(pointer_index);
195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  touch.screenPosition.x = event.GetRawX(pointer_index);
196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  touch.screenPosition.y = event.GetRawY(pointer_index);
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // A note on touch ellipse specifications:
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  //
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Android MotionEvent provides the major and minor axes of the touch ellipse,
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // as well as the orientation of the major axis clockwise from vertical, in
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // radians. See:
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // http://developer.android.com/reference/android/view/MotionEvent.html
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  //
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The proposed extension to W3C Touch Events specifies the touch ellipse
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // using two radii along x- & y-axes and a positive acute rotation angle in
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // degrees. See:
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // http://dvcs.w3.org/hg/webevents/raw-file/default/touchevents.html
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  float major_radius = event.GetTouchMajor(pointer_index) / 2.f;
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  float minor_radius = event.GetTouchMinor(pointer_index) / 2.f;
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  float orientation_deg = event.GetOrientation(pointer_index) * 180.f / M_PI;
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_GE(major_radius, 0) << "Unexpected touch major < 0";
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_GE(minor_radius, 0) << "Unexpected touch minor < 0";
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK_GE(major_radius, minor_radius) << "Unexpected major/minor touch radii";
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(-90 <= orientation_deg && orientation_deg <= 90)
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      << "Unexpected touch orientation angle";
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (orientation_deg >= 0) {
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // The case orientation_deg == 0 is handled here on purpose: although the
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // 'else' block is equivalent in this case, we want to pass the 0 value
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // unchanged (and 0 is the default value for many devices that don't
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // report elliptical touches).
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    touch.radiusX = minor_radius;
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    touch.radiusY = major_radius;
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    touch.rotationAngle = orientation_deg;
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    touch.radiusX = major_radius;
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    touch.radiusY = minor_radius;
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    touch.rotationAngle = orientation_deg + 90;
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  touch.force = event.GetPressure(pointer_index);
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return touch;
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
237bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}  // namespace
238bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
239bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochnamespace content {
240bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void UpdateWindowsKeyCodeAndKeyIdentifier(blink::WebKeyboardEvent* event,
242bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                          ui::KeyboardCode windows_key_code) {
243bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  event->windowsKeyCode = windows_key_code;
244bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
245bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  const char* id = GetKeyIdentifier(windows_key_code);
246bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (id) {
247bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    base::strlcpy(event->keyIdentifier, id, sizeof(event->keyIdentifier) - 1);
248bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  } else {
249a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    base::snprintf(event->keyIdentifier,
250a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                   sizeof(event->keyIdentifier),
251a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                   "U+%04X",
252bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                   base::ToUpperASCII(static_cast<int>(windows_key_code)));
253bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  }
254bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
255bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)blink::WebTouchEvent CreateWebTouchEventFromMotionEvent(
257a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const ui::MotionEvent& event) {
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPILE_ASSERT(static_cast<int>(MotionEvent::MAX_TOUCH_POINT_COUNT) ==
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     static_cast<int>(blink::WebTouchEvent::touchesLengthCap),
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 inconsistent_maximum_number_of_active_touch_points);
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  blink::WebTouchEvent result;
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  WebTouchEventTraits::ResetType(
2655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ToWebInputEventType(event.GetAction()),
2665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      (event.GetEventTime() - base::TimeTicks()).InSecondsF(),
2675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      &result);
268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  result.modifiers = EventFlagsToWebEventModifiers(event.GetFlags());
270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  result.touchesLength =
271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      std::min(event.GetPointerCount(),
272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               static_cast<size_t>(WebTouchEvent::touchesLengthCap));
273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_GT(result.touchesLength, 0U);
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (size_t i = 0; i < result.touchesLength; ++i)
276a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    result.touches[i] = CreateWebTouchPoint(event, i);
277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return result;
279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)WebGestureEvent CreateWebGestureEventFromGestureEventData(
282a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const ui::GestureEventData& data) {
283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  WebGestureEvent gesture;
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gesture.modifiers = EventFlagsToWebEventModifiers(data.flags);
285a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  gesture.x = data.x;
286a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  gesture.y = data.y;
2876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  gesture.globalX = data.raw_x;
2886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  gesture.globalY = data.raw_y;
289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gesture.timeStampSeconds = (data.time - base::TimeTicks()).InSecondsF();
29046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  gesture.sourceDevice = blink::WebGestureDeviceTouchscreen;
291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  switch (data.type()) {
293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_SHOW_PRESS:
294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureShowPress;
295a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.showPress.width = data.details.bounding_box_f().width();
296a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.showPress.height = data.details.bounding_box_f().height();
297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_DOUBLE_TAP:
299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureDoubleTap;
300effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      DCHECK_EQ(1, data.details.tap_count());
301effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gesture.data.tap.tapCount = data.details.tap_count();
302a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.tap.width = data.details.bounding_box_f().width();
303a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.tap.height = data.details.bounding_box_f().height();
304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_TAP:
306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureTap;
307effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      DCHECK_EQ(1, data.details.tap_count());
308effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gesture.data.tap.tapCount = data.details.tap_count();
309a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.tap.width = data.details.bounding_box_f().width();
310a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.tap.height = data.details.bounding_box_f().height();
311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_TAP_UNCONFIRMED:
313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureTapUnconfirmed;
314effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      DCHECK_EQ(1, data.details.tap_count());
315effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gesture.data.tap.tapCount = data.details.tap_count();
316a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.tap.width = data.details.bounding_box_f().width();
317a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.tap.height = data.details.bounding_box_f().height();
318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_LONG_PRESS:
320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureLongPress;
321a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.longPress.width = data.details.bounding_box_f().width();
322a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.longPress.height = data.details.bounding_box_f().height();
323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_LONG_TAP:
325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureLongTap;
326a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.longPress.width = data.details.bounding_box_f().width();
327a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.longPress.height = data.details.bounding_box_f().height();
328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_BEGIN:
330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureScrollBegin;
331a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.scrollBegin.deltaXHint = data.details.scroll_x_hint();
332a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.scrollBegin.deltaYHint = data.details.scroll_y_hint();
333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_UPDATE:
335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureScrollUpdate;
336a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.scrollUpdate.deltaX = data.details.scroll_x();
337a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.scrollUpdate.deltaY = data.details.scroll_y();
338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_END:
340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureScrollEnd;
341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_SCROLL_FLING_START:
343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureFlingStart;
344a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.flingStart.velocityX = data.details.velocity_x();
345a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.flingStart.velocityY = data.details.velocity_y();
346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_SCROLL_FLING_CANCEL:
348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureFlingCancel;
349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_PINCH_BEGIN:
351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GesturePinchBegin;
352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_PINCH_UPDATE:
354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GesturePinchUpdate;
355effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      gesture.data.pinchUpdate.scale = data.details.scale();
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_PINCH_END:
358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GesturePinchEnd;
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_TAP_CANCEL:
361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureTapCancel;
362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_TAP_DOWN:
364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureTapDown;
365a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.tapDown.width = data.details.bounding_box_f().width();
366a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      gesture.data.tapDown.height = data.details.bounding_box_f().height();
367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
368c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case ui::ET_GESTURE_BEGIN:
369c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    case ui::ET_GESTURE_END:
370c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      NOTREACHED() << "ET_GESTURE_BEGIN and ET_GESTURE_END are only produced "
371c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   << "in Aura, and should never end up here.";
372c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      break;
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    default:
374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      NOTREACHED() << "ui::EventType provided wasn't a valid gesture event.";
375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return gesture;
379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint EventFlagsToWebEventModifiers(int flags) {
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int modifiers = 0;
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (flags & ui::EF_SHIFT_DOWN)
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    modifiers |= blink::WebInputEvent::ShiftKey;
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (flags & ui::EF_CONTROL_DOWN)
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    modifiers |= blink::WebInputEvent::ControlKey;
3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (flags & ui::EF_ALT_DOWN)
3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    modifiers |= blink::WebInputEvent::AltKey;
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (flags & ui::EF_COMMAND_DOWN)
3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    modifiers |= blink::WebInputEvent::MetaKey;
3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (flags & ui::EF_LEFT_MOUSE_BUTTON)
3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    modifiers |= blink::WebInputEvent::LeftButtonDown;
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (flags & ui::EF_MIDDLE_MOUSE_BUTTON)
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    modifiers |= blink::WebInputEvent::MiddleButtonDown;
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (flags & ui::EF_RIGHT_MOUSE_BUTTON)
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    modifiers |= blink::WebInputEvent::RightButtonDown;
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (flags & ui::EF_CAPS_LOCK_DOWN)
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    modifiers |= blink::WebInputEvent::CapsLockOn;
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (flags & ui::EF_IS_REPEAT)
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    modifiers |= blink::WebInputEvent::IsAutoRepeat;
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (flags & ui::EF_NUMPAD_KEY)
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    modifiers |= blink::WebInputEvent::IsKeyPad;
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return modifiers;
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint WebEventModifiersToEventFlags(int modifiers) {
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int flags = 0;
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (modifiers & blink::WebInputEvent::ShiftKey)
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags |= ui::EF_SHIFT_DOWN;
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (modifiers & blink::WebInputEvent::ControlKey)
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags |= ui::EF_CONTROL_DOWN;
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (modifiers & blink::WebInputEvent::AltKey)
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags |= ui::EF_ALT_DOWN;
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (modifiers & blink::WebInputEvent::MetaKey)
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags |= ui::EF_COMMAND_DOWN;
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (modifiers & blink::WebInputEvent::LeftButtonDown)
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags |= ui::EF_LEFT_MOUSE_BUTTON;
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (modifiers & blink::WebInputEvent::MiddleButtonDown)
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags |= ui::EF_MIDDLE_MOUSE_BUTTON;
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (modifiers & blink::WebInputEvent::RightButtonDown)
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags |= ui::EF_RIGHT_MOUSE_BUTTON;
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (modifiers & blink::WebInputEvent::CapsLockOn)
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags |= ui::EF_CAPS_LOCK_DOWN;
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (modifiers & blink::WebInputEvent::IsAutoRepeat)
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags |= ui::EF_IS_REPEAT;
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (modifiers & blink::WebInputEvent::IsKeyPad)
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    flags |= ui::EF_NUMPAD_KEY;
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return flags;
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
437bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}  // namespace content
438