• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "content/common/input/synthetic_web_input_event_builders.h"
6 
7 #include "base/logging.h"
8 #include "content/common/input/web_touch_event_traits.h"
9 #include "ui/events/keycodes/keyboard_codes.h"
10 
11 namespace content {
12 
13 using blink::WebInputEvent;
14 using blink::WebKeyboardEvent;
15 using blink::WebGestureEvent;
16 using blink::WebMouseEvent;
17 using blink::WebMouseWheelEvent;
18 using blink::WebTouchEvent;
19 using blink::WebTouchPoint;
20 
Build(blink::WebInputEvent::Type type)21 WebMouseEvent SyntheticWebMouseEventBuilder::Build(
22     blink::WebInputEvent::Type type) {
23   WebMouseEvent result;
24   result.type = type;
25   return result;
26 }
27 
Build(blink::WebInputEvent::Type type,int window_x,int window_y,int modifiers)28 WebMouseEvent SyntheticWebMouseEventBuilder::Build(
29     blink::WebInputEvent::Type type,
30     int window_x,
31     int window_y,
32     int modifiers) {
33   DCHECK(WebInputEvent::isMouseEventType(type));
34   WebMouseEvent result = Build(type);
35   result.x = window_x;
36   result.y = window_y;
37   result.windowX = window_x;
38   result.windowY = window_y;
39   result.modifiers = modifiers;
40 
41   if (type == WebInputEvent::MouseDown || type == WebInputEvent::MouseUp)
42     result.button = WebMouseEvent::ButtonLeft;
43   else
44     result.button = WebMouseEvent::ButtonNone;
45 
46   return result;
47 }
48 
Build(WebMouseWheelEvent::Phase phase)49 WebMouseWheelEvent SyntheticWebMouseWheelEventBuilder::Build(
50     WebMouseWheelEvent::Phase phase) {
51   WebMouseWheelEvent result;
52   result.type = WebInputEvent::MouseWheel;
53   result.phase = phase;
54   return result;
55 }
56 
Build(float dx,float dy,int modifiers,bool precise)57 WebMouseWheelEvent SyntheticWebMouseWheelEventBuilder::Build(float dx,
58                                                              float dy,
59                                                              int modifiers,
60                                                              bool precise) {
61   WebMouseWheelEvent result;
62   result.type = WebInputEvent::MouseWheel;
63   result.deltaX = dx;
64   result.deltaY = dy;
65   if (dx)
66     result.wheelTicksX = dx > 0.0f ? 1.0f : -1.0f;
67   if (dy)
68     result.wheelTicksY = dy > 0.0f ? 1.0f : -1.0f;
69   result.modifiers = modifiers;
70   result.hasPreciseScrollingDeltas = precise;
71   return result;
72 }
73 
Build(WebInputEvent::Type type)74 WebKeyboardEvent SyntheticWebKeyboardEventBuilder::Build(
75     WebInputEvent::Type type) {
76   DCHECK(WebInputEvent::isKeyboardEventType(type));
77   WebKeyboardEvent result;
78   result.type = type;
79   result.windowsKeyCode = ui::VKEY_L;  // non-null made up value.
80   return result;
81 }
82 
Build(WebInputEvent::Type type,blink::WebGestureDevice source_device)83 WebGestureEvent SyntheticWebGestureEventBuilder::Build(
84     WebInputEvent::Type type,
85     blink::WebGestureDevice source_device) {
86   DCHECK(WebInputEvent::isGestureEventType(type));
87   WebGestureEvent result;
88   result.type = type;
89   result.sourceDevice = source_device;
90   if (type == WebInputEvent::GestureTap ||
91       type == WebInputEvent::GestureTapUnconfirmed ||
92       type == WebInputEvent::GestureDoubleTap) {
93     result.data.tap.tapCount = 1;
94     result.data.tap.width = 10;
95     result.data.tap.height = 10;
96   }
97   return result;
98 }
99 
BuildScrollBegin(float dx_hint,float dy_hint)100 WebGestureEvent SyntheticWebGestureEventBuilder::BuildScrollBegin(
101     float dx_hint,
102     float dy_hint) {
103   WebGestureEvent result = Build(WebInputEvent::GestureScrollBegin,
104                                  blink::WebGestureDeviceTouchscreen);
105   result.data.scrollBegin.deltaXHint = dx_hint;
106   result.data.scrollBegin.deltaYHint = dy_hint;
107   return result;
108 }
109 
BuildScrollUpdate(float dx,float dy,int modifiers)110 WebGestureEvent SyntheticWebGestureEventBuilder::BuildScrollUpdate(
111     float dx,
112     float dy,
113     int modifiers) {
114   WebGestureEvent result = Build(WebInputEvent::GestureScrollUpdate,
115                                  blink::WebGestureDeviceTouchscreen);
116   result.data.scrollUpdate.deltaX = dx;
117   result.data.scrollUpdate.deltaY = dy;
118   result.modifiers = modifiers;
119   return result;
120 }
121 
BuildPinchUpdate(float scale,float anchor_x,float anchor_y,int modifiers,blink::WebGestureDevice source_device)122 WebGestureEvent SyntheticWebGestureEventBuilder::BuildPinchUpdate(
123     float scale,
124     float anchor_x,
125     float anchor_y,
126     int modifiers,
127     blink::WebGestureDevice source_device) {
128   WebGestureEvent result =
129       Build(WebInputEvent::GesturePinchUpdate, source_device);
130   result.data.pinchUpdate.scale = scale;
131   result.x = anchor_x;
132   result.y = anchor_y;
133   result.globalX = anchor_x;
134   result.globalY = anchor_y;
135   result.modifiers = modifiers;
136   return result;
137 }
138 
BuildFling(float velocity_x,float velocity_y,blink::WebGestureDevice source_device)139 WebGestureEvent SyntheticWebGestureEventBuilder::BuildFling(
140     float velocity_x,
141     float velocity_y,
142     blink::WebGestureDevice source_device) {
143   WebGestureEvent result = Build(WebInputEvent::GestureFlingStart,
144                                  source_device);
145   result.data.flingStart.velocityX = velocity_x;
146   result.data.flingStart.velocityY = velocity_y;
147   return result;
148 }
149 
SyntheticWebTouchEvent()150 SyntheticWebTouchEvent::SyntheticWebTouchEvent() : WebTouchEvent() {
151   SetTimestamp(base::TimeTicks::Now() - base::TimeTicks());
152 }
153 
ResetPoints()154 void SyntheticWebTouchEvent::ResetPoints() {
155   int point = 0;
156   for (unsigned int i = 0; i < touchesLength; ++i) {
157     if (touches[i].state == WebTouchPoint::StateReleased)
158       continue;
159 
160     touches[point] = touches[i];
161     touches[point].state = WebTouchPoint::StateStationary;
162     ++point;
163   }
164   touchesLength = point;
165   type = WebInputEvent::Undefined;
166 }
167 
PressPoint(float x,float y)168 int SyntheticWebTouchEvent::PressPoint(float x, float y) {
169   if (touchesLength == touchesLengthCap)
170     return -1;
171   WebTouchPoint& point = touches[touchesLength];
172   point.id = touchesLength;
173   point.position.x = point.screenPosition.x = x;
174   point.position.y = point.screenPosition.y = y;
175   point.state = WebTouchPoint::StatePressed;
176   point.radiusX = point.radiusY = 1.f;
177   ++touchesLength;
178   WebTouchEventTraits::ResetType(
179       WebInputEvent::TouchStart, timeStampSeconds, this);
180   return point.id;
181 }
182 
MovePoint(int index,float x,float y)183 void SyntheticWebTouchEvent::MovePoint(int index, float x, float y) {
184   CHECK(index >= 0 && index < touchesLengthCap);
185   WebTouchPoint& point = touches[index];
186   point.position.x = point.screenPosition.x = x;
187   point.position.y = point.screenPosition.y = y;
188   touches[index].state = WebTouchPoint::StateMoved;
189   WebTouchEventTraits::ResetType(
190       WebInputEvent::TouchMove, timeStampSeconds, this);
191 }
192 
ReleasePoint(int index)193 void SyntheticWebTouchEvent::ReleasePoint(int index) {
194   CHECK(index >= 0 && index < touchesLengthCap);
195   touches[index].state = WebTouchPoint::StateReleased;
196   WebTouchEventTraits::ResetType(
197       WebInputEvent::TouchEnd, timeStampSeconds, this);
198 }
199 
CancelPoint(int index)200 void SyntheticWebTouchEvent::CancelPoint(int index) {
201   CHECK(index >= 0 && index < touchesLengthCap);
202   touches[index].state = WebTouchPoint::StateCancelled;
203   WebTouchEventTraits::ResetType(
204       WebInputEvent::TouchCancel, timeStampSeconds, this);
205 }
206 
SetTimestamp(base::TimeDelta timestamp)207 void SyntheticWebTouchEvent::SetTimestamp(base::TimeDelta timestamp) {
208   timeStampSeconds = timestamp.InSecondsF();
209 }
210 
211 }  // namespace content
212