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.
5 #include "base/basictypes.h"
6 #include "base/memory/scoped_ptr.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "ui/events/gesture_detection/mock_motion_event.h"
9 #include "ui/events/gesture_detection/touch_disposition_gesture_filter.h"
13 class TouchDispositionGestureFilterTest
14 : public testing::Test,
15 public TouchDispositionGestureFilterClient {
17 TouchDispositionGestureFilterTest()
18 : cancel_after_next_gesture_(false), sent_gesture_count_(0) {}
19 virtual ~TouchDispositionGestureFilterTest() {}
22 virtual void SetUp() OVERRIDE {
23 queue_.reset(new TouchDispositionGestureFilter(this));
26 virtual void TearDown() OVERRIDE {
30 // TouchDispositionGestureFilterClient
31 virtual void ForwardGestureEvent(const GestureEventData& event) OVERRIDE {
32 ++sent_gesture_count_;
33 last_sent_gesture_time_ = event.time;
34 sent_gestures_.push_back(event.type);
35 if (cancel_after_next_gesture_) {
37 SendTouchNotConsumedAck();
38 cancel_after_next_gesture_ = false;
43 typedef std::vector<EventType> GestureList;
45 ::testing::AssertionResult GesturesMatch(const GestureList& expected,
46 const GestureList& actual) {
47 if (expected.size() != actual.size()) {
48 return ::testing::AssertionFailure()
49 << "actual.size(" << actual.size()
50 << ") != expected.size(" << expected.size() << ")";
53 for (size_t i = 0; i < expected.size(); ++i) {
54 if (expected[i] != actual[i]) {
55 return ::testing::AssertionFailure()
56 << "actual[" << i << "] ("
58 << ") != expected[" << i << "] ("
59 << expected[i] << ")";
63 return ::testing::AssertionSuccess();
66 GestureList Gestures(EventType type) {
67 return GestureList(1, type);
70 GestureList Gestures(EventType type0, EventType type1) {
71 GestureList gestures(2);
77 GestureList Gestures(EventType type0,
80 GestureList gestures(3);
87 GestureList Gestures(EventType type0,
91 GestureList gestures(4);
99 void SendTouchGestures() {
100 touch_event_.SetTime(base::TimeTicks::Now());
101 EXPECT_EQ(TouchDispositionGestureFilter::SUCCESS,
102 SendTouchGestures(touch_event_, pending_gesture_packet_));
103 GestureEventDataPacket gesture_packet;
104 std::swap(gesture_packet, pending_gesture_packet_);
107 TouchDispositionGestureFilter::PacketResult
108 SendTouchGestures(const MotionEvent& touch,
109 const GestureEventDataPacket& packet) {
110 GestureEventDataPacket touch_packet =
111 GestureEventDataPacket::FromTouch(touch);
112 for (size_t i = 0; i < packet.gesture_count(); ++i)
113 touch_packet.Push(packet.gesture(i));
114 return queue_->OnGesturePacket(touch_packet);
117 TouchDispositionGestureFilter::PacketResult
118 SendTimeoutGesture(EventType type) {
119 return queue_->OnGesturePacket(
120 GestureEventDataPacket::FromTouchTimeout(CreateGesture(type)));
123 TouchDispositionGestureFilter::PacketResult
124 SendGesturePacket(const GestureEventDataPacket& packet) {
125 return queue_->OnGesturePacket(packet);
128 void SendTouchEventAck(bool event_consumed) {
129 queue_->OnTouchEventAck(event_consumed);
132 void SendTouchConsumedAck() { SendTouchEventAck(true); }
134 void SendTouchNotConsumedAck() { SendTouchEventAck(false); }
136 void PushGesture(EventType type) {
137 pending_gesture_packet_.Push(CreateGesture(type));
140 void PressTouchPoint(int x, int y) {
141 touch_event_.PressPoint(x, y);
145 void MoveTouchPoint(size_t index, int x, int y) {
146 touch_event_.MovePoint(index, x, y);
150 void ReleaseTouchPoint() {
151 touch_event_.ReleasePoint();
155 void CancelTouchPoint() {
156 touch_event_.CancelPoint();
160 void ResetTouchPoints() { touch_event_ = MockMotionEvent(); }
162 bool GesturesSent() const { return !sent_gestures_.empty(); }
164 base::TimeTicks LastSentGestureTime() const {
165 return last_sent_gesture_time_;
168 base::TimeTicks CurrentTouchTime() const {
169 return touch_event_.GetEventTime();
172 bool IsEmpty() const { return queue_->IsEmpty(); }
174 GestureList GetAndResetSentGestures() {
175 GestureList sent_gestures;
176 sent_gestures.swap(sent_gestures_);
177 return sent_gestures;
180 void SetCancelAfterNextGesture(bool cancel_after_next_gesture) {
181 cancel_after_next_gesture_ = cancel_after_next_gesture;
184 static GestureEventData CreateGesture(EventType type) {
185 return GestureEventData(
186 type, 0, base::TimeTicks(), 0, 0, 1, gfx::RectF(0, 0, 0, 0));
190 scoped_ptr<TouchDispositionGestureFilter> queue_;
191 bool cancel_after_next_gesture_;
192 MockMotionEvent touch_event_;
193 GestureEventDataPacket pending_gesture_packet_;
194 size_t sent_gesture_count_;
195 base::TimeTicks last_sent_gesture_time_;
196 GestureList sent_gestures_;
199 TEST_F(TouchDispositionGestureFilterTest, BasicNoGestures) {
200 PressTouchPoint(1, 1);
201 EXPECT_FALSE(GesturesSent());
203 MoveTouchPoint(0, 2, 2);
204 EXPECT_FALSE(GesturesSent());
206 // No gestures should be dispatched by the ack, as the queued packets
207 // contained no gestures.
208 SendTouchConsumedAck();
209 EXPECT_FALSE(GesturesSent());
211 // Release the touch gesture.
213 SendTouchConsumedAck();
214 SendTouchConsumedAck();
215 EXPECT_FALSE(GesturesSent());
218 TEST_F(TouchDispositionGestureFilterTest, BasicGestures) {
219 // An unconsumed touch's gesture should be sent.
220 PushGesture(ET_GESTURE_BEGIN);
221 PushGesture(ET_GESTURE_SCROLL_BEGIN);
222 PressTouchPoint(1, 1);
223 EXPECT_FALSE(GesturesSent());
224 SendTouchNotConsumedAck();
225 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_BEGIN, ET_GESTURE_SCROLL_BEGIN),
226 GetAndResetSentGestures()));
228 // Multiple gestures can be queued for a single event.
229 PushGesture(ET_SCROLL_FLING_START);
230 PushGesture(ET_SCROLL_FLING_CANCEL);
231 PushGesture(ET_GESTURE_END);
233 EXPECT_FALSE(GesturesSent());
234 SendTouchNotConsumedAck();
235 EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START,
236 ET_SCROLL_FLING_CANCEL,
238 GetAndResetSentGestures()));
241 TEST_F(TouchDispositionGestureFilterTest, BasicGesturesConsumed) {
242 // A consumed touch's gesture should not be sent.
243 PushGesture(ET_GESTURE_BEGIN);
244 PushGesture(ET_GESTURE_SCROLL_BEGIN);
245 PressTouchPoint(1, 1);
246 SendTouchConsumedAck();
247 EXPECT_FALSE(GesturesSent());
249 PushGesture(ET_GESTURE_SCROLL_UPDATE);
250 MoveTouchPoint(0, 2, 2);
251 SendTouchConsumedAck();
252 EXPECT_FALSE(GesturesSent());
254 PushGesture(ET_SCROLL_FLING_START);
255 PushGesture(ET_SCROLL_FLING_CANCEL);
256 PushGesture(ET_GESTURE_END);
258 SendTouchConsumedAck();
259 EXPECT_FALSE(GesturesSent());
262 TEST_F(TouchDispositionGestureFilterTest, ConsumedThenNotConsumed) {
263 // A consumed touch's gesture should not be sent.
264 PushGesture(ET_GESTURE_SCROLL_BEGIN);
265 PressTouchPoint(1, 1);
266 SendTouchConsumedAck();
267 EXPECT_FALSE(GesturesSent());
269 // Even if the subsequent touch is not consumed, continue dropping gestures.
270 PushGesture(ET_GESTURE_SCROLL_UPDATE);
271 MoveTouchPoint(0, 2, 2);
272 SendTouchNotConsumedAck();
273 EXPECT_FALSE(GesturesSent());
275 // Even if the subsequent touch had no consumer, continue dropping gestures.
276 PushGesture(ET_SCROLL_FLING_START);
278 SendTouchNotConsumedAck();
279 EXPECT_FALSE(GesturesSent());
282 TEST_F(TouchDispositionGestureFilterTest, NotConsumedThenConsumed) {
283 // A not consumed touch's gesture should be sent.
284 PushGesture(ET_GESTURE_SCROLL_BEGIN);
285 PressTouchPoint(1, 1);
286 SendTouchNotConsumedAck();
287 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
288 GetAndResetSentGestures()));
290 // A newly consumed gesture should not be sent.
291 PushGesture(ET_GESTURE_PINCH_BEGIN);
292 PressTouchPoint(10, 10);
293 SendTouchConsumedAck();
294 EXPECT_FALSE(GesturesSent());
296 // And subsequent non-consumed pinch updates should not be sent.
297 PushGesture(ET_GESTURE_SCROLL_UPDATE);
298 PushGesture(ET_GESTURE_PINCH_UPDATE);
299 MoveTouchPoint(0, 2, 2);
300 SendTouchNotConsumedAck();
301 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE),
302 GetAndResetSentGestures()));
304 // End events dispatched only when their start events were.
305 PushGesture(ET_GESTURE_PINCH_END);
307 SendTouchNotConsumedAck();
308 EXPECT_FALSE(GesturesSent());
310 PushGesture(ET_GESTURE_SCROLL_END);
312 SendTouchConsumedAck();
313 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
314 GetAndResetSentGestures()));
317 TEST_F(TouchDispositionGestureFilterTest, ScrollAlternatelyConsumed) {
318 // A consumed touch's gesture should not be sent.
319 PushGesture(ET_GESTURE_SCROLL_BEGIN);
320 PressTouchPoint(1, 1);
321 SendTouchNotConsumedAck();
322 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
323 GetAndResetSentGestures()));
325 for (size_t i = 0; i < 3; ++i) {
326 PushGesture(ET_GESTURE_SCROLL_UPDATE);
327 MoveTouchPoint(0, 2, 2);
328 SendTouchConsumedAck();
329 EXPECT_FALSE(GesturesSent());
331 PushGesture(ET_GESTURE_SCROLL_UPDATE);
332 MoveTouchPoint(0, 3, 3);
333 SendTouchNotConsumedAck();
334 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE),
335 GetAndResetSentGestures()));
338 PushGesture(ET_GESTURE_SCROLL_END);
340 SendTouchConsumedAck();
341 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
342 GetAndResetSentGestures()));
345 TEST_F(TouchDispositionGestureFilterTest, NotConsumedThenNoConsumer) {
346 // An unconsumed touch's gesture should be sent.
347 PushGesture(ET_GESTURE_SCROLL_BEGIN);
348 PressTouchPoint(1, 1);
349 SendTouchNotConsumedAck();
350 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
351 GetAndResetSentGestures()));
353 // If the subsequent touch has no consumer (e.g., a secondary pointer is
354 // pressed but not on a touch handling rect), send the gesture.
355 PushGesture(ET_GESTURE_PINCH_BEGIN);
356 PressTouchPoint(2, 2);
357 SendTouchNotConsumedAck();
358 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
359 GetAndResetSentGestures()));
361 // End events should be dispatched when their start events were, independent
363 PushGesture(ET_GESTURE_PINCH_END);
365 SendTouchConsumedAck();
366 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END),
367 GetAndResetSentGestures()));
369 PushGesture(ET_GESTURE_SCROLL_END);
371 SendTouchConsumedAck();
372 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
373 GetAndResetSentGestures()));
376 TEST_F(TouchDispositionGestureFilterTest, EndingEventsSent) {
377 PushGesture(ET_GESTURE_SCROLL_BEGIN);
378 PressTouchPoint(1, 1);
379 SendTouchNotConsumedAck();
380 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
381 GetAndResetSentGestures()));
383 PushGesture(ET_GESTURE_PINCH_BEGIN);
384 PressTouchPoint(2, 2);
385 SendTouchNotConsumedAck();
386 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
387 GetAndResetSentGestures()));
389 // Consuming the touchend event can't suppress the match end gesture.
390 PushGesture(ET_GESTURE_PINCH_END);
392 SendTouchConsumedAck();
393 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END),
394 GetAndResetSentGestures()));
396 // But other events in the same packet are still suppressed.
397 PushGesture(ET_GESTURE_SCROLL_UPDATE);
398 PushGesture(ET_GESTURE_SCROLL_END);
400 SendTouchConsumedAck();
401 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
402 GetAndResetSentGestures()));
404 // ET_GESTURE_SCROLL_END and ET_SCROLL_FLING_START behave the same in this
406 PushGesture(ET_GESTURE_SCROLL_BEGIN);
407 PressTouchPoint(1, 1);
408 SendTouchNotConsumedAck();
409 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
410 GetAndResetSentGestures()));
412 PushGesture(ET_SCROLL_FLING_START);
414 SendTouchConsumedAck();
415 EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START),
416 GetAndResetSentGestures()));
419 TEST_F(TouchDispositionGestureFilterTest, EndingEventsNotSent) {
420 // Consuming a begin event ensures no end events are sent.
421 PushGesture(ET_GESTURE_SCROLL_BEGIN);
422 PressTouchPoint(1, 1);
423 SendTouchConsumedAck();
424 EXPECT_FALSE(GesturesSent());
426 PushGesture(ET_GESTURE_PINCH_BEGIN);
427 PressTouchPoint(2, 2);
428 SendTouchNotConsumedAck();
429 EXPECT_FALSE(GesturesSent());
431 PushGesture(ET_GESTURE_PINCH_END);
433 SendTouchNotConsumedAck();
434 EXPECT_FALSE(GesturesSent());
436 PushGesture(ET_GESTURE_SCROLL_END);
438 SendTouchNotConsumedAck();
439 EXPECT_FALSE(GesturesSent());
442 TEST_F(TouchDispositionGestureFilterTest, UpdateEventsSuppressedPerEvent) {
443 PushGesture(ET_GESTURE_SCROLL_BEGIN);
444 PressTouchPoint(1, 1);
445 SendTouchNotConsumedAck();
446 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
447 GetAndResetSentGestures()));
449 // Consuming a single scroll or pinch update should suppress only that event.
450 PushGesture(ET_GESTURE_SCROLL_UPDATE);
451 MoveTouchPoint(0, 2, 2);
452 SendTouchConsumedAck();
453 EXPECT_FALSE(GesturesSent());
455 PushGesture(ET_GESTURE_PINCH_BEGIN);
456 PressTouchPoint(2, 2);
457 SendTouchNotConsumedAck();
458 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
459 GetAndResetSentGestures()));
461 PushGesture(ET_GESTURE_PINCH_UPDATE);
462 MoveTouchPoint(1, 2, 3);
463 SendTouchConsumedAck();
464 EXPECT_FALSE(GesturesSent());
466 // Subsequent updates should not be affected.
467 PushGesture(ET_GESTURE_SCROLL_UPDATE);
468 MoveTouchPoint(0, 4, 4);
469 SendTouchNotConsumedAck();
470 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE),
471 GetAndResetSentGestures()));
473 PushGesture(ET_GESTURE_PINCH_UPDATE);
474 MoveTouchPoint(0, 4, 5);
475 SendTouchNotConsumedAck();
476 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_UPDATE),
477 GetAndResetSentGestures()));
479 PushGesture(ET_GESTURE_PINCH_END);
481 SendTouchConsumedAck();
482 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END),
483 GetAndResetSentGestures()));
485 PushGesture(ET_GESTURE_SCROLL_END);
487 SendTouchConsumedAck();
488 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
489 GetAndResetSentGestures()));
492 TEST_F(TouchDispositionGestureFilterTest, UpdateEventsDependOnBeginEvents) {
493 PushGesture(ET_GESTURE_SCROLL_BEGIN);
494 PressTouchPoint(1, 1);
495 SendTouchConsumedAck();
496 EXPECT_FALSE(GesturesSent());
498 // Scroll and pinch gestures depend on the scroll begin gesture being
500 PushGesture(ET_GESTURE_SCROLL_UPDATE);
501 MoveTouchPoint(0, 2, 2);
502 SendTouchNotConsumedAck();
503 EXPECT_FALSE(GesturesSent());
505 PushGesture(ET_GESTURE_PINCH_BEGIN);
506 PressTouchPoint(2, 2);
507 SendTouchNotConsumedAck();
508 EXPECT_FALSE(GesturesSent());
510 PushGesture(ET_GESTURE_PINCH_UPDATE);
511 MoveTouchPoint(1, 2, 3);
512 SendTouchConsumedAck();
513 EXPECT_FALSE(GesturesSent());
515 PushGesture(ET_GESTURE_PINCH_END);
517 SendTouchNotConsumedAck();
518 EXPECT_FALSE(GesturesSent());
520 PushGesture(ET_GESTURE_SCROLL_END);
522 SendTouchNotConsumedAck();
523 EXPECT_FALSE(GesturesSent());
526 TEST_F(TouchDispositionGestureFilterTest, MultipleTouchSequences) {
527 // Queue two touch-to-gestures sequences.
528 PushGesture(ET_GESTURE_TAP_DOWN);
529 PressTouchPoint(1, 1);
530 PushGesture(ET_GESTURE_TAP);
532 PushGesture(ET_GESTURE_SCROLL_BEGIN);
533 PressTouchPoint(1, 1);
534 PushGesture(ET_GESTURE_SCROLL_END);
537 // The first gesture sequence should not be allowed.
538 SendTouchConsumedAck();
539 SendTouchNotConsumedAck();
540 EXPECT_FALSE(GesturesSent());
542 // The subsequent sequence should "reset" allowance.
543 SendTouchNotConsumedAck();
544 SendTouchNotConsumedAck();
545 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
546 ET_GESTURE_SCROLL_END),
547 GetAndResetSentGestures()));
550 TEST_F(TouchDispositionGestureFilterTest, FlingCancelledOnNewTouchSequence) {
552 PushGesture(ET_GESTURE_TAP_DOWN);
553 PushGesture(ET_GESTURE_SCROLL_BEGIN);
554 PressTouchPoint(1, 1);
555 SendTouchNotConsumedAck();
556 EXPECT_TRUE(GesturesMatch(
558 ET_GESTURE_TAP_DOWN, ET_GESTURE_TAP_CANCEL, ET_GESTURE_SCROLL_BEGIN),
559 GetAndResetSentGestures()));
560 PushGesture(ET_SCROLL_FLING_START);
562 SendTouchNotConsumedAck();
563 EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START),
564 GetAndResetSentGestures()));
566 // A new touch sequence should cancel the outstanding fling.
567 PressTouchPoint(1, 1);
568 SendTouchNotConsumedAck();
569 EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_CANCEL),
570 GetAndResetSentGestures()));
571 EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
573 SendTouchNotConsumedAck();
574 EXPECT_FALSE(GesturesSent());
577 TEST_F(TouchDispositionGestureFilterTest, ScrollEndedOnTouchReleaseIfNoFling) {
578 // Simulate a scroll.
579 PushGesture(ET_GESTURE_TAP_DOWN);
580 PushGesture(ET_GESTURE_SCROLL_BEGIN);
581 PressTouchPoint(1, 1);
582 SendTouchNotConsumedAck();
583 EXPECT_TRUE(GesturesMatch(
585 ET_GESTURE_TAP_DOWN, ET_GESTURE_TAP_CANCEL, ET_GESTURE_SCROLL_BEGIN),
586 GetAndResetSentGestures()));
588 SendTouchNotConsumedAck();
589 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
590 GetAndResetSentGestures()));
591 EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
594 TEST_F(TouchDispositionGestureFilterTest, ScrollEndedOnNewTouchSequence) {
595 // Simulate a scroll.
596 PushGesture(ET_GESTURE_TAP_DOWN);
597 PushGesture(ET_GESTURE_SCROLL_BEGIN);
598 PressTouchPoint(1, 1);
599 SendTouchNotConsumedAck();
600 EXPECT_TRUE(GesturesMatch(
602 ET_GESTURE_TAP_DOWN, ET_GESTURE_TAP_CANCEL, ET_GESTURE_SCROLL_BEGIN),
603 GetAndResetSentGestures()));
605 // A new touch sequence should end the outstanding scroll.
607 PressTouchPoint(1, 1);
608 SendTouchConsumedAck();
609 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
610 GetAndResetSentGestures()));
611 EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
614 TEST_F(TouchDispositionGestureFilterTest, FlingCancelledOnScrollBegin) {
615 // Simulate a fling sequence.
616 PushGesture(ET_GESTURE_TAP_DOWN);
617 PushGesture(ET_GESTURE_SCROLL_BEGIN);
618 PushGesture(ET_SCROLL_FLING_START);
619 PressTouchPoint(1, 1);
620 SendTouchNotConsumedAck();
621 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN,
622 ET_GESTURE_TAP_CANCEL,
623 ET_GESTURE_SCROLL_BEGIN,
624 ET_SCROLL_FLING_START),
625 GetAndResetSentGestures()));
627 // The new fling should cancel the preceding one.
628 PushGesture(ET_GESTURE_SCROLL_BEGIN);
629 PushGesture(ET_SCROLL_FLING_START);
631 SendTouchNotConsumedAck();
632 EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_CANCEL,
633 ET_GESTURE_SCROLL_BEGIN,
634 ET_SCROLL_FLING_START),
635 GetAndResetSentGestures()));
638 TEST_F(TouchDispositionGestureFilterTest, FlingNotCancelledIfGFCEventReceived) {
639 // Simulate a fling that is started then cancelled.
640 PushGesture(ET_GESTURE_SCROLL_BEGIN);
641 PressTouchPoint(1, 1);
642 SendTouchNotConsumedAck();
643 PushGesture(ET_SCROLL_FLING_START);
644 MoveTouchPoint(0, 1, 1);
645 SendTouchNotConsumedAck();
646 PushGesture(ET_SCROLL_FLING_CANCEL);
648 SendTouchNotConsumedAck();
649 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
650 ET_SCROLL_FLING_START,
651 ET_SCROLL_FLING_CANCEL),
652 GetAndResetSentGestures()));
654 // A new touch sequence will not inject a ET_SCROLL_FLING_CANCEL, as the fling
655 // has already been cancelled.
656 PressTouchPoint(1, 1);
657 SendTouchNotConsumedAck();
659 SendTouchNotConsumedAck();
660 EXPECT_FALSE(GesturesSent());
663 TEST_F(TouchDispositionGestureFilterTest, TapCancelledWhenScrollBegins) {
664 PushGesture(ET_GESTURE_TAP_DOWN);
665 PressTouchPoint(1, 1);
666 SendTouchNotConsumedAck();
667 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
668 GetAndResetSentGestures()));
670 // If the subsequent touch turns into a scroll, the tap should be cancelled.
671 PushGesture(ET_GESTURE_SCROLL_BEGIN);
672 MoveTouchPoint(0, 2, 2);
673 SendTouchNotConsumedAck();
674 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL,
675 ET_GESTURE_SCROLL_BEGIN),
676 GetAndResetSentGestures()));
679 TEST_F(TouchDispositionGestureFilterTest, TapCancelledWhenTouchConsumed) {
680 PushGesture(ET_GESTURE_TAP_DOWN);
681 PressTouchPoint(1, 1);
682 SendTouchNotConsumedAck();
683 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
684 GetAndResetSentGestures()));
686 // If the subsequent touch is consumed, the tap should be cancelled.
687 PushGesture(ET_GESTURE_SCROLL_BEGIN);
688 MoveTouchPoint(0, 2, 2);
689 SendTouchConsumedAck();
690 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL),
691 GetAndResetSentGestures()));
694 TEST_F(TouchDispositionGestureFilterTest,
695 TapNotCancelledIfTapEndingEventReceived) {
696 PushGesture(ET_GESTURE_TAP_DOWN);
697 PressTouchPoint(1, 1);
698 PressTouchPoint(2, 2);
699 SendTouchNotConsumedAck();
700 SendTouchNotConsumedAck();
701 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
702 GetAndResetSentGestures()));
704 PushGesture(ET_GESTURE_TAP);
706 SendTouchNotConsumedAck();
707 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS,
709 GetAndResetSentGestures()));
711 // The tap should not be cancelled as it was terminated by a |ET_GESTURE_TAP|.
713 SendTouchConsumedAck();
714 EXPECT_FALSE(GesturesSent());
717 TEST_F(TouchDispositionGestureFilterTest, TimeoutGestures) {
718 // If the sequence is allowed, and there are no preceding gestures, the
719 // timeout gestures should be forwarded immediately.
720 PushGesture(ET_GESTURE_TAP_DOWN);
721 PressTouchPoint(1, 1);
722 SendTouchNotConsumedAck();
723 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
724 GetAndResetSentGestures()));
726 SendTimeoutGesture(ET_GESTURE_SHOW_PRESS);
727 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS),
728 GetAndResetSentGestures()));
730 SendTimeoutGesture(ET_GESTURE_LONG_PRESS);
731 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_LONG_PRESS),
732 GetAndResetSentGestures()));
734 PushGesture(ET_GESTURE_LONG_TAP);
736 SendTouchNotConsumedAck();
737 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL,
738 ET_GESTURE_LONG_TAP),
739 GetAndResetSentGestures()));
741 // If the sequence is disallowed, and there are no preceding gestures, the
742 // timeout gestures should be dropped immediately.
743 PushGesture(ET_GESTURE_TAP_DOWN);
744 PressTouchPoint(1, 1);
745 SendTouchConsumedAck();
746 EXPECT_FALSE(GesturesSent());
748 SendTimeoutGesture(ET_GESTURE_SHOW_PRESS);
749 EXPECT_FALSE(GesturesSent());
751 SendTouchNotConsumedAck();
753 // If the sequence has a pending ack, the timeout gestures should
754 // remain queued until the ack is received.
755 PushGesture(ET_GESTURE_TAP_DOWN);
756 PressTouchPoint(1, 1);
757 EXPECT_FALSE(GesturesSent());
759 SendTimeoutGesture(ET_GESTURE_LONG_PRESS);
760 EXPECT_FALSE(GesturesSent());
762 SendTouchNotConsumedAck();
763 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN,
764 ET_GESTURE_LONG_PRESS),
765 GetAndResetSentGestures()));
768 TEST_F(TouchDispositionGestureFilterTest, SpuriousAcksIgnored) {
769 // Acks received when the queue is empty will be safely ignored.
770 ASSERT_TRUE(IsEmpty());
771 SendTouchConsumedAck();
772 EXPECT_FALSE(GesturesSent());
774 PushGesture(ET_GESTURE_SCROLL_BEGIN);
775 PressTouchPoint(1, 1);
776 PushGesture(ET_GESTURE_SCROLL_UPDATE);
777 MoveTouchPoint(0, 3,3);
778 SendTouchNotConsumedAck();
779 SendTouchNotConsumedAck();
780 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
781 ET_GESTURE_SCROLL_UPDATE),
782 GetAndResetSentGestures()));
784 // Even if all packets have been dispatched, the filter may not be empty as
785 // there could be follow-up timeout events. Spurious acks in such cases
786 // should also be safely ignored.
787 ASSERT_FALSE(IsEmpty());
788 SendTouchConsumedAck();
789 EXPECT_FALSE(GesturesSent());
792 TEST_F(TouchDispositionGestureFilterTest, PacketWithInvalidTypeIgnored) {
793 GestureEventDataPacket packet;
794 EXPECT_EQ(TouchDispositionGestureFilter::INVALID_PACKET_TYPE,
795 SendGesturePacket(packet));
796 EXPECT_TRUE(IsEmpty());
799 TEST_F(TouchDispositionGestureFilterTest, PacketsWithInvalidOrderIgnored) {
800 EXPECT_EQ(TouchDispositionGestureFilter::INVALID_PACKET_ORDER,
801 SendTimeoutGesture(ET_GESTURE_SHOW_PRESS));
802 EXPECT_TRUE(IsEmpty());
805 TEST_F(TouchDispositionGestureFilterTest, ConsumedTouchCancel) {
806 // An unconsumed touch's gesture should be sent.
807 PushGesture(ET_GESTURE_TAP_DOWN);
808 PressTouchPoint(1, 1);
809 EXPECT_FALSE(GesturesSent());
810 SendTouchNotConsumedAck();
811 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
812 GetAndResetSentGestures()));
814 PushGesture(ET_GESTURE_TAP_CANCEL);
815 PushGesture(ET_GESTURE_SCROLL_END);
817 EXPECT_FALSE(GesturesSent());
818 SendTouchConsumedAck();
819 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL,
820 ET_GESTURE_SCROLL_END),
821 GetAndResetSentGestures()));
824 TEST_F(TouchDispositionGestureFilterTest, TimeoutEventAfterRelease) {
825 PressTouchPoint(1, 1);
826 SendTouchNotConsumedAck();
827 EXPECT_FALSE(GesturesSent());
828 PushGesture(ET_GESTURE_TAP_DOWN);
829 PushGesture(ET_GESTURE_TAP_UNCONFIRMED);
831 SendTouchNotConsumedAck();
833 GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN, ET_GESTURE_TAP_UNCONFIRMED),
834 GetAndResetSentGestures()));
836 SendTimeoutGesture(ET_GESTURE_TAP);
837 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS, ET_GESTURE_TAP),
838 GetAndResetSentGestures()));
841 TEST_F(TouchDispositionGestureFilterTest, ShowPressInsertedBeforeTap) {
842 PushGesture(ET_GESTURE_TAP_DOWN);
843 PressTouchPoint(1, 1);
844 SendTouchNotConsumedAck();
845 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
846 GetAndResetSentGestures()));
848 SendTimeoutGesture(ET_GESTURE_TAP_UNCONFIRMED);
849 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_UNCONFIRMED),
850 GetAndResetSentGestures()));
852 PushGesture(ET_GESTURE_TAP);
854 SendTouchNotConsumedAck();
855 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS,
857 GetAndResetSentGestures()));
860 TEST_F(TouchDispositionGestureFilterTest, ShowPressNotInsertedIfAlreadySent) {
861 PushGesture(ET_GESTURE_TAP_DOWN);
862 PressTouchPoint(1, 1);
863 SendTouchNotConsumedAck();
864 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
865 GetAndResetSentGestures()));
867 SendTimeoutGesture(ET_GESTURE_SHOW_PRESS);
868 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS),
869 GetAndResetSentGestures()));
871 PushGesture(ET_GESTURE_TAP);
873 SendTouchNotConsumedAck();
874 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP),
875 GetAndResetSentGestures()));
878 TEST_F(TouchDispositionGestureFilterTest, TapAndScrollCancelledOnTouchCancel) {
879 PushGesture(ET_GESTURE_TAP_DOWN);
880 PressTouchPoint(1, 1);
881 SendTouchNotConsumedAck();
882 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
883 GetAndResetSentGestures()));
885 // A cancellation motion event should cancel the tap.
887 SendTouchNotConsumedAck();
888 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL),
889 GetAndResetSentGestures()));
890 EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
892 PushGesture(ET_GESTURE_SCROLL_BEGIN);
893 PressTouchPoint(1, 1);
894 SendTouchNotConsumedAck();
895 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
896 GetAndResetSentGestures()));
898 // A cancellation motion event should end the scroll, even if the touch was
901 SendTouchConsumedAck();
902 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
903 GetAndResetSentGestures()));
904 EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
907 TEST_F(TouchDispositionGestureFilterTest,
908 ConsumedScrollUpdateMakesFlingScrollEnd) {
909 // A consumed touch's gesture should not be sent.
910 PushGesture(ET_GESTURE_BEGIN);
911 PushGesture(ET_GESTURE_SCROLL_BEGIN);
912 PressTouchPoint(1, 1);
913 SendTouchNotConsumedAck();
916 GesturesMatch(Gestures(ET_GESTURE_BEGIN, ET_GESTURE_SCROLL_BEGIN),
917 GetAndResetSentGestures()));
919 PushGesture(ET_GESTURE_SCROLL_UPDATE);
920 MoveTouchPoint(0, 2, 2);
921 SendTouchConsumedAck();
922 EXPECT_FALSE(GesturesSent());
924 PushGesture(ET_SCROLL_FLING_START);
925 PushGesture(ET_SCROLL_FLING_CANCEL);
926 PushGesture(ET_GESTURE_END);
928 SendTouchNotConsumedAck();
929 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_END, ET_GESTURE_SCROLL_END),
930 GetAndResetSentGestures()));
932 PushGesture(ET_GESTURE_BEGIN);
933 PushGesture(ET_GESTURE_SCROLL_BEGIN);
934 PressTouchPoint(1, 1);
935 SendTouchNotConsumedAck();
936 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_BEGIN, ET_GESTURE_SCROLL_BEGIN),
937 GetAndResetSentGestures()));
940 TEST_F(TouchDispositionGestureFilterTest, TapCancelledOnTouchCancel) {
941 PushGesture(ET_GESTURE_TAP_DOWN);
942 PressTouchPoint(1, 1);
943 SendTouchNotConsumedAck();
944 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
945 GetAndResetSentGestures()));
947 // A cancellation motion event should cancel the tap.
949 SendTouchNotConsumedAck();
950 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL),
951 GetAndResetSentGestures()));
952 EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
955 // Test that a GestureEvent whose dispatch causes a cancel event to be fired
956 // won't cause a crash.
957 TEST_F(TouchDispositionGestureFilterTest, TestCancelMidGesture) {
958 SetCancelAfterNextGesture(true);
959 PushGesture(ET_GESTURE_TAP_DOWN);
960 PressTouchPoint(1, 1);
961 SendTouchNotConsumedAck();
962 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN,
963 ET_GESTURE_TAP_CANCEL),
964 GetAndResetSentGestures()));
967 // Test that a MultiFingerSwipe event is dispatched when appropriate.
968 TEST_F(TouchDispositionGestureFilterTest, TestAllowedMultiFingerSwipe) {
969 PushGesture(ET_GESTURE_SCROLL_BEGIN);
970 PressTouchPoint(1, 1);
971 SendTouchNotConsumedAck();
972 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
973 GetAndResetSentGestures()));
975 PushGesture(ET_GESTURE_PINCH_BEGIN);
976 PressTouchPoint(1, 1);
977 SendTouchNotConsumedAck();
978 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
979 GetAndResetSentGestures()));
981 PushGesture(ET_GESTURE_MULTIFINGER_SWIPE);
982 PressTouchPoint(1, 1);
983 SendTouchNotConsumedAck();
984 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_MULTIFINGER_SWIPE),
985 GetAndResetSentGestures()));
988 // Test that a MultiFingerSwipe event is dispatched when appropriate.
989 TEST_F(TouchDispositionGestureFilterTest, TestDisallowedMultiFingerSwipe) {
990 PressTouchPoint(1, 1);
991 SendTouchNotConsumedAck();
993 PushGesture(ET_GESTURE_SCROLL_BEGIN);
994 MoveTouchPoint(0, 0, 0);
995 SendTouchConsumedAck();
996 EXPECT_FALSE(GesturesSent());
998 PushGesture(ET_GESTURE_PINCH_BEGIN);
999 PressTouchPoint(1, 1);
1000 SendTouchNotConsumedAck();
1001 EXPECT_FALSE(GesturesSent());
1003 PushGesture(ET_GESTURE_MULTIFINGER_SWIPE);
1004 PressTouchPoint(1, 1);
1005 SendTouchNotConsumedAck();
1006 EXPECT_FALSE(GesturesSent());