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