1 // Copyright 2014 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/gesture_event_stream_validator.h"
6
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "third_party/blink/public/common/input/synthetic_web_input_event_builders.h"
9
10 using blink::WebInputEvent;
11 using blink::WebGestureEvent;
12
13 namespace content {
14 namespace {
15
16 const blink::WebGestureDevice kDefaultGestureDevice =
17 blink::WebGestureDevice::kTouchscreen;
18
Build(WebInputEvent::Type type)19 blink::WebGestureEvent Build(WebInputEvent::Type type) {
20 blink::WebGestureEvent event = blink::SyntheticWebGestureEventBuilder::Build(
21 type, kDefaultGestureDevice);
22 // Default to providing a (valid) non-zero fling velocity.
23 if (type == WebInputEvent::Type::kGestureFlingStart)
24 event.data.fling_start.velocity_x = 5;
25 return event;
26 }
27
28 } // namespace
29
TEST(GestureEventStreamValidator,ValidScroll)30 TEST(GestureEventStreamValidator, ValidScroll) {
31 GestureEventStreamValidator validator;
32 std::string error_msg;
33 WebGestureEvent event;
34
35 event = Build(WebInputEvent::Type::kGestureScrollBegin);
36 EXPECT_TRUE(validator.Validate(event, &error_msg));
37 EXPECT_TRUE(error_msg.empty());
38
39 event = Build(WebInputEvent::Type::kGestureScrollUpdate);
40 EXPECT_TRUE(validator.Validate(event, &error_msg));
41 EXPECT_TRUE(error_msg.empty());
42
43 event = Build(WebInputEvent::Type::kGestureScrollEnd);
44 EXPECT_TRUE(validator.Validate(event, &error_msg));
45 EXPECT_TRUE(error_msg.empty());
46 }
47
TEST(GestureEventStreamValidator,InvalidScroll)48 TEST(GestureEventStreamValidator, InvalidScroll) {
49 GestureEventStreamValidator validator;
50 std::string error_msg;
51 WebGestureEvent event;
52
53 // No preceding ScrollBegin.
54 event = Build(WebInputEvent::Type::kGestureScrollUpdate);
55 EXPECT_FALSE(validator.Validate(event, &error_msg));
56 EXPECT_FALSE(error_msg.empty());
57
58 // No preceding ScrollBegin.
59 event = Build(WebInputEvent::Type::kGestureScrollEnd);
60 EXPECT_FALSE(validator.Validate(event, &error_msg));
61 EXPECT_FALSE(error_msg.empty());
62
63 event = Build(WebInputEvent::Type::kGestureScrollBegin);
64 EXPECT_TRUE(validator.Validate(event, &error_msg));
65 EXPECT_TRUE(error_msg.empty());
66
67 // Already scrolling.
68 event = Build(WebInputEvent::Type::kGestureScrollBegin);
69 EXPECT_FALSE(validator.Validate(event, &error_msg));
70 EXPECT_FALSE(error_msg.empty());
71
72 event = Build(WebInputEvent::Type::kGestureScrollEnd);
73 EXPECT_TRUE(validator.Validate(event, &error_msg));
74 EXPECT_TRUE(error_msg.empty());
75
76 // Scroll already ended.
77 event = Build(WebInputEvent::Type::kGestureScrollEnd);
78 EXPECT_FALSE(validator.Validate(event, &error_msg));
79 EXPECT_FALSE(error_msg.empty());
80 }
81
TEST(GestureEventStreamValidator,ValidFling)82 TEST(GestureEventStreamValidator, ValidFling) {
83 GestureEventStreamValidator validator;
84 std::string error_msg;
85 WebGestureEvent event;
86
87 event = Build(WebInputEvent::Type::kGestureScrollBegin);
88 EXPECT_TRUE(validator.Validate(event, &error_msg));
89 EXPECT_TRUE(error_msg.empty());
90
91 event = Build(WebInputEvent::Type::kGestureFlingStart);
92 EXPECT_TRUE(validator.Validate(event, &error_msg));
93 EXPECT_TRUE(error_msg.empty());
94 }
95
TEST(GestureEventStreamValidator,InvalidFling)96 TEST(GestureEventStreamValidator, InvalidFling) {
97 GestureEventStreamValidator validator;
98 std::string error_msg;
99 WebGestureEvent event;
100
101 // No preceding ScrollBegin.
102 event = Build(WebInputEvent::Type::kGestureFlingStart);
103 EXPECT_FALSE(validator.Validate(event, &error_msg));
104 EXPECT_FALSE(error_msg.empty());
105
106 // Zero velocity.
107 event = Build(WebInputEvent::Type::kGestureScrollBegin);
108 EXPECT_TRUE(validator.Validate(event, &error_msg));
109 EXPECT_TRUE(error_msg.empty());
110
111 event = Build(WebInputEvent::Type::kGestureFlingStart);
112 event.data.fling_start.velocity_x = 0;
113 event.data.fling_start.velocity_y = 0;
114 EXPECT_FALSE(validator.Validate(event, &error_msg));
115 EXPECT_FALSE(error_msg.empty());
116 }
117
TEST(GestureEventStreamValidator,ValidPinch)118 TEST(GestureEventStreamValidator, ValidPinch) {
119 GestureEventStreamValidator validator;
120 std::string error_msg;
121 WebGestureEvent event;
122
123 event = Build(WebInputEvent::Type::kGesturePinchBegin);
124 EXPECT_TRUE(validator.Validate(event, &error_msg));
125 EXPECT_TRUE(error_msg.empty());
126
127 event = Build(WebInputEvent::Type::kGesturePinchUpdate);
128 EXPECT_TRUE(validator.Validate(event, &error_msg));
129 EXPECT_TRUE(error_msg.empty());
130
131 event = Build(WebInputEvent::Type::kGesturePinchEnd);
132 EXPECT_TRUE(validator.Validate(event, &error_msg));
133 EXPECT_TRUE(error_msg.empty());
134 }
135
TEST(GestureEventStreamValidator,InvalidPinch)136 TEST(GestureEventStreamValidator, InvalidPinch) {
137 GestureEventStreamValidator validator;
138 std::string error_msg;
139 WebGestureEvent event;
140
141 // No preceding PinchBegin.
142 event = Build(WebInputEvent::Type::kGesturePinchUpdate);
143 EXPECT_FALSE(validator.Validate(event, &error_msg));
144 EXPECT_FALSE(error_msg.empty());
145
146 event = Build(WebInputEvent::Type::kGesturePinchBegin);
147 EXPECT_TRUE(validator.Validate(event, &error_msg));
148 EXPECT_TRUE(error_msg.empty());
149
150 // ScrollBegin while pinching.
151 event = Build(WebInputEvent::Type::kGestureScrollBegin);
152 EXPECT_FALSE(validator.Validate(event, &error_msg));
153 EXPECT_FALSE(error_msg.empty());
154
155 // ScrollEnd while pinching.
156 event = Build(WebInputEvent::Type::kGestureScrollEnd);
157 EXPECT_FALSE(validator.Validate(event, &error_msg));
158 EXPECT_FALSE(error_msg.empty());
159
160 // Pinch already begun.
161 event = Build(WebInputEvent::Type::kGesturePinchBegin);
162 EXPECT_FALSE(validator.Validate(event, &error_msg));
163 EXPECT_FALSE(error_msg.empty());
164
165 event = Build(WebInputEvent::Type::kGesturePinchEnd);
166 EXPECT_TRUE(validator.Validate(event, &error_msg));
167 EXPECT_TRUE(error_msg.empty());
168
169 // Pinch already ended.
170 event = Build(WebInputEvent::Type::kGesturePinchEnd);
171 EXPECT_FALSE(validator.Validate(event, &error_msg));
172 EXPECT_FALSE(error_msg.empty());
173 }
174
TEST(GestureEventStreamValidator,ValidTap)175 TEST(GestureEventStreamValidator, ValidTap) {
176 GestureEventStreamValidator validator;
177 std::string error_msg;
178 WebGestureEvent event;
179
180 event = Build(WebInputEvent::Type::kGestureTapDown);
181 EXPECT_TRUE(validator.Validate(event, &error_msg));
182 EXPECT_TRUE(error_msg.empty());
183
184 event = Build(WebInputEvent::Type::kGestureTapCancel);
185 EXPECT_TRUE(validator.Validate(event, &error_msg));
186 EXPECT_TRUE(error_msg.empty());
187
188 event = Build(WebInputEvent::Type::kGestureTapDown);
189 EXPECT_TRUE(validator.Validate(event, &error_msg));
190 EXPECT_TRUE(error_msg.empty());
191
192 event = Build(WebInputEvent::Type::kGestureTapUnconfirmed);
193 EXPECT_TRUE(validator.Validate(event, &error_msg));
194 EXPECT_TRUE(error_msg.empty());
195
196 event = Build(WebInputEvent::Type::kGestureTapCancel);
197 EXPECT_TRUE(validator.Validate(event, &error_msg));
198 EXPECT_TRUE(error_msg.empty());
199
200 event = Build(WebInputEvent::Type::kGestureTapDown);
201 EXPECT_TRUE(validator.Validate(event, &error_msg));
202 EXPECT_TRUE(error_msg.empty());
203
204 event = Build(WebInputEvent::Type::kGestureTap);
205 EXPECT_TRUE(validator.Validate(event, &error_msg));
206 EXPECT_TRUE(error_msg.empty());
207
208 // DoubleTap does not require a TapDown (unlike Tap, TapUnconfirmed and
209 // TapCancel).
210 event = Build(WebInputEvent::Type::kGestureDoubleTap);
211 EXPECT_TRUE(validator.Validate(event, &error_msg));
212 EXPECT_TRUE(error_msg.empty());
213 }
214
TEST(GestureEventStreamValidator,InvalidTap)215 TEST(GestureEventStreamValidator, InvalidTap) {
216 GestureEventStreamValidator validator;
217 std::string error_msg;
218 WebGestureEvent event;
219
220 // No preceding TapDown.
221 event = Build(WebInputEvent::Type::kGestureTapUnconfirmed);
222 EXPECT_FALSE(validator.Validate(event, &error_msg));
223 EXPECT_FALSE(error_msg.empty());
224
225 event = Build(WebInputEvent::Type::kGestureTapCancel);
226 EXPECT_FALSE(validator.Validate(event, &error_msg));
227 EXPECT_FALSE(error_msg.empty());
228
229 event = Build(WebInputEvent::Type::kGestureTap);
230 EXPECT_FALSE(validator.Validate(event, &error_msg));
231 EXPECT_FALSE(error_msg.empty());
232
233 // TapDown already terminated.
234 event = Build(WebInputEvent::Type::kGestureTapDown);
235 EXPECT_TRUE(validator.Validate(event, &error_msg));
236 EXPECT_TRUE(error_msg.empty());
237
238 event = Build(WebInputEvent::Type::kGestureDoubleTap);
239 EXPECT_TRUE(validator.Validate(event, &error_msg));
240 EXPECT_TRUE(error_msg.empty());
241
242 event = Build(WebInputEvent::Type::kGestureTapCancel);
243 EXPECT_FALSE(validator.Validate(event, &error_msg));
244 EXPECT_FALSE(error_msg.empty());
245
246 // TapDown already terminated.
247 event = Build(WebInputEvent::Type::kGestureTapDown);
248 EXPECT_TRUE(validator.Validate(event, &error_msg));
249 EXPECT_TRUE(error_msg.empty());
250
251 event = Build(WebInputEvent::Type::kGestureTap);
252 EXPECT_TRUE(validator.Validate(event, &error_msg));
253 EXPECT_TRUE(error_msg.empty());
254
255 event = Build(WebInputEvent::Type::kGestureTapCancel);
256 EXPECT_FALSE(validator.Validate(event, &error_msg));
257 EXPECT_FALSE(error_msg.empty());
258 }
259
260 } // namespace content
261