web_input_event_util.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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
5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/browser/renderer_host/input/web_input_event_util.h"
6bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
7bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/strings/string_util.h"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/gesture_detection/gesture_event_data.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/gesture_detection/motion_event.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using blink::WebGestureEvent;
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using blink::WebInputEvent;
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using blink::WebTouchEvent;
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using blink::WebTouchPoint;
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using ui::MotionEvent;
16bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
17bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochnamespace {
18bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
19bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochconst char* GetKeyIdentifier(ui::KeyboardCode key_code) {
20bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  switch (key_code) {
21bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_MENU:
22bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Alt";
23bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_CONTROL:
24bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Control";
25bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_SHIFT:
26bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Shift";
27bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_CAPITAL:
28bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "CapsLock";
29bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_LWIN:
30bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_RWIN:
31bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Win";
32bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_CLEAR:
33bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Clear";
34bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_DOWN:
35bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Down";
36bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_END:
37bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "End";
38bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_RETURN:
39bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Enter";
40bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_EXECUTE:
41bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Execute";
42bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F1:
43bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F1";
44bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F2:
45bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F2";
46bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F3:
47bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F3";
48bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F4:
49bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F4";
50bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F5:
51bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F5";
52bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F6:
53bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F6";
54bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F7:
55bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F7";
56bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F8:
57bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F8";
58bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F9:
59bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F9";
60bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F10:
61bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F10";
62bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F11:
63bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F11";
64bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F12:
65bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F12";
66bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F13:
67bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F13";
68bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F14:
69bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F14";
70bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F15:
71bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F15";
72bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F16:
73bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F16";
74bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F17:
75bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F17";
76bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F18:
77bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F18";
78bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F19:
79bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F19";
80bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F20:
81bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F20";
82bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F21:
83bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F21";
84bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F22:
85bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F22";
86bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F23:
87bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F23";
88bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_F24:
89bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "F24";
90bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_HELP:
91bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Help";
92bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_HOME:
93bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Home";
94bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_INSERT:
95bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Insert";
96bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_LEFT:
97bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Left";
98bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_NEXT:
99bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "PageDown";
100bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_PRIOR:
101bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "PageUp";
102bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_PAUSE:
103bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Pause";
104bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_SNAPSHOT:
105bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "PrintScreen";
106bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_RIGHT:
107bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Right";
108bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_SCROLL:
109bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Scroll";
110bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_SELECT:
111bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Select";
112bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_UP:
113bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "Up";
114bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_DELETE:
115bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "U+007F"; // Standard says that DEL becomes U+007F.
116bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_MEDIA_NEXT_TRACK:
117bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "MediaNextTrack";
118bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_MEDIA_PREV_TRACK:
119bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "MediaPreviousTrack";
120bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_MEDIA_STOP:
121bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "MediaStop";
122bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_MEDIA_PLAY_PAUSE:
123bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "MediaPlayPause";
124bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_VOLUME_MUTE:
125bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "VolumeMute";
126bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_VOLUME_DOWN:
127bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "VolumeDown";
128bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    case ui::VKEY_VOLUME_UP:
129bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return "VolumeUp";
130bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    default:
131bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      return NULL;
132bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  };
133bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
134bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)WebInputEvent::Type ToWebInputEventType(MotionEvent::Action action) {
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  switch (action) {
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_DOWN:
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebInputEvent::TouchStart;
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_MOVE:
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebInputEvent::TouchMove;
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_UP:
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebInputEvent::TouchEnd;
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_CANCEL:
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebInputEvent::TouchCancel;
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_POINTER_DOWN:
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebInputEvent::TouchStart;
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_POINTER_UP:
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebInputEvent::TouchEnd;
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NOTREACHED() << "Invalid MotionEvent::Action.";
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return WebInputEvent::Undefined;
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Note that |is_action_pointer| is meaningful only in the context of
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// |ACTION_POINTER_UP| and |ACTION_POINTER_DOWN|; other actions map directly to
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// WebTouchPoint::State.
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)WebTouchPoint::State ToWebTouchPointState(MotionEvent::Action action,
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                          bool is_action_pointer) {
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  switch (action) {
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_DOWN:
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebTouchPoint::StatePressed;
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_MOVE:
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebTouchPoint::StateMoved;
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_UP:
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebTouchPoint::StateReleased;
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_CANCEL:
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return WebTouchPoint::StateCancelled;
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_POINTER_DOWN:
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return is_action_pointer ? WebTouchPoint::StatePressed
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               : WebTouchPoint::StateStationary;
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case MotionEvent::ACTION_POINTER_UP:
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return is_action_pointer ? WebTouchPoint::StateReleased
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                               : WebTouchPoint::StateStationary;
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NOTREACHED() << "Invalid MotionEvent::Action.";
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return WebTouchPoint::StateUndefined;
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)WebTouchPoint CreateWebTouchPoint(const MotionEvent& event,
180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 size_t pointer_index,
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 float scale) {
182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  WebTouchPoint touch;
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  touch.id = event.GetPointerId(pointer_index);
184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  touch.state = ToWebTouchPointState(
185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      event.GetAction(),
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      static_cast<int>(pointer_index) == event.GetActionIndex());
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  touch.position.x = event.GetX(pointer_index) * scale;
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  touch.position.y = event.GetY(pointer_index) * scale;
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TODO(joth): Raw event co-ordinates.
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  touch.screenPosition = touch.position;
191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  touch.radiusX = touch.radiusY =
192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      event.GetTouchMajor(pointer_index) * 0.5f * scale;
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  touch.force = event.GetPressure(pointer_index);
194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return touch;
196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
198bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}  // namespace
199bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
200bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochnamespace content {
201bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void UpdateWindowsKeyCodeAndKeyIdentifier(blink::WebKeyboardEvent* event,
203bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                          ui::KeyboardCode windows_key_code) {
204bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  event->windowsKeyCode = windows_key_code;
205bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
206bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  const char* id = GetKeyIdentifier(windows_key_code);
207bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (id) {
208bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    base::strlcpy(event->keyIdentifier, id, sizeof(event->keyIdentifier) - 1);
209bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  } else {
210bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    base::snprintf(event->keyIdentifier, sizeof(event->keyIdentifier), "U+%04X",
211bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                   base::ToUpperASCII(static_cast<int>(windows_key_code)));
212bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  }
213bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
214bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)blink::WebTouchEvent CreateWebTouchEventFromMotionEvent(
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const ui::MotionEvent& event,
217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    float scale) {
218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  blink::WebTouchEvent result;
219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  result.type = ToWebInputEventType(event.GetAction());
221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(WebInputEvent::isTouchEventType(result.type));
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  result.timeStampSeconds =
224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      (event.GetEventTime() - base::TimeTicks()).InSecondsF();
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  result.touchesLength =
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      std::min(event.GetPointerCount(),
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               static_cast<size_t>(WebTouchEvent::touchesLengthCap));
229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK_GT(result.touchesLength, 0U);
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (size_t i = 0; i < result.touchesLength; ++i)
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    result.touches[i] = CreateWebTouchPoint(event, i, scale);
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return result;
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)WebGestureEvent CreateWebGestureEventFromGestureEventData(
238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const ui::GestureEventData& data,
239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    float scale) {
240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  WebGestureEvent gesture;
241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gesture.x = data.x * scale;
242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gesture.y = data.y * scale;
243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gesture.timeStampSeconds = (data.time - base::TimeTicks()).InSecondsF();
244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gesture.sourceDevice = WebGestureEvent::Touchscreen;
245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  switch (data.type) {
247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_SHOW_PRESS:
248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureShowPress;
249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.showPress.width = data.details.show_press.width * scale;
250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.showPress.width = data.details.show_press.width * scale;
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_DOUBLE_TAP:
253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureDoubleTap;
254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      DCHECK_EQ(1, data.details.tap.tap_count);
255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.tap.tapCount = data.details.tap.tap_count;
256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.tap.width = data.details.tap.width * scale;
257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.tap.height = data.details.tap.height * scale;
258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_TAP:
260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureTap;
261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      DCHECK_EQ(1, data.details.tap.tap_count);
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.tap.tapCount = data.details.tap.tap_count;
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.tap.width = data.details.tap.width * scale;
264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.tap.height = data.details.tap.height * scale;
265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_TAP_UNCONFIRMED:
267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureTapUnconfirmed;
268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      DCHECK_EQ(1, data.details.tap.tap_count);
269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.tap.tapCount = data.details.tap.tap_count;
270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.tap.width = data.details.tap.width * scale;
271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.tap.height = data.details.tap.height * scale;
272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_LONG_PRESS:
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureLongPress;
275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.longPress.width = data.details.long_press.width * scale;
276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.longPress.height = data.details.long_press.height * scale;
277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_LONG_TAP:
279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureLongTap;
280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.longPress.width = data.details.long_press.width * scale;
281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.longPress.height = data.details.long_press.height * scale;
282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_BEGIN:
284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureScrollBegin;
285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.scrollBegin.deltaXHint =
286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          data.details.scroll_begin.delta_x_hint * scale;
287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.scrollBegin.deltaYHint =
288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          data.details.scroll_begin.delta_y_hint * scale;
289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_UPDATE:
291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureScrollUpdate;
292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.scrollUpdate.deltaX =
293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          data.details.scroll_update.delta_x * scale;
294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.scrollUpdate.deltaY =
295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          data.details.scroll_update.delta_y * scale;
296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.scrollUpdate.velocityX =
297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          data.details.scroll_update.velocity_x * scale;
298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.scrollUpdate.velocityY =
299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          data.details.scroll_update.velocity_y * scale;
300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_SCROLL_END:
302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureScrollEnd;
303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_SCROLL_FLING_START:
305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureFlingStart;
306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.flingStart.velocityX =
307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          data.details.fling_start.velocity_x * scale;
308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.flingStart.velocityY =
309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          data.details.fling_start.velocity_y * scale;
310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_SCROLL_FLING_CANCEL:
312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureFlingCancel;
313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_PINCH_BEGIN:
315a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GesturePinchBegin;
316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_PINCH_UPDATE:
318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GesturePinchUpdate;
319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.pinchUpdate.scale = data.details.pinch_update.scale;
320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_PINCH_END:
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GesturePinchEnd;
323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_TAP_CANCEL:
325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureTapCancel;
326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    case ui::ET_GESTURE_TAP_DOWN:
328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.type = WebInputEvent::GestureTapDown;
329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.tapDown.width = data.details.tap_down.width * scale;
330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture.data.tapDown.height = data.details.tap_down.height * scale;
331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    default:
333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      NOTREACHED() << "ui::EventType provided wasn't a valid gesture event.";
334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      break;
335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return gesture;
338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
340bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}  // namespace content
341