1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/basictypes.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/gesture_detection/touch_disposition_gesture_filter.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/test/mock_motion_event.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing ui::test::MockMotionEvent;
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace ui {
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst int kDefaultEventFlags = EF_ALT_DOWN | EF_SHIFT_DOWN;
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class TouchDispositionGestureFilterTest
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public testing::Test,
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      public TouchDispositionGestureFilterClient {
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  TouchDispositionGestureFilterTest()
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      : cancel_after_next_gesture_(false), sent_gesture_count_(0) {}
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ~TouchDispositionGestureFilterTest() {}
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // testing::Test
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    queue_.reset(new TouchDispositionGestureFilter(this));
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    touch_event_.set_flags(kDefaultEventFlags);
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    queue_.reset();
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // TouchDispositionGestureFilterClient
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void ForwardGestureEvent(const GestureEventData& event) OVERRIDE {
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ++sent_gesture_count_;
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    last_sent_gesture_.reset(new GestureEventData(event));
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    sent_gestures_.push_back(event.type());
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (event.type() == ET_GESTURE_SHOW_PRESS)
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      show_press_bounding_box_ = event.details.bounding_box();
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    if (cancel_after_next_gesture_) {
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      cancel_after_next_gesture_ = false;
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      CancelTouchPoint();
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      SendTouchNotConsumedAck();
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef std::vector<EventType> GestureList;
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ::testing::AssertionResult GesturesMatch(const GestureList& expected,
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                           const GestureList& actual) {
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (expected.size() != actual.size()) {
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      return ::testing::AssertionFailure()
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          << "actual.size(" << actual.size()
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          << ") != expected.size(" << expected.size() << ")";
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    for (size_t i = 0; i < expected.size(); ++i) {
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (expected[i] != actual[i]) {
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        return ::testing::AssertionFailure()
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            << "actual[" << i << "] ("
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            << actual[i]
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            << ") != expected[" << i << "] ("
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            << expected[i] << ")";
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      }
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return ::testing::AssertionSuccess();
74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GestureList Gestures(EventType type) {
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return GestureList(1, type);
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GestureList Gestures(EventType type0, EventType type1) {
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    GestureList gestures(2);
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gestures[0] = type0;
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gestures[1] = type1;
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return gestures;
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GestureList Gestures(EventType type0,
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       EventType type1,
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       EventType type2) {
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    GestureList gestures(3);
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gestures[0] = type0;
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gestures[1] = type1;
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gestures[2] = type2;
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return gestures;
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GestureList Gestures(EventType type0,
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       EventType type1,
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       EventType type2,
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       EventType type3) {
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    GestureList gestures(4);
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gestures[0] = type0;
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gestures[1] = type1;
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gestures[2] = type2;
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gestures[3] = type3;
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return gestures;
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void SendTouchGestures() {
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    touch_event_.set_event_time(base::TimeTicks::Now());
1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    EXPECT_EQ(TouchDispositionGestureFilter::SUCCESS,
1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu              SendTouchGestures(touch_event_, pending_gesture_packet_));
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    GestureEventDataPacket gesture_packet;
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    std::swap(gesture_packet, pending_gesture_packet_);
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TouchDispositionGestureFilter::PacketResult
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchGestures(const MotionEvent& touch,
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    const GestureEventDataPacket& packet) {
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    GestureEventDataPacket touch_packet =
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        GestureEventDataPacket::FromTouch(touch);
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    for (size_t i = 0; i < packet.gesture_count(); ++i)
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      touch_packet.Push(packet.gesture(i));
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return queue_->OnGesturePacket(touch_packet);
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TouchDispositionGestureFilter::PacketResult
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTimeoutGesture(EventType type) {
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return queue_->OnGesturePacket(
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        GestureEventDataPacket::FromTouchTimeout(CreateGesture(type)));
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TouchDispositionGestureFilter::PacketResult
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendGesturePacket(const GestureEventDataPacket& packet) {
135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return queue_->OnGesturePacket(packet);
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void SendTouchEventAck(bool event_consumed) {
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    queue_->OnTouchEventAck(event_consumed);
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void SendTouchConsumedAck() { SendTouchEventAck(true); }
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void SendTouchNotConsumedAck() { SendTouchEventAck(false); }
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void PushGesture(EventType type) {
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    pending_gesture_packet_.Push(CreateGesture(type));
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void PushGesture(EventType type, float x, float y, float diameter) {
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    pending_gesture_packet_.Push(CreateGesture(type, x, y, diameter));
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void PressTouchPoint(int x, int y) {
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    touch_event_.PressPoint(x, y);
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    touch_event_.SetRawOffset(raw_offset_.x(), raw_offset_.y());
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SendTouchGestures();
158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void MoveTouchPoint(size_t index, int x, int y) {
161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    touch_event_.MovePoint(index, x, y);
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    touch_event_.SetRawOffset(raw_offset_.x(), raw_offset_.y());
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SendTouchGestures();
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void ReleaseTouchPoint() {
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    touch_event_.ReleasePoint();
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SendTouchGestures();
169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void CancelTouchPoint() {
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    touch_event_.CancelPoint();
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SendTouchGestures();
174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  void SetRawTouchOffset(const gfx::Vector2dF& raw_offset) {
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    raw_offset_ = raw_offset;
1786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
1796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void ResetTouchPoints() { touch_event_ = MockMotionEvent(); }
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool GesturesSent() const { return !sent_gestures_.empty(); }
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::TimeTicks LastSentGestureTime() const {
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK(last_sent_gesture_);
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return last_sent_gesture_->time;
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  base::TimeTicks CurrentTouchTime() const {
190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return touch_event_.GetEventTime();
191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool IsEmpty() const { return queue_->IsEmpty(); }
194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GestureList GetAndResetSentGestures() {
196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    GestureList sent_gestures;
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sent_gestures.swap(sent_gestures_);
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return sent_gestures;
199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::PointF LastSentGestureLocation() const {
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK(last_sent_gesture_);
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return gfx::PointF(last_sent_gesture_->x, last_sent_gesture_->y);
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::PointF LastSentGestureRawLocation() const {
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK(last_sent_gesture_);
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return gfx::PointF(last_sent_gesture_->raw_x, last_sent_gesture_->raw_y);
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int LastSentGestureFlags() const {
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK(last_sent_gesture_);
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return last_sent_gesture_->flags;
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const gfx::RectF& ShowPressBoundingBox() const {
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return show_press_bounding_box_;
2186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
2196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
2205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void SetCancelAfterNextGesture(bool cancel_after_next_gesture) {
2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    cancel_after_next_gesture_ = cancel_after_next_gesture;
2225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GestureEventData CreateGesture(EventType type) {
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return CreateGesture(type, 0, 0, 0);
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GestureEventData CreateGesture(EventType type,
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 float x,
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 float y,
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 float diameter) {
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return GestureEventData(
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        GestureEventDetails(type),
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        0,
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        MotionEvent::TOOL_TYPE_FINGER,
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::TimeTicks(),
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        touch_event_.GetX(0),
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        touch_event_.GetY(0),
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        touch_event_.GetRawX(0),
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        touch_event_.GetRawY(0),
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        1,
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        gfx::RectF(x - diameter / 2, y - diameter / 2, diameter, diameter),
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kDefaultEventFlags);
244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<TouchDispositionGestureFilter> queue_;
2485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool cancel_after_next_gesture_;
249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MockMotionEvent touch_event_;
250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GestureEventDataPacket pending_gesture_packet_;
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  size_t sent_gesture_count_;
252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GestureList sent_gestures_;
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gfx::Vector2dF raw_offset_;
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<GestureEventData> last_sent_gesture_;
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::RectF show_press_bounding_box_;
256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
258a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, BasicNoGestures) {
259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MoveTouchPoint(0, 2, 2);
263a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
264a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
265a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // No gestures should be dispatched by the ack, as the queued packets
266a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // contained no gestures.
267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Release the touch gesture.
271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, BasicGestures) {
278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // An unconsumed touch's gesture should be sent.
279c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_BEGIN);
280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_BEGIN, ET_GESTURE_SCROLL_BEGIN),
285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Multiple gestures can be queued for a single event.
288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_SCROLL_FLING_START);
289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_SCROLL_FLING_CANCEL);
290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_END);
291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START,
295c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                     ET_SCROLL_FLING_CANCEL,
296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                     ET_GESTURE_END),
297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
300a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, BasicGesturesConsumed) {
301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // A consumed touch's gesture should not be sent.
302c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_BEGIN);
303a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
306a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
308c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_SCROLL_UPDATE);
309c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  MoveTouchPoint(0, 2, 2);
310c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTouchConsumedAck();
311c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(GesturesSent());
312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
313a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_SCROLL_FLING_START);
314a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_SCROLL_FLING_CANCEL);
315c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_END);
316a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, ConsumedThenNotConsumed) {
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // A consumed touch's gesture should not be sent.
323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Even if the subsequent touch is not consumed, continue dropping gestures.
329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_UPDATE);
330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MoveTouchPoint(0, 2, 2);
331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Even if the subsequent touch had no consumer, continue dropping gestures.
335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_SCROLL_FLING_START);
336a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
337a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
338a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
339a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, NotConsumedThenConsumed) {
342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // A not consumed touch's gesture should be sent.
343a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
347a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
348a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
349a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // A newly consumed gesture should not be sent.
350a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_BEGIN);
351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(10, 10);
352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // And subsequent non-consumed pinch updates should not be sent.
356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_UPDATE);
357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_UPDATE);
358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MoveTouchPoint(0, 2, 2);
359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE),
361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // End events dispatched only when their start events were.
364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_END);
365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_END);
370a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
374a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, ScrollAlternatelyConsumed) {
377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // A consumed touch's gesture should not be sent.
378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (size_t i = 0; i < 3; ++i) {
385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PushGesture(ET_GESTURE_SCROLL_UPDATE);
386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    MoveTouchPoint(0, 2, 2);
387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SendTouchConsumedAck();
388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(GesturesSent());
389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
390a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    PushGesture(ET_GESTURE_SCROLL_UPDATE);
391a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    MoveTouchPoint(0, 3, 3);
392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    SendTouchNotConsumedAck();
393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE),
394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                              GetAndResetSentGestures()));
395a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_END);
398a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
402a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
403a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, NotConsumedThenNoConsumer) {
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // An unconsumed touch's gesture should be sent.
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
412a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // If the subsequent touch has no consumer (e.g., a secondary pointer is
413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // pressed but not on a touch handling rect), send the gesture.
414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_BEGIN);
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(2, 2);
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // End events should be dispatched when their start events were, independent
421a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // of the ack state.
422a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_END);
423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
425a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END),
426a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_END);
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, EndingEventsSent) {
436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_BEGIN);
443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(2, 2);
444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
448a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Consuming the touchend event can't suppress the match end gesture.
449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_END);
450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END),
453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // But other events in the same packet are still suppressed.
456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_UPDATE);
457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_END);
458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
462a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // ET_GESTURE_SCROLL_END and ET_SCROLL_FLING_START behave the same in this
464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // regard.
465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
466a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
471a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_SCROLL_FLING_START);
472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
474a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START),
475a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
477a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
478a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, EndingEventsNotSent) {
479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Consuming a begin event ensures no end events are sent.
480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
481a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
482a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_BEGIN);
486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(2, 2);
487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_END);
491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
493a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
494a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
495a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_END);
496a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
497a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
499a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
500a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, UpdateEventsSuppressedPerEvent) {
502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
508a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Consuming a single scroll or pinch update should suppress only that event.
509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_UPDATE);
510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MoveTouchPoint(0, 2, 2);
511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_BEGIN);
515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(2, 2);
516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
517a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
519a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
520a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_UPDATE);
521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MoveTouchPoint(1, 2, 3);
522a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
523a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
524a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Subsequent updates should not be affected.
526a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_UPDATE);
527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MoveTouchPoint(0, 4, 4);
528a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE),
530a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
531a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
532a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_UPDATE);
533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MoveTouchPoint(0, 4, 5);
534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
535a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_UPDATE),
536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
537a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
538a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_END);
539a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END),
542a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
544a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_END);
545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
546a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
547a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
548a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, UpdateEventsDependOnBeginEvents) {
552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
553a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Scroll and pinch gestures depend on the scroll begin gesture being
558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // dispatched.
559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_UPDATE);
560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MoveTouchPoint(0, 2, 2);
561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_BEGIN);
565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(2, 2);
566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_UPDATE);
570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MoveTouchPoint(1, 2, 3);
571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
574a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_PINCH_END);
575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_END);
580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
581a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
582a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
583a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
584a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, MultipleTouchSequences) {
586a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Queue two touch-to-gestures sequences.
587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_TAP_DOWN);
588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
589a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_TAP);
590a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
591a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_END);
594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The first gesture sequence should not be allowed.
597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
598a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The subsequent sequence should "reset" allowance.
602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ET_GESTURE_SCROLL_END),
606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, FlingCancelledOnNewTouchSequence) {
6106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  const gfx::Vector2dF raw_offset(1.3f, 3.7f);
6116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SetRawTouchOffset(raw_offset);
6125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
613a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Simulate a fling.
614c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_TAP_DOWN);
615a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
616a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
617a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
618c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(
619c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      Gestures(
620c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          ET_GESTURE_TAP_DOWN, ET_GESTURE_TAP_CANCEL, ET_GESTURE_SCROLL_BEGIN),
621c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GetAndResetSentGestures()));
622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_SCROLL_FLING_START);
623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
624a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
625a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START),
626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // A new touch sequence should cancel the outstanding fling.
629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_CANCEL),
632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
633010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1));
6356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(LastSentGestureRawLocation(), gfx::PointF(1, 1) + raw_offset);
636a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
641010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, ScrollEndedOnTouchReleaseIfNoFling) {
642a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Simulate a scroll.
643c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_TAP_DOWN);
644a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
647c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(
648c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      Gestures(
649c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          ET_GESTURE_TAP_DOWN, ET_GESTURE_TAP_CANCEL, ET_GESTURE_SCROLL_BEGIN),
650c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GetAndResetSentGestures()));
651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
652a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
653010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            GetAndResetSentGestures()));
655010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1));
657010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
658010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
659010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, ScrollEndedOnNewTouchSequence) {
660010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Simulate a scroll.
661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PushGesture(ET_GESTURE_TAP_DOWN);
662010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
663010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PressTouchPoint(1, 1);
664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SendTouchNotConsumedAck();
665010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(GesturesMatch(
666010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      Gestures(
667010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          ET_GESTURE_TAP_DOWN, ET_GESTURE_TAP_CANCEL, ET_GESTURE_SCROLL_BEGIN),
668010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      GetAndResetSentGestures()));
669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
670010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // A new touch sequence should end the outstanding scroll.
671010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ResetTouchPoints();
672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PressTouchPoint(2, 3);
673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(2, 3));
678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, FlingCancelledOnScrollBegin) {
681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Simulate a fling sequence.
682c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_TAP_DOWN);
683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
684a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_SCROLL_FLING_START);
685a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
686a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
687c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN,
688c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                     ET_GESTURE_TAP_CANCEL,
689c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                     ET_GESTURE_SCROLL_BEGIN,
690a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ET_SCROLL_FLING_START),
691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
692a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
693a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The new fling should cancel the preceding one.
694a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
695a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_SCROLL_FLING_START);
696a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
697a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
698a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_CANCEL,
699a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ET_GESTURE_SCROLL_BEGIN,
700a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ET_SCROLL_FLING_START),
701a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
702a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
703a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
704a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, FlingNotCancelledIfGFCEventReceived) {
705a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Simulate a fling that is started then cancelled.
706a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
707a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
708a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
709a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_SCROLL_FLING_START);
710cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MoveTouchPoint(0, 2, 3);
711a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
712a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_SCROLL_FLING_CANCEL);
713a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
714a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
715a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ET_SCROLL_FLING_START,
717a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ET_SCROLL_FLING_CANCEL),
718a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(2, 3));
720a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
721a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // A new touch sequence will not inject a ET_SCROLL_FLING_CANCEL, as the fling
722a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // has already been cancelled.
723a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
724a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
725a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
726a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
727a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
728a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
729a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
730a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, TapCancelledWhenScrollBegins) {
731a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_TAP_DOWN);
732a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
733a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
734a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
735a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
736a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
737a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // If the subsequent touch turns into a scroll, the tap should be cancelled.
738a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
739a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MoveTouchPoint(0, 2, 2);
740a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
741a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL,
742a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ET_GESTURE_SCROLL_BEGIN),
743a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
744a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
746a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, TapCancelledWhenTouchConsumed) {
747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_TAP_DOWN);
748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
749a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
750a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
751a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
752a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
753a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // If the subsequent touch is consumed, the tap should be cancelled.
754a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
755a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MoveTouchPoint(0, 2, 2);
756a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
757116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(
758116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL, ET_GESTURE_SCROLL_BEGIN),
759116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                    GetAndResetSentGestures()));
760116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1));
761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
762a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest,
764a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)       TapNotCancelledIfTapEndingEventReceived) {
765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_TAP_DOWN);
766a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
767a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
768cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(
769cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN), GetAndResetSentGestures()));
770a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
771a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_TAP);
772a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
774cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS, ET_GESTURE_TAP),
775a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
776a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
777a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The tap should not be cancelled as it was terminated by a |ET_GESTURE_TAP|.
778cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PressTouchPoint(2, 2);
779a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
780a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
781a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
782a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, TimeoutGestures) {
784a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // If the sequence is allowed, and there are no preceding gestures, the
785a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // timeout gestures should be forwarded immediately.
786c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_TAP_DOWN);
787a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
788a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
789c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
790c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            GetAndResetSentGestures()));
791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
792a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTimeoutGesture(ET_GESTURE_SHOW_PRESS);
793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS),
794a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
795a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
796a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTimeoutGesture(ET_GESTURE_LONG_PRESS);
797a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_LONG_PRESS),
798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
799a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
800c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_LONG_TAP);
801a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
802a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
803c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL,
804c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                     ET_GESTURE_LONG_TAP),
805c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            GetAndResetSentGestures()));
806a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
807a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // If the sequence is disallowed, and there are no preceding gestures, the
808a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // timeout gestures should be dropped immediately.
809c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_TAP_DOWN);
810a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
811a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
812a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
813a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
814a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTimeoutGesture(ET_GESTURE_SHOW_PRESS);
815a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
816a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
817a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
818a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
819a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // If the sequence has a pending ack, the timeout gestures should
820a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // remain queued until the ack is received.
821c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_TAP_DOWN);
822a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
823a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
824a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
825a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTimeoutGesture(ET_GESTURE_LONG_PRESS);
826a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
827a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
828a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
829c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN,
830c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                     ET_GESTURE_LONG_PRESS),
831a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
832a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
833a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
834a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, SpuriousAcksIgnored) {
835a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Acks received when the queue is empty will be safely ignored.
836a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(IsEmpty());
837a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
838a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
839a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
840a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_BEGIN);
841a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
842a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_UPDATE);
843a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MoveTouchPoint(0, 3,3);
844a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
845a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
846a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
847a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ET_GESTURE_SCROLL_UPDATE),
848a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
849a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
850a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Even if all packets have been dispatched, the filter may not be empty as
851a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // there could be follow-up timeout events.  Spurious acks in such cases
852a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // should also be safely ignored.
853a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_FALSE(IsEmpty());
854a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
855a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
856a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
857a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
858a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, PacketWithInvalidTypeIgnored) {
859a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GestureEventDataPacket packet;
860a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(TouchDispositionGestureFilter::INVALID_PACKET_TYPE,
861a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            SendGesturePacket(packet));
862a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(IsEmpty());
863a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
864a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
865a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, PacketsWithInvalidOrderIgnored) {
866a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(TouchDispositionGestureFilter::INVALID_PACKET_ORDER,
867a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            SendTimeoutGesture(ET_GESTURE_SHOW_PRESS));
868a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(IsEmpty());
869a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
870a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
871a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, ConsumedTouchCancel) {
872a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // An unconsumed touch's gesture should be sent.
873a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_TAP_DOWN);
874a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
875a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
876a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
877a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
878a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
879a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
880a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_TAP_CANCEL);
881a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_SCROLL_END);
882a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CancelTouchPoint();
883a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
884a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchConsumedAck();
885a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL,
886a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ET_GESTURE_SCROLL_END),
887a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
888a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
889a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
890a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, TimeoutEventAfterRelease) {
891a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PressTouchPoint(1, 1);
892a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
893a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(GesturesSent());
8945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PushGesture(ET_GESTURE_TAP_DOWN);
895a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  PushGesture(ET_GESTURE_TAP_UNCONFIRMED);
896a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ReleaseTouchPoint();
897a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTouchNotConsumedAck();
8985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(
8995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN, ET_GESTURE_TAP_UNCONFIRMED),
9005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                    GetAndResetSentGestures()));
901a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
902a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SendTimeoutGesture(ET_GESTURE_TAP);
9035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS, ET_GESTURE_TAP),
904a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            GetAndResetSentGestures()));
905a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
906a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
907c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(TouchDispositionGestureFilterTest, ShowPressInsertedBeforeTap) {
908c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_TAP_DOWN);
909c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PressTouchPoint(1, 1);
910c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTouchNotConsumedAck();
911c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
912c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            GetAndResetSentGestures()));
913c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
914c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTimeoutGesture(ET_GESTURE_TAP_UNCONFIRMED);
915c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_UNCONFIRMED),
916c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            GetAndResetSentGestures()));
917c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
918c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_TAP);
919c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ReleaseTouchPoint();
920c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTouchNotConsumedAck();
921c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS,
922c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                     ET_GESTURE_TAP),
923c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            GetAndResetSentGestures()));
924c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
925c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
926c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(TouchDispositionGestureFilterTest, ShowPressNotInsertedIfAlreadySent) {
927c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_TAP_DOWN);
928c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PressTouchPoint(1, 1);
929c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTouchNotConsumedAck();
930c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
931c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            GetAndResetSentGestures()));
932c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
933c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTimeoutGesture(ET_GESTURE_SHOW_PRESS);
934c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS),
935c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            GetAndResetSentGestures()));
936c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
937c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_TAP);
938c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ReleaseTouchPoint();
939c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTouchNotConsumedAck();
940c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP),
941c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            GetAndResetSentGestures()));
942c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
943c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
944c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(TouchDispositionGestureFilterTest, TapAndScrollCancelledOnTouchCancel) {
9456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  const gfx::Vector2dF raw_offset(1.3f, 3.7f);
9466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  SetRawTouchOffset(raw_offset);
9475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
948c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_TAP_DOWN);
949c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PressTouchPoint(1, 1);
950c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTouchNotConsumedAck();
951c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
952c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            GetAndResetSentGestures()));
953c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
9545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // A cancellation motion event should cancel the tap.
955c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  CancelTouchPoint();
956c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTouchNotConsumedAck();
9575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL),
9585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                            GetAndResetSentGestures()));
959010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
960cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1));
9616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(LastSentGestureRawLocation(), gfx::PointF(1, 1) + raw_offset);
962c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
963c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_SCROLL_BEGIN);
964c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PressTouchPoint(1, 1);
965c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTouchNotConsumedAck();
9665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
967c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            GetAndResetSentGestures()));
968c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
969c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // A cancellation motion event should end the scroll, even if the touch was
970c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // consumed.
971c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  CancelTouchPoint();
972c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTouchConsumedAck();
973c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
974c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            GetAndResetSentGestures()));
975010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
976cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1));
9776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_EQ(LastSentGestureRawLocation(), gfx::PointF(1, 1) + raw_offset);
978c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
979c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
980c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(TouchDispositionGestureFilterTest,
981c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       ConsumedScrollUpdateMakesFlingScrollEnd) {
982c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // A consumed touch's gesture should not be sent.
983c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_BEGIN);
984c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_SCROLL_BEGIN);
985c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PressTouchPoint(1, 1);
986c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTouchNotConsumedAck();
987c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
988c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(
989c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GesturesMatch(Gestures(ET_GESTURE_BEGIN, ET_GESTURE_SCROLL_BEGIN),
990c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                    GetAndResetSentGestures()));
991c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
992c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_SCROLL_UPDATE);
993c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  MoveTouchPoint(0, 2, 2);
994c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTouchConsumedAck();
995c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_FALSE(GesturesSent());
996c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
997c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_SCROLL_FLING_START);
998c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_SCROLL_FLING_CANCEL);
999c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_END);
1000c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ReleaseTouchPoint();
1001c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTouchNotConsumedAck();
10021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END, ET_GESTURE_END),
1003c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            GetAndResetSentGestures()));
1004cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(2, 2));
1005c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
1006c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_BEGIN);
1007c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PushGesture(ET_GESTURE_SCROLL_BEGIN);
1008c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PressTouchPoint(1, 1);
1009c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  SendTouchNotConsumedAck();
1010c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_BEGIN, ET_GESTURE_SCROLL_BEGIN),
1011c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                            GetAndResetSentGestures()));
1012c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
1013c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
10145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(TouchDispositionGestureFilterTest, TapCancelledOnTouchCancel) {
10155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PushGesture(ET_GESTURE_TAP_DOWN);
10165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PressTouchPoint(1, 1);
10175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SendTouchNotConsumedAck();
10185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
10195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                            GetAndResetSentGestures()));
10205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
10215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // A cancellation motion event should cancel the tap.
10225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CancelTouchPoint();
10235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SendTouchNotConsumedAck();
10245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL),
10255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                            GetAndResetSentGestures()));
1026010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime());
1027cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1));
10285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
10295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
10305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Test that a GestureEvent whose dispatch causes a cancel event to be fired
10315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// won't cause a crash.
10325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(TouchDispositionGestureFilterTest, TestCancelMidGesture) {
10335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SetCancelAfterNextGesture(true);
10345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PushGesture(ET_GESTURE_TAP_DOWN);
10355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PressTouchPoint(1, 1);
10365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SendTouchNotConsumedAck();
10375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN,
10385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                     ET_GESTURE_TAP_CANCEL),
10395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                            GetAndResetSentGestures()));
1040cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1));
10415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
10425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
10435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Test that a MultiFingerSwipe event is dispatched when appropriate.
10445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(TouchDispositionGestureFilterTest, TestAllowedMultiFingerSwipe) {
10455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PushGesture(ET_GESTURE_SCROLL_BEGIN);
10465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PressTouchPoint(1, 1);
10475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SendTouchNotConsumedAck();
10485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
10495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                            GetAndResetSentGestures()));
10505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
10515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PushGesture(ET_GESTURE_PINCH_BEGIN);
10525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PressTouchPoint(1, 1);
10535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SendTouchNotConsumedAck();
10545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
10555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                            GetAndResetSentGestures()));
10565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1057cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PushGesture(ET_GESTURE_SWIPE);
10585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PressTouchPoint(1, 1);
10595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SendTouchNotConsumedAck();
1060cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SWIPE),
10615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                            GetAndResetSentGestures()));
10625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
10635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
10645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Test that a MultiFingerSwipe event is dispatched when appropriate.
10655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(TouchDispositionGestureFilterTest, TestDisallowedMultiFingerSwipe) {
10665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PressTouchPoint(1, 1);
10675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SendTouchNotConsumedAck();
10685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
10695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PushGesture(ET_GESTURE_SCROLL_BEGIN);
10705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MoveTouchPoint(0, 0, 0);
10715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SendTouchConsumedAck();
1072116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
1073116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            GetAndResetSentGestures()));
10745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
10755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PushGesture(ET_GESTURE_PINCH_BEGIN);
10765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PressTouchPoint(1, 1);
10775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SendTouchNotConsumedAck();
1078116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
1079116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            GetAndResetSentGestures()));
10805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1081cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PushGesture(ET_GESTURE_SWIPE);
10825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PressTouchPoint(1, 1);
1083116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SendTouchConsumedAck();
10845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(GesturesSent());
10855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
10865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1087cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(TouchDispositionGestureFilterTest, TapCancelOnSecondFingerDown) {
1088cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PushGesture(ET_GESTURE_TAP_DOWN);
1089cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PressTouchPoint(1, 1);
1090cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendTouchNotConsumedAck();
1091cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
1092cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            GetAndResetSentGestures()));
1093cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1094cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PressTouchPoint(1, 1);
1095cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SendTouchNotConsumedAck();
1096cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL),
1097cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            GetAndResetSentGestures()));
1098cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1099cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(TouchDispositionGestureFilterTest, ShowPressBoundingBox) {
11011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PushGesture(ET_GESTURE_TAP_DOWN, 9, 9, 8);
11021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PressTouchPoint(9, 9);
11031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendTouchNotConsumedAck();
11041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(
11051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN), GetAndResetSentGestures()));
11061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
11071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PushGesture(ET_GESTURE_TAP, 10, 10, 10);
11081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ReleaseTouchPoint();
11091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendTouchNotConsumedAck();
11101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS, ET_GESTURE_TAP),
11111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            GetAndResetSentGestures()));
11121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(gfx::RectF(5, 5, 10, 10), ShowPressBoundingBox());
11131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
11141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
11151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(TouchDispositionGestureFilterTest, TapCancelledBeforeGestureEnd) {
11161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PushGesture(ET_GESTURE_BEGIN);
11171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PushGesture(ET_GESTURE_TAP_DOWN);
11181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PressTouchPoint(1, 1);
11191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendTouchNotConsumedAck();
11201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_BEGIN, ET_GESTURE_TAP_DOWN),
11211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            GetAndResetSentGestures()));
11221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendTimeoutGesture(ET_GESTURE_SHOW_PRESS);
11231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS),
11241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            GetAndResetSentGestures()));
11251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
11261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendTimeoutGesture(ET_GESTURE_LONG_PRESS);
11271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_LONG_PRESS),
11281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            GetAndResetSentGestures()));
11291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PushGesture(ET_GESTURE_END);
11301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CancelTouchPoint();
11311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendTouchNotConsumedAck();
11321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL, ET_GESTURE_END),
11331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            GetAndResetSentGestures()));
11341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
11351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
11361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(TouchDispositionGestureFilterTest, EventFlagPropagation) {
11371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Real gestures should propagate flags from their causal touches.
11381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PushGesture(ET_GESTURE_TAP_DOWN);
11391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PressTouchPoint(1, 1);
11401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendTouchNotConsumedAck();
11411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(
11421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN), GetAndResetSentGestures()));
11431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kDefaultEventFlags, LastSentGestureFlags());
11441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
11451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Synthetic gestures lack flags.
11461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  PressTouchPoint(1, 1);
11471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendTouchNotConsumedAck();
11481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL),
11491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            GetAndResetSentGestures()));
11501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(0, LastSentGestureFlags());
11511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
11521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace ui
1154