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.
5 #include "content/common/input/synthetic_web_input_event_builders.h"
7 #include "base/logging.h"
8 #include "content/common/input/web_touch_event_traits.h"
9 #include "ui/events/keycodes/keyboard_codes.h"
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;
21 WebMouseEvent SyntheticWebMouseEventBuilder::Build(
22 blink::WebInputEvent::Type type) {
28 WebMouseEvent SyntheticWebMouseEventBuilder::Build(
29 blink::WebInputEvent::Type type,
33 DCHECK(WebInputEvent::isMouseEventType(type));
34 WebMouseEvent result = Build(type);
37 result.windowX = window_x;
38 result.windowY = window_y;
39 result.modifiers = modifiers;
41 if (type == WebInputEvent::MouseDown || type == WebInputEvent::MouseUp)
42 result.button = WebMouseEvent::ButtonLeft;
44 result.button = WebMouseEvent::ButtonNone;
49 WebMouseWheelEvent SyntheticWebMouseWheelEventBuilder::Build(
50 WebMouseWheelEvent::Phase phase) {
51 WebMouseWheelEvent result;
52 result.type = WebInputEvent::MouseWheel;
57 WebMouseWheelEvent SyntheticWebMouseWheelEventBuilder::Build(float dx,
61 WebMouseWheelEvent result;
62 result.type = WebInputEvent::MouseWheel;
66 result.wheelTicksX = dx > 0.0f ? 1.0f : -1.0f;
68 result.wheelTicksY = dy > 0.0f ? 1.0f : -1.0f;
69 result.modifiers = modifiers;
70 result.hasPreciseScrollingDeltas = precise;
74 WebKeyboardEvent SyntheticWebKeyboardEventBuilder::Build(
75 WebInputEvent::Type type) {
76 DCHECK(WebInputEvent::isKeyboardEventType(type));
77 WebKeyboardEvent result;
79 result.windowsKeyCode = ui::VKEY_L; // non-null made up value.
83 WebGestureEvent SyntheticWebGestureEventBuilder::Build(
84 WebInputEvent::Type type,
85 WebGestureEvent::SourceDevice source_device) {
86 DCHECK(WebInputEvent::isGestureEventType(type));
87 WebGestureEvent result;
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;
100 WebGestureEvent SyntheticWebGestureEventBuilder::BuildScrollBegin(
103 WebGestureEvent result = Build(WebInputEvent::GestureScrollBegin,
104 WebGestureEvent::Touchscreen);
105 result.data.scrollBegin.deltaXHint = dx_hint;
106 result.data.scrollBegin.deltaYHint = dy_hint;
110 WebGestureEvent SyntheticWebGestureEventBuilder::BuildScrollUpdate(
114 WebGestureEvent result = Build(WebInputEvent::GestureScrollUpdate,
115 WebGestureEvent::Touchscreen);
116 result.data.scrollUpdate.deltaX = dx;
117 result.data.scrollUpdate.deltaY = dy;
118 result.modifiers = modifiers;
122 WebGestureEvent SyntheticWebGestureEventBuilder::BuildPinchUpdate(
127 WebGestureEvent::SourceDevice source_device) {
128 WebGestureEvent result =
129 Build(WebInputEvent::GesturePinchUpdate, source_device);
130 result.data.pinchUpdate.scale = scale;
133 result.globalX = anchor_x;
134 result.globalY = anchor_y;
135 result.modifiers = modifiers;
139 WebGestureEvent SyntheticWebGestureEventBuilder::BuildFling(
142 WebGestureEvent::SourceDevice source_device) {
143 WebGestureEvent result = Build(WebInputEvent::GestureFlingStart,
145 result.data.flingStart.velocityX = velocity_x;
146 result.data.flingStart.velocityY = velocity_y;
150 SyntheticWebTouchEvent::SyntheticWebTouchEvent() : WebTouchEvent() {}
152 void SyntheticWebTouchEvent::ResetPoints() {
154 for (unsigned int i = 0; i < touchesLength; ++i) {
155 if (touches[i].state == WebTouchPoint::StateReleased)
158 touches[point] = touches[i];
159 touches[point].state = WebTouchPoint::StateStationary;
162 touchesLength = point;
163 type = WebInputEvent::Undefined;
166 int SyntheticWebTouchEvent::PressPoint(float x, float y) {
167 if (touchesLength == touchesLengthCap)
169 WebTouchPoint& point = touches[touchesLength];
170 point.id = touchesLength;
171 point.position.x = point.screenPosition.x = x;
172 point.position.y = point.screenPosition.y = y;
173 point.state = WebTouchPoint::StatePressed;
174 point.radiusX = point.radiusY = 1.f;
176 WebTouchEventTraits::ResetType(
177 WebInputEvent::TouchStart, timeStampSeconds, this);
181 void SyntheticWebTouchEvent::MovePoint(int index, float x, float y) {
182 CHECK(index >= 0 && index < touchesLengthCap);
183 WebTouchPoint& point = touches[index];
184 point.position.x = point.screenPosition.x = x;
185 point.position.y = point.screenPosition.y = y;
186 touches[index].state = WebTouchPoint::StateMoved;
187 WebTouchEventTraits::ResetType(
188 WebInputEvent::TouchMove, timeStampSeconds, this);
191 void SyntheticWebTouchEvent::ReleasePoint(int index) {
192 CHECK(index >= 0 && index < touchesLengthCap);
193 touches[index].state = WebTouchPoint::StateReleased;
194 WebTouchEventTraits::ResetType(
195 WebInputEvent::TouchEnd, timeStampSeconds, this);
198 void SyntheticWebTouchEvent::CancelPoint(int index) {
199 CHECK(index >= 0 && index < touchesLengthCap);
200 touches[index].state = WebTouchPoint::StateCancelled;
201 WebTouchEventTraits::ResetType(
202 WebInputEvent::TouchCancel, timeStampSeconds, this);
205 void SyntheticWebTouchEvent::SetTimestamp(base::TimeDelta timestamp) {
206 timeStampSeconds = timestamp.InSecondsF();
209 } // namespace content