touch_disposition_gesture_filter_unittest.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
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 "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"
10
11namespace ui {
12
13class TouchDispositionGestureFilterTest
14    : public testing::Test,
15      public TouchDispositionGestureFilterClient {
16 public:
17  TouchDispositionGestureFilterTest()
18      : cancel_after_next_gesture_(false), sent_gesture_count_(0) {}
19  virtual ~TouchDispositionGestureFilterTest() {}
20
21  // testing::Test
22  virtual void SetUp() OVERRIDE {
23    queue_.reset(new TouchDispositionGestureFilter(this));
24  }
25
26  virtual void TearDown() OVERRIDE {
27    queue_.reset();
28  }
29
30  // TouchDispositionGestureFilterClient
31  virtual void ForwardGestureEvent(const GestureEventData& event) OVERRIDE {
32    ++sent_gesture_count_;
33    sent_gestures_.push_back(event.type);
34    if (cancel_after_next_gesture_) {
35      CancelTouchPoint();
36      SendTouchNotConsumedAck();
37      cancel_after_next_gesture_ = false;
38    }
39  }
40
41 protected:
42  typedef std::vector<EventType> GestureList;
43
44  ::testing::AssertionResult GesturesMatch(const GestureList& expected,
45                                           const GestureList& actual) {
46    if (expected.size() != actual.size()) {
47      return ::testing::AssertionFailure()
48          << "actual.size(" << actual.size()
49          << ") != expected.size(" << expected.size() << ")";
50    }
51
52    for (size_t i = 0; i < expected.size(); ++i) {
53      if (expected[i] != actual[i]) {
54        return ::testing::AssertionFailure()
55            << "actual[" << i << "] ("
56            << actual[i]
57            << ") != expected[" << i << "] ("
58            << expected[i] << ")";
59      }
60    }
61
62    return ::testing::AssertionSuccess();
63  }
64
65  GestureList Gestures(EventType type) {
66    return GestureList(1, type);
67  }
68
69  GestureList Gestures(EventType type0, EventType type1) {
70    GestureList gestures(2);
71    gestures[0] = type0;
72    gestures[1] = type1;
73    return gestures;
74  }
75
76  GestureList Gestures(EventType type0,
77                       EventType type1,
78                       EventType type2) {
79    GestureList gestures(3);
80    gestures[0] = type0;
81    gestures[1] = type1;
82    gestures[2] = type2;
83    return gestures;
84  }
85
86  GestureList Gestures(EventType type0,
87                       EventType type1,
88                       EventType type2,
89                       EventType type3) {
90    GestureList gestures(4);
91    gestures[0] = type0;
92    gestures[1] = type1;
93    gestures[2] = type2;
94    gestures[3] = type3;
95    return gestures;
96  }
97
98  void SendTouchGestures() {
99    EXPECT_EQ(TouchDispositionGestureFilter::SUCCESS,
100              SendTouchGestures(touch_event_, pending_gesture_packet_));
101    GestureEventDataPacket gesture_packet;
102    std::swap(gesture_packet, pending_gesture_packet_);
103  }
104
105  TouchDispositionGestureFilter::PacketResult
106  SendTouchGestures(const MotionEvent& touch,
107                    const GestureEventDataPacket& packet) {
108    GestureEventDataPacket touch_packet =
109        GestureEventDataPacket::FromTouch(touch);
110    for (size_t i = 0; i < packet.gesture_count(); ++i)
111      touch_packet.Push(packet.gesture(i));
112    return queue_->OnGesturePacket(touch_packet);
113  }
114
115  TouchDispositionGestureFilter::PacketResult
116  SendTimeoutGesture(EventType type) {
117    return queue_->OnGesturePacket(
118        GestureEventDataPacket::FromTouchTimeout(CreateGesture(type)));
119  }
120
121  TouchDispositionGestureFilter::PacketResult
122  SendGesturePacket(const GestureEventDataPacket& packet) {
123    return queue_->OnGesturePacket(packet);
124  }
125
126  void SendTouchEventAck(bool event_consumed) {
127    queue_->OnTouchEventAck(event_consumed);
128  }
129
130  void SendTouchConsumedAck() {
131    SendTouchEventAck(true);
132  }
133
134  void SendTouchNotConsumedAck() {
135    SendTouchEventAck(false);
136  }
137
138  void PushGesture(EventType type) {
139    pending_gesture_packet_.Push(CreateGesture(type));
140  }
141
142  void PressTouchPoint(int x, int y) {
143    touch_event_.PressPoint(x, y);
144    SendTouchGestures();
145  }
146
147  void MoveTouchPoint(size_t index, int x, int y) {
148    touch_event_.MovePoint(index, x, y);
149    SendTouchGestures();
150  }
151
152  void ReleaseTouchPoint() {
153    touch_event_.ReleasePoint();
154    SendTouchGestures();
155  }
156
157  void CancelTouchPoint() {
158    touch_event_.CancelPoint();
159    SendTouchGestures();
160  }
161
162  bool GesturesSent() const {
163    return !sent_gestures_.empty();
164  }
165
166  bool IsEmpty() const {
167    return queue_->IsEmpty();
168  }
169
170  GestureList GetAndResetSentGestures() {
171    GestureList sent_gestures;
172    sent_gestures.swap(sent_gestures_);
173    return sent_gestures;
174  }
175
176  void SetCancelAfterNextGesture(bool cancel_after_next_gesture) {
177    cancel_after_next_gesture_ = cancel_after_next_gesture;
178  }
179
180  static GestureEventData CreateGesture(EventType type) {
181    return GestureEventData(
182        type, 0, base::TimeTicks(), 0, 0, 1, gfx::RectF(0, 0, 0, 0));
183  }
184
185 private:
186  scoped_ptr<TouchDispositionGestureFilter> queue_;
187  bool cancel_after_next_gesture_;
188  MockMotionEvent touch_event_;
189  GestureEventDataPacket pending_gesture_packet_;
190  size_t sent_gesture_count_;
191  GestureList sent_gestures_;
192};
193
194TEST_F(TouchDispositionGestureFilterTest, BasicNoGestures) {
195  PressTouchPoint(1, 1);
196  EXPECT_FALSE(GesturesSent());
197
198  MoveTouchPoint(0, 2, 2);
199  EXPECT_FALSE(GesturesSent());
200
201  // No gestures should be dispatched by the ack, as the queued packets
202  // contained no gestures.
203  SendTouchConsumedAck();
204  EXPECT_FALSE(GesturesSent());
205
206  // Release the touch gesture.
207  ReleaseTouchPoint();
208  SendTouchConsumedAck();
209  SendTouchConsumedAck();
210  EXPECT_FALSE(GesturesSent());
211}
212
213TEST_F(TouchDispositionGestureFilterTest, BasicGestures) {
214  // An unconsumed touch's gesture should be sent.
215  PushGesture(ET_GESTURE_BEGIN);
216  PushGesture(ET_GESTURE_SCROLL_BEGIN);
217  PressTouchPoint(1, 1);
218  EXPECT_FALSE(GesturesSent());
219  SendTouchNotConsumedAck();
220  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_BEGIN, ET_GESTURE_SCROLL_BEGIN),
221                            GetAndResetSentGestures()));
222
223  // Multiple gestures can be queued for a single event.
224  PushGesture(ET_SCROLL_FLING_START);
225  PushGesture(ET_SCROLL_FLING_CANCEL);
226  PushGesture(ET_GESTURE_END);
227  ReleaseTouchPoint();
228  EXPECT_FALSE(GesturesSent());
229  SendTouchNotConsumedAck();
230  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START,
231                                     ET_SCROLL_FLING_CANCEL,
232                                     ET_GESTURE_END),
233                            GetAndResetSentGestures()));
234}
235
236TEST_F(TouchDispositionGestureFilterTest, BasicGesturesConsumed) {
237  // A consumed touch's gesture should not be sent.
238  PushGesture(ET_GESTURE_BEGIN);
239  PushGesture(ET_GESTURE_SCROLL_BEGIN);
240  PressTouchPoint(1, 1);
241  SendTouchConsumedAck();
242  EXPECT_FALSE(GesturesSent());
243
244  PushGesture(ET_GESTURE_SCROLL_UPDATE);
245  MoveTouchPoint(0, 2, 2);
246  SendTouchConsumedAck();
247  EXPECT_FALSE(GesturesSent());
248
249  PushGesture(ET_SCROLL_FLING_START);
250  PushGesture(ET_SCROLL_FLING_CANCEL);
251  PushGesture(ET_GESTURE_END);
252  ReleaseTouchPoint();
253  SendTouchConsumedAck();
254  EXPECT_FALSE(GesturesSent());
255}
256
257TEST_F(TouchDispositionGestureFilterTest, ConsumedThenNotConsumed) {
258  // A consumed touch's gesture should not be sent.
259  PushGesture(ET_GESTURE_SCROLL_BEGIN);
260  PressTouchPoint(1, 1);
261  SendTouchConsumedAck();
262  EXPECT_FALSE(GesturesSent());
263
264  // Even if the subsequent touch is not consumed, continue dropping gestures.
265  PushGesture(ET_GESTURE_SCROLL_UPDATE);
266  MoveTouchPoint(0, 2, 2);
267  SendTouchNotConsumedAck();
268  EXPECT_FALSE(GesturesSent());
269
270  // Even if the subsequent touch had no consumer, continue dropping gestures.
271  PushGesture(ET_SCROLL_FLING_START);
272  ReleaseTouchPoint();
273  SendTouchNotConsumedAck();
274  EXPECT_FALSE(GesturesSent());
275}
276
277TEST_F(TouchDispositionGestureFilterTest, NotConsumedThenConsumed) {
278  // A not consumed touch's gesture should be sent.
279  PushGesture(ET_GESTURE_SCROLL_BEGIN);
280  PressTouchPoint(1, 1);
281  SendTouchNotConsumedAck();
282  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
283                            GetAndResetSentGestures()));
284
285  // A newly consumed gesture should not be sent.
286  PushGesture(ET_GESTURE_PINCH_BEGIN);
287  PressTouchPoint(10, 10);
288  SendTouchConsumedAck();
289  EXPECT_FALSE(GesturesSent());
290
291  // And subsequent non-consumed pinch updates should not be sent.
292  PushGesture(ET_GESTURE_SCROLL_UPDATE);
293  PushGesture(ET_GESTURE_PINCH_UPDATE);
294  MoveTouchPoint(0, 2, 2);
295  SendTouchNotConsumedAck();
296  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE),
297                            GetAndResetSentGestures()));
298
299  // End events dispatched only when their start events were.
300  PushGesture(ET_GESTURE_PINCH_END);
301  ReleaseTouchPoint();
302  SendTouchNotConsumedAck();
303  EXPECT_FALSE(GesturesSent());
304
305  PushGesture(ET_GESTURE_SCROLL_END);
306  ReleaseTouchPoint();
307  SendTouchConsumedAck();
308  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
309                            GetAndResetSentGestures()));
310}
311
312TEST_F(TouchDispositionGestureFilterTest, ScrollAlternatelyConsumed) {
313  // A consumed touch's gesture should not be sent.
314  PushGesture(ET_GESTURE_SCROLL_BEGIN);
315  PressTouchPoint(1, 1);
316  SendTouchNotConsumedAck();
317  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
318                            GetAndResetSentGestures()));
319
320  for (size_t i = 0; i < 3; ++i) {
321    PushGesture(ET_GESTURE_SCROLL_UPDATE);
322    MoveTouchPoint(0, 2, 2);
323    SendTouchConsumedAck();
324    EXPECT_FALSE(GesturesSent());
325
326    PushGesture(ET_GESTURE_SCROLL_UPDATE);
327    MoveTouchPoint(0, 3, 3);
328    SendTouchNotConsumedAck();
329    EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE),
330                              GetAndResetSentGestures()));
331  }
332
333  PushGesture(ET_GESTURE_SCROLL_END);
334  ReleaseTouchPoint();
335  SendTouchConsumedAck();
336  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
337                            GetAndResetSentGestures()));
338}
339
340TEST_F(TouchDispositionGestureFilterTest, NotConsumedThenNoConsumer) {
341  // An unconsumed touch's gesture should be sent.
342  PushGesture(ET_GESTURE_SCROLL_BEGIN);
343  PressTouchPoint(1, 1);
344  SendTouchNotConsumedAck();
345  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
346                            GetAndResetSentGestures()));
347
348  // If the subsequent touch has no consumer (e.g., a secondary pointer is
349  // pressed but not on a touch handling rect), send the gesture.
350  PushGesture(ET_GESTURE_PINCH_BEGIN);
351  PressTouchPoint(2, 2);
352  SendTouchNotConsumedAck();
353  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
354                            GetAndResetSentGestures()));
355
356  // End events should be dispatched when their start events were, independent
357  // of the ack state.
358  PushGesture(ET_GESTURE_PINCH_END);
359  ReleaseTouchPoint();
360  SendTouchConsumedAck();
361  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END),
362                            GetAndResetSentGestures()));
363
364  PushGesture(ET_GESTURE_SCROLL_END);
365  ReleaseTouchPoint();
366  SendTouchConsumedAck();
367  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
368                            GetAndResetSentGestures()));
369}
370
371TEST_F(TouchDispositionGestureFilterTest, EndingEventsSent) {
372  PushGesture(ET_GESTURE_SCROLL_BEGIN);
373  PressTouchPoint(1, 1);
374  SendTouchNotConsumedAck();
375  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
376                            GetAndResetSentGestures()));
377
378  PushGesture(ET_GESTURE_PINCH_BEGIN);
379  PressTouchPoint(2, 2);
380  SendTouchNotConsumedAck();
381  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
382                            GetAndResetSentGestures()));
383
384  // Consuming the touchend event can't suppress the match end gesture.
385  PushGesture(ET_GESTURE_PINCH_END);
386  ReleaseTouchPoint();
387  SendTouchConsumedAck();
388  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END),
389                            GetAndResetSentGestures()));
390
391  // But other events in the same packet are still suppressed.
392  PushGesture(ET_GESTURE_SCROLL_UPDATE);
393  PushGesture(ET_GESTURE_SCROLL_END);
394  ReleaseTouchPoint();
395  SendTouchConsumedAck();
396  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
397                            GetAndResetSentGestures()));
398
399  // ET_GESTURE_SCROLL_END and ET_SCROLL_FLING_START behave the same in this
400  // regard.
401  PushGesture(ET_GESTURE_SCROLL_BEGIN);
402  PressTouchPoint(1, 1);
403  SendTouchNotConsumedAck();
404  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
405                            GetAndResetSentGestures()));
406
407  PushGesture(ET_SCROLL_FLING_START);
408  ReleaseTouchPoint();
409  SendTouchConsumedAck();
410  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START),
411                            GetAndResetSentGestures()));
412}
413
414TEST_F(TouchDispositionGestureFilterTest, EndingEventsNotSent) {
415  // Consuming a begin event ensures no end events are sent.
416  PushGesture(ET_GESTURE_SCROLL_BEGIN);
417  PressTouchPoint(1, 1);
418  SendTouchConsumedAck();
419  EXPECT_FALSE(GesturesSent());
420
421  PushGesture(ET_GESTURE_PINCH_BEGIN);
422  PressTouchPoint(2, 2);
423  SendTouchNotConsumedAck();
424  EXPECT_FALSE(GesturesSent());
425
426  PushGesture(ET_GESTURE_PINCH_END);
427  ReleaseTouchPoint();
428  SendTouchNotConsumedAck();
429  EXPECT_FALSE(GesturesSent());
430
431  PushGesture(ET_GESTURE_SCROLL_END);
432  ReleaseTouchPoint();
433  SendTouchNotConsumedAck();
434  EXPECT_FALSE(GesturesSent());
435}
436
437TEST_F(TouchDispositionGestureFilterTest, UpdateEventsSuppressedPerEvent) {
438  PushGesture(ET_GESTURE_SCROLL_BEGIN);
439  PressTouchPoint(1, 1);
440  SendTouchNotConsumedAck();
441  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
442                            GetAndResetSentGestures()));
443
444  // Consuming a single scroll or pinch update should suppress only that event.
445  PushGesture(ET_GESTURE_SCROLL_UPDATE);
446  MoveTouchPoint(0, 2, 2);
447  SendTouchConsumedAck();
448  EXPECT_FALSE(GesturesSent());
449
450  PushGesture(ET_GESTURE_PINCH_BEGIN);
451  PressTouchPoint(2, 2);
452  SendTouchNotConsumedAck();
453  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
454                            GetAndResetSentGestures()));
455
456  PushGesture(ET_GESTURE_PINCH_UPDATE);
457  MoveTouchPoint(1, 2, 3);
458  SendTouchConsumedAck();
459  EXPECT_FALSE(GesturesSent());
460
461  // Subsequent updates should not be affected.
462  PushGesture(ET_GESTURE_SCROLL_UPDATE);
463  MoveTouchPoint(0, 4, 4);
464  SendTouchNotConsumedAck();
465  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE),
466                            GetAndResetSentGestures()));
467
468  PushGesture(ET_GESTURE_PINCH_UPDATE);
469  MoveTouchPoint(0, 4, 5);
470  SendTouchNotConsumedAck();
471  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_UPDATE),
472                            GetAndResetSentGestures()));
473
474  PushGesture(ET_GESTURE_PINCH_END);
475  ReleaseTouchPoint();
476  SendTouchConsumedAck();
477  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END),
478                            GetAndResetSentGestures()));
479
480  PushGesture(ET_GESTURE_SCROLL_END);
481  ReleaseTouchPoint();
482  SendTouchConsumedAck();
483  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
484                            GetAndResetSentGestures()));
485}
486
487TEST_F(TouchDispositionGestureFilterTest, UpdateEventsDependOnBeginEvents) {
488  PushGesture(ET_GESTURE_SCROLL_BEGIN);
489  PressTouchPoint(1, 1);
490  SendTouchConsumedAck();
491  EXPECT_FALSE(GesturesSent());
492
493  // Scroll and pinch gestures depend on the scroll begin gesture being
494  // dispatched.
495  PushGesture(ET_GESTURE_SCROLL_UPDATE);
496  MoveTouchPoint(0, 2, 2);
497  SendTouchNotConsumedAck();
498  EXPECT_FALSE(GesturesSent());
499
500  PushGesture(ET_GESTURE_PINCH_BEGIN);
501  PressTouchPoint(2, 2);
502  SendTouchNotConsumedAck();
503  EXPECT_FALSE(GesturesSent());
504
505  PushGesture(ET_GESTURE_PINCH_UPDATE);
506  MoveTouchPoint(1, 2, 3);
507  SendTouchConsumedAck();
508  EXPECT_FALSE(GesturesSent());
509
510  PushGesture(ET_GESTURE_PINCH_END);
511  ReleaseTouchPoint();
512  SendTouchNotConsumedAck();
513  EXPECT_FALSE(GesturesSent());
514
515  PushGesture(ET_GESTURE_SCROLL_END);
516  ReleaseTouchPoint();
517  SendTouchNotConsumedAck();
518  EXPECT_FALSE(GesturesSent());
519}
520
521TEST_F(TouchDispositionGestureFilterTest, MultipleTouchSequences) {
522  // Queue two touch-to-gestures sequences.
523  PushGesture(ET_GESTURE_TAP_DOWN);
524  PressTouchPoint(1, 1);
525  PushGesture(ET_GESTURE_TAP);
526  ReleaseTouchPoint();
527  PushGesture(ET_GESTURE_SCROLL_BEGIN);
528  PressTouchPoint(1, 1);
529  PushGesture(ET_GESTURE_SCROLL_END);
530  ReleaseTouchPoint();
531
532  // The first gesture sequence should not be allowed.
533  SendTouchConsumedAck();
534  SendTouchNotConsumedAck();
535  EXPECT_FALSE(GesturesSent());
536
537  // The subsequent sequence should "reset" allowance.
538  SendTouchNotConsumedAck();
539  SendTouchNotConsumedAck();
540  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
541                                     ET_GESTURE_SCROLL_END),
542                            GetAndResetSentGestures()));
543}
544
545TEST_F(TouchDispositionGestureFilterTest, FlingCancelledOnNewTouchSequence) {
546  // Simulate a fling.
547  PushGesture(ET_GESTURE_TAP_DOWN);
548  PushGesture(ET_GESTURE_SCROLL_BEGIN);
549  PressTouchPoint(1, 1);
550  SendTouchNotConsumedAck();
551  EXPECT_TRUE(GesturesMatch(
552      Gestures(
553          ET_GESTURE_TAP_DOWN, ET_GESTURE_TAP_CANCEL, ET_GESTURE_SCROLL_BEGIN),
554      GetAndResetSentGestures()));
555  PushGesture(ET_SCROLL_FLING_START);
556  ReleaseTouchPoint();
557  SendTouchNotConsumedAck();
558  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START),
559                            GetAndResetSentGestures()));
560
561  // A new touch seqeuence should cancel the outstanding fling.
562  PressTouchPoint(1, 1);
563  SendTouchNotConsumedAck();
564  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_CANCEL),
565                            GetAndResetSentGestures()));
566  ReleaseTouchPoint();
567  SendTouchNotConsumedAck();
568  EXPECT_FALSE(GesturesSent());
569}
570
571TEST_F(TouchDispositionGestureFilterTest, ScrollEndedOnNewTouchSequence) {
572  // Simulate a scroll.
573  PushGesture(ET_GESTURE_TAP_DOWN);
574  PushGesture(ET_GESTURE_SCROLL_BEGIN);
575  PressTouchPoint(1, 1);
576  SendTouchNotConsumedAck();
577  EXPECT_TRUE(GesturesMatch(
578      Gestures(
579          ET_GESTURE_TAP_DOWN, ET_GESTURE_TAP_CANCEL, ET_GESTURE_SCROLL_BEGIN),
580      GetAndResetSentGestures()));
581  ReleaseTouchPoint();
582  SendTouchNotConsumedAck();
583
584  // A new touch seqeuence should end the outstanding scroll.
585  PressTouchPoint(1, 1);
586  SendTouchConsumedAck();
587  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
588                            GetAndResetSentGestures()));
589}
590
591TEST_F(TouchDispositionGestureFilterTest, FlingCancelledOnScrollBegin) {
592  // Simulate a fling sequence.
593  PushGesture(ET_GESTURE_TAP_DOWN);
594  PushGesture(ET_GESTURE_SCROLL_BEGIN);
595  PushGesture(ET_SCROLL_FLING_START);
596  PressTouchPoint(1, 1);
597  SendTouchNotConsumedAck();
598  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN,
599                                     ET_GESTURE_TAP_CANCEL,
600                                     ET_GESTURE_SCROLL_BEGIN,
601                                     ET_SCROLL_FLING_START),
602                            GetAndResetSentGestures()));
603
604  // The new fling should cancel the preceding one.
605  PushGesture(ET_GESTURE_SCROLL_BEGIN);
606  PushGesture(ET_SCROLL_FLING_START);
607  ReleaseTouchPoint();
608  SendTouchNotConsumedAck();
609  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_CANCEL,
610                                     ET_GESTURE_SCROLL_BEGIN,
611                                     ET_SCROLL_FLING_START),
612                            GetAndResetSentGestures()));
613}
614
615TEST_F(TouchDispositionGestureFilterTest, FlingNotCancelledIfGFCEventReceived) {
616  // Simulate a fling that is started then cancelled.
617  PushGesture(ET_GESTURE_SCROLL_BEGIN);
618  PressTouchPoint(1, 1);
619  SendTouchNotConsumedAck();
620  PushGesture(ET_SCROLL_FLING_START);
621  MoveTouchPoint(0, 1, 1);
622  SendTouchNotConsumedAck();
623  PushGesture(ET_SCROLL_FLING_CANCEL);
624  ReleaseTouchPoint();
625  SendTouchNotConsumedAck();
626  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
627                                     ET_SCROLL_FLING_START,
628                                     ET_SCROLL_FLING_CANCEL),
629                            GetAndResetSentGestures()));
630
631  // A new touch sequence will not inject a ET_SCROLL_FLING_CANCEL, as the fling
632  // has already been cancelled.
633  PressTouchPoint(1, 1);
634  SendTouchNotConsumedAck();
635  ReleaseTouchPoint();
636  SendTouchNotConsumedAck();
637  EXPECT_FALSE(GesturesSent());
638}
639
640TEST_F(TouchDispositionGestureFilterTest, TapCancelledWhenScrollBegins) {
641  PushGesture(ET_GESTURE_TAP_DOWN);
642  PressTouchPoint(1, 1);
643  SendTouchNotConsumedAck();
644  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
645                            GetAndResetSentGestures()));
646
647  // If the subsequent touch turns into a scroll, the tap should be cancelled.
648  PushGesture(ET_GESTURE_SCROLL_BEGIN);
649  MoveTouchPoint(0, 2, 2);
650  SendTouchNotConsumedAck();
651  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL,
652                                     ET_GESTURE_SCROLL_BEGIN),
653                            GetAndResetSentGestures()));
654}
655
656TEST_F(TouchDispositionGestureFilterTest, TapCancelledWhenTouchConsumed) {
657  PushGesture(ET_GESTURE_TAP_DOWN);
658  PressTouchPoint(1, 1);
659  SendTouchNotConsumedAck();
660  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
661                            GetAndResetSentGestures()));
662
663  // If the subsequent touch is consumed, the tap should be cancelled.
664  PushGesture(ET_GESTURE_SCROLL_BEGIN);
665  MoveTouchPoint(0, 2, 2);
666  SendTouchConsumedAck();
667  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL),
668                            GetAndResetSentGestures()));
669}
670
671TEST_F(TouchDispositionGestureFilterTest,
672       TapNotCancelledIfTapEndingEventReceived) {
673  PushGesture(ET_GESTURE_TAP_DOWN);
674  PressTouchPoint(1, 1);
675  PressTouchPoint(2, 2);
676  SendTouchNotConsumedAck();
677  SendTouchNotConsumedAck();
678  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
679                            GetAndResetSentGestures()));
680
681  PushGesture(ET_GESTURE_TAP);
682  ReleaseTouchPoint();
683  SendTouchNotConsumedAck();
684  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS,
685                                     ET_GESTURE_TAP),
686                            GetAndResetSentGestures()));
687
688  // The tap should not be cancelled as it was terminated by a |ET_GESTURE_TAP|.
689  ReleaseTouchPoint();
690  SendTouchConsumedAck();
691  EXPECT_FALSE(GesturesSent());
692}
693
694TEST_F(TouchDispositionGestureFilterTest, TimeoutGestures) {
695  // If the sequence is allowed, and there are no preceding gestures, the
696  // timeout gestures should be forwarded immediately.
697  PushGesture(ET_GESTURE_TAP_DOWN);
698  PressTouchPoint(1, 1);
699  SendTouchNotConsumedAck();
700  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
701                            GetAndResetSentGestures()));
702
703  SendTimeoutGesture(ET_GESTURE_SHOW_PRESS);
704  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS),
705                            GetAndResetSentGestures()));
706
707  SendTimeoutGesture(ET_GESTURE_LONG_PRESS);
708  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_LONG_PRESS),
709                            GetAndResetSentGestures()));
710
711  PushGesture(ET_GESTURE_LONG_TAP);
712  ReleaseTouchPoint();
713  SendTouchNotConsumedAck();
714  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL,
715                                     ET_GESTURE_LONG_TAP),
716                            GetAndResetSentGestures()));
717
718  // If the sequence is disallowed, and there are no preceding gestures, the
719  // timeout gestures should be dropped immediately.
720  PushGesture(ET_GESTURE_TAP_DOWN);
721  PressTouchPoint(1, 1);
722  SendTouchConsumedAck();
723  EXPECT_FALSE(GesturesSent());
724
725  SendTimeoutGesture(ET_GESTURE_SHOW_PRESS);
726  EXPECT_FALSE(GesturesSent());
727  ReleaseTouchPoint();
728  SendTouchNotConsumedAck();
729
730  // If the sequence has a pending ack, the timeout gestures should
731  // remain queued until the ack is received.
732  PushGesture(ET_GESTURE_TAP_DOWN);
733  PressTouchPoint(1, 1);
734  EXPECT_FALSE(GesturesSent());
735
736  SendTimeoutGesture(ET_GESTURE_LONG_PRESS);
737  EXPECT_FALSE(GesturesSent());
738
739  SendTouchNotConsumedAck();
740  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN,
741                                     ET_GESTURE_LONG_PRESS),
742                            GetAndResetSentGestures()));
743}
744
745TEST_F(TouchDispositionGestureFilterTest, SpuriousAcksIgnored) {
746  // Acks received when the queue is empty will be safely ignored.
747  ASSERT_TRUE(IsEmpty());
748  SendTouchConsumedAck();
749  EXPECT_FALSE(GesturesSent());
750
751  PushGesture(ET_GESTURE_SCROLL_BEGIN);
752  PressTouchPoint(1, 1);
753  PushGesture(ET_GESTURE_SCROLL_UPDATE);
754  MoveTouchPoint(0, 3,3);
755  SendTouchNotConsumedAck();
756  SendTouchNotConsumedAck();
757  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
758                                     ET_GESTURE_SCROLL_UPDATE),
759                            GetAndResetSentGestures()));
760
761  // Even if all packets have been dispatched, the filter may not be empty as
762  // there could be follow-up timeout events.  Spurious acks in such cases
763  // should also be safely ignored.
764  ASSERT_FALSE(IsEmpty());
765  SendTouchConsumedAck();
766  EXPECT_FALSE(GesturesSent());
767}
768
769TEST_F(TouchDispositionGestureFilterTest, PacketWithInvalidTypeIgnored) {
770  GestureEventDataPacket packet;
771  EXPECT_EQ(TouchDispositionGestureFilter::INVALID_PACKET_TYPE,
772            SendGesturePacket(packet));
773  EXPECT_TRUE(IsEmpty());
774}
775
776TEST_F(TouchDispositionGestureFilterTest, PacketsWithInvalidOrderIgnored) {
777  EXPECT_EQ(TouchDispositionGestureFilter::INVALID_PACKET_ORDER,
778            SendTimeoutGesture(ET_GESTURE_SHOW_PRESS));
779  EXPECT_TRUE(IsEmpty());
780}
781
782TEST_F(TouchDispositionGestureFilterTest, ConsumedTouchCancel) {
783  // An unconsumed touch's gesture should be sent.
784  PushGesture(ET_GESTURE_TAP_DOWN);
785  PressTouchPoint(1, 1);
786  EXPECT_FALSE(GesturesSent());
787  SendTouchNotConsumedAck();
788  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
789                            GetAndResetSentGestures()));
790
791  PushGesture(ET_GESTURE_TAP_CANCEL);
792  PushGesture(ET_GESTURE_SCROLL_END);
793  CancelTouchPoint();
794  EXPECT_FALSE(GesturesSent());
795  SendTouchConsumedAck();
796  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL,
797                                     ET_GESTURE_SCROLL_END),
798                            GetAndResetSentGestures()));
799}
800
801TEST_F(TouchDispositionGestureFilterTest, TimeoutEventAfterRelease) {
802  PressTouchPoint(1, 1);
803  SendTouchNotConsumedAck();
804  EXPECT_FALSE(GesturesSent());
805  PushGesture(ET_GESTURE_TAP_DOWN);
806  PushGesture(ET_GESTURE_TAP_UNCONFIRMED);
807  ReleaseTouchPoint();
808  SendTouchNotConsumedAck();
809  EXPECT_TRUE(
810      GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN, ET_GESTURE_TAP_UNCONFIRMED),
811                    GetAndResetSentGestures()));
812
813  SendTimeoutGesture(ET_GESTURE_TAP);
814  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS, ET_GESTURE_TAP),
815                            GetAndResetSentGestures()));
816}
817
818TEST_F(TouchDispositionGestureFilterTest, ShowPressInsertedBeforeTap) {
819  PushGesture(ET_GESTURE_TAP_DOWN);
820  PressTouchPoint(1, 1);
821  SendTouchNotConsumedAck();
822  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
823                            GetAndResetSentGestures()));
824
825  SendTimeoutGesture(ET_GESTURE_TAP_UNCONFIRMED);
826  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_UNCONFIRMED),
827                            GetAndResetSentGestures()));
828
829  PushGesture(ET_GESTURE_TAP);
830  ReleaseTouchPoint();
831  SendTouchNotConsumedAck();
832  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS,
833                                     ET_GESTURE_TAP),
834                            GetAndResetSentGestures()));
835}
836
837TEST_F(TouchDispositionGestureFilterTest, ShowPressNotInsertedIfAlreadySent) {
838  PushGesture(ET_GESTURE_TAP_DOWN);
839  PressTouchPoint(1, 1);
840  SendTouchNotConsumedAck();
841  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
842                            GetAndResetSentGestures()));
843
844  SendTimeoutGesture(ET_GESTURE_SHOW_PRESS);
845  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS),
846                            GetAndResetSentGestures()));
847
848  PushGesture(ET_GESTURE_TAP);
849  ReleaseTouchPoint();
850  SendTouchNotConsumedAck();
851  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP),
852                            GetAndResetSentGestures()));
853}
854
855TEST_F(TouchDispositionGestureFilterTest, TapAndScrollCancelledOnTouchCancel) {
856  PushGesture(ET_GESTURE_TAP_DOWN);
857  PressTouchPoint(1, 1);
858  SendTouchNotConsumedAck();
859  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
860                            GetAndResetSentGestures()));
861
862  // A cancellation motion event should cancel the tap.
863  CancelTouchPoint();
864  SendTouchNotConsumedAck();
865  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL),
866                            GetAndResetSentGestures()));
867
868  PushGesture(ET_GESTURE_SCROLL_BEGIN);
869  PressTouchPoint(1, 1);
870  SendTouchNotConsumedAck();
871  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
872                            GetAndResetSentGestures()));
873
874  // A cancellation motion event should end the scroll, even if the touch was
875  // consumed.
876  CancelTouchPoint();
877  SendTouchConsumedAck();
878  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
879                            GetAndResetSentGestures()));
880}
881
882TEST_F(TouchDispositionGestureFilterTest,
883       ConsumedScrollUpdateMakesFlingScrollEnd) {
884  // A consumed touch's gesture should not be sent.
885  PushGesture(ET_GESTURE_BEGIN);
886  PushGesture(ET_GESTURE_SCROLL_BEGIN);
887  PressTouchPoint(1, 1);
888  SendTouchNotConsumedAck();
889
890  EXPECT_TRUE(
891      GesturesMatch(Gestures(ET_GESTURE_BEGIN, ET_GESTURE_SCROLL_BEGIN),
892                    GetAndResetSentGestures()));
893
894  PushGesture(ET_GESTURE_SCROLL_UPDATE);
895  MoveTouchPoint(0, 2, 2);
896  SendTouchConsumedAck();
897  EXPECT_FALSE(GesturesSent());
898
899  PushGesture(ET_SCROLL_FLING_START);
900  PushGesture(ET_SCROLL_FLING_CANCEL);
901  PushGesture(ET_GESTURE_END);
902  ReleaseTouchPoint();
903  SendTouchNotConsumedAck();
904  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_END, ET_GESTURE_SCROLL_END),
905                            GetAndResetSentGestures()));
906
907  PushGesture(ET_GESTURE_BEGIN);
908  PushGesture(ET_GESTURE_SCROLL_BEGIN);
909  PressTouchPoint(1, 1);
910  SendTouchNotConsumedAck();
911  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_BEGIN, ET_GESTURE_SCROLL_BEGIN),
912                            GetAndResetSentGestures()));
913}
914
915TEST_F(TouchDispositionGestureFilterTest, TapCancelledOnTouchCancel) {
916  PushGesture(ET_GESTURE_TAP_DOWN);
917  PressTouchPoint(1, 1);
918  SendTouchNotConsumedAck();
919  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
920                            GetAndResetSentGestures()));
921
922  // A cancellation motion event should cancel the tap.
923  CancelTouchPoint();
924  SendTouchNotConsumedAck();
925  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL),
926                            GetAndResetSentGestures()));
927}
928
929// Test that a GestureEvent whose dispatch causes a cancel event to be fired
930// won't cause a crash.
931TEST_F(TouchDispositionGestureFilterTest, TestCancelMidGesture) {
932  SetCancelAfterNextGesture(true);
933  PushGesture(ET_GESTURE_TAP_DOWN);
934  PressTouchPoint(1, 1);
935  SendTouchNotConsumedAck();
936  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN,
937                                     ET_GESTURE_TAP_CANCEL),
938                            GetAndResetSentGestures()));
939}
940
941// Test that a MultiFingerSwipe event is dispatched when appropriate.
942TEST_F(TouchDispositionGestureFilterTest, TestAllowedMultiFingerSwipe) {
943  PushGesture(ET_GESTURE_SCROLL_BEGIN);
944  PressTouchPoint(1, 1);
945  SendTouchNotConsumedAck();
946  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
947                            GetAndResetSentGestures()));
948
949  PushGesture(ET_GESTURE_PINCH_BEGIN);
950  PressTouchPoint(1, 1);
951  SendTouchNotConsumedAck();
952  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
953                            GetAndResetSentGestures()));
954
955  PushGesture(ET_GESTURE_MULTIFINGER_SWIPE);
956  PressTouchPoint(1, 1);
957  SendTouchNotConsumedAck();
958  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_MULTIFINGER_SWIPE),
959                            GetAndResetSentGestures()));
960}
961
962  // Test that a MultiFingerSwipe event is dispatched when appropriate.
963TEST_F(TouchDispositionGestureFilterTest, TestDisallowedMultiFingerSwipe) {
964  PressTouchPoint(1, 1);
965  SendTouchNotConsumedAck();
966
967  PushGesture(ET_GESTURE_SCROLL_BEGIN);
968  MoveTouchPoint(0, 0, 0);
969  SendTouchConsumedAck();
970  EXPECT_FALSE(GesturesSent());
971
972  PushGesture(ET_GESTURE_PINCH_BEGIN);
973  PressTouchPoint(1, 1);
974  SendTouchNotConsumedAck();
975  EXPECT_FALSE(GesturesSent());
976
977  PushGesture(ET_GESTURE_MULTIFINGER_SWIPE);
978  PressTouchPoint(1, 1);
979  SendTouchNotConsumedAck();
980  EXPECT_FALSE(GesturesSent());
981}
982
983}  // namespace ui
984