Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / ui / events / gesture_detection / gesture_provider_unittest.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/basictypes.h"
6 #include "base/logging.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/time/time.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "ui/events/event_constants.h"
12 #include "ui/events/gesture_detection/gesture_event_data.h"
13 #include "ui/events/gesture_detection/gesture_provider.h"
14 #include "ui/events/gesture_detection/motion_event.h"
15 #include "ui/events/test/mock_motion_event.h"
16 #include "ui/gfx/geometry/point_f.h"
17
18 using base::TimeDelta;
19 using base::TimeTicks;
20 using ui::test::MockMotionEvent;
21
22 namespace ui {
23 namespace {
24
25 const float kFakeCoordX = 42.f;
26 const float kFakeCoordY = 24.f;
27 const TimeDelta kOneSecond = TimeDelta::FromSeconds(1);
28 const TimeDelta kOneMicrosecond = TimeDelta::FromMicroseconds(1);
29 const TimeDelta kDeltaTimeForFlingSequences = TimeDelta::FromMilliseconds(5);
30 const float kMockTouchRadius = MockMotionEvent::TOUCH_MAJOR / 2;
31 const float kMaxTwoFingerTapSeparation = 300;
32
33 GestureProvider::Config CreateDefaultConfig() {
34   GestureProvider::Config sConfig;
35   // The longpress timeout is non-zero only to indicate ordering with respect to
36   // the showpress timeout.
37   sConfig.gesture_detector_config.showpress_timeout = base::TimeDelta();
38   sConfig.gesture_detector_config.longpress_timeout = kOneMicrosecond;
39
40   // A valid doubletap timeout should always be non-zero. The value is used not
41   // only to trigger the timeout that confirms the tap event, but also to gate
42   // whether the second tap is in fact a double-tap (using a strict inequality
43   // between times for the first up and the second down events). We use 4
44   // microseconds simply to allow several intermediate events to occur before
45   // the second tap at microsecond intervals.
46   sConfig.gesture_detector_config.double_tap_timeout = kOneMicrosecond * 4;
47   sConfig.gesture_detector_config.double_tap_min_time = kOneMicrosecond * 2;
48   return sConfig;
49 }
50
51 gfx::RectF BoundsForSingleMockTouchAtLocation(float x, float y) {
52   float diameter = MockMotionEvent::TOUCH_MAJOR;
53   return gfx::RectF(x - diameter / 2, y - diameter / 2, diameter, diameter);
54 }
55
56 }  // namespace
57
58 class GestureProviderTest : public testing::Test, public GestureProviderClient {
59  public:
60   GestureProviderTest() {}
61   virtual ~GestureProviderTest() {}
62
63   static MockMotionEvent ObtainMotionEvent(base::TimeTicks event_time,
64                                            MotionEvent::Action action,
65                                            float x,
66                                            float y) {
67     return MockMotionEvent(action, event_time, x, y);
68   }
69
70   static MockMotionEvent ObtainMotionEvent(base::TimeTicks event_time,
71                                            MotionEvent::Action action,
72                                            float x0,
73                                            float y0,
74                                            float x1,
75                                            float y1) {
76     return MockMotionEvent(action, event_time, x0, y0, x1, y1);
77   }
78
79   static MockMotionEvent ObtainMotionEvent(base::TimeTicks event_time,
80                                            MotionEvent::Action action,
81                                            float x0,
82                                            float y0,
83                                            float x1,
84                                            float y1,
85                                            float x2,
86                                            float y2) {
87     return MockMotionEvent(action, event_time, x0, y0, x1, y1, x2, y2);
88   }
89
90   static MockMotionEvent ObtainMotionEvent(
91       base::TimeTicks event_time,
92       MotionEvent::Action action,
93       const std::vector<gfx::PointF>& positions) {
94     switch (positions.size()) {
95       case 1:
96         return MockMotionEvent(
97             action, event_time, positions[0].x(), positions[0].y());
98       case 2:
99         return MockMotionEvent(action,
100                                event_time,
101                                positions[0].x(),
102                                positions[0].y(),
103                                positions[1].x(),
104                                positions[1].y());
105       case 3:
106         return MockMotionEvent(action,
107                                event_time,
108                                positions[0].x(),
109                                positions[0].y(),
110                                positions[1].x(),
111                                positions[1].y(),
112                                positions[2].x(),
113                                positions[2].y());
114       default:
115         CHECK(false) << "MockMotionEvent only supports 1-3 pointers";
116         return MockMotionEvent();
117     }
118   }
119
120   static MockMotionEvent ObtainMotionEvent(base::TimeTicks event_time,
121                                            MotionEvent::Action action) {
122     return ObtainMotionEvent(event_time, action, kFakeCoordX, kFakeCoordY);
123   }
124
125   // Test
126   virtual void SetUp() OVERRIDE { SetUpWithConfig(GetDefaultConfig()); }
127
128   virtual void TearDown() OVERRIDE {
129     gestures_.clear();
130     gesture_provider_.reset();
131   }
132
133   // GestureProviderClient
134   virtual void OnGestureEvent(const GestureEventData& gesture) OVERRIDE {
135     if (gesture.type() == ET_GESTURE_SCROLL_BEGIN)
136       active_scroll_begin_event_.reset(new GestureEventData(gesture));
137     gestures_.push_back(gesture);
138   }
139
140   void SetUpWithConfig(const GestureProvider::Config& config) {
141     gesture_provider_.reset(new GestureProvider(config, this));
142     gesture_provider_->SetMultiTouchZoomSupportEnabled(false);
143   }
144
145   void ResetGestureDetection() {
146     CancelActiveTouchSequence();
147     gestures_.clear();
148   }
149   bool CancelActiveTouchSequence() {
150     if (!gesture_provider_->current_down_event())
151       return false;
152     return gesture_provider_->OnTouchEvent(
153         *gesture_provider_->current_down_event()->Cancel());
154   }
155
156   bool HasReceivedGesture(EventType type) const {
157     for (size_t i = 0; i < gestures_.size(); ++i) {
158       if (gestures_[i].type() == type)
159         return true;
160     }
161     return false;
162   }
163
164   const GestureEventData& GetMostRecentGestureEvent() const {
165     EXPECT_FALSE(gestures_.empty());
166     return gestures_.back();
167   }
168
169   EventType GetMostRecentGestureEventType() const {
170     EXPECT_FALSE(gestures_.empty());
171     return gestures_.back().type();
172   }
173
174   size_t GetReceivedGestureCount() const { return gestures_.size(); }
175
176   const GestureEventData& GetReceivedGesture(size_t index) const {
177     EXPECT_LT(index, GetReceivedGestureCount());
178     return gestures_[index];
179   }
180
181   const GestureEventData* GetActiveScrollBeginEvent() const {
182     return active_scroll_begin_event_ ? active_scroll_begin_event_.get() : NULL;
183   }
184
185   const GestureProvider::Config& GetDefaultConfig() const {
186     static GestureProvider::Config sConfig = CreateDefaultConfig();
187     return sConfig;
188   }
189
190   float GetTouchSlop() const {
191     return GetDefaultConfig().gesture_detector_config.touch_slop;
192   }
193
194   float GetMinScalingSpan() const {
195     return GetDefaultConfig().scale_gesture_detector_config.min_scaling_span;
196   }
197
198   float GetMinSwipeVelocity() const {
199     return GetDefaultConfig().gesture_detector_config.minimum_swipe_velocity;
200   }
201
202   base::TimeDelta GetLongPressTimeout() const {
203     return GetDefaultConfig().gesture_detector_config.longpress_timeout;
204   }
205
206   base::TimeDelta GetShowPressTimeout() const {
207     return GetDefaultConfig().gesture_detector_config.showpress_timeout;
208   }
209
210   base::TimeDelta GetDoubleTapTimeout() const {
211     return GetDefaultConfig().gesture_detector_config.double_tap_timeout;
212   }
213
214   base::TimeDelta GetDoubleTapMinTime() const {
215     return GetDefaultConfig().gesture_detector_config.double_tap_min_time;
216   }
217
218   base::TimeDelta GetValidDoubleTapDelay() const {
219     return (GetDoubleTapTimeout() + GetDoubleTapMinTime()) / 2;
220   }
221
222   void EnableBeginEndTypes() {
223     GestureProvider::Config config = GetDefaultConfig();
224     config.gesture_begin_end_types_enabled = true;
225     SetUpWithConfig(config);
226   }
227
228   void EnableSwipe() {
229     GestureProvider::Config config = GetDefaultConfig();
230     config.gesture_detector_config.swipe_enabled = true;
231     SetUpWithConfig(config);
232   }
233
234   void EnableTwoFingerTap(float max_distance_for_two_finger_tap,
235                           base::TimeDelta two_finger_tap_timeout) {
236     GestureProvider::Config config = GetDefaultConfig();
237     config.gesture_detector_config.two_finger_tap_enabled = true;
238     config.gesture_detector_config.two_finger_tap_max_separation =
239         max_distance_for_two_finger_tap;
240     config.gesture_detector_config.two_finger_tap_timeout =
241         two_finger_tap_timeout;
242     SetUpWithConfig(config);
243   }
244
245   void SetMinPinchUpdateSpanDelta(float min_pinch_update_span_delta) {
246     GestureProvider::Config config = GetDefaultConfig();
247     config.scale_gesture_detector_config.min_pinch_update_span_delta =
248         min_pinch_update_span_delta;
249     SetUpWithConfig(config);
250   }
251
252   void SetMinMaxGestureBoundsLength(float min_gesture_bound_length,
253                                     float max_gesture_bound_length) {
254     GestureProvider::Config config = GetDefaultConfig();
255     config.min_gesture_bounds_length = min_gesture_bound_length;
256     config.max_gesture_bounds_length = max_gesture_bound_length;
257     SetUpWithConfig(config);
258   }
259
260   void SetShowPressAndLongPressTimeout(base::TimeDelta showpress_timeout,
261                                        base::TimeDelta longpress_timeout) {
262     GestureProvider::Config config = GetDefaultConfig();
263     config.gesture_detector_config.showpress_timeout = showpress_timeout;
264     config.gesture_detector_config.longpress_timeout = longpress_timeout;
265     SetUpWithConfig(config);
266   }
267
268   bool HasDownEvent() const { return gesture_provider_->current_down_event(); }
269
270  protected:
271   void CheckScrollEventSequenceForEndActionType(
272       MotionEvent::Action end_action_type) {
273     base::TimeTicks event_time = base::TimeTicks::Now();
274     const float scroll_to_x = kFakeCoordX + 100;
275     const float scroll_to_y = kFakeCoordY + 100;
276     int motion_event_id = 0;
277     int motion_event_flags = EF_SHIFT_DOWN | EF_CAPS_LOCK_DOWN;
278
279     MockMotionEvent event =
280         ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
281     event.set_id(++motion_event_id);
282     event.set_flags(motion_event_flags);
283
284     EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
285     EXPECT_EQ(motion_event_flags, GetMostRecentGestureEvent().flags);
286
287     event = ObtainMotionEvent(event_time + kOneSecond,
288                               MotionEvent::ACTION_MOVE,
289                               scroll_to_x,
290                               scroll_to_y);
291     event.SetToolType(0, MotionEvent::TOOL_TYPE_FINGER);
292     event.set_id(++motion_event_id);
293     event.set_flags(motion_event_flags);
294
295     EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
296     EXPECT_TRUE(gesture_provider_->IsScrollInProgress());
297     EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
298     EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
299     EXPECT_EQ(motion_event_flags, GetMostRecentGestureEvent().flags);
300     EXPECT_EQ(event.GetToolType(0),
301               GetMostRecentGestureEvent().primary_tool_type);
302     EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetMostRecentGestureEventType());
303     EXPECT_EQ(BoundsForSingleMockTouchAtLocation(scroll_to_x, scroll_to_y),
304               GetMostRecentGestureEvent().details.bounding_box());
305     ASSERT_EQ(3U, GetReceivedGestureCount()) << "Only TapDown, "
306                                                 "ScrollBegin and ScrollBy "
307                                                 "should have been sent";
308
309     EXPECT_EQ(ET_GESTURE_SCROLL_BEGIN, GetReceivedGesture(1).type());
310     EXPECT_EQ(motion_event_id, GetReceivedGesture(1).motion_event_id);
311     EXPECT_EQ(event_time + kOneSecond, GetReceivedGesture(1).time)
312         << "ScrollBegin should have the time of the ACTION_MOVE";
313
314     event = ObtainMotionEvent(
315         event_time + kOneSecond, end_action_type, scroll_to_x, scroll_to_y);
316     event.SetToolType(0, MotionEvent::TOOL_TYPE_FINGER);
317     event.set_id(++motion_event_id);
318
319     gesture_provider_->OnTouchEvent(event);
320     EXPECT_FALSE(gesture_provider_->IsScrollInProgress());
321     EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_END));
322     EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType());
323     EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
324     EXPECT_EQ(event.GetToolType(0),
325               GetMostRecentGestureEvent().primary_tool_type);
326     EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
327     EXPECT_EQ(BoundsForSingleMockTouchAtLocation(scroll_to_x, scroll_to_y),
328               GetMostRecentGestureEvent().details.bounding_box());
329   }
330
331   void OneFingerSwipe(float vx, float vy) {
332     std::vector<gfx::Vector2dF> velocities;
333     velocities.push_back(gfx::Vector2dF(vx, vy));
334     MultiFingerSwipe(velocities);
335   }
336
337   void TwoFingerSwipe(float vx0, float vy0, float vx1, float vy1) {
338     std::vector<gfx::Vector2dF> velocities;
339     velocities.push_back(gfx::Vector2dF(vx0, vy0));
340     velocities.push_back(gfx::Vector2dF(vx1, vy1));
341     MultiFingerSwipe(velocities);
342   }
343
344   void ThreeFingerSwipe(float vx0,
345                         float vy0,
346                         float vx1,
347                         float vy1,
348                         float vx2,
349                         float vy2) {
350     std::vector<gfx::Vector2dF> velocities;
351     velocities.push_back(gfx::Vector2dF(vx0, vy0));
352     velocities.push_back(gfx::Vector2dF(vx1, vy1));
353     velocities.push_back(gfx::Vector2dF(vx2, vy2));
354     MultiFingerSwipe(velocities);
355   }
356
357   void MultiFingerSwipe(std::vector<gfx::Vector2dF> velocities) {
358     ASSERT_GT(velocities.size(), 0U);
359
360     base::TimeTicks event_time = base::TimeTicks::Now();
361
362     std::vector<gfx::PointF> positions(velocities.size());
363     for (size_t i = 0; i < positions.size(); ++i)
364       positions[i] = gfx::PointF(kFakeCoordX * (i + 1), kFakeCoordY * (i + 1));
365
366     float dt = kDeltaTimeForFlingSequences.InSecondsF();
367
368     // Each pointer down should be a separate event.
369     for (size_t i = 0; i < positions.size(); ++i) {
370       const size_t pointer_count = i + 1;
371       std::vector<gfx::PointF> event_positions(pointer_count);
372       event_positions.assign(positions.begin(),
373                              positions.begin() + pointer_count);
374       MockMotionEvent event =
375           ObtainMotionEvent(event_time,
376                             pointer_count > 1 ? MotionEvent::ACTION_POINTER_DOWN
377                                               : MotionEvent::ACTION_DOWN,
378                             event_positions);
379       EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
380     }
381
382     for (size_t i = 0; i < positions.size(); ++i)
383       positions[i] += gfx::ScaleVector2d(velocities[i], dt);
384     MockMotionEvent event =
385         ObtainMotionEvent(event_time + kDeltaTimeForFlingSequences,
386                           MotionEvent::ACTION_MOVE,
387                           positions);
388     EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
389
390     for (size_t i = 0; i < positions.size(); ++i)
391       positions[i] += gfx::ScaleVector2d(velocities[i], dt);
392     event = ObtainMotionEvent(event_time + 2 * kDeltaTimeForFlingSequences,
393                               MotionEvent::ACTION_MOVE,
394                               positions);
395     EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
396
397     event = ObtainMotionEvent(event_time + 2 * kDeltaTimeForFlingSequences,
398                               MotionEvent::ACTION_POINTER_UP,
399                               positions);
400     EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
401   }
402
403   static void RunTasksAndWait(base::TimeDelta delay) {
404     base::MessageLoop::current()->PostDelayedTask(
405         FROM_HERE, base::MessageLoop::QuitClosure(), delay);
406     base::MessageLoop::current()->Run();
407   }
408
409   std::vector<GestureEventData> gestures_;
410   scoped_ptr<GestureProvider> gesture_provider_;
411   scoped_ptr<GestureEventData> active_scroll_begin_event_;
412   base::MessageLoopForUI message_loop_;
413 };
414
415 // Verify that a DOWN followed shortly by an UP will trigger a single tap.
416 TEST_F(GestureProviderTest, GestureTap) {
417   base::TimeTicks event_time = base::TimeTicks::Now();
418   int motion_event_id = 0;
419   int motion_event_flags = EF_CONTROL_DOWN | EF_ALT_DOWN;
420
421   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false);
422
423   MockMotionEvent event =
424       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
425   event.SetToolType(0, MotionEvent::TOOL_TYPE_FINGER);
426   event.set_id(++motion_event_id);
427   event.set_flags(motion_event_flags);
428
429   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
430   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
431   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
432   EXPECT_EQ(event.GetToolType(0),
433             GetMostRecentGestureEvent().primary_tool_type);
434   EXPECT_EQ(motion_event_flags, GetMostRecentGestureEvent().flags);
435   EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
436             GetMostRecentGestureEvent().details.bounding_box());
437
438   event = ObtainMotionEvent(event_time + kOneMicrosecond,
439                             MotionEvent::ACTION_UP);
440   event.SetToolType(0, MotionEvent::TOOL_TYPE_FINGER);
441   event.set_id(++motion_event_id);
442   event.set_flags(motion_event_flags);
443
444   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
445   EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType());
446   // Ensure tap details have been set.
447   EXPECT_EQ(1, GetMostRecentGestureEvent().details.tap_count());
448   EXPECT_EQ(event.GetToolType(0),
449             GetMostRecentGestureEvent().primary_tool_type);
450   EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
451   EXPECT_EQ(motion_event_flags, GetMostRecentGestureEvent().flags);
452   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
453   EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
454             GetMostRecentGestureEvent().details.bounding_box());
455 }
456
457 // Verify that a DOWN followed shortly by an UP will trigger
458 // a ET_GESTURE_TAP_UNCONFIRMED event if double-tap is enabled.
459 TEST_F(GestureProviderTest, GestureTapWithDelay) {
460   base::TimeTicks event_time = base::TimeTicks::Now();
461   int motion_event_id = 0;
462   int motion_event_flags = EF_CONTROL_DOWN | EF_ALT_DOWN | EF_CAPS_LOCK_DOWN;
463
464   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true);
465
466   MockMotionEvent event =
467       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
468   event.set_id(++motion_event_id);
469   event.set_flags(motion_event_flags);
470
471   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
472   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
473   EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
474   EXPECT_EQ(motion_event_flags, GetMostRecentGestureEvent().flags);
475   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
476   EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
477             GetMostRecentGestureEvent().details.bounding_box());
478
479   event = ObtainMotionEvent(event_time + kOneMicrosecond,
480                             MotionEvent::ACTION_UP);
481   event.set_id(++motion_event_id);
482   event.set_flags(motion_event_flags);
483
484   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
485   EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType());
486   // Ensure tap details have been set.
487   EXPECT_EQ(1, GetMostRecentGestureEvent().details.tap_count());
488   EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
489   EXPECT_EQ(motion_event_flags, GetMostRecentGestureEvent().flags);
490   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
491   EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
492             GetMostRecentGestureEvent().details.bounding_box());
493
494   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_TAP));
495   RunTasksAndWait(GetDoubleTapTimeout());
496   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_TAP));
497 }
498
499 // Verify that a DOWN followed by a MOVE will trigger fling (but not LONG).
500 TEST_F(GestureProviderTest, GestureFlingAndCancelLongPress) {
501   base::TimeTicks event_time = TimeTicks::Now();
502   base::TimeDelta delta_time = kDeltaTimeForFlingSequences;
503   int motion_event_id = 0;
504   int motion_event_flags = EF_ALT_DOWN;
505
506   MockMotionEvent event =
507       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
508   event.set_id(++motion_event_id);
509   event.set_flags(motion_event_flags);
510
511   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
512   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
513   EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
514   EXPECT_EQ(motion_event_flags, GetMostRecentGestureEvent().flags);
515   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
516
517   event = ObtainMotionEvent(event_time + delta_time,
518                             MotionEvent::ACTION_MOVE,
519                             kFakeCoordX * 10,
520                             kFakeCoordY * 10);
521   event.set_id(++motion_event_id);
522   event.set_flags(motion_event_flags);
523   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
524
525   event = ObtainMotionEvent(event_time + delta_time * 2,
526                             MotionEvent::ACTION_UP,
527                             kFakeCoordX * 10,
528                             kFakeCoordY * 10);
529   event.set_id(++motion_event_id);
530   event.set_flags(motion_event_flags);
531
532   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
533   EXPECT_EQ(ET_SCROLL_FLING_START, GetMostRecentGestureEventType());
534   EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
535   EXPECT_EQ(motion_event_flags, GetMostRecentGestureEvent().flags);
536   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
537   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_LONG_PRESS));
538   EXPECT_EQ(
539       BoundsForSingleMockTouchAtLocation(kFakeCoordX * 10, kFakeCoordY * 10),
540       GetMostRecentGestureEvent().details.bounding_box());
541 }
542
543 // Verify that for a normal scroll the following events are sent:
544 // - ET_GESTURE_SCROLL_BEGIN
545 // - ET_GESTURE_SCROLL_UPDATE
546 // - ET_GESTURE_SCROLL_END
547 TEST_F(GestureProviderTest, ScrollEventActionUpSequence) {
548   CheckScrollEventSequenceForEndActionType(MotionEvent::ACTION_UP);
549 }
550
551 // Verify that for a cancelled scroll the following events are sent:
552 // - ET_GESTURE_SCROLL_BEGIN
553 // - ET_GESTURE_SCROLL_UPDATE
554 // - ET_GESTURE_SCROLL_END
555 TEST_F(GestureProviderTest, ScrollEventActionCancelSequence) {
556   CheckScrollEventSequenceForEndActionType(MotionEvent::ACTION_CANCEL);
557 }
558
559 // Verify that for a normal fling (fling after scroll) the following events are
560 // sent:
561 // - ET_GESTURE_SCROLL_BEGIN
562 // - ET_SCROLL_FLING_START
563 TEST_F(GestureProviderTest, FlingEventSequence) {
564   base::TimeTicks event_time = base::TimeTicks::Now();
565   base::TimeDelta delta_time = kDeltaTimeForFlingSequences;
566   int motion_event_id = 0;
567
568   MockMotionEvent event =
569       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
570   event.set_id(++motion_event_id);
571
572   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
573
574   event = ObtainMotionEvent(event_time + delta_time,
575                             MotionEvent::ACTION_MOVE,
576                             kFakeCoordX * 5,
577                             kFakeCoordY * 5);
578   event.set_id(++motion_event_id);
579
580   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
581   EXPECT_TRUE(gesture_provider_->IsScrollInProgress());
582   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
583   EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetMostRecentGestureEventType());
584   EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
585   ASSERT_EQ(3U, GetReceivedGestureCount());
586   ASSERT_EQ(ET_GESTURE_SCROLL_BEGIN, GetReceivedGesture(1).type());
587   EXPECT_EQ(motion_event_id, GetReceivedGesture(1).motion_event_id);
588
589   // We don't want to take a dependency here on exactly how hints are calculated
590   // for a fling (eg. may depend on velocity), so just validate the direction.
591   int hint_x = GetReceivedGesture(1).details.scroll_x_hint();
592   int hint_y = GetReceivedGesture(1).details.scroll_y_hint();
593   EXPECT_TRUE(hint_x > 0 && hint_y > 0 && hint_x > hint_y)
594       << "ScrollBegin hint should be in positive X axis";
595
596   event = ObtainMotionEvent(event_time + delta_time * 2,
597                             MotionEvent::ACTION_UP,
598                             kFakeCoordX * 10,
599                             kFakeCoordY * 10);
600   event.set_id(++motion_event_id);
601
602   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
603   EXPECT_FALSE(gesture_provider_->IsScrollInProgress());
604   EXPECT_EQ(ET_SCROLL_FLING_START, GetMostRecentGestureEventType());
605   EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
606   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
607   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_SCROLL_END));
608   EXPECT_EQ(event_time + delta_time * 2, GetMostRecentGestureEvent().time)
609       << "FlingStart should have the time of the ACTION_UP";
610 }
611
612 TEST_F(GestureProviderTest, GestureCancelledWhenWindowFocusLost) {
613   const base::TimeTicks event_time = TimeTicks::Now();
614
615   MockMotionEvent event =
616       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
617   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
618   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
619
620   RunTasksAndWait(GetLongPressTimeout() + GetShowPressTimeout() +
621                   kOneMicrosecond);
622   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SHOW_PRESS));
623   EXPECT_EQ(ET_GESTURE_LONG_PRESS, GetMostRecentGestureEventType());
624
625   // The long press triggers window focus loss by opening a context menu.
626   EXPECT_TRUE(CancelActiveTouchSequence());
627   EXPECT_FALSE(HasDownEvent());
628
629   // A final ACTION_UP should have no effect.
630   event = ObtainMotionEvent(event_time + kOneMicrosecond * 2,
631                             MotionEvent::ACTION_UP);
632   EXPECT_FALSE(gesture_provider_->OnTouchEvent(event));
633 }
634
635 TEST_F(GestureProviderTest, NoTapAfterScrollBegins) {
636   base::TimeTicks event_time = base::TimeTicks::Now();
637
638   MockMotionEvent event =
639       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
640
641   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
642
643   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
644   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
645   event = ObtainMotionEvent(event_time + kOneMicrosecond,
646                             MotionEvent::ACTION_MOVE,
647                             kFakeCoordX + 50,
648                             kFakeCoordY + 50);
649   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
650   EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetMostRecentGestureEventType());
651
652   event = ObtainMotionEvent(event_time + kOneSecond,
653                             MotionEvent::ACTION_UP,
654                             kFakeCoordX + 50,
655                             kFakeCoordY + 50);
656   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
657   EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType());
658   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_LONG_TAP));
659 }
660
661 TEST_F(GestureProviderTest, DoubleTap) {
662   base::TimeTicks event_time = base::TimeTicks::Now();
663
664   MockMotionEvent event =
665       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
666   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
667
668   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
669   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
670
671   event = ObtainMotionEvent(event_time + kOneMicrosecond,
672                             MotionEvent::ACTION_UP,
673                             kFakeCoordX,
674                             kFakeCoordY);
675   gesture_provider_->OnTouchEvent(event);
676   EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType());
677   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
678
679   event_time += GetValidDoubleTapDelay();
680   event = ObtainMotionEvent(event_time,
681                             MotionEvent::ACTION_DOWN,
682                             kFakeCoordX,
683                             kFakeCoordY);
684   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
685   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
686   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
687
688   // Moving a very small amount of distance should not trigger the double tap
689   // drag zoom mode.
690   event = ObtainMotionEvent(event_time + kOneMicrosecond,
691                             MotionEvent::ACTION_MOVE,
692                             kFakeCoordX,
693                             kFakeCoordY + 1);
694   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
695   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
696   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
697
698   event = ObtainMotionEvent(event_time + kOneMicrosecond * 2,
699                             MotionEvent::ACTION_UP,
700                             kFakeCoordX,
701                             kFakeCoordY + 1);
702   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
703
704   const GestureEventData& double_tap = GetMostRecentGestureEvent();
705   EXPECT_EQ(ET_GESTURE_DOUBLE_TAP, double_tap.type());
706   // Ensure tap details have been set.
707   EXPECT_EQ(10, double_tap.details.bounding_box().width());
708   EXPECT_EQ(10, double_tap.details.bounding_box().height());
709   EXPECT_EQ(1, double_tap.details.tap_count());
710 }
711
712 TEST_F(GestureProviderTest, DoubleTapDragZoomBasic) {
713   const base::TimeTicks down_time_1 = TimeTicks::Now();
714   const base::TimeTicks down_time_2 = down_time_1 + GetValidDoubleTapDelay();
715
716   MockMotionEvent event =
717       ObtainMotionEvent(down_time_1, MotionEvent::ACTION_DOWN);
718   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
719
720   event = ObtainMotionEvent(down_time_1 + kOneMicrosecond,
721                             MotionEvent::ACTION_UP,
722                             kFakeCoordX,
723                             kFakeCoordY);
724   gesture_provider_->OnTouchEvent(event);
725   EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType());
726   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
727
728   event = ObtainMotionEvent(
729       down_time_2, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
730   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
731   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
732   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
733
734   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond,
735                             MotionEvent::ACTION_MOVE,
736                             kFakeCoordX,
737                             kFakeCoordY + 100);
738   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
739   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
740   ASSERT_EQ(ET_GESTURE_PINCH_BEGIN, GetMostRecentGestureEventType());
741   EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY + 100),
742             GetMostRecentGestureEvent().details.bounding_box());
743
744   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 2,
745                             MotionEvent::ACTION_MOVE,
746                             kFakeCoordX,
747                             kFakeCoordY + 200);
748   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
749   ASSERT_EQ(ET_GESTURE_PINCH_UPDATE, GetMostRecentGestureEventType());
750   EXPECT_LT(1.f, GetMostRecentGestureEvent().details.scale());
751   EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY + 200),
752             GetMostRecentGestureEvent().details.bounding_box());
753
754   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 3,
755                             MotionEvent::ACTION_MOVE,
756                             kFakeCoordX,
757                             kFakeCoordY + 100);
758   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
759   ASSERT_EQ(ET_GESTURE_PINCH_UPDATE, GetMostRecentGestureEventType());
760   EXPECT_GT(1.f, GetMostRecentGestureEvent().details.scale());
761   EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY + 100),
762             GetMostRecentGestureEvent().details.bounding_box());
763
764   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 4,
765                             MotionEvent::ACTION_UP,
766                             kFakeCoordX,
767                             kFakeCoordY - 200);
768   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
769   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_PINCH_END));
770   EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType());
771   EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY - 200),
772             GetMostRecentGestureEvent().details.bounding_box());
773 }
774
775 // Generate a scroll gesture and verify that the resulting scroll motion event
776 // has both absolute and relative position information.
777 TEST_F(GestureProviderTest, ScrollUpdateValues) {
778   const float delta_x = 16;
779   const float delta_y = 84;
780   const float raw_offset_x = 17.3f;
781   const float raw_offset_y = 13.7f;
782
783   const base::TimeTicks event_time = TimeTicks::Now();
784
785   MockMotionEvent event =
786       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
787   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
788
789   // Move twice so that we get two ET_GESTURE_SCROLL_UPDATE events and can
790   // compare the relative and absolute coordinates.
791   event = ObtainMotionEvent(event_time + kOneMicrosecond,
792                             MotionEvent::ACTION_MOVE,
793                             kFakeCoordX - delta_x / 2,
794                             kFakeCoordY - delta_y / 2);
795   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
796
797   event = ObtainMotionEvent(event_time + kOneMicrosecond * 2,
798                             MotionEvent::ACTION_MOVE,
799                             kFakeCoordX - delta_x,
800                             kFakeCoordY - delta_y);
801   event.SetRawOffset(raw_offset_x, raw_offset_y);
802   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
803
804   // Make sure the reported gesture event has all the expected details.
805   ASSERT_LT(0U, GetReceivedGestureCount());
806   GestureEventData gesture = GetMostRecentGestureEvent();
807   EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, gesture.type());
808   EXPECT_EQ(event_time + kOneMicrosecond * 2, gesture.time);
809   EXPECT_EQ(kFakeCoordX - delta_x, gesture.x);
810   EXPECT_EQ(kFakeCoordY - delta_y, gesture.y);
811   EXPECT_EQ(kFakeCoordX - delta_x + raw_offset_x, gesture.raw_x);
812   EXPECT_EQ(kFakeCoordY - delta_y + raw_offset_y, gesture.raw_y);
813   EXPECT_EQ(1, gesture.details.touch_points());
814
815   // No horizontal delta because of snapping.
816   EXPECT_EQ(0, gesture.details.scroll_x());
817   EXPECT_EQ(-delta_y / 2, gesture.details.scroll_y());
818 }
819
820 // Verify that fractional scroll deltas are rounded as expected and that
821 // fractional scrolling doesn't break scroll snapping.
822 TEST_F(GestureProviderTest, FractionalScroll) {
823   const float delta_x = 0.4f;
824   const float delta_y = 5.2f;
825
826   const base::TimeTicks event_time = TimeTicks::Now();
827
828   MockMotionEvent event =
829       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
830   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
831
832   // Skip past the touch slop and move back.
833   event = ObtainMotionEvent(event_time,
834                             MotionEvent::ACTION_MOVE,
835                             kFakeCoordX,
836                             kFakeCoordY + 100);
837   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
838   event = ObtainMotionEvent(event_time,
839                             MotionEvent::ACTION_MOVE);
840   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
841
842   // Now move up slowly, mostly vertically but with a (fractional) bit of
843   // horizontal motion.
844   for(int i = 1; i <= 10; i++) {
845     event = ObtainMotionEvent(event_time + kOneMicrosecond * i,
846                               MotionEvent::ACTION_MOVE,
847                               kFakeCoordX + delta_x * i,
848                               kFakeCoordY + delta_y * i);
849     EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
850
851     ASSERT_LT(0U, GetReceivedGestureCount());
852     GestureEventData gesture = GetMostRecentGestureEvent();
853     EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, gesture.type());
854     EXPECT_EQ(event_time + kOneMicrosecond * i, gesture.time);
855     EXPECT_EQ(1, gesture.details.touch_points());
856
857     // Verify that the event co-ordinates are still the precise values we
858     // supplied.
859     EXPECT_EQ(kFakeCoordX + delta_x * i, gesture.x);
860     EXPECT_FLOAT_EQ(kFakeCoordY + delta_y * i, gesture.y);
861
862     // Verify that we're scrolling vertically by the expected amount
863     // (modulo rounding).
864     EXPECT_GE(gesture.details.scroll_y(), (int)delta_y);
865     EXPECT_LE(gesture.details.scroll_y(), ((int)delta_y) + 1);
866
867     // And that there has been no horizontal motion at all.
868     EXPECT_EQ(0, gesture.details.scroll_x());
869   }
870 }
871
872 // Generate a scroll gesture and verify that the resulting scroll begin event
873 // has the expected hint values.
874 TEST_F(GestureProviderTest, ScrollBeginValues) {
875   const float delta_x = 13;
876   const float delta_y = 89;
877
878   const base::TimeTicks event_time = TimeTicks::Now();
879
880   MockMotionEvent event =
881       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
882   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
883
884   // Move twice such that the first event isn't sufficient to start
885   // scrolling on it's own.
886   event = ObtainMotionEvent(event_time + kOneMicrosecond,
887                             MotionEvent::ACTION_MOVE,
888                             kFakeCoordX + 2,
889                             kFakeCoordY + 1);
890   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
891   EXPECT_FALSE(gesture_provider_->IsScrollInProgress());
892
893   event = ObtainMotionEvent(event_time + kOneMicrosecond * 2,
894                             MotionEvent::ACTION_MOVE,
895                             kFakeCoordX + delta_x,
896                             kFakeCoordY + delta_y);
897   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
898   EXPECT_TRUE(gesture_provider_->IsScrollInProgress());
899
900   const GestureEventData* scroll_begin_gesture = GetActiveScrollBeginEvent();
901   ASSERT_TRUE(!!scroll_begin_gesture);
902   EXPECT_EQ(delta_x, scroll_begin_gesture->details.scroll_x_hint());
903   EXPECT_EQ(delta_y, scroll_begin_gesture->details.scroll_y_hint());
904 }
905
906 TEST_F(GestureProviderTest, LongPressAndTapCancelledWhenScrollBegins) {
907   base::TimeTicks event_time = base::TimeTicks::Now();
908
909   MockMotionEvent event =
910       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
911   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
912   event = ObtainMotionEvent(event_time + kOneMicrosecond,
913                             MotionEvent::ACTION_MOVE,
914                             kFakeCoordX * 5,
915                             kFakeCoordY * 5);
916   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
917   event = ObtainMotionEvent(event_time + kOneMicrosecond * 2,
918                             MotionEvent::ACTION_MOVE,
919                             kFakeCoordX * 10,
920                             kFakeCoordY * 10);
921   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
922
923   const base::TimeDelta long_press_timeout =
924       GetLongPressTimeout() + GetShowPressTimeout() + kOneMicrosecond;
925   RunTasksAndWait(long_press_timeout);
926
927   // No LONG_TAP as the LONG_PRESS timer is cancelled.
928   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_LONG_PRESS));
929   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_LONG_TAP));
930 }
931
932 // Verify that LONG_TAP is triggered after LONG_PRESS followed by an UP.
933 TEST_F(GestureProviderTest, GestureLongTap) {
934   base::TimeTicks event_time = base::TimeTicks::Now();
935
936   MockMotionEvent event =
937       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
938   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
939
940   const base::TimeDelta long_press_timeout =
941       GetLongPressTimeout() + GetShowPressTimeout() + kOneMicrosecond;
942   RunTasksAndWait(long_press_timeout);
943
944   EXPECT_EQ(ET_GESTURE_LONG_PRESS, GetMostRecentGestureEventType());
945   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
946   EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
947             GetMostRecentGestureEvent().details.bounding_box());
948
949   event = ObtainMotionEvent(event_time + kOneSecond, MotionEvent::ACTION_UP);
950   gesture_provider_->OnTouchEvent(event);
951   EXPECT_EQ(ET_GESTURE_LONG_TAP, GetMostRecentGestureEventType());
952   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
953   EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
954             GetMostRecentGestureEvent().details.bounding_box());
955 }
956
957 TEST_F(GestureProviderTest, GestureLongPressDoesNotPreventScrolling) {
958   base::TimeTicks event_time = base::TimeTicks::Now();
959
960   MockMotionEvent event =
961       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
962   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
963
964   const base::TimeDelta long_press_timeout =
965       GetLongPressTimeout() + GetShowPressTimeout() + kOneMicrosecond;
966   RunTasksAndWait(long_press_timeout);
967
968   EXPECT_EQ(ET_GESTURE_LONG_PRESS, GetMostRecentGestureEventType());
969   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
970   event = ObtainMotionEvent(event_time + long_press_timeout,
971                             MotionEvent::ACTION_MOVE,
972                             kFakeCoordX + 100,
973                             kFakeCoordY + 100);
974   gesture_provider_->OnTouchEvent(event);
975
976   EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetMostRecentGestureEventType());
977   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
978   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
979
980   event = ObtainMotionEvent(event_time + long_press_timeout,
981                             MotionEvent::ACTION_UP);
982   gesture_provider_->OnTouchEvent(event);
983   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_LONG_TAP));
984 }
985
986 TEST_F(GestureProviderTest, NoGestureLongPressDuringDoubleTap) {
987   base::TimeTicks event_time = base::TimeTicks::Now();
988   int motion_event_id = 0;
989
990   MockMotionEvent event = ObtainMotionEvent(
991       event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
992   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
993
994   event = ObtainMotionEvent(event_time + kOneMicrosecond,
995                             MotionEvent::ACTION_UP,
996                             kFakeCoordX,
997                             kFakeCoordY);
998   gesture_provider_->OnTouchEvent(event);
999   EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType());
1000   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1001
1002   event_time += GetValidDoubleTapDelay();
1003   event = ObtainMotionEvent(event_time,
1004                             MotionEvent::ACTION_DOWN,
1005                             kFakeCoordX,
1006                             kFakeCoordY);
1007   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1008   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
1009   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1010   EXPECT_TRUE(gesture_provider_->IsDoubleTapInProgress());
1011
1012   const base::TimeDelta long_press_timeout =
1013       GetLongPressTimeout() + GetShowPressTimeout() + kOneMicrosecond;
1014   RunTasksAndWait(long_press_timeout);
1015   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_LONG_PRESS));
1016
1017   event = ObtainMotionEvent(event_time + long_press_timeout,
1018                             MotionEvent::ACTION_MOVE,
1019                             kFakeCoordX + 20,
1020                             kFakeCoordY + 20);
1021   event.set_id(++motion_event_id);
1022
1023   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1024   EXPECT_EQ(ET_GESTURE_PINCH_BEGIN, GetMostRecentGestureEventType());
1025   EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
1026   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1027   EXPECT_TRUE(gesture_provider_->IsDoubleTapInProgress());
1028
1029   event = ObtainMotionEvent(event_time + long_press_timeout + kOneMicrosecond,
1030                             MotionEvent::ACTION_UP,
1031                             kFakeCoordX,
1032                             kFakeCoordY + 1);
1033   event.set_id(++motion_event_id);
1034   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1035   EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType());
1036   EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
1037   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1038   EXPECT_FALSE(gesture_provider_->IsDoubleTapInProgress());
1039 }
1040
1041 // Verify that the touch slop region is removed from the first scroll delta to
1042 // avoid a jump when starting to scroll.
1043 TEST_F(GestureProviderTest, TouchSlopRemovedFromScroll) {
1044   const float touch_slop = GetTouchSlop();
1045   const float scroll_delta = 5;
1046
1047   base::TimeTicks event_time = base::TimeTicks::Now();
1048
1049   MockMotionEvent event =
1050       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
1051   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1052
1053   event = ObtainMotionEvent(event_time + kOneMicrosecond * 2,
1054                             MotionEvent::ACTION_MOVE,
1055                             kFakeCoordX,
1056                             kFakeCoordY + touch_slop + scroll_delta);
1057   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1058
1059   EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetMostRecentGestureEventType());
1060   GestureEventData gesture = GetMostRecentGestureEvent();
1061   EXPECT_EQ(0, gesture.details.scroll_x());
1062   EXPECT_EQ(scroll_delta, gesture.details.scroll_y());
1063   EXPECT_EQ(1, gesture.details.touch_points());
1064 }
1065
1066 // Verify that movement within the touch slop region does not generate a scroll,
1067 // and that the slop region is correct even when using fractional coordinates.
1068 TEST_F(GestureProviderTest, NoScrollWithinTouchSlop) {
1069   const float touch_slop = GetTouchSlop();
1070   const float scale_factor = 2.5f;
1071   const int touch_slop_pixels = static_cast<int>(scale_factor * touch_slop);
1072
1073   base::TimeTicks event_time = base::TimeTicks::Now();
1074
1075   MockMotionEvent event =
1076       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
1077   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1078
1079   event = ObtainMotionEvent(event_time + kOneMicrosecond * 2,
1080                             MotionEvent::ACTION_MOVE,
1081                             kFakeCoordX + touch_slop_pixels / scale_factor,
1082                             kFakeCoordY);
1083   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1084   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
1085
1086   event = ObtainMotionEvent(event_time + kOneMicrosecond * 2,
1087                             MotionEvent::ACTION_MOVE,
1088                             kFakeCoordX,
1089                             kFakeCoordY + touch_slop_pixels / scale_factor);
1090   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1091   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
1092
1093   event = ObtainMotionEvent(event_time + kOneMicrosecond * 2,
1094                             MotionEvent::ACTION_MOVE,
1095                             kFakeCoordX - touch_slop_pixels / scale_factor,
1096                             kFakeCoordY);
1097   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1098   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
1099
1100   event = ObtainMotionEvent(event_time + kOneMicrosecond * 2,
1101                             MotionEvent::ACTION_MOVE,
1102                             kFakeCoordX,
1103                             kFakeCoordY - touch_slop_pixels / scale_factor);
1104   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1105   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
1106
1107   event =
1108       ObtainMotionEvent(event_time + kOneMicrosecond * 2,
1109                         MotionEvent::ACTION_MOVE,
1110                         kFakeCoordX,
1111                         kFakeCoordY + (touch_slop_pixels + 1.f) / scale_factor);
1112   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1113   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
1114 }
1115
1116 TEST_F(GestureProviderTest, NoDoubleTapWhenTooRapid) {
1117   base::TimeTicks event_time = base::TimeTicks::Now();
1118
1119   MockMotionEvent event =
1120       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
1121   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1122
1123   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
1124   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1125
1126   event = ObtainMotionEvent(event_time + kOneMicrosecond,
1127                             MotionEvent::ACTION_UP,
1128                             kFakeCoordX,
1129                             kFakeCoordY);
1130   gesture_provider_->OnTouchEvent(event);
1131   EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType());
1132   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1133
1134   // If the second tap follows the first in too short a time span, no double-tap
1135   // will occur.
1136   event_time += (GetDoubleTapMinTime() / 2);
1137   event = ObtainMotionEvent(event_time,
1138                             MotionEvent::ACTION_DOWN,
1139                             kFakeCoordX,
1140                             kFakeCoordY);
1141   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1142   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
1143   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1144
1145   event = ObtainMotionEvent(event_time + kOneMicrosecond,
1146                             MotionEvent::ACTION_UP,
1147                             kFakeCoordX,
1148                             kFakeCoordY);
1149   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1150   EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType());
1151 }
1152
1153 TEST_F(GestureProviderTest, NoDoubleTapWhenExplicitlyDisabled) {
1154   // Ensure that double-tap gestures can be disabled.
1155   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false);
1156
1157   base::TimeTicks event_time = base::TimeTicks::Now();
1158   MockMotionEvent event = ObtainMotionEvent(
1159       event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
1160   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1161   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
1162
1163   event = ObtainMotionEvent(event_time + kOneMicrosecond,
1164                             MotionEvent::ACTION_UP,
1165                             kFakeCoordX,
1166                             kFakeCoordY);
1167   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1168   EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType());
1169
1170   event_time += GetValidDoubleTapDelay();
1171   event = ObtainMotionEvent(event_time,
1172                             MotionEvent::ACTION_DOWN,
1173                             kFakeCoordX,
1174                             kFakeCoordY);
1175   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1176   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
1177
1178   event = ObtainMotionEvent(event_time + kOneMicrosecond,
1179                             MotionEvent::ACTION_UP,
1180                             kFakeCoordX,
1181                             kFakeCoordY);
1182   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1183   EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType());
1184
1185   // Ensure that double-tap gestures can be interrupted.
1186   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true);
1187
1188   event_time = base::TimeTicks::Now();
1189   event = ObtainMotionEvent(
1190       event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
1191   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1192   EXPECT_EQ(5U, GetReceivedGestureCount());
1193
1194   event = ObtainMotionEvent(event_time + kOneMicrosecond,
1195                             MotionEvent::ACTION_UP,
1196                             kFakeCoordX,
1197                             kFakeCoordY);
1198   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1199   EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType());
1200
1201   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false);
1202   EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType());
1203
1204   // Ensure that double-tap gestures can be resumed.
1205   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true);
1206
1207   event_time += GetValidDoubleTapDelay();
1208   event = ObtainMotionEvent(event_time,
1209                             MotionEvent::ACTION_DOWN,
1210                             kFakeCoordX,
1211                             kFakeCoordY);
1212   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1213   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
1214
1215   event = ObtainMotionEvent(event_time + kOneMicrosecond,
1216                             MotionEvent::ACTION_UP,
1217                             kFakeCoordX,
1218                             kFakeCoordY);
1219   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1220   EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType());
1221
1222   event_time += GetValidDoubleTapDelay();
1223   event = ObtainMotionEvent(event_time,
1224                             MotionEvent::ACTION_DOWN,
1225                             kFakeCoordX,
1226                             kFakeCoordY);
1227   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1228   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
1229
1230   event = ObtainMotionEvent(event_time + kOneMicrosecond,
1231                             MotionEvent::ACTION_UP,
1232                             kFakeCoordX,
1233                             kFakeCoordY);
1234   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1235   EXPECT_EQ(ET_GESTURE_DOUBLE_TAP, GetMostRecentGestureEventType());
1236 }
1237
1238 TEST_F(GestureProviderTest, NoDelayedTapWhenDoubleTapSupportToggled) {
1239   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true);
1240
1241   base::TimeTicks event_time = base::TimeTicks::Now();
1242   MockMotionEvent event = ObtainMotionEvent(
1243       event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
1244   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1245   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
1246   EXPECT_EQ(1U, GetReceivedGestureCount());
1247
1248   event = ObtainMotionEvent(event_time + kOneMicrosecond,
1249                             MotionEvent::ACTION_UP,
1250                             kFakeCoordX,
1251                             kFakeCoordY);
1252   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1253   EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType());
1254   EXPECT_EQ(2U, GetReceivedGestureCount());
1255
1256   // Disabling double-tap during the tap timeout should flush the delayed tap.
1257   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false);
1258   EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType());
1259   EXPECT_EQ(3U, GetReceivedGestureCount());
1260
1261   // No further timeout gestures should arrive.
1262   const base::TimeDelta long_press_timeout =
1263       GetLongPressTimeout() + GetShowPressTimeout() + kOneMicrosecond;
1264   RunTasksAndWait(long_press_timeout);
1265   EXPECT_EQ(3U, GetReceivedGestureCount());
1266 }
1267
1268 TEST_F(GestureProviderTest, NoDoubleTapDragZoomWhenDisabledOnPlatform) {
1269   const base::TimeTicks down_time_1 = TimeTicks::Now();
1270   const base::TimeTicks down_time_2 = down_time_1 + GetValidDoubleTapDelay();
1271
1272   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false);
1273
1274   MockMotionEvent event =
1275       ObtainMotionEvent(down_time_1, MotionEvent::ACTION_DOWN);
1276   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1277
1278   event = ObtainMotionEvent(down_time_1 + kOneMicrosecond,
1279                             MotionEvent::ACTION_UP,
1280                             kFakeCoordX,
1281                             kFakeCoordY);
1282   gesture_provider_->OnTouchEvent(event);
1283
1284   event = ObtainMotionEvent(
1285       down_time_2, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
1286   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1287
1288   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond,
1289                             MotionEvent::ACTION_MOVE,
1290                             kFakeCoordX,
1291                             kFakeCoordY + 100);
1292
1293   // The move should become a scroll, as doubletap drag zoom is disabled.
1294   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1295   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
1296   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_PINCH_BEGIN));
1297
1298   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 2,
1299                             MotionEvent::ACTION_MOVE,
1300                             kFakeCoordX,
1301                             kFakeCoordY + 200);
1302   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1303   EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetMostRecentGestureEventType());
1304   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1305   EXPECT_EQ(down_time_2 + kOneMicrosecond * 2,
1306             GetMostRecentGestureEvent().time);
1307   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_PINCH_UPDATE));
1308
1309   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 3,
1310                             MotionEvent::ACTION_UP,
1311                             kFakeCoordX,
1312                             kFakeCoordY + 200);
1313   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1314   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_PINCH_END));
1315 }
1316
1317 // Verify that double tap drag zoom feature is not invoked when the gesture
1318 // handler is told to disable double tap gesture detection.
1319 // The second tap sequence should be treated just as the first would be.
1320 TEST_F(GestureProviderTest, NoDoubleTapDragZoomWhenDisabledOnPage) {
1321   const base::TimeTicks down_time_1 = TimeTicks::Now();
1322   const base::TimeTicks down_time_2 = down_time_1 + GetValidDoubleTapDelay();
1323
1324   gesture_provider_->SetDoubleTapSupportForPageEnabled(false);
1325
1326   MockMotionEvent event =
1327       ObtainMotionEvent(down_time_1, MotionEvent::ACTION_DOWN);
1328   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1329
1330   event = ObtainMotionEvent(down_time_1 + kOneMicrosecond,
1331                             MotionEvent::ACTION_UP,
1332                             kFakeCoordX,
1333                             kFakeCoordY);
1334   gesture_provider_->OnTouchEvent(event);
1335
1336   event = ObtainMotionEvent(
1337       down_time_2, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
1338   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1339
1340   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond,
1341                             MotionEvent::ACTION_MOVE,
1342                             kFakeCoordX,
1343                             kFakeCoordY + 100);
1344
1345   // The move should become a scroll, as double tap drag zoom is disabled.
1346   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1347   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
1348   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_PINCH_BEGIN));
1349
1350   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 2,
1351                             MotionEvent::ACTION_MOVE,
1352                             kFakeCoordX,
1353                             kFakeCoordY + 200);
1354   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1355   EXPECT_EQ(ET_GESTURE_SCROLL_UPDATE, GetMostRecentGestureEventType());
1356   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1357   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_PINCH_UPDATE));
1358
1359   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 3,
1360                             MotionEvent::ACTION_UP,
1361                             kFakeCoordX,
1362                             kFakeCoordY + 200);
1363   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1364   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_PINCH_END));
1365 }
1366
1367 // Verify that updating double tap support during a double tap drag zoom
1368 // disables double tap detection after the gesture has ended.
1369 TEST_F(GestureProviderTest, FixedPageScaleDuringDoubleTapDragZoom) {
1370   base::TimeTicks down_time_1 = TimeTicks::Now();
1371   base::TimeTicks down_time_2 = down_time_1 + GetValidDoubleTapDelay();
1372
1373   gesture_provider_->SetDoubleTapSupportForPageEnabled(true);
1374   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true);
1375
1376   // Start a double-tap drag gesture.
1377   MockMotionEvent event =
1378       ObtainMotionEvent(down_time_1, MotionEvent::ACTION_DOWN);
1379   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1380   event = ObtainMotionEvent(down_time_1 + kOneMicrosecond,
1381                             MotionEvent::ACTION_UP,
1382                             kFakeCoordX,
1383                             kFakeCoordY);
1384   gesture_provider_->OnTouchEvent(event);
1385   event = ObtainMotionEvent(
1386       down_time_2, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
1387   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1388   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond,
1389                             MotionEvent::ACTION_MOVE,
1390                             kFakeCoordX,
1391                             kFakeCoordY + 100);
1392   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1393   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
1394   EXPECT_EQ(ET_GESTURE_PINCH_BEGIN, GetMostRecentGestureEventType());
1395   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1396
1397   // Simulate setting a fixed page scale (or a mobile viewport);
1398   // this should not disrupt the current double-tap gesture.
1399   gesture_provider_->SetDoubleTapSupportForPageEnabled(false);
1400
1401   // Double tap zoom updates should continue.
1402   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 2,
1403                             MotionEvent::ACTION_MOVE,
1404                             kFakeCoordX,
1405                             kFakeCoordY + 200);
1406   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1407   EXPECT_EQ(ET_GESTURE_PINCH_UPDATE, GetMostRecentGestureEventType());
1408   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1409   EXPECT_LT(1.f, GetMostRecentGestureEvent().details.scale());
1410   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 3,
1411                             MotionEvent::ACTION_UP,
1412                             kFakeCoordX,
1413                             kFakeCoordY + 200);
1414   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1415   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_PINCH_END));
1416   EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType());
1417   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1418
1419   // The double-tap gesture has finished, but the page scale is fixed.
1420   // The same event sequence should not generate any double tap getsures.
1421   gestures_.clear();
1422   down_time_1 += kOneMicrosecond * 40;
1423   down_time_2 += kOneMicrosecond * 40;
1424
1425   // Start a double-tap drag gesture.
1426   event = ObtainMotionEvent(down_time_1, MotionEvent::ACTION_DOWN);
1427   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1428   event = ObtainMotionEvent(down_time_1 + kOneMicrosecond,
1429                             MotionEvent::ACTION_UP,
1430                             kFakeCoordX,
1431                             kFakeCoordY);
1432   gesture_provider_->OnTouchEvent(event);
1433   event = ObtainMotionEvent(
1434       down_time_2, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
1435   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1436   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond,
1437                             MotionEvent::ACTION_MOVE,
1438                             kFakeCoordX,
1439                             kFakeCoordY + 100);
1440   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1441   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
1442   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_PINCH_BEGIN));
1443
1444   // Double tap zoom updates should not be sent.
1445   // Instead, the second tap drag becomes a scroll gesture sequence.
1446   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 2,
1447                             MotionEvent::ACTION_MOVE,
1448                             kFakeCoordX,
1449                             kFakeCoordY + 200);
1450   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1451   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_UPDATE));
1452   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_PINCH_UPDATE));
1453   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 3,
1454                             MotionEvent::ACTION_UP,
1455                             kFakeCoordX,
1456                             kFakeCoordY + 200);
1457   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1458   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_PINCH_END));
1459 }
1460
1461 // Verify that pinch zoom sends the proper event sequence.
1462 TEST_F(GestureProviderTest, PinchZoom) {
1463   base::TimeTicks event_time = base::TimeTicks::Now();
1464   const float touch_slop = GetTouchSlop();
1465   const float raw_offset_x = 3.2f;
1466   const float raw_offset_y = 4.3f;
1467   int motion_event_id = 0;
1468
1469   gesture_provider_->SetDoubleTapSupportForPageEnabled(false);
1470   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true);
1471   gesture_provider_->SetMultiTouchZoomSupportEnabled(true);
1472
1473   int secondary_coord_x = kFakeCoordX + 20 * touch_slop;
1474   int secondary_coord_y = kFakeCoordY + 20 * touch_slop;
1475
1476   MockMotionEvent event =
1477       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
1478   event.set_id(++motion_event_id);
1479   event.SetRawOffset(raw_offset_x, raw_offset_y);
1480   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1481   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
1482   EXPECT_EQ(kFakeCoordX, GetMostRecentGestureEvent().x);
1483   EXPECT_EQ(kFakeCoordY, GetMostRecentGestureEvent().y);
1484   EXPECT_EQ(kFakeCoordX + raw_offset_x, GetMostRecentGestureEvent().raw_x);
1485   EXPECT_EQ(kFakeCoordY + raw_offset_y, GetMostRecentGestureEvent().raw_y);
1486   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1487   EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
1488             GetMostRecentGestureEvent().details.bounding_box());
1489
1490   // Toggling double-tap support should not take effect until the next sequence.
1491   gesture_provider_->SetDoubleTapSupportForPageEnabled(true);
1492
1493   event = ObtainMotionEvent(event_time,
1494                             MotionEvent::ACTION_POINTER_DOWN,
1495                             kFakeCoordX,
1496                             kFakeCoordY,
1497                             secondary_coord_x,
1498                             secondary_coord_y);
1499   event.set_id(++motion_event_id);
1500   event.SetRawOffset(raw_offset_x, raw_offset_y);
1501
1502   gesture_provider_->OnTouchEvent(event);
1503   EXPECT_EQ(1U, GetReceivedGestureCount());
1504   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1505   EXPECT_EQ(BoundsForSingleMockTouchAtLocation(kFakeCoordX, kFakeCoordY),
1506             GetMostRecentGestureEvent().details.bounding_box());
1507
1508   secondary_coord_x += 5 * touch_slop;
1509   secondary_coord_y += 5 * touch_slop;
1510   event = ObtainMotionEvent(event_time,
1511                             MotionEvent::ACTION_MOVE,
1512                             kFakeCoordX,
1513                             kFakeCoordY,
1514                             secondary_coord_x,
1515                             secondary_coord_y);
1516   event.set_id(++motion_event_id);
1517   event.SetRawOffset(raw_offset_x, raw_offset_y);
1518
1519   // Toggling double-tap support should not take effect until the next sequence.
1520   gesture_provider_->SetDoubleTapSupportForPageEnabled(false);
1521
1522   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1523   EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
1524   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
1525   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_PINCH_BEGIN));
1526   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
1527   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_UPDATE));
1528
1529   EXPECT_EQ((kFakeCoordX + secondary_coord_x) / 2, GetReceivedGesture(3).x);
1530   EXPECT_EQ((kFakeCoordY + secondary_coord_y) / 2, GetReceivedGesture(3).y);
1531   EXPECT_EQ((kFakeCoordX + secondary_coord_x) / 2 + raw_offset_x,
1532             GetReceivedGesture(3).raw_x);
1533   EXPECT_EQ((kFakeCoordY + secondary_coord_y) / 2 + raw_offset_y,
1534             GetReceivedGesture(3).raw_y);
1535
1536   EXPECT_EQ(
1537       gfx::RectF(kFakeCoordX - kMockTouchRadius,
1538                  kFakeCoordY - kMockTouchRadius,
1539                  secondary_coord_x - kFakeCoordX + kMockTouchRadius * 2,
1540                  secondary_coord_y - kFakeCoordY + kMockTouchRadius * 2),
1541       GetMostRecentGestureEvent().details.bounding_box());
1542
1543   secondary_coord_x += 2 * touch_slop;
1544   secondary_coord_y += 2 * touch_slop;
1545   event = ObtainMotionEvent(event_time,
1546                             MotionEvent::ACTION_MOVE,
1547                             kFakeCoordX,
1548                             kFakeCoordY,
1549                             secondary_coord_x,
1550                             secondary_coord_y);
1551   event.set_id(++motion_event_id);
1552
1553   // Toggling double-tap support should not take effect until the next sequence.
1554   gesture_provider_->SetDoubleTapSupportForPageEnabled(true);
1555
1556   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1557   EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
1558   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_UPDATE));
1559   EXPECT_EQ(ET_GESTURE_PINCH_UPDATE, GetMostRecentGestureEventType());
1560   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
1561   EXPECT_LT(1.f, GetMostRecentGestureEvent().details.scale());
1562   EXPECT_EQ(
1563       gfx::RectF(kFakeCoordX - kMockTouchRadius,
1564                  kFakeCoordY - kMockTouchRadius,
1565                  secondary_coord_x - kFakeCoordX + kMockTouchRadius * 2,
1566                  secondary_coord_y - kFakeCoordY + kMockTouchRadius * 2),
1567       GetMostRecentGestureEvent().details.bounding_box());
1568
1569   event = ObtainMotionEvent(event_time,
1570                             MotionEvent::ACTION_POINTER_UP,
1571                             kFakeCoordX,
1572                             kFakeCoordY,
1573                             secondary_coord_x,
1574                             secondary_coord_y);
1575   event.set_id(++motion_event_id);
1576
1577   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1578   EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
1579   EXPECT_EQ(ET_GESTURE_PINCH_END, GetMostRecentGestureEventType());
1580   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
1581   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_SCROLL_END));
1582   EXPECT_EQ(
1583       gfx::RectF(kFakeCoordX - kMockTouchRadius,
1584                  kFakeCoordY - kMockTouchRadius,
1585                  secondary_coord_x - kFakeCoordX + kMockTouchRadius * 2,
1586                  secondary_coord_y - kFakeCoordY + kMockTouchRadius * 2),
1587       GetMostRecentGestureEvent().details.bounding_box());
1588
1589   event = ObtainMotionEvent(event_time, MotionEvent::ACTION_UP);
1590   gesture_provider_->OnTouchEvent(event);
1591   EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType());
1592   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1593   EXPECT_EQ(gfx::RectF(kFakeCoordX - kMockTouchRadius,
1594                        kFakeCoordY - kMockTouchRadius,
1595                        kMockTouchRadius * 2,
1596                        kMockTouchRadius * 2),
1597             GetMostRecentGestureEvent().details.bounding_box());
1598 }
1599
1600 // Verify that no accidental pinching occurs if the touch size is large relative
1601 // to the min scaling span when the touch major value is used in scaling.
1602 TEST_F(GestureProviderTest, NoPinchZoomWithFatFinger) {
1603   base::TimeTicks event_time = base::TimeTicks::Now();
1604   const float kFatFingerSize = GetMinScalingSpan() * 3.f;
1605
1606   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false);
1607   gesture_provider_->SetMultiTouchZoomSupportEnabled(true);
1608
1609   MockMotionEvent event =
1610       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
1611   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1612   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
1613   EXPECT_EQ(1U, GetReceivedGestureCount());
1614
1615   event = ObtainMotionEvent(event_time + kOneSecond,
1616                             MotionEvent::ACTION_MOVE);
1617   event.SetTouchMajor(0.1f);
1618   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1619   EXPECT_EQ(1U, GetReceivedGestureCount());
1620
1621   event = ObtainMotionEvent(event_time + kOneSecond * 2,
1622                             MotionEvent::ACTION_MOVE,
1623                             kFakeCoordX + 1.f,
1624                             kFakeCoordY);
1625   event.SetTouchMajor(1.f);
1626   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1627   EXPECT_EQ(1U, GetReceivedGestureCount());
1628
1629   event = ObtainMotionEvent(event_time + kOneSecond * 3,
1630                             MotionEvent::ACTION_MOVE);
1631   event.SetTouchMajor(kFatFingerSize * 3.5f);
1632   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1633   EXPECT_EQ(1U, GetReceivedGestureCount());
1634
1635   event = ObtainMotionEvent(event_time + kOneSecond * 4,
1636                             MotionEvent::ACTION_MOVE);
1637   event.SetTouchMajor(kFatFingerSize * 5.f);
1638   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1639   EXPECT_EQ(1U, GetReceivedGestureCount());
1640
1641   event = ObtainMotionEvent(event_time + kOneSecond * 4,
1642                             MotionEvent::ACTION_MOVE,
1643                             kFakeCoordX + 50.f,
1644                             kFakeCoordY - 25.f);
1645   event.SetTouchMajor(kFatFingerSize * 10.f);
1646   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1647   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_PINCH_BEGIN));
1648
1649   event = ObtainMotionEvent(event_time + kOneSecond * 4,
1650                             MotionEvent::ACTION_MOVE,
1651                             kFakeCoordX + 100.f,
1652                             kFakeCoordY - 50.f);
1653   event.SetTouchMajor(kFatFingerSize * 5.f);
1654   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1655   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_PINCH_BEGIN));
1656 }
1657
1658 // Verify that multi-finger swipe sends the proper event sequence.
1659 TEST_F(GestureProviderTest, MultiFingerSwipe) {
1660   EnableSwipe();
1661   gesture_provider_->SetMultiTouchZoomSupportEnabled(false);
1662   const float min_swipe_velocity = GetMinSwipeVelocity();
1663
1664   // One finger - swipe right
1665   OneFingerSwipe(2 * min_swipe_velocity, 0);
1666   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SWIPE));
1667   EXPECT_TRUE(GetMostRecentGestureEvent().details.swipe_right());
1668   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1669   ResetGestureDetection();
1670
1671   // One finger - swipe left
1672   OneFingerSwipe(-2 * min_swipe_velocity, 0);
1673   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SWIPE));
1674   EXPECT_TRUE(GetMostRecentGestureEvent().details.swipe_left());
1675   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1676   ResetGestureDetection();
1677
1678   // One finger - swipe down
1679   OneFingerSwipe(0, 2 * min_swipe_velocity);
1680   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SWIPE));
1681   EXPECT_TRUE(GetMostRecentGestureEvent().details.swipe_down());
1682   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1683   ResetGestureDetection();
1684
1685   // One finger - swipe up
1686   OneFingerSwipe(0, -2 * min_swipe_velocity);
1687   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SWIPE));
1688   EXPECT_TRUE(GetMostRecentGestureEvent().details.swipe_up());
1689   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1690   ResetGestureDetection();
1691
1692   // Two fingers
1693   // Swipe right.
1694   TwoFingerSwipe(min_swipe_velocity * 2, 0, min_swipe_velocity * 2, 0);
1695   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SWIPE));
1696   EXPECT_TRUE(GetMostRecentGestureEvent().details.swipe_right());
1697   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
1698   ResetGestureDetection();
1699
1700   // Swipe left.
1701   TwoFingerSwipe(-min_swipe_velocity * 2, 0, -min_swipe_velocity * 2, 0);
1702   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SWIPE));
1703   EXPECT_TRUE(GetMostRecentGestureEvent().details.swipe_left());
1704   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
1705   ResetGestureDetection();
1706
1707   // No swipe with different touch directions.
1708   TwoFingerSwipe(min_swipe_velocity * 2, 0, -min_swipe_velocity * 2, 0);
1709   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_SWIPE));
1710   ResetGestureDetection();
1711
1712   // No swipe without a dominant direction.
1713   TwoFingerSwipe(min_swipe_velocity * 2,
1714                  min_swipe_velocity * 2,
1715                  min_swipe_velocity * 2,
1716                  min_swipe_velocity * 2);
1717   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_SWIPE));
1718   ResetGestureDetection();
1719
1720   // Swipe down with non-zero velocities on both axes and dominant direction.
1721   TwoFingerSwipe(-min_swipe_velocity,
1722                  min_swipe_velocity * 4,
1723                  -min_swipe_velocity,
1724                  min_swipe_velocity * 4);
1725   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SWIPE));
1726   EXPECT_TRUE(GetMostRecentGestureEvent().details.swipe_down());
1727   EXPECT_FALSE(GetMostRecentGestureEvent().details.swipe_left());
1728   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
1729   ResetGestureDetection();
1730
1731   // Swipe up with non-zero velocities on both axes.
1732   TwoFingerSwipe(min_swipe_velocity,
1733                  -min_swipe_velocity * 4,
1734                  min_swipe_velocity,
1735                  -min_swipe_velocity * 4);
1736   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SWIPE));
1737   EXPECT_TRUE(GetMostRecentGestureEvent().details.swipe_up());
1738   EXPECT_FALSE(GetMostRecentGestureEvent().details.swipe_right());
1739   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
1740   ResetGestureDetection();
1741
1742   // No swipe without sufficient velocity.
1743   TwoFingerSwipe(min_swipe_velocity / 2, 0, 0, 0);
1744   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_SWIPE));
1745   ResetGestureDetection();
1746
1747   // Swipe up with one small and one medium velocity in slightly different but
1748   // not opposing directions.
1749   TwoFingerSwipe(min_swipe_velocity / 2,
1750                  min_swipe_velocity / 2,
1751                  0,
1752                  min_swipe_velocity * 2);
1753   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SWIPE));
1754   EXPECT_TRUE(GetMostRecentGestureEvent().details.swipe_down());
1755   EXPECT_FALSE(GetMostRecentGestureEvent().details.swipe_right());
1756   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
1757   ResetGestureDetection();
1758
1759   // No swipe in orthogonal directions.
1760   TwoFingerSwipe(min_swipe_velocity * 2, 0, 0, min_swipe_velocity * 7);
1761   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_SWIPE));
1762   ResetGestureDetection();
1763
1764   // Three finger swipe in same directions.
1765   ThreeFingerSwipe(min_swipe_velocity * 2,
1766                    0,
1767                    min_swipe_velocity * 3,
1768                    0,
1769                    min_swipe_velocity * 4,
1770                    0);
1771   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SWIPE));
1772   EXPECT_TRUE(GetMostRecentGestureEvent().details.swipe_right());
1773   EXPECT_EQ(3, GetMostRecentGestureEvent().details.touch_points());
1774   ResetGestureDetection();
1775
1776   // No three finger swipe in different directions.
1777   ThreeFingerSwipe(min_swipe_velocity * 2,
1778                    0,
1779                    0,
1780                    min_swipe_velocity * 3,
1781                    min_swipe_velocity * 4,
1782                    0);
1783   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_SWIPE));
1784 }
1785
1786 // Verify that the timer of LONG_PRESS will be cancelled when scrolling begins
1787 // so LONG_PRESS and LONG_TAP won't be triggered.
1788 TEST_F(GestureProviderTest, GesturesCancelledAfterLongPressCausesLostFocus) {
1789   base::TimeTicks event_time = base::TimeTicks::Now();
1790
1791   MockMotionEvent event =
1792       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
1793   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1794
1795   const base::TimeDelta long_press_timeout =
1796       GetLongPressTimeout() + GetShowPressTimeout() + kOneMicrosecond;
1797   RunTasksAndWait(long_press_timeout);
1798   EXPECT_EQ(ET_GESTURE_LONG_PRESS, GetMostRecentGestureEventType());
1799   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1800
1801   EXPECT_TRUE(CancelActiveTouchSequence());
1802   EXPECT_FALSE(HasDownEvent());
1803
1804   event = ObtainMotionEvent(event_time + long_press_timeout,
1805                             MotionEvent::ACTION_UP);
1806   gesture_provider_->OnTouchEvent(event);
1807   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_LONG_TAP));
1808 }
1809
1810 // Verify that inserting a touch cancel event will trigger proper touch and
1811 // gesture sequence cancellation.
1812 TEST_F(GestureProviderTest, CancelActiveTouchSequence) {
1813   base::TimeTicks event_time = base::TimeTicks::Now();
1814   int motion_event_id = 0;
1815
1816   EXPECT_FALSE(CancelActiveTouchSequence());
1817   EXPECT_EQ(0U, GetReceivedGestureCount());
1818
1819   MockMotionEvent event =
1820       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
1821   event.set_id(++motion_event_id);
1822   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1823   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
1824   EXPECT_EQ(motion_event_id, GetMostRecentGestureEvent().motion_event_id);
1825   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1826
1827   ASSERT_TRUE(CancelActiveTouchSequence());
1828   EXPECT_FALSE(HasDownEvent());
1829
1830   // Subsequent MotionEvent's are dropped until ACTION_DOWN.
1831   event = ObtainMotionEvent(event_time + kOneMicrosecond,
1832                             MotionEvent::ACTION_MOVE);
1833   EXPECT_FALSE(gesture_provider_->OnTouchEvent(event));
1834
1835   event = ObtainMotionEvent(event_time + kOneMicrosecond * 2,
1836                             MotionEvent::ACTION_UP);
1837   EXPECT_FALSE(gesture_provider_->OnTouchEvent(event));
1838
1839   event = ObtainMotionEvent(event_time + kOneMicrosecond * 3,
1840                             MotionEvent::ACTION_DOWN);
1841   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1842   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
1843   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1844 }
1845
1846 TEST_F(GestureProviderTest, DoubleTapDragZoomCancelledOnSecondaryPointerDown) {
1847   const base::TimeTicks down_time_1 = TimeTicks::Now();
1848   const base::TimeTicks down_time_2 = down_time_1 + GetValidDoubleTapDelay();
1849
1850   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true);
1851
1852   MockMotionEvent event =
1853       ObtainMotionEvent(down_time_1, MotionEvent::ACTION_DOWN);
1854   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1855   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
1856   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1857
1858   event =
1859       ObtainMotionEvent(down_time_1 + kOneMicrosecond, MotionEvent::ACTION_UP);
1860   gesture_provider_->OnTouchEvent(event);
1861   EXPECT_EQ(ET_GESTURE_TAP_UNCONFIRMED, GetMostRecentGestureEventType());
1862   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1863
1864   event = ObtainMotionEvent(down_time_2, MotionEvent::ACTION_DOWN);
1865   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1866   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
1867   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1868
1869   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond,
1870                             MotionEvent::ACTION_MOVE,
1871                             kFakeCoordX,
1872                             kFakeCoordY - 30);
1873   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1874   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
1875   EXPECT_EQ(ET_GESTURE_PINCH_BEGIN, GetMostRecentGestureEventType());
1876   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1877
1878   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 2,
1879                             MotionEvent::ACTION_POINTER_DOWN,
1880                             kFakeCoordX,
1881                             kFakeCoordY - 30,
1882                             kFakeCoordX + 50,
1883                             kFakeCoordY + 50);
1884   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1885   EXPECT_EQ(ET_GESTURE_PINCH_END, GetMostRecentGestureEventType());
1886   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
1887
1888   const size_t gesture_count = GetReceivedGestureCount();
1889   event = ObtainMotionEvent(down_time_2 + kOneMicrosecond * 3,
1890                             MotionEvent::ACTION_POINTER_UP,
1891                             kFakeCoordX,
1892                             kFakeCoordY - 30,
1893                             kFakeCoordX + 50,
1894                             kFakeCoordY + 50);
1895   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1896   EXPECT_EQ(gesture_count, GetReceivedGestureCount());
1897
1898   event = ObtainMotionEvent(down_time_2 + kOneSecond,
1899                             MotionEvent::ACTION_UP);
1900   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1901   EXPECT_EQ(gesture_count + 1, GetReceivedGestureCount());
1902   EXPECT_EQ(ET_GESTURE_SCROLL_END, GetMostRecentGestureEventType());
1903   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1904 }
1905
1906 // Verify that gesture begin and gesture end events are dispatched correctly.
1907 TEST_F(GestureProviderTest, GestureBeginAndEnd) {
1908   EnableBeginEndTypes();
1909   base::TimeTicks event_time = base::TimeTicks::Now();
1910   const float raw_offset_x = 7.5f;
1911   const float raw_offset_y = 5.7f;
1912
1913   EXPECT_EQ(0U, GetReceivedGestureCount());
1914   MockMotionEvent event =
1915       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN, 1, 1);
1916   event.SetRawOffset(raw_offset_x, raw_offset_y);
1917   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1918   EXPECT_EQ(ET_GESTURE_BEGIN, GetReceivedGesture(0).type());
1919   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
1920   EXPECT_EQ(2U, GetReceivedGestureCount());
1921   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
1922   EXPECT_EQ(1, GetMostRecentGestureEvent().x);
1923   EXPECT_EQ(1, GetMostRecentGestureEvent().y);
1924   EXPECT_EQ(1 + raw_offset_x, GetMostRecentGestureEvent().raw_x);
1925   EXPECT_EQ(1 + raw_offset_y, GetMostRecentGestureEvent().raw_y);
1926   EXPECT_EQ(gfx::RectF(1 - kMockTouchRadius,
1927                        1 - kMockTouchRadius,
1928                        kMockTouchRadius * 2,
1929                        kMockTouchRadius * 2),
1930             GetMostRecentGestureEvent().details.bounding_box());
1931
1932   event = ObtainMotionEvent(
1933       event_time, MotionEvent::ACTION_POINTER_DOWN, 1, 1, 2, 2);
1934   event.SetRawOffset(raw_offset_x, raw_offset_y);
1935   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1936   EXPECT_EQ(ET_GESTURE_BEGIN, GetMostRecentGestureEventType());
1937   EXPECT_EQ(3U, GetReceivedGestureCount());
1938   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
1939   EXPECT_EQ(2, GetMostRecentGestureEvent().x);
1940   EXPECT_EQ(2, GetMostRecentGestureEvent().y);
1941   EXPECT_EQ(2 + raw_offset_x, GetMostRecentGestureEvent().raw_x);
1942   EXPECT_EQ(2 + raw_offset_y, GetMostRecentGestureEvent().raw_y);
1943
1944   event = ObtainMotionEvent(
1945       event_time, MotionEvent::ACTION_POINTER_DOWN, 1, 1, 2, 2, 3, 3);
1946   event.SetRawOffset(raw_offset_x, raw_offset_y);
1947   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1948   EXPECT_EQ(ET_GESTURE_BEGIN, GetMostRecentGestureEventType());
1949   EXPECT_EQ(4U, GetReceivedGestureCount());
1950   EXPECT_EQ(3, GetMostRecentGestureEvent().details.touch_points());
1951   EXPECT_EQ(3, GetMostRecentGestureEvent().x);
1952   EXPECT_EQ(3, GetMostRecentGestureEvent().y);
1953   EXPECT_EQ(3 + raw_offset_x, GetMostRecentGestureEvent().raw_x);
1954   EXPECT_EQ(3 + raw_offset_y, GetMostRecentGestureEvent().raw_y);
1955
1956   event = ObtainMotionEvent(
1957       event_time, MotionEvent::ACTION_POINTER_UP, 1, 1, 2, 2, 3, 3);
1958   event.SetRawOffset(raw_offset_x, raw_offset_y);
1959   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1960   EXPECT_EQ(ET_GESTURE_END, GetMostRecentGestureEventType());
1961   EXPECT_EQ(5U, GetReceivedGestureCount());
1962   EXPECT_EQ(3, GetMostRecentGestureEvent().details.touch_points());
1963   EXPECT_EQ(1, GetMostRecentGestureEvent().x);
1964   EXPECT_EQ(1, GetMostRecentGestureEvent().y);
1965   EXPECT_EQ(1 + raw_offset_x, GetMostRecentGestureEvent().raw_x);
1966   EXPECT_EQ(1 + raw_offset_y, GetMostRecentGestureEvent().raw_y);
1967
1968   event = ObtainMotionEvent(
1969       event_time, MotionEvent::ACTION_POINTER_DOWN, 2, 2, 3, 3, 4, 4);
1970   event.SetRawOffset(raw_offset_x, raw_offset_y);
1971   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1972   EXPECT_EQ(ET_GESTURE_BEGIN, GetMostRecentGestureEventType());
1973   EXPECT_EQ(6U, GetReceivedGestureCount());
1974   EXPECT_EQ(3, GetMostRecentGestureEvent().details.touch_points());
1975   EXPECT_EQ(4, GetMostRecentGestureEvent().x);
1976   EXPECT_EQ(4, GetMostRecentGestureEvent().y);
1977   EXPECT_EQ(4 + raw_offset_x, GetMostRecentGestureEvent().raw_x);
1978   EXPECT_EQ(4 + raw_offset_y, GetMostRecentGestureEvent().raw_y);
1979
1980   event = ObtainMotionEvent(
1981       event_time, MotionEvent::ACTION_POINTER_UP, 2, 2, 3, 3, 4, 4);
1982   event.SetRawOffset(raw_offset_x, raw_offset_y);
1983   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1984   EXPECT_EQ(ET_GESTURE_END, GetMostRecentGestureEventType());
1985   EXPECT_EQ(7U, GetReceivedGestureCount());
1986   EXPECT_EQ(3, GetMostRecentGestureEvent().details.touch_points());
1987   EXPECT_EQ(2, GetMostRecentGestureEvent().x);
1988   EXPECT_EQ(2, GetMostRecentGestureEvent().y);
1989   EXPECT_EQ(2 + raw_offset_x, GetMostRecentGestureEvent().raw_x);
1990   EXPECT_EQ(2 + raw_offset_y, GetMostRecentGestureEvent().raw_y);
1991
1992   event =
1993       ObtainMotionEvent(event_time, MotionEvent::ACTION_POINTER_UP, 3, 3, 4, 4);
1994   event.SetRawOffset(raw_offset_x, raw_offset_y);
1995   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
1996   EXPECT_EQ(ET_GESTURE_END, GetMostRecentGestureEventType());
1997   EXPECT_EQ(8U, GetReceivedGestureCount());
1998   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
1999   EXPECT_EQ(3, GetMostRecentGestureEvent().x);
2000   EXPECT_EQ(3, GetMostRecentGestureEvent().y);
2001   EXPECT_EQ(3 + raw_offset_x, GetMostRecentGestureEvent().raw_x);
2002   EXPECT_EQ(3 + raw_offset_y, GetMostRecentGestureEvent().raw_y);
2003
2004
2005   event = ObtainMotionEvent(event_time, MotionEvent::ACTION_UP, 4, 4);
2006   event.SetRawOffset(raw_offset_x, raw_offset_y);
2007   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2008   EXPECT_EQ(ET_GESTURE_END, GetMostRecentGestureEventType());
2009   EXPECT_EQ(9U, GetReceivedGestureCount());
2010   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
2011   EXPECT_EQ(4, GetMostRecentGestureEvent().x);
2012   EXPECT_EQ(4, GetMostRecentGestureEvent().y);
2013   EXPECT_EQ(4 + raw_offset_x, GetMostRecentGestureEvent().raw_x);
2014   EXPECT_EQ(4 + raw_offset_y, GetMostRecentGestureEvent().raw_y);
2015 }
2016
2017 // Verify that gesture begin and gesture end events are dispatched correctly
2018 // when an ACTION_CANCEL is received.
2019 TEST_F(GestureProviderTest, GestureBeginAndEndOnCancel) {
2020   EnableBeginEndTypes();
2021   base::TimeTicks event_time = base::TimeTicks::Now();
2022
2023   EXPECT_EQ(0U, GetReceivedGestureCount());
2024   MockMotionEvent event =
2025       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN, 1, 1);
2026   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2027   EXPECT_EQ(ET_GESTURE_BEGIN, GetReceivedGesture(0).type());
2028   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
2029   EXPECT_EQ(2U, GetReceivedGestureCount());
2030   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
2031   EXPECT_EQ(gfx::RectF(1 - kMockTouchRadius,
2032                        1 - kMockTouchRadius,
2033                        kMockTouchRadius * 2,
2034                        kMockTouchRadius * 2),
2035             GetMostRecentGestureEvent().details.bounding_box());
2036   EXPECT_EQ(1, GetMostRecentGestureEvent().x);
2037   EXPECT_EQ(1, GetMostRecentGestureEvent().y);
2038
2039   event = ObtainMotionEvent(
2040       event_time, MotionEvent::ACTION_POINTER_DOWN, 1, 1, 2, 2);
2041   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2042   EXPECT_EQ(ET_GESTURE_BEGIN, GetMostRecentGestureEventType());
2043   EXPECT_EQ(3U, GetReceivedGestureCount());
2044   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
2045   EXPECT_EQ(2, GetMostRecentGestureEvent().x);
2046   EXPECT_EQ(2, GetMostRecentGestureEvent().y);
2047
2048   event = ObtainMotionEvent(
2049       event_time, MotionEvent::ACTION_POINTER_DOWN, 1, 1, 2, 2, 3, 3);
2050   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2051   EXPECT_EQ(ET_GESTURE_BEGIN, GetMostRecentGestureEventType());
2052   EXPECT_EQ(4U, GetReceivedGestureCount());
2053   EXPECT_EQ(3, GetMostRecentGestureEvent().details.touch_points());
2054   EXPECT_EQ(3, GetMostRecentGestureEvent().x);
2055   EXPECT_EQ(3, GetMostRecentGestureEvent().y);
2056
2057   event = ObtainMotionEvent(
2058       event_time, MotionEvent::ACTION_CANCEL, 1, 1, 2, 2, 3, 3);
2059   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2060   EXPECT_EQ(5U, GetReceivedGestureCount());
2061   EXPECT_EQ(3, GetReceivedGesture(4).details.touch_points());
2062   EXPECT_EQ(ET_GESTURE_END, GetReceivedGesture(4).type());
2063   EXPECT_EQ(1, GetMostRecentGestureEvent().x);
2064   EXPECT_EQ(1, GetMostRecentGestureEvent().y);
2065
2066   event = ObtainMotionEvent(
2067       event_time, MotionEvent::ACTION_CANCEL, 1, 1, 3, 3);
2068   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2069   EXPECT_EQ(6U, GetReceivedGestureCount());
2070   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
2071   EXPECT_EQ(ET_GESTURE_END, GetMostRecentGestureEvent().type());
2072   EXPECT_EQ(1, GetMostRecentGestureEvent().x);
2073   EXPECT_EQ(1, GetMostRecentGestureEvent().y);
2074
2075   event = ObtainMotionEvent(
2076       event_time, MotionEvent::ACTION_CANCEL, 3, 3);
2077   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2078   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
2079   EXPECT_EQ(ET_GESTURE_END, GetMostRecentGestureEvent().type());
2080   EXPECT_EQ(3, GetMostRecentGestureEvent().x);
2081   EXPECT_EQ(3, GetMostRecentGestureEvent().y);
2082 }
2083
2084 // Test a simple two finger tap
2085 TEST_F(GestureProviderTest, TwoFingerTap) {
2086   // The time between ACTION_POINTER_DOWN and ACTION_POINTER_UP must be <= the
2087   // two finger tap delay.
2088   EnableTwoFingerTap(kMaxTwoFingerTapSeparation, base::TimeDelta());
2089   const float scaled_touch_slop = GetTouchSlop();
2090
2091   base::TimeTicks event_time = base::TimeTicks::Now();
2092
2093   MockMotionEvent event =
2094       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN, 0, 0);
2095   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2096
2097   event = ObtainMotionEvent(event_time,
2098                             MotionEvent::ACTION_MOVE,
2099                             0,
2100                             scaled_touch_slop / 2);
2101
2102   event = ObtainMotionEvent(event_time,
2103                             MotionEvent::ACTION_POINTER_DOWN,
2104                             0,
2105                             0,
2106                             kMaxTwoFingerTapSeparation / 2,
2107                             0);
2108   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2109
2110   event =
2111       ObtainMotionEvent(event_time,
2112                         MotionEvent::ACTION_MOVE,
2113                         0,
2114                         -scaled_touch_slop / 2,
2115                         kMaxTwoFingerTapSeparation / 2 + scaled_touch_slop / 2,
2116                         0);
2117   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2118
2119   event = ObtainMotionEvent(event_time,
2120                             MotionEvent::ACTION_POINTER_UP,
2121                             0,
2122                             0,
2123                             kMaxTwoFingerTapSeparation,
2124                             0);
2125   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2126
2127   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetReceivedGesture(0).type());
2128   EXPECT_EQ(ET_GESTURE_SCROLL_BEGIN, GetReceivedGesture(1).type());
2129   EXPECT_EQ(ET_GESTURE_TWO_FINGER_TAP, GetReceivedGesture(2).type());
2130   EXPECT_EQ(3U, GetReceivedGestureCount());
2131
2132   EXPECT_EQ(kMockTouchRadius * 2,
2133             GetReceivedGesture(2).details.first_finger_width());
2134   EXPECT_EQ(kMockTouchRadius * 2,
2135             GetReceivedGesture(2).details.first_finger_height());
2136 }
2137
2138 // Test preventing a two finger tap via finger movement.
2139 TEST_F(GestureProviderTest, TwoFingerTapCancelledByFingerMovement) {
2140   EnableTwoFingerTap(kMaxTwoFingerTapSeparation, base::TimeDelta());
2141   const float scaled_touch_slop = GetTouchSlop();
2142   base::TimeTicks event_time = base::TimeTicks::Now();
2143
2144   MockMotionEvent event = ObtainMotionEvent(
2145       event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
2146   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2147
2148   event = ObtainMotionEvent(event_time,
2149                             MotionEvent::ACTION_POINTER_DOWN,
2150                             kFakeCoordX,
2151                             kFakeCoordY,
2152                             kFakeCoordX,
2153                             kFakeCoordY);
2154   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2155
2156   event = ObtainMotionEvent(event_time,
2157                             MotionEvent::ACTION_MOVE,
2158                             kFakeCoordX,
2159                             kFakeCoordY,
2160                             kFakeCoordX + scaled_touch_slop + 0.1,
2161                             kFakeCoordY);
2162   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2163
2164   event = ObtainMotionEvent(event_time,
2165                             MotionEvent::ACTION_POINTER_UP,
2166                             kFakeCoordX,
2167                             kFakeCoordY,
2168                             kFakeCoordX,
2169                             kFakeCoordY);
2170   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2171
2172   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetReceivedGesture(0).type());
2173   EXPECT_EQ(ET_GESTURE_SCROLL_BEGIN, GetReceivedGesture(1).type());
2174   EXPECT_EQ(2U, GetReceivedGestureCount());
2175 }
2176
2177 // Test preventing a two finger tap by waiting too long before releasing the
2178 // secondary pointer.
2179 TEST_F(GestureProviderTest, TwoFingerTapCancelledByDelay) {
2180   base::TimeDelta two_finger_tap_timeout = kOneSecond;
2181   EnableTwoFingerTap(kMaxTwoFingerTapSeparation, two_finger_tap_timeout);
2182   base::TimeTicks event_time = base::TimeTicks::Now();
2183
2184   MockMotionEvent event = ObtainMotionEvent(
2185       event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
2186   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2187
2188   event = ObtainMotionEvent(event_time,
2189                             MotionEvent::ACTION_MOVE,
2190                             kFakeCoordX,
2191                             kFakeCoordY);
2192
2193   event = ObtainMotionEvent(event_time,
2194                             MotionEvent::ACTION_POINTER_DOWN,
2195                             kFakeCoordX,
2196                             kFakeCoordY,
2197                             kFakeCoordX + kMaxTwoFingerTapSeparation / 2,
2198                             kFakeCoordY);
2199   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2200
2201   event = ObtainMotionEvent(event_time + kOneSecond + kOneMicrosecond,
2202                             MotionEvent::ACTION_POINTER_UP,
2203                             kFakeCoordX,
2204                             kFakeCoordY,
2205                             kFakeCoordX + kMaxTwoFingerTapSeparation / 2,
2206                             kFakeCoordY);
2207   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2208
2209   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetReceivedGesture(0).type());
2210   EXPECT_EQ(1U, GetReceivedGestureCount());
2211 }
2212
2213 // Test preventing a two finger tap by pressing the secondary pointer too far
2214 // from the first
2215 TEST_F(GestureProviderTest, TwoFingerTapCancelledByDistanceBetweenPointers) {
2216   EnableTwoFingerTap(kMaxTwoFingerTapSeparation, base::TimeDelta());
2217   base::TimeTicks event_time = base::TimeTicks::Now();
2218
2219   MockMotionEvent event = ObtainMotionEvent(
2220       event_time, MotionEvent::ACTION_DOWN, kFakeCoordX, kFakeCoordY);
2221   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2222
2223   event = ObtainMotionEvent(event_time,
2224                             MotionEvent::ACTION_POINTER_DOWN,
2225                             kFakeCoordX,
2226                             kFakeCoordY,
2227                             kFakeCoordX + kMaxTwoFingerTapSeparation,
2228                             kFakeCoordY);
2229   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2230
2231   event = ObtainMotionEvent(event_time,
2232                             MotionEvent::ACTION_POINTER_UP,
2233                             kFakeCoordX,
2234                             kFakeCoordY,
2235                             kFakeCoordX + kMaxTwoFingerTapSeparation,
2236                             kFakeCoordY);
2237   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2238
2239   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetReceivedGesture(0).type());
2240   EXPECT_EQ(1U, GetReceivedGestureCount());
2241 }
2242
2243 // Verify that pinch zoom only sends updates which exceed the
2244 // min_pinch_update_span_delta.
2245 TEST_F(GestureProviderTest, PinchZoomWithThreshold) {
2246   const float kMinPinchUpdateDistance = 5;
2247
2248   base::TimeTicks event_time = base::TimeTicks::Now();
2249   const float touch_slop = GetTouchSlop();
2250
2251   SetMinPinchUpdateSpanDelta(kMinPinchUpdateDistance);
2252   gesture_provider_->SetDoubleTapSupportForPageEnabled(false);
2253   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(true);
2254   gesture_provider_->SetMultiTouchZoomSupportEnabled(true);
2255
2256   int secondary_coord_x = kFakeCoordX + 20 * touch_slop;
2257   int secondary_coord_y = kFakeCoordY + 20 * touch_slop;
2258
2259   // First finger down.
2260   MockMotionEvent event =
2261       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
2262   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2263   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
2264   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
2265
2266   // Second finger down.
2267   event = ObtainMotionEvent(event_time,
2268                             MotionEvent::ACTION_POINTER_DOWN,
2269                             kFakeCoordX,
2270                             kFakeCoordY,
2271                             secondary_coord_x,
2272                             secondary_coord_y);
2273
2274   gesture_provider_->OnTouchEvent(event);
2275   EXPECT_EQ(1U, GetReceivedGestureCount());
2276   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
2277
2278   // Move second finger.
2279   secondary_coord_x += 5 * touch_slop;
2280   secondary_coord_y += 5 * touch_slop;
2281   event = ObtainMotionEvent(event_time,
2282                             MotionEvent::ACTION_MOVE,
2283                             kFakeCoordX,
2284                             kFakeCoordY,
2285                             secondary_coord_x,
2286                             secondary_coord_y);
2287
2288   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2289   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
2290   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_PINCH_BEGIN));
2291   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_PINCH_UPDATE));
2292   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_BEGIN));
2293   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_SCROLL_UPDATE));
2294
2295   // Small move, shouldn't trigger pinch.
2296   event = ObtainMotionEvent(event_time,
2297                             MotionEvent::ACTION_MOVE,
2298                             kFakeCoordX,
2299                             kFakeCoordY,
2300                             secondary_coord_x + kMinPinchUpdateDistance,
2301                             secondary_coord_y);
2302
2303   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2304   EXPECT_FALSE(HasReceivedGesture(ET_GESTURE_PINCH_UPDATE));
2305   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
2306
2307   // Small move, but combined with the previous move, should trigger pinch. We
2308   // need to overshoot kMinPinchUpdateDistance by a fair bit, as the span
2309   // calculation factors in touch radius.
2310   const float kOvershootMinPinchUpdateDistance = 3;
2311   event = ObtainMotionEvent(event_time,
2312                             MotionEvent::ACTION_MOVE,
2313                             kFakeCoordX,
2314                             kFakeCoordY,
2315                             secondary_coord_x + kMinPinchUpdateDistance +
2316                                 kOvershootMinPinchUpdateDistance,
2317                             secondary_coord_y);
2318
2319   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2320   EXPECT_TRUE(HasReceivedGesture(ET_GESTURE_PINCH_UPDATE));
2321   EXPECT_EQ(2, GetMostRecentGestureEvent().details.touch_points());
2322 }
2323
2324 // Verify that the min gesture bound setting is honored.
2325 TEST_F(GestureProviderTest, MinGestureBoundsLength) {
2326   const float kMinGestureBoundsLength = 10.f * kMockTouchRadius;
2327   SetMinMaxGestureBoundsLength(kMinGestureBoundsLength, 0.f);
2328   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false);
2329
2330   base::TimeTicks event_time = base::TimeTicks::Now();
2331   MockMotionEvent event =
2332       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
2333   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2334
2335   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
2336   EXPECT_EQ(kMinGestureBoundsLength,
2337             GetMostRecentGestureEvent().details.bounding_box_f().width());
2338   EXPECT_EQ(kMinGestureBoundsLength,
2339             GetMostRecentGestureEvent().details.bounding_box_f().height());
2340
2341   event =
2342       ObtainMotionEvent(event_time + kOneMicrosecond, MotionEvent::ACTION_UP);
2343   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2344   EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType());
2345   EXPECT_EQ(kMinGestureBoundsLength,
2346             GetMostRecentGestureEvent().details.bounding_box_f().width());
2347   EXPECT_EQ(kMinGestureBoundsLength,
2348             GetMostRecentGestureEvent().details.bounding_box_f().height());
2349 }
2350
2351 TEST_F(GestureProviderTest, MaxGestureBoundsLength) {
2352   const float kMaxGestureBoundsLength = kMockTouchRadius / 10.f;
2353   SetMinMaxGestureBoundsLength(0.f, kMaxGestureBoundsLength);
2354   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false);
2355
2356   base::TimeTicks event_time = base::TimeTicks::Now();
2357   MockMotionEvent event =
2358       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
2359   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2360
2361   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
2362   EXPECT_EQ(kMaxGestureBoundsLength,
2363             GetMostRecentGestureEvent().details.bounding_box_f().width());
2364   EXPECT_EQ(kMaxGestureBoundsLength,
2365             GetMostRecentGestureEvent().details.bounding_box_f().height());
2366
2367   event =
2368       ObtainMotionEvent(event_time + kOneMicrosecond, MotionEvent::ACTION_UP);
2369   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2370   EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType());
2371   EXPECT_EQ(kMaxGestureBoundsLength,
2372             GetMostRecentGestureEvent().details.bounding_box_f().width());
2373   EXPECT_EQ(kMaxGestureBoundsLength,
2374             GetMostRecentGestureEvent().details.bounding_box_f().height());
2375 }
2376
2377 TEST_F(GestureProviderTest, ZeroRadiusBoundingBox) {
2378   base::TimeTicks event_time = base::TimeTicks::Now();
2379   MockMotionEvent event =
2380       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN, 10, 20);
2381   event.SetTouchMajor(0);
2382   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2383   EXPECT_EQ(gfx::RectF(10, 20, 0, 0),
2384             GetMostRecentGestureEvent().details.bounding_box());
2385
2386   event = ObtainMotionEvent(
2387       event_time, MotionEvent::ACTION_POINTER_DOWN, 10, 20, 110, 120);
2388   event.SetTouchMajor(0);
2389   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2390
2391   event = ObtainMotionEvent(
2392       event_time, MotionEvent::ACTION_MOVE, 10, 20, 110, 150);
2393   event.SetTouchMajor(0);
2394   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2395
2396   EXPECT_EQ(gfx::RectF(10, 20, 100, 130),
2397             GetMostRecentGestureEvent().details.bounding_box());
2398 }
2399
2400 // Verify that the min/max gesture bound settings are not applied to stylus
2401 // or mouse-derived MotionEvents.
2402 TEST_F(GestureProviderTest, NoMinOrMaxGestureBoundsLengthWithStylusOrMouse) {
2403   const float kMinGestureBoundsLength = 5.f * kMockTouchRadius;
2404   const float kMaxGestureBoundsLength = 10.f * kMockTouchRadius;
2405   SetMinMaxGestureBoundsLength(kMinGestureBoundsLength,
2406                                kMaxGestureBoundsLength);
2407   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false);
2408
2409   base::TimeTicks event_time = base::TimeTicks::Now();
2410   MockMotionEvent event =
2411       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
2412   event.SetTouchMajor(0);
2413   event.SetToolType(0, MotionEvent::TOOL_TYPE_MOUSE);
2414   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2415
2416   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
2417   EXPECT_EQ(MotionEvent::TOOL_TYPE_MOUSE,
2418             GetMostRecentGestureEvent().primary_tool_type);
2419   EXPECT_EQ(0.f, GetMostRecentGestureEvent().details.bounding_box_f().width());
2420   EXPECT_EQ(0.f, GetMostRecentGestureEvent().details.bounding_box_f().height());
2421
2422   event =
2423       ObtainMotionEvent(event_time + kOneMicrosecond, MotionEvent::ACTION_UP);
2424   event.SetTouchMajor(1);
2425   event.SetToolType(0, MotionEvent::TOOL_TYPE_STYLUS);
2426   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2427   EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType());
2428   EXPECT_EQ(MotionEvent::TOOL_TYPE_STYLUS,
2429             GetMostRecentGestureEvent().primary_tool_type);
2430   EXPECT_EQ(0, GetMostRecentGestureEvent().details.bounding_box_f().width());
2431   EXPECT_EQ(0, GetMostRecentGestureEvent().details.bounding_box_f().height());
2432
2433   event = ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN);
2434   event.SetTouchMajor(2.f * kMaxGestureBoundsLength);
2435   event.SetToolType(0, MotionEvent::TOOL_TYPE_MOUSE);
2436   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2437   EXPECT_EQ(MotionEvent::TOOL_TYPE_MOUSE,
2438             GetMostRecentGestureEvent().primary_tool_type);
2439   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
2440   EXPECT_EQ(2.f * kMaxGestureBoundsLength,
2441             GetMostRecentGestureEvent().details.bounding_box_f().width());
2442   EXPECT_EQ(2.f * kMaxGestureBoundsLength,
2443             GetMostRecentGestureEvent().details.bounding_box_f().height());
2444
2445   event =
2446       ObtainMotionEvent(event_time + kOneMicrosecond, MotionEvent::ACTION_UP);
2447   event.SetTouchMajor(2.f * kMaxGestureBoundsLength);
2448   event.SetToolType(0, MotionEvent::TOOL_TYPE_ERASER);
2449   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2450   EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType());
2451   EXPECT_EQ(MotionEvent::TOOL_TYPE_ERASER,
2452             GetMostRecentGestureEvent().primary_tool_type);
2453   EXPECT_EQ(2.f * kMaxGestureBoundsLength,
2454             GetMostRecentGestureEvent().details.bounding_box_f().width());
2455   EXPECT_EQ(2.f * kMaxGestureBoundsLength,
2456             GetMostRecentGestureEvent().details.bounding_box_f().height());
2457 }
2458
2459 // Test the bounding box for show press and tap gestures.
2460 TEST_F(GestureProviderTest, BoundingBoxForShowPressAndTapGesture) {
2461   base::TimeTicks event_time = base::TimeTicks::Now();
2462   gesture_provider_->SetDoubleTapSupportForPlatformEnabled(false);
2463   base::TimeDelta showpress_timeout = kOneMicrosecond;
2464   base::TimeDelta longpress_timeout = kOneSecond;
2465   SetShowPressAndLongPressTimeout(showpress_timeout, longpress_timeout);
2466
2467   MockMotionEvent event =
2468       ObtainMotionEvent(event_time, MotionEvent::ACTION_DOWN, 10, 10);
2469   event.SetTouchMajor(10);
2470
2471   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2472   EXPECT_EQ(ET_GESTURE_TAP_DOWN, GetMostRecentGestureEventType());
2473   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
2474   EXPECT_EQ(gfx::RectF(5, 5, 10, 10),
2475             GetMostRecentGestureEvent().details.bounding_box());
2476
2477   event = ObtainMotionEvent(
2478       event_time + kOneMicrosecond, MotionEvent::ACTION_MOVE, 11, 9);
2479   event.SetTouchMajor(20);
2480   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2481   event = ObtainMotionEvent(
2482       event_time + kOneMicrosecond, MotionEvent::ACTION_MOVE, 8, 11);
2483   event.SetTouchMajor(10);
2484   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2485   RunTasksAndWait(showpress_timeout + kOneMicrosecond);
2486   EXPECT_EQ(ET_GESTURE_SHOW_PRESS, GetMostRecentGestureEventType());
2487   EXPECT_EQ(gfx::RectF(0, 0, 20, 20),
2488             GetMostRecentGestureEvent().details.bounding_box());
2489
2490   event =
2491       ObtainMotionEvent(event_time + kOneMicrosecond, MotionEvent::ACTION_UP);
2492   event.SetTouchMajor(30);
2493   EXPECT_TRUE(gesture_provider_->OnTouchEvent(event));
2494   EXPECT_EQ(ET_GESTURE_TAP, GetMostRecentGestureEventType());
2495
2496   EXPECT_EQ(1, GetMostRecentGestureEvent().details.tap_count());
2497   EXPECT_EQ(1, GetMostRecentGestureEvent().details.touch_points());
2498   EXPECT_EQ(gfx::RectF(0, 0, 20, 20),
2499             GetMostRecentGestureEvent().details.bounding_box());
2500 }
2501
2502 }  // namespace ui