Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Side by Side Diff: content/browser/renderer_host/input/touch_to_gesture_queue_unittest.cc

Issue 120513005: [Android] Perform eager gesture recognition on MotionEvents (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove LongPressDetector entirely (happiness) Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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 "base/basictypes.h"
6 #include "base/logging.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "content/browser/renderer_host/input/touch_to_gesture_queue.h"
9 #include "content/common/input/synthetic_web_input_event_builders.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "third_party/WebKit/public/web/WebInputEvent.h"
12
13 using blink::WebGestureEvent;
14 using blink::WebInputEvent;
15 using blink::WebTouchEvent;
16 using blink::WebTouchPoint;
17
18 namespace content {
19 namespace {
20 const size_t kDefaultTouchTimeoutDelayMs = 10;
21 }
22
23 class TouchToGestureQueueTest : public testing::Test,
24 public TouchToGestureQueueClient {
25 public:
26 TouchToGestureQueueTest()
27 : sent_touch_count_(0),
28 sent_gesture_count_(0) {}
29
30 virtual ~TouchToGestureQueueTest() {}
31
32 // testing::Test
33 virtual void SetUp() OVERRIDE {
34 queue_.reset(new TouchToGestureQueue(this));
35 }
36
37 virtual void TearDown() OVERRIDE {
38 queue_.reset();
39 }
40
41 // TouchEventQueueClient
42 virtual void ForwardTouchEvent(const WebTouchEvent& event) OVERRIDE {
43 ++sent_touch_count_;
44 last_touch_event_ = event;
45 if (sync_ack_result_)
46 SendTouchEventACK(*sync_ack_result_.Pass());
47 }
48
49 virtual void ForwardGestureEvent(const WebGestureEvent& event) OVERRIDE {
50 ++sent_gesture_count_;
51 last_gesture_event_ = event;
52 }
53
54 protected:
55 typedef std::vector<WebGestureEvent> Gestures;
56
57 void SendTouchEventWithGestures() {
58 Gestures gestures;
59 gestures.swap(gestures_);
60 SendTouchEventWithGestures(touch_event_, gestures);
61 touch_event_.ResetPoints();
62 }
63
64 void SendTouchEventWithGestures(const WebTouchEvent& touch,
65 const Gestures& gestures) {
66 queue_->OnTouchEventHandlingBegin(touch);
67 for (size_t i = 0; i < gestures.size(); ++i)
68 queue_->OnGestureEvent(gestures[i]);
69 queue_->OnTouchEventHandlingEnd();
70 }
71
72 void SendGesture(const WebGestureEvent& gesture) {
73 queue_->OnGestureEvent(gesture);
74 }
75
76 void SendTouchEventACK(InputEventAckState ack_result) {
77 queue_->OnTouchEventAck(ack_result);
78 }
79
80 void SetSyncAckResult(InputEventAckState sync_ack_result) {
81 sync_ack_result_.reset(new InputEventAckState(sync_ack_result));
82 }
83
84 void PushGesture(const WebGestureEvent& gesture) {
85 gestures_.push_back(gesture);
86 }
87
88 void PushGesture(WebInputEvent::Type type) {
89 DCHECK(WebInputEvent::isGestureEventType(type));
90 PushGesture(CreateGesture(type));
91 }
92
93 void PressTouchPoint(int x, int y) {
94 touch_event_.PressPoint(x, y);
95 SendTouchEventWithGestures();
96 }
97
98 void MoveTouchPoint(int index, int x, int y) {
99 touch_event_.MovePoint(index, x, y);
100 SendTouchEventWithGestures();
101 }
102
103 void MoveTouchPoints(int index0, int x0, int y0, int index1, int x1, int y1) {
104 touch_event_.MovePoint(index0, x0, y0);
105 touch_event_.MovePoint(index1, x1, y1);
106 SendTouchEventWithGestures();
107 }
108
109 void ReleaseTouchPoint(int index) {
110 touch_event_.ReleasePoint(index);
111 SendTouchEventWithGestures();
112 }
113
114 void CancelTouchPoint(int index) {
115 touch_event_.CancelPoint(index);
116 SendTouchEventWithGestures();
117 }
118
119 size_t GetAndResetSentTouchCount() {
120 size_t count = sent_touch_count_;
121 sent_touch_count_ = 0;
122 return count;
123 }
124
125 size_t GetAndResetSentGestureCount() {
126 size_t count = sent_gesture_count_;
127 sent_gesture_count_ = 0;
128 return count;
129 }
130
131 const WebTouchEvent& sent_touch() const {
132 return last_touch_event_;
133 }
134
135 const WebGestureEvent& sent_gesture() const {
136 return last_gesture_event_;
137 }
138
139 static WebGestureEvent CreateGesture(WebInputEvent::Type type) {
140 return SyntheticWebGestureEventBuilder::Build(
141 type, WebGestureEvent::Touchscreen);
142 }
143
144 private:
145
146 scoped_ptr<TouchToGestureQueue> queue_;
147 SyntheticWebTouchEvent touch_event_;
148 Gestures gestures_;
149 size_t sent_touch_count_;
150 size_t sent_gesture_count_;
151 WebTouchEvent last_touch_event_;
152 WebGestureEvent last_gesture_event_;
153 scoped_ptr<InputEventAckState> sync_ack_result_;
154 };
155
156 TEST_F(TouchToGestureQueueTest, BasicNoGestures) {
157 PressTouchPoint(1, 1);
158 EXPECT_EQ(1U, GetAndResetSentTouchCount());
159 EXPECT_EQ(0U, GetAndResetSentGestureCount());
160 EXPECT_EQ(WebInputEvent::TouchStart, sent_touch().type);
161
162 // Touch events are always forwarded immediately.
163 MoveTouchPoint(0, 2, 2);
164 EXPECT_EQ(1U, GetAndResetSentTouchCount());
165 EXPECT_EQ(0U, GetAndResetSentGestureCount());
166 EXPECT_EQ(WebInputEvent::TouchMove, sent_touch().type);
167
168 // No gestures should be dispatched by the ack, as none were queued.
169 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
170 EXPECT_EQ(0U, GetAndResetSentTouchCount());
171 EXPECT_EQ(0U, GetAndResetSentGestureCount());
172
173 // Release the touch gesture.
174 ReleaseTouchPoint(0);
175 EXPECT_EQ(1U, GetAndResetSentTouchCount());
176 EXPECT_EQ(0U, GetAndResetSentGestureCount());
177 EXPECT_EQ(WebInputEvent::TouchEnd, sent_touch().type);
178 }
179
180 TEST_F(TouchToGestureQueueTest, BasicGestures) {
181 // An unconsumed touch's gesture should be sent.
182 PushGesture(WebInputEvent::GestureScrollBegin);
183 PressTouchPoint(1, 1);
184 EXPECT_EQ(1U, GetAndResetSentTouchCount());
185 EXPECT_EQ(0U, GetAndResetSentGestureCount());
186 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
187 EXPECT_EQ(1U, GetAndResetSentGestureCount());
188 EXPECT_EQ(WebInputEvent::GestureScrollBegin, sent_gesture().type);
189
190 // Multiple gestures can be queued for a single event.
191 PushGesture(WebInputEvent::GestureFlingStart);
192 PushGesture(WebInputEvent::GestureFlingCancel);
193 MoveTouchPoint(0, 1, 1);
194 EXPECT_EQ(1U, GetAndResetSentTouchCount());
195 EXPECT_EQ(0U, GetAndResetSentGestureCount());
196 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
197 EXPECT_EQ(2U, GetAndResetSentGestureCount());
198 EXPECT_EQ(WebInputEvent::GestureFlingCancel, sent_gesture().type);
199
200 // A consumed touch's gesture should not be sent.
201 PushGesture(WebInputEvent::GestureFlingStart);
202 PushGesture(WebInputEvent::GestureFlingCancel);
203 ReleaseTouchPoint(0);
204 EXPECT_EQ(1U, GetAndResetSentTouchCount());
205 EXPECT_EQ(0U, GetAndResetSentGestureCount());
206 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
207 EXPECT_EQ(0U, GetAndResetSentGestureCount());
208 }
209
210 TEST_F(TouchToGestureQueueTest, ConsumedThenNotConsumed) {
211 // A consumed touch's gesture should not be sent.
212 PushGesture(WebInputEvent::GestureScrollBegin);
213 PressTouchPoint(1, 1);
214 EXPECT_EQ(1U, GetAndResetSentTouchCount());
215 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
216 EXPECT_EQ(0U, GetAndResetSentGestureCount());
217
218 // Event if the subsequent touch is not consumed, continue dropping gestures.
219 PushGesture(WebInputEvent::GestureScrollUpdate);
220 MoveTouchPoint(0, 2, 2);
221 EXPECT_EQ(1U, GetAndResetSentTouchCount());
222 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
223 EXPECT_EQ(0U, GetAndResetSentGestureCount());
224
225 // Event if the subsequent touch had no consumer, continue dropping gestures.
226 PushGesture(WebInputEvent::GestureFlingStart);
227 ReleaseTouchPoint(0);
228 EXPECT_EQ(1U, GetAndResetSentTouchCount());
229 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
230 EXPECT_EQ(0U, GetAndResetSentGestureCount());
231 }
232
233 TEST_F(TouchToGestureQueueTest, NotConsumedThenNoConsumer) {
234 // An unconsumed touch's gesture should not be sent.
tdresser 2014/01/14 16:25:30 I think these comments are incorrect?
jdduke (slow) 2014/01/14 23:24:03 Done.
235 PushGesture(WebInputEvent::GestureScrollBegin);
236 PressTouchPoint(1, 1);
237 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
238 EXPECT_EQ(1U, GetAndResetSentTouchCount());
239 EXPECT_EQ(1U, GetAndResetSentGestureCount());
240
241 // If the subsequent touch has no consumer, send the gesture.
242 PushGesture(WebInputEvent::GestureScrollEnd);
243 MoveTouchPoint(0, 2, 2);
244 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
245 EXPECT_EQ(1U, GetAndResetSentTouchCount());
246 EXPECT_EQ(1U, GetAndResetSentGestureCount());
247
248 // Even if the subsequent touch was consumed, continue sending gestures.
249 PushGesture(WebInputEvent::GestureFlingStart);
250 PushGesture(WebInputEvent::GestureFlingCancel);
251 MoveTouchPoint(0, 2, 2);
252 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
253 EXPECT_EQ(1U, GetAndResetSentTouchCount());
254 EXPECT_EQ(2U, GetAndResetSentGestureCount());
255 }
256
257 TEST_F(TouchToGestureQueueTest, MultipleTouchSequences) {
258 // Queue two touch-to-gestures sequences.
259 PushGesture(WebInputEvent::GestureFlingStart);
260 PressTouchPoint(1, 1);
261 PushGesture(WebInputEvent::GestureFlingCancel);
262 ReleaseTouchPoint(0);
263 PushGesture(WebInputEvent::GestureFlingStart);
264 PressTouchPoint(1, 1);
265 PushGesture(WebInputEvent::GestureFlingCancel);
266 ReleaseTouchPoint(0);
267 EXPECT_EQ(4U, GetAndResetSentTouchCount());
268
269 // The first gesture sequence should not be allowed.
270 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
271 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
272 EXPECT_EQ(0U, GetAndResetSentGestureCount());
273
274 // The subsequent sequence should "reset" allowance.
275 // The first gesture sequence should not be allowed.
276 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
277 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
278 EXPECT_EQ(2U, GetAndResetSentGestureCount());
279 }
280
281 TEST_F(TouchToGestureQueueTest, TimeoutGestures) {}
282
283 TEST_F(TouchToGestureQueueTest, GestureFlingCancel) {}
284
285 TEST_F(TouchToGestureQueueTest, GestureTapCancel) {}
286
287 TEST_F(TouchToGestureQueueTest, SyntheticGestures) {
288 // Non-timeout gestures without an associated touch event should be
289 // forwarded immediately.
290 SendGesture(CreateGesture(WebInputEvent::GesturePinchBegin));
291 SendGesture(CreateGesture(WebInputEvent::GesturePinchUpdate));
292 SendGesture(CreateGesture(WebInputEvent::GesturePinchEnd));
293 EXPECT_EQ(3U, GetAndResetSentGestureCount());
294 EXPECT_EQ(WebInputEvent::GesturePinchEnd, sent_gesture().type);
295
296 PushGesture(WebInputEvent::GestureFlingStart);
297 PressTouchPoint(1, 1);
298
299 // Even if there's a queued gesture, synthetic events should be forwarded
300 // immediately.
301 SendGesture(CreateGesture(WebInputEvent::GesturePinchBegin));
302 SendGesture(CreateGesture(WebInputEvent::GesturePinchUpdate));
303 SendGesture(CreateGesture(WebInputEvent::GesturePinchEnd));
304 EXPECT_EQ(3U, GetAndResetSentGestureCount());
305 EXPECT_EQ(WebInputEvent::GesturePinchEnd, sent_gesture().type);
306
307 // The queued gesture should be dispatched as usual.
308 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
309 EXPECT_EQ(1U, GetAndResetSentGestureCount());
310 EXPECT_EQ(WebInputEvent::GestureFlingStart, sent_gesture().type);
311 }
312
313 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698