596cb1f40cbdb23baf0122488e507d6d846cb808
[platform/framework/web/crosswalk.git] / src / ui / aura / gestures / gesture_recognizer_unittest.cc
1 // Copyright (c) 2012 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/command_line.h"
6 #include "base/memory/scoped_vector.h"
7 #include "base/run_loop.h"
8 #include "base/strings/string_number_conversions.h"
9 #include "base/timer/timer.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "ui/aura/env.h"
12 #include "ui/aura/test/aura_test_base.h"
13 #include "ui/aura/test/event_generator.h"
14 #include "ui/aura/test/test_window_delegate.h"
15 #include "ui/aura/test/test_windows.h"
16 #include "ui/aura/window.h"
17 #include "ui/aura/window_event_dispatcher.h"
18 #include "ui/base/hit_test.h"
19 #include "ui/base/ui_base_switches.h"
20 #include "ui/events/event.h"
21 #include "ui/events/event_switches.h"
22 #include "ui/events/event_utils.h"
23 #include "ui/events/gestures/gesture_configuration.h"
24 #include "ui/events/gestures/gesture_recognizer_impl.h"
25 #include "ui/events/gestures/gesture_sequence.h"
26 #include "ui/events/gestures/gesture_types.h"
27 #include "ui/gfx/point.h"
28 #include "ui/gfx/rect.h"
29
30 #include <queue>
31
32 namespace aura {
33 namespace test {
34
35 namespace {
36
37 std::string WindowIDAsString(ui::GestureConsumer* consumer) {
38   return consumer ?
39       base::IntToString(static_cast<Window*>(consumer)->id()) : "?";
40 }
41
42 #define EXPECT_0_EVENTS(events) \
43     EXPECT_EQ(0u, events.size())
44
45 #define EXPECT_1_EVENT(events, e0) \
46     EXPECT_EQ(1u, events.size()); \
47     EXPECT_EQ(e0, events[0])
48
49 #define EXPECT_2_EVENTS(events, e0, e1) \
50     EXPECT_EQ(2u, events.size()); \
51     EXPECT_EQ(e0, events[0]); \
52     EXPECT_EQ(e1, events[1])
53
54 #define EXPECT_3_EVENTS(events, e0, e1, e2) \
55     EXPECT_EQ(3u, events.size()); \
56     EXPECT_EQ(e0, events[0]); \
57     EXPECT_EQ(e1, events[1]); \
58     EXPECT_EQ(e2, events[2])
59
60 #define EXPECT_4_EVENTS(events, e0, e1, e2, e3) \
61     EXPECT_EQ(4u, events.size()); \
62     EXPECT_EQ(e0, events[0]); \
63     EXPECT_EQ(e1, events[1]); \
64     EXPECT_EQ(e2, events[2]); \
65     EXPECT_EQ(e3, events[3])
66
67 // A delegate that keeps track of gesture events.
68 class GestureEventConsumeDelegate : public TestWindowDelegate {
69  public:
70   GestureEventConsumeDelegate()
71       : tap_(false),
72         tap_down_(false),
73         tap_cancel_(false),
74         begin_(false),
75         end_(false),
76         scroll_begin_(false),
77         scroll_update_(false),
78         scroll_end_(false),
79         pinch_begin_(false),
80         pinch_update_(false),
81         pinch_end_(false),
82         long_press_(false),
83         fling_(false),
84         two_finger_tap_(false),
85         show_press_(false),
86         swipe_left_(false),
87         swipe_right_(false),
88         swipe_up_(false),
89         swipe_down_(false),
90         scroll_x_(0),
91         scroll_y_(0),
92         scroll_velocity_x_(0),
93         scroll_velocity_y_(0),
94         velocity_x_(0),
95         velocity_y_(0),
96         scroll_x_hint_(0),
97         scroll_y_hint_(0),
98         tap_count_(0),
99         flags_(0),
100         wait_until_event_(ui::ET_UNKNOWN) {}
101
102   virtual ~GestureEventConsumeDelegate() {}
103
104   void Reset() {
105     events_.clear();
106     tap_ = false;
107     tap_down_ = false;
108     tap_cancel_ = false;
109     begin_ = false;
110     end_ = false;
111     scroll_begin_ = false;
112     scroll_update_ = false;
113     scroll_end_ = false;
114     pinch_begin_ = false;
115     pinch_update_ = false;
116     pinch_end_ = false;
117     long_press_ = false;
118     fling_ = false;
119     two_finger_tap_ = false;
120     show_press_ = false;
121     swipe_left_ = false;
122     swipe_right_ = false;
123     swipe_up_ = false;
124     swipe_down_ = false;
125
126     scroll_begin_position_.SetPoint(0, 0);
127     tap_location_.SetPoint(0, 0);
128     gesture_end_location_.SetPoint(0, 0);
129
130     scroll_x_ = 0;
131     scroll_y_ = 0;
132     scroll_velocity_x_ = 0;
133     scroll_velocity_y_ = 0;
134     velocity_x_ = 0;
135     velocity_y_ = 0;
136     scroll_x_hint_ = 0;
137     scroll_y_hint_ = 0;
138     tap_count_ = 0;
139     scale_ = 0;
140     flags_ = 0;
141     latency_info_.Clear();
142   }
143
144   const std::vector<ui::EventType>& events() const { return events_; };
145
146   bool tap() const { return tap_; }
147   bool tap_down() const { return tap_down_; }
148   bool tap_cancel() const { return tap_cancel_; }
149   bool begin() const { return begin_; }
150   bool end() const { return end_; }
151   bool scroll_begin() const { return scroll_begin_; }
152   bool scroll_update() const { return scroll_update_; }
153   bool scroll_end() const { return scroll_end_; }
154   bool pinch_begin() const { return pinch_begin_; }
155   bool pinch_update() const { return pinch_update_; }
156   bool pinch_end() const { return pinch_end_; }
157   bool long_press() const { return long_press_; }
158   bool long_tap() const { return long_tap_; }
159   bool fling() const { return fling_; }
160   bool two_finger_tap() const { return two_finger_tap_; }
161   bool show_press() const { return show_press_; }
162   bool swipe_left() const { return swipe_left_; }
163   bool swipe_right() const { return swipe_right_; }
164   bool swipe_up() const { return swipe_up_; }
165   bool swipe_down() const { return swipe_down_; }
166
167   const gfx::Point& scroll_begin_position() const {
168     return scroll_begin_position_;
169   }
170
171   const gfx::Point& tap_location() const {
172     return tap_location_;
173   }
174
175   const gfx::Point& gesture_end_location() const {
176     return gesture_end_location_;
177   }
178
179   float scroll_x() const { return scroll_x_; }
180   float scroll_y() const { return scroll_y_; }
181   float scroll_velocity_x() const { return scroll_velocity_x_; }
182   float scroll_velocity_y() const { return scroll_velocity_y_; }
183   float velocity_x() const { return velocity_x_; }
184   float velocity_y() const { return velocity_y_; }
185   float scroll_x_hint() const { return scroll_x_hint_; }
186   float scroll_y_hint() const { return scroll_y_hint_; }
187   float scale() const { return scale_; }
188   const gfx::Rect& bounding_box() const { return bounding_box_; }
189   int tap_count() const { return tap_count_; }
190   int flags() const { return flags_; }
191   const ui::LatencyInfo& latency_info() const { return latency_info_; }
192
193   void WaitUntilReceivedGesture(ui::EventType type) {
194     wait_until_event_ = type;
195     run_loop_.reset(new base::RunLoop());
196     run_loop_->Run();
197   }
198
199   virtual void OnGestureEvent(ui::GestureEvent* gesture) OVERRIDE {
200     events_.push_back(gesture->type());
201     bounding_box_ = gesture->details().bounding_box();
202     flags_ = gesture->flags();
203     latency_info_ = *gesture->latency();
204     switch (gesture->type()) {
205       case ui::ET_GESTURE_TAP:
206         tap_location_ = gesture->location();
207         tap_count_ = gesture->details().tap_count();
208         tap_ = true;
209         break;
210       case ui::ET_GESTURE_TAP_DOWN:
211         tap_down_ = true;
212         break;
213       case ui::ET_GESTURE_TAP_CANCEL:
214         tap_cancel_ = true;
215         break;
216       case ui::ET_GESTURE_BEGIN:
217         begin_ = true;
218         break;
219       case ui::ET_GESTURE_END:
220         end_ = true;
221         gesture_end_location_ = gesture->location();
222         break;
223       case ui::ET_GESTURE_SCROLL_BEGIN:
224         scroll_begin_ = true;
225         scroll_begin_position_ = gesture->location();
226         scroll_x_hint_ = gesture->details().scroll_x_hint();
227         scroll_y_hint_ = gesture->details().scroll_y_hint();
228         break;
229       case ui::ET_GESTURE_SCROLL_UPDATE:
230         scroll_update_ = true;
231         scroll_x_ += gesture->details().scroll_x();
232         scroll_y_ += gesture->details().scroll_y();
233         break;
234       case ui::ET_GESTURE_SCROLL_END:
235         EXPECT_TRUE(velocity_x_ == 0 && velocity_y_ == 0);
236         scroll_end_ = true;
237         break;
238       case ui::ET_GESTURE_PINCH_BEGIN:
239         pinch_begin_ = true;
240         break;
241       case ui::ET_GESTURE_PINCH_UPDATE:
242         pinch_update_ = true;
243         scale_ = gesture->details().scale();
244         break;
245       case ui::ET_GESTURE_PINCH_END:
246         pinch_end_ = true;
247         break;
248       case ui::ET_GESTURE_LONG_PRESS:
249         long_press_ = true;
250         break;
251       case ui::ET_GESTURE_LONG_TAP:
252         long_tap_ = true;
253         break;
254       case ui::ET_SCROLL_FLING_START:
255         EXPECT_TRUE(gesture->details().velocity_x() != 0 ||
256                     gesture->details().velocity_y() != 0);
257         EXPECT_FALSE(scroll_end_);
258         fling_ = true;
259         velocity_x_ = gesture->details().velocity_x();
260         velocity_y_ = gesture->details().velocity_y();
261         break;
262       case ui::ET_GESTURE_TWO_FINGER_TAP:
263         two_finger_tap_ = true;
264         break;
265       case ui::ET_GESTURE_SHOW_PRESS:
266         show_press_ = true;
267         break;
268       case ui::ET_GESTURE_SWIPE:
269         swipe_left_ = gesture->details().swipe_left();
270         swipe_right_ = gesture->details().swipe_right();
271         swipe_up_ = gesture->details().swipe_up();
272         swipe_down_ = gesture->details().swipe_down();
273         break;
274       case ui::ET_SCROLL_FLING_CANCEL:
275         // Only used in unified gesture detection.
276         break;
277       default:
278         NOTREACHED();
279     }
280     if (wait_until_event_ == gesture->type() && run_loop_) {
281       run_loop_->Quit();
282       wait_until_event_ = ui::ET_UNKNOWN;
283     }
284     gesture->StopPropagation();
285   }
286
287  private:
288   scoped_ptr<base::RunLoop> run_loop_;
289   std::vector<ui::EventType> events_;
290
291   bool tap_;
292   bool tap_down_;
293   bool tap_cancel_;
294   bool begin_;
295   bool end_;
296   bool scroll_begin_;
297   bool scroll_update_;
298   bool scroll_end_;
299   bool pinch_begin_;
300   bool pinch_update_;
301   bool pinch_end_;
302   bool long_press_;
303   bool long_tap_;
304   bool fling_;
305   bool two_finger_tap_;
306   bool show_press_;
307   bool swipe_left_;
308   bool swipe_right_;
309   bool swipe_up_;
310   bool swipe_down_;
311
312   gfx::Point scroll_begin_position_;
313   gfx::Point tap_location_;
314   gfx::Point gesture_end_location_;
315
316   float scroll_x_;
317   float scroll_y_;
318   float scroll_velocity_x_;
319   float scroll_velocity_y_;
320   float velocity_x_;
321   float velocity_y_;
322   float scroll_x_hint_;
323   float scroll_y_hint_;
324   float scale_;
325   gfx::Rect bounding_box_;
326   int tap_count_;
327   int flags_;
328   ui::LatencyInfo latency_info_;
329
330   ui::EventType wait_until_event_;
331
332   DISALLOW_COPY_AND_ASSIGN(GestureEventConsumeDelegate);
333 };
334
335 class QueueTouchEventDelegate : public GestureEventConsumeDelegate {
336  public:
337   explicit QueueTouchEventDelegate(WindowEventDispatcher* dispatcher)
338       : window_(NULL),
339         dispatcher_(dispatcher),
340         queue_events_(true) {
341   }
342   virtual ~QueueTouchEventDelegate() {
343     while(!queue_.empty()) {
344       delete queue_.front();
345       queue_.pop();
346     }
347   }
348
349   virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
350     if (queue_events_) {
351       queue_.push(new ui::TouchEvent(*event, window_, window_));
352       event->StopPropagation();
353     }
354   }
355
356   void ReceivedAck() {
357     ReceivedAckImpl(false);
358   }
359
360   void ReceivedAckPreventDefaulted() {
361     ReceivedAckImpl(true);
362   }
363
364   void set_window(Window* w) { window_ = w; }
365   void set_queue_events(bool queue) { queue_events_ = queue; }
366
367  private:
368   void ReceivedAckImpl(bool prevent_defaulted) {
369     scoped_ptr<ui::TouchEvent> event(queue_.front());
370     dispatcher_->ProcessedTouchEvent(event.get(), window_,
371         prevent_defaulted ? ui::ER_HANDLED : ui::ER_UNHANDLED);
372     queue_.pop();
373   }
374
375   std::queue<ui::TouchEvent*> queue_;
376   Window* window_;
377   WindowEventDispatcher* dispatcher_;
378   bool queue_events_;
379
380   DISALLOW_COPY_AND_ASSIGN(QueueTouchEventDelegate);
381 };
382
383 // A delegate that ignores gesture events but keeps track of [synthetic] mouse
384 // events.
385 class GestureEventSynthDelegate : public TestWindowDelegate {
386  public:
387   GestureEventSynthDelegate()
388       : mouse_enter_(false),
389         mouse_exit_(false),
390         mouse_press_(false),
391         mouse_release_(false),
392         mouse_move_(false),
393         double_click_(false) {
394   }
395
396   void Reset() {
397     mouse_enter_ = false;
398     mouse_exit_ = false;
399     mouse_press_ = false;
400     mouse_release_ = false;
401     mouse_move_ = false;
402     double_click_ = false;
403   }
404
405   bool mouse_enter() const { return mouse_enter_; }
406   bool mouse_exit() const { return mouse_exit_; }
407   bool mouse_press() const { return mouse_press_; }
408   bool mouse_move() const { return mouse_move_; }
409   bool mouse_release() const { return mouse_release_; }
410   bool double_click() const { return double_click_; }
411
412   virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE {
413     switch (event->type()) {
414       case ui::ET_MOUSE_PRESSED:
415         double_click_ = event->flags() & ui::EF_IS_DOUBLE_CLICK;
416         mouse_press_ = true;
417         break;
418       case ui::ET_MOUSE_RELEASED:
419         mouse_release_ = true;
420         break;
421       case ui::ET_MOUSE_MOVED:
422         mouse_move_ = true;
423         break;
424       case ui::ET_MOUSE_ENTERED:
425         mouse_enter_ = true;
426         break;
427       case ui::ET_MOUSE_EXITED:
428         mouse_exit_ = true;
429         break;
430       default:
431         NOTREACHED();
432     }
433     event->SetHandled();
434   }
435
436  private:
437   bool mouse_enter_;
438   bool mouse_exit_;
439   bool mouse_press_;
440   bool mouse_release_;
441   bool mouse_move_;
442   bool double_click_;
443
444   DISALLOW_COPY_AND_ASSIGN(GestureEventSynthDelegate);
445 };
446
447 class TestOneShotGestureSequenceTimer
448     : public base::OneShotTimer<ui::GestureSequence> {
449  public:
450   TestOneShotGestureSequenceTimer() {}
451
452   void ForceTimeout() {
453     if (IsRunning()) {
454       user_task().Run();
455       Stop();
456     }
457   }
458
459  private:
460   DISALLOW_COPY_AND_ASSIGN(TestOneShotGestureSequenceTimer);
461 };
462
463 class TimerTestGestureSequence : public ui::GestureSequence {
464  public:
465   explicit TimerTestGestureSequence(ui::GestureSequenceDelegate* delegate)
466       : ui::GestureSequence(delegate) {
467   }
468
469   void ForceTimeout() {
470     static_cast<TestOneShotGestureSequenceTimer*>(
471         GetLongPressTimer())->ForceTimeout();
472   }
473
474   bool IsTimerRunning() {
475     return GetLongPressTimer()->IsRunning();
476   }
477
478   virtual base::OneShotTimer<ui::GestureSequence>* CreateTimer() OVERRIDE {
479     return new TestOneShotGestureSequenceTimer();
480   }
481
482  private:
483   DISALLOW_COPY_AND_ASSIGN(TimerTestGestureSequence);
484 };
485
486 class TestGestureRecognizer : public ui::GestureRecognizerImpl {
487  public:
488   TestGestureRecognizer() : GestureRecognizerImpl() {
489   }
490
491   ui::GestureSequence* GetGestureSequenceForTesting(Window* window) {
492     return GetGestureSequenceForConsumer(window);
493   }
494
495  private:
496   DISALLOW_COPY_AND_ASSIGN(TestGestureRecognizer);
497 };
498
499 class TimerTestGestureRecognizer : public TestGestureRecognizer {
500  public:
501   TimerTestGestureRecognizer() : TestGestureRecognizer() {
502   }
503
504   virtual ui::GestureSequence* CreateSequence(
505       ui::GestureSequenceDelegate* delegate) OVERRIDE {
506     return new TimerTestGestureSequence(delegate);
507   }
508
509  private:
510   DISALLOW_COPY_AND_ASSIGN(TimerTestGestureRecognizer);
511 };
512
513 base::TimeDelta GetTime() {
514   return ui::EventTimeForNow();
515 }
516
517 class ScopedGestureRecognizerSetter {
518  public:
519   // Takes ownership of |new_gr|.
520   explicit ScopedGestureRecognizerSetter(ui::GestureRecognizer* new_gr)
521       : new_gr_(new_gr) {
522     original_gr_ = ui::GestureRecognizer::Get();
523     ui::SetGestureRecognizerForTesting(new_gr_.get());
524   }
525
526   virtual ~ScopedGestureRecognizerSetter() {
527     ui::SetGestureRecognizerForTesting(original_gr_);
528   }
529
530  private:
531   ui::GestureRecognizer* original_gr_;
532   scoped_ptr<ui::GestureRecognizer> new_gr_;
533
534   DISALLOW_COPY_AND_ASSIGN(ScopedGestureRecognizerSetter);
535 };
536
537 class TimedEvents {
538  private:
539   int simulated_now_;
540
541  public:
542   // Use a non-zero start time to pass DCHECKs which ensure events have had a
543   // time assigned.
544   TimedEvents() : simulated_now_(1) {
545   }
546
547   base::TimeDelta Now() {
548     base::TimeDelta t = base::TimeDelta::FromMilliseconds(simulated_now_);
549     simulated_now_++;
550     return t;
551   }
552
553   base::TimeDelta LeapForward(int time_in_millis) {
554     simulated_now_ += time_in_millis;
555     return base::TimeDelta::FromMilliseconds(simulated_now_);
556   }
557
558   base::TimeDelta InFuture(int time_in_millis) {
559     return base::TimeDelta::FromMilliseconds(simulated_now_ + time_in_millis);
560   }
561
562   void SendScrollEvents(ui::EventProcessor* dispatcher,
563                         float x_start,
564                         float y_start,
565                         int dx,
566                         int dy,
567                         int touch_id,
568                         int time_step,
569                         int num_steps,
570                         GestureEventConsumeDelegate* delegate) {
571     int x = x_start;
572     int y = y_start;
573
574     for (int i = 0; i < num_steps; i++) {
575       x += dx;
576       y += dy;
577       ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::PointF(x, y),
578                           touch_id,
579                           base::TimeDelta::FromMilliseconds(simulated_now_));
580       ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move);
581       ASSERT_FALSE(details.dispatcher_destroyed);
582       simulated_now_ += time_step;
583     }
584   }
585
586   void SendScrollEvent(ui::EventProcessor* dispatcher,
587                        float x,
588                        float y,
589                        int touch_id,
590                        GestureEventConsumeDelegate* delegate) {
591     delegate->Reset();
592     ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::PointF(x, y),
593                         touch_id,
594                         base::TimeDelta::FromMilliseconds(simulated_now_));
595     ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&move);
596     ASSERT_FALSE(details.dispatcher_destroyed);
597     simulated_now_++;
598   }
599 };
600
601 // An event handler to keep track of events.
602 class TestEventHandler : public ui::EventHandler {
603  public:
604   TestEventHandler() : touch_released_count_(0),
605                        touch_pressed_count_(0),
606                        touch_moved_count_(0),
607                        touch_cancelled_count_(0) {
608   }
609
610   virtual ~TestEventHandler() {}
611
612   virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
613     switch (event->type()) {
614       case ui::ET_TOUCH_RELEASED:
615         touch_released_count_++;
616         break;
617       case ui::ET_TOUCH_PRESSED:
618         touch_pressed_count_++;
619         break;
620       case ui::ET_TOUCH_MOVED:
621         touch_moved_count_++;
622         break;
623       case ui::ET_TOUCH_CANCELLED:
624         touch_cancelled_count_++;
625         break;
626       default:
627         break;
628     }
629   }
630
631   void Reset() {
632     touch_released_count_ = 0;
633     touch_pressed_count_ = 0;
634     touch_moved_count_ = 0;
635     touch_cancelled_count_ = 0;
636   }
637
638   int touch_released_count() const { return touch_released_count_; }
639   int touch_pressed_count() const { return touch_pressed_count_; }
640   int touch_moved_count() const { return touch_moved_count_; }
641   int touch_cancelled_count() const { return touch_cancelled_count_; }
642
643  private:
644   int touch_released_count_;
645   int touch_pressed_count_;
646   int touch_moved_count_;
647   int touch_cancelled_count_;
648
649   DISALLOW_COPY_AND_ASSIGN(TestEventHandler);
650 };
651
652 // Removes the target window from its parent when it receives a touch-cancel
653 // event.
654 class RemoveOnTouchCancelHandler : public TestEventHandler {
655  public:
656   RemoveOnTouchCancelHandler() {}
657   virtual ~RemoveOnTouchCancelHandler() {}
658
659  private:
660   // ui::EventHandler:
661   virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE {
662     TestEventHandler::OnTouchEvent(event);
663     if (event->type() == ui::ET_TOUCH_CANCELLED) {
664       Window* target = static_cast<Window*>(event->target());
665       // This is tiptoeing around crbug.com/310172. If this event handler isn't
666       // removed, we enter an infinite loop.
667       target->RemovePreTargetHandler(this);
668       target->parent()->RemoveChild(target);
669     }
670   }
671
672   DISALLOW_COPY_AND_ASSIGN(RemoveOnTouchCancelHandler);
673 };
674
675 }  // namespace
676
677 class GestureRecognizerTest : public AuraTestBase,
678                               public ::testing::WithParamInterface<bool> {
679  public:
680   GestureRecognizerTest() {}
681
682   bool UsingUnifiedGR() {
683     return GetParam();
684   }
685
686   virtual void SetUp() OVERRIDE {
687     // TODO(tdresser): Once unified GR has landed, only run these tests once.
688     CommandLine::ForCurrentProcess()->AppendSwitchASCII(
689         switches::kUnifiedGestureDetector,
690         UsingUnifiedGR() ? switches::kUnifiedGestureDetectorEnabled
691                          : switches::kUnifiedGestureDetectorDisabled);
692
693     AuraTestBase::SetUp();
694     ui::GestureConfiguration::set_min_touch_down_duration_in_seconds_for_click(
695         0.001);
696     ui::GestureConfiguration::set_show_press_delay_in_ms(2);
697     ui::GestureConfiguration::set_long_press_time_in_seconds(0.003);
698   }
699
700   DISALLOW_COPY_AND_ASSIGN(GestureRecognizerTest);
701 };
702
703 // Check that appropriate touch events generate tap gesture events.
704 TEST_P(GestureRecognizerTest, GestureEventTap) {
705   scoped_ptr<GestureEventConsumeDelegate> delegate(
706       new GestureEventConsumeDelegate());
707   TimedEvents tes;
708   const int kWindowWidth = 123;
709   const int kWindowHeight = 45;
710   const int kTouchId = 2;
711   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
712   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
713       delegate.get(), -1234, bounds, root_window()));
714
715   delegate->Reset();
716   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
717                        kTouchId, tes.Now());
718   DispatchEventUsingWindowDispatcher(&press);
719   EXPECT_FALSE(delegate->tap());
720   EXPECT_FALSE(delegate->show_press());
721   EXPECT_TRUE(delegate->tap_down());
722   EXPECT_FALSE(delegate->tap_cancel());
723   EXPECT_TRUE(delegate->begin());
724   EXPECT_FALSE(delegate->scroll_begin());
725   EXPECT_FALSE(delegate->scroll_update());
726   EXPECT_FALSE(delegate->scroll_end());
727   EXPECT_FALSE(delegate->long_press());
728
729   delegate->Reset();
730   delegate->WaitUntilReceivedGesture(ui::ET_GESTURE_SHOW_PRESS);
731   EXPECT_TRUE(delegate->show_press());
732   EXPECT_FALSE(delegate->tap_down());
733
734   // Make sure there is enough delay before the touch is released so that it is
735   // recognized as a tap.
736   delegate->Reset();
737   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
738                          kTouchId, tes.LeapForward(50));
739
740   DispatchEventUsingWindowDispatcher(&release);
741   EXPECT_TRUE(delegate->tap());
742   EXPECT_FALSE(delegate->tap_down());
743   EXPECT_FALSE(delegate->tap_cancel());
744   EXPECT_FALSE(delegate->begin());
745   EXPECT_TRUE(delegate->end());
746   EXPECT_FALSE(delegate->scroll_begin());
747   EXPECT_FALSE(delegate->scroll_update());
748   EXPECT_FALSE(delegate->scroll_end());
749
750   EXPECT_EQ(1, delegate->tap_count());
751 }
752
753 // Check that appropriate touch events generate tap gesture events
754 // when information about the touch radii are provided.
755 TEST_P(GestureRecognizerTest, GestureEventTapRegion) {
756   // TODO(tdresser): enable this test with unified GR once we resolve the
757   // bounding box differences. See crbug.com/366641.
758   if (UsingUnifiedGR())
759     return;
760
761   scoped_ptr<GestureEventConsumeDelegate> delegate(
762       new GestureEventConsumeDelegate());
763   TimedEvents tes;
764   const int kWindowWidth = 800;
765   const int kWindowHeight = 600;
766   const int kTouchId = 2;
767   gfx::Rect bounds(0, 0, kWindowWidth, kWindowHeight);
768   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
769       delegate.get(), -1234, bounds, root_window()));
770
771   // Test with no ET_TOUCH_MOVED events.
772   {
773      delegate->Reset();
774      ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
775                           kTouchId, tes.Now());
776      press.set_radius_x(5);
777      press.set_radius_y(12);
778      DispatchEventUsingWindowDispatcher(&press);
779      EXPECT_FALSE(delegate->tap());
780      EXPECT_TRUE(delegate->tap_down());
781      EXPECT_FALSE(delegate->tap_cancel());
782      EXPECT_TRUE(delegate->begin());
783      EXPECT_FALSE(delegate->scroll_begin());
784      EXPECT_FALSE(delegate->scroll_update());
785      EXPECT_FALSE(delegate->scroll_end());
786      EXPECT_FALSE(delegate->long_press());
787
788      // Make sure there is enough delay before the touch is released so that it
789      // is recognized as a tap.
790      delegate->Reset();
791      ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
792                             kTouchId, tes.LeapForward(50));
793      release.set_radius_x(5);
794      release.set_radius_y(12);
795
796      DispatchEventUsingWindowDispatcher(&release);
797      EXPECT_TRUE(delegate->tap());
798      EXPECT_FALSE(delegate->tap_down());
799      EXPECT_FALSE(delegate->tap_cancel());
800      EXPECT_FALSE(delegate->begin());
801      EXPECT_TRUE(delegate->end());
802      EXPECT_FALSE(delegate->scroll_begin());
803      EXPECT_FALSE(delegate->scroll_update());
804      EXPECT_FALSE(delegate->scroll_end());
805
806      EXPECT_EQ(1, delegate->tap_count());
807      gfx::Point actual_point(delegate->tap_location());
808      EXPECT_EQ(24, delegate->bounding_box().width());
809      EXPECT_EQ(24, delegate->bounding_box().height());
810      EXPECT_EQ(101, actual_point.x());
811      EXPECT_EQ(201, actual_point.y());
812   }
813
814   // Test with no ET_TOUCH_MOVED events but different touch points and radii.
815   {
816      delegate->Reset();
817      ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(365, 290),
818                           kTouchId, tes.Now());
819      press.set_radius_x(8);
820      press.set_radius_y(14);
821      DispatchEventUsingWindowDispatcher(&press);
822      EXPECT_FALSE(delegate->tap());
823      EXPECT_TRUE(delegate->tap_down());
824      EXPECT_FALSE(delegate->tap_cancel());
825      EXPECT_TRUE(delegate->begin());
826      EXPECT_FALSE(delegate->scroll_begin());
827      EXPECT_FALSE(delegate->scroll_update());
828      EXPECT_FALSE(delegate->scroll_end());
829      EXPECT_FALSE(delegate->long_press());
830
831      delegate->Reset();
832      ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(367, 291),
833                             kTouchId, tes.LeapForward(50));
834      release.set_radius_x(20);
835      release.set_radius_y(13);
836
837      DispatchEventUsingWindowDispatcher(&release);
838      EXPECT_TRUE(delegate->tap());
839      EXPECT_FALSE(delegate->tap_down());
840      EXPECT_FALSE(delegate->tap_cancel());
841      EXPECT_FALSE(delegate->begin());
842      EXPECT_TRUE(delegate->end());
843      EXPECT_FALSE(delegate->scroll_begin());
844      EXPECT_FALSE(delegate->scroll_update());
845      EXPECT_FALSE(delegate->scroll_end());
846
847      EXPECT_EQ(1, delegate->tap_count());
848      gfx::Point actual_point(delegate->tap_location());
849      EXPECT_EQ(40, delegate->bounding_box().width());
850      EXPECT_EQ(40, delegate->bounding_box().height());
851      EXPECT_EQ(367, actual_point.x());
852      EXPECT_EQ(291, actual_point.y());
853   }
854
855   // Test with a single ET_TOUCH_MOVED event.
856   {
857      delegate->Reset();
858      ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(46, 205),
859                           kTouchId, tes.Now());
860      press.set_radius_x(6);
861      press.set_radius_y(10);
862      DispatchEventUsingWindowDispatcher(&press);
863      EXPECT_FALSE(delegate->tap());
864      EXPECT_TRUE(delegate->tap_down());
865      EXPECT_FALSE(delegate->tap_cancel());
866      EXPECT_TRUE(delegate->begin());
867      EXPECT_FALSE(delegate->tap_cancel());
868      EXPECT_FALSE(delegate->scroll_begin());
869      EXPECT_FALSE(delegate->scroll_update());
870      EXPECT_FALSE(delegate->scroll_end());
871      EXPECT_FALSE(delegate->long_press());
872
873      delegate->Reset();
874      ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(49, 204),
875                          kTouchId, tes.LeapForward(50));
876      move.set_radius_x(8);
877      move.set_radius_y(12);
878      DispatchEventUsingWindowDispatcher(&move);
879      EXPECT_FALSE(delegate->tap());
880      EXPECT_FALSE(delegate->tap_down());
881      EXPECT_FALSE(delegate->tap_cancel());
882      EXPECT_FALSE(delegate->begin());
883      EXPECT_FALSE(delegate->scroll_begin());
884      EXPECT_FALSE(delegate->scroll_update());
885      EXPECT_FALSE(delegate->scroll_end());
886      EXPECT_FALSE(delegate->long_press());
887
888      delegate->Reset();
889      ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(49, 204),
890                             kTouchId, tes.LeapForward(50));
891      release.set_radius_x(4);
892      release.set_radius_y(8);
893
894      DispatchEventUsingWindowDispatcher(&release);
895      EXPECT_TRUE(delegate->tap());
896      EXPECT_FALSE(delegate->tap_down());
897      EXPECT_FALSE(delegate->tap_cancel());
898      EXPECT_FALSE(delegate->begin());
899      EXPECT_TRUE(delegate->end());
900      EXPECT_FALSE(delegate->scroll_begin());
901      EXPECT_FALSE(delegate->scroll_update());
902      EXPECT_FALSE(delegate->scroll_end());
903
904      EXPECT_EQ(1, delegate->tap_count());
905      gfx::Point actual_point(delegate->tap_location());
906      EXPECT_EQ(25, delegate->bounding_box().width());
907      EXPECT_EQ(24, delegate->bounding_box().height());
908      EXPECT_EQ(48, actual_point.x());
909      EXPECT_EQ(204, actual_point.y());
910   }
911
912   // Test with a few ET_TOUCH_MOVED events.
913   {
914      delegate->Reset();
915      ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(400, 150),
916                           kTouchId, tes.Now());
917      press.set_radius_x(7);
918      press.set_radius_y(10);
919      DispatchEventUsingWindowDispatcher(&press);
920      EXPECT_FALSE(delegate->tap());
921      EXPECT_TRUE(delegate->tap_down());
922      EXPECT_FALSE(delegate->tap_cancel());
923      EXPECT_TRUE(delegate->begin());
924      EXPECT_FALSE(delegate->scroll_begin());
925      EXPECT_FALSE(delegate->scroll_update());
926      EXPECT_FALSE(delegate->scroll_end());
927      EXPECT_FALSE(delegate->long_press());
928
929      delegate->Reset();
930      ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(397, 151),
931                          kTouchId, tes.LeapForward(50));
932      move.set_radius_x(13);
933      move.set_radius_y(12);
934      DispatchEventUsingWindowDispatcher(&move);
935      EXPECT_FALSE(delegate->tap());
936      EXPECT_FALSE(delegate->tap_down());
937      EXPECT_FALSE(delegate->tap_cancel());
938      EXPECT_FALSE(delegate->begin());
939      EXPECT_FALSE(delegate->scroll_begin());
940      EXPECT_FALSE(delegate->scroll_update());
941      EXPECT_FALSE(delegate->scroll_end());
942      EXPECT_FALSE(delegate->long_press());
943
944      delegate->Reset();
945      ui::TouchEvent move1(ui::ET_TOUCH_MOVED, gfx::Point(397, 149),
946                           kTouchId, tes.LeapForward(50));
947      move1.set_radius_x(16);
948      move1.set_radius_y(16);
949      DispatchEventUsingWindowDispatcher(&move1);
950      EXPECT_FALSE(delegate->tap());
951      EXPECT_FALSE(delegate->tap_down());
952      EXPECT_FALSE(delegate->tap_cancel());
953      EXPECT_FALSE(delegate->begin());
954      EXPECT_FALSE(delegate->scroll_begin());
955      EXPECT_FALSE(delegate->scroll_update());
956      EXPECT_FALSE(delegate->scroll_end());
957      EXPECT_FALSE(delegate->long_press());
958
959      delegate->Reset();
960      ui::TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(400, 150),
961                           kTouchId, tes.LeapForward(50));
962      move2.set_radius_x(14);
963      move2.set_radius_y(10);
964      DispatchEventUsingWindowDispatcher(&move2);
965      EXPECT_FALSE(delegate->tap());
966      EXPECT_FALSE(delegate->tap_down());
967      EXPECT_FALSE(delegate->tap_cancel());
968      EXPECT_FALSE(delegate->begin());
969      EXPECT_FALSE(delegate->scroll_begin());
970      EXPECT_FALSE(delegate->scroll_update());
971      EXPECT_FALSE(delegate->scroll_end());
972      EXPECT_FALSE(delegate->long_press());
973
974      delegate->Reset();
975      ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(401, 149),
976                             kTouchId, tes.LeapForward(50));
977      release.set_radius_x(8);
978      release.set_radius_y(9);
979
980      DispatchEventUsingWindowDispatcher(&release);
981      EXPECT_TRUE(delegate->tap());
982      EXPECT_FALSE(delegate->tap_down());
983      EXPECT_FALSE(delegate->tap_cancel());
984      EXPECT_FALSE(delegate->begin());
985      EXPECT_TRUE(delegate->end());
986      EXPECT_FALSE(delegate->scroll_begin());
987      EXPECT_FALSE(delegate->scroll_update());
988      EXPECT_FALSE(delegate->scroll_end());
989
990      EXPECT_EQ(1, delegate->tap_count());
991      gfx::Point actual_point(delegate->tap_location());
992      EXPECT_EQ(33, delegate->bounding_box().width());
993      EXPECT_EQ(32, delegate->bounding_box().height());
994      EXPECT_EQ(397, actual_point.x());
995      EXPECT_EQ(149, actual_point.y());
996   }
997 }
998
999 // Check that appropriate touch events generate scroll gesture events.
1000 TEST_P(GestureRecognizerTest, GestureEventScroll) {
1001   // We'll start by moving the touch point by (10.5, 10.5). We want 5 dips of
1002   // that distance to be consumed by the slop, so we set the slop radius to
1003   // sqrt(5 * 5 + 5 * 5).
1004   ui::GestureConfiguration::set_max_touch_move_in_pixels_for_click(
1005       sqrt(static_cast<double>(5 * 5 + 5 * 5)));
1006   scoped_ptr<GestureEventConsumeDelegate> delegate(
1007       new GestureEventConsumeDelegate());
1008   TimedEvents tes;
1009   const int kWindowWidth = 123;
1010   const int kWindowHeight = 45;
1011   const int kTouchId = 5;
1012   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
1013   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
1014       delegate.get(), -1234, bounds, root_window()));
1015
1016   delegate->Reset();
1017   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
1018                        kTouchId, tes.Now());
1019   DispatchEventUsingWindowDispatcher(&press);
1020   EXPECT_2_EVENTS(delegate->events(),
1021                   ui::ET_GESTURE_BEGIN,
1022                   ui::ET_GESTURE_TAP_DOWN);
1023
1024   // Move the touch-point enough so that it is considered as a scroll. This
1025   // should generate both SCROLL_BEGIN and SCROLL_UPDATE gestures.
1026   // The first movement is diagonal, to ensure that we have a free scroll,
1027   // and not a rail scroll.
1028   tes.SendScrollEvent(event_processor(), 111.5, 211.5, kTouchId,
1029                       delegate.get());
1030   EXPECT_3_EVENTS(delegate->events(),
1031                   ui::ET_GESTURE_TAP_CANCEL,
1032                   ui::ET_GESTURE_SCROLL_BEGIN,
1033                   ui::ET_GESTURE_SCROLL_UPDATE);
1034   // The slop consumed 5 dips
1035   EXPECT_FLOAT_EQ(5.5, delegate->scroll_x());
1036   EXPECT_FLOAT_EQ(5.5, delegate->scroll_y());
1037   EXPECT_EQ(gfx::Point(1, 1).ToString(),
1038             delegate->scroll_begin_position().ToString());
1039
1040   // When scrolling with a single finger, the bounding box of the gesture should
1041   // be empty, since it's a single point and the radius for testing is zero.
1042   EXPECT_TRUE(delegate->bounding_box().IsEmpty());
1043
1044   // Move some more to generate a few more scroll updates. Make sure that we get
1045   // out of the snap channel for the unified GR.
1046   tes.SendScrollEvent(event_processor(), 20, 120, kTouchId, delegate.get());
1047   EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE);
1048   EXPECT_FLOAT_EQ(-91.5, delegate->scroll_x());
1049   EXPECT_FLOAT_EQ(-91.5, delegate->scroll_y());
1050   EXPECT_TRUE(delegate->bounding_box().IsEmpty());
1051
1052   tes.SendScrollEvent(event_processor(), 50, 124, kTouchId, delegate.get());
1053   EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE);
1054   EXPECT_EQ(30, delegate->scroll_x());
1055   EXPECT_EQ(4, delegate->scroll_y());
1056   EXPECT_TRUE(delegate->bounding_box().IsEmpty());
1057
1058   // Release the touch. This should end the scroll.
1059   delegate->Reset();
1060   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
1061                          kTouchId,
1062                          tes.LeapForward(50));
1063   DispatchEventUsingWindowDispatcher(&release);
1064   EXPECT_2_EVENTS(delegate->events(),
1065                   ui::ET_SCROLL_FLING_START,
1066                   ui::ET_GESTURE_END);
1067   EXPECT_TRUE(delegate->bounding_box().IsEmpty());
1068 }
1069
1070 // Check that predicted scroll update positions are correct.
1071 TEST_P(GestureRecognizerTest, GestureEventScrollPrediction) {
1072   const double prediction_interval = 0.03;
1073   ui::GestureConfiguration::set_scroll_prediction_seconds(prediction_interval);
1074    // We'll start by moving the touch point by (5, 5). We want all of that
1075   // distance to be consumed by the slop, so we set the slop radius to
1076   // sqrt(5 * 5 + 5 * 5).
1077   ui::GestureConfiguration::set_max_touch_move_in_pixels_for_click(
1078       sqrt(static_cast<double>(5 * 5 + 5 * 5)));
1079
1080   scoped_ptr<GestureEventConsumeDelegate> delegate(
1081       new GestureEventConsumeDelegate());
1082   TimedEvents tes;
1083   const int kWindowWidth = 123;
1084   const int kWindowHeight = 45;
1085   const int kTouchId = 5;
1086   gfx::Rect bounds(95, 195, kWindowWidth, kWindowHeight);
1087   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
1088       delegate.get(), -1234, bounds, root_window()));
1089
1090   delegate->Reset();
1091   // Tracks the total scroll since we want to verify that the correct position
1092   // will be scrolled to throughout the prediction.
1093   gfx::Vector2dF total_scroll;
1094   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(96, 196),
1095                        kTouchId, tes.Now());
1096   DispatchEventUsingWindowDispatcher(&press);
1097   EXPECT_2_EVENTS(delegate->events(),
1098                   ui::ET_GESTURE_BEGIN,
1099                   ui::ET_GESTURE_TAP_DOWN);
1100   delegate->Reset();
1101
1102   // Get rid of touch slop.
1103   ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(111, 211),
1104                       kTouchId, tes.Now());
1105   DispatchEventUsingWindowDispatcher(&move);
1106   EXPECT_3_EVENTS(delegate->events(),
1107                   ui::ET_GESTURE_TAP_CANCEL,
1108                   ui::ET_GESTURE_SCROLL_BEGIN,
1109                   ui::ET_GESTURE_SCROLL_UPDATE);
1110   total_scroll.set_x(total_scroll.x() + delegate->scroll_x());
1111   total_scroll.set_y(total_scroll.y() + delegate->scroll_y());
1112
1113   // Move the touch-point enough so that it is considered as a scroll. This
1114   // should generate both SCROLL_BEGIN and SCROLL_UPDATE gestures.
1115   // The first movement is diagonal, to ensure that we have a free scroll,
1116   // and not a rail scroll.
1117   tes.LeapForward(30);
1118   tes.SendScrollEvent(event_processor(), 130, 230, kTouchId, delegate.get());
1119   EXPECT_1_EVENT(delegate->events(),
1120                  ui::ET_GESTURE_SCROLL_UPDATE);
1121   total_scroll.set_x(total_scroll.x() + delegate->scroll_x());
1122   total_scroll.set_y(total_scroll.y() + delegate->scroll_y());
1123
1124   // Move some more to generate a few more scroll updates.
1125   tes.LeapForward(30);
1126   tes.SendScrollEvent(event_processor(), 110, 211, kTouchId, delegate.get());
1127   EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE);
1128   total_scroll.set_x(total_scroll.x() + delegate->scroll_x());
1129   total_scroll.set_y(total_scroll.y() + delegate->scroll_y());
1130
1131   tes.LeapForward(30);
1132   tes.SendScrollEvent(event_processor(), 140, 215, kTouchId, delegate.get());
1133   EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE);
1134   total_scroll.set_x(total_scroll.x() + delegate->scroll_x());
1135   total_scroll.set_y(total_scroll.y() + delegate->scroll_y());
1136
1137   // Release the touch. This should end the scroll.
1138   delegate->Reset();
1139   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
1140                          kTouchId,
1141                          tes.LeapForward(50));
1142   DispatchEventUsingWindowDispatcher(&release);
1143 }
1144
1145 // Check that the bounding box during a scroll event is correct.
1146 TEST_P(GestureRecognizerTest, GestureEventScrollBoundingBox) {
1147   TimedEvents tes;
1148   for (int radius = 1; radius <= 10; ++radius) {
1149     ui::GestureConfiguration::set_default_radius(radius);
1150     scoped_ptr<GestureEventConsumeDelegate> delegate(
1151         new GestureEventConsumeDelegate());
1152     const int kWindowWidth = 123;
1153     const int kWindowHeight = 45;
1154     const int kTouchId = 5;
1155     gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
1156     scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
1157         delegate.get(), -1234, bounds, root_window()));
1158
1159     const int kPositionX = 101;
1160     const int kPositionY = 201;
1161     delegate->Reset();
1162     ui::TouchEvent press(ui::ET_TOUCH_PRESSED,
1163                          gfx::Point(kPositionX, kPositionY),
1164                          kTouchId,
1165                          tes.Now());
1166     DispatchEventUsingWindowDispatcher(&press);
1167     EXPECT_EQ(gfx::Rect(kPositionX - radius,
1168                         kPositionY - radius,
1169                         radius * 2,
1170                         radius * 2).ToString(),
1171               delegate->bounding_box().ToString());
1172
1173     const int kScrollAmount = 50;
1174     tes.SendScrollEvents(event_processor(), kPositionX, kPositionY,
1175         1, 1, kTouchId, 1, kScrollAmount, delegate.get());
1176     EXPECT_EQ(gfx::Point(1, 1).ToString(),
1177               delegate->scroll_begin_position().ToString());
1178     EXPECT_EQ(gfx::Rect(kPositionX + kScrollAmount - radius,
1179                         kPositionY + kScrollAmount - radius,
1180                         radius * 2,
1181                         radius * 2).ToString(),
1182               delegate->bounding_box().ToString());
1183
1184     // Release the touch. This should end the scroll.
1185     delegate->Reset();
1186     ui::TouchEvent release(ui::ET_TOUCH_RELEASED,
1187                                gfx::Point(kPositionX + kScrollAmount,
1188                                           kPositionY + kScrollAmount),
1189                                kTouchId, press.time_stamp() +
1190                                base::TimeDelta::FromMilliseconds(50));
1191     DispatchEventUsingWindowDispatcher(&release);
1192     EXPECT_EQ(gfx::Rect(kPositionX + kScrollAmount - radius,
1193                         kPositionY + kScrollAmount - radius,
1194                         radius * 2,
1195                         radius * 2).ToString(),
1196               delegate->bounding_box().ToString());
1197   }
1198   ui::GestureConfiguration::set_default_radius(0);
1199 }
1200
1201 // Check Scroll End Events report correct velocities
1202 // if the user was on a horizontal rail
1203 TEST_P(GestureRecognizerTest, GestureEventHorizontalRailFling) {
1204   scoped_ptr<GestureEventConsumeDelegate> delegate(
1205       new GestureEventConsumeDelegate());
1206   TimedEvents tes;
1207   const int kTouchId = 7;
1208   gfx::Rect bounds(0, 0, 1000, 1000);
1209   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
1210       delegate.get(), -1234, bounds, root_window()));
1211
1212   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0),
1213                        kTouchId, tes.Now());
1214   DispatchEventUsingWindowDispatcher(&press);
1215
1216   // Get rid of touch slop.
1217   ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(10, 0),
1218                        kTouchId, tes.Now());
1219   DispatchEventUsingWindowDispatcher(&move);
1220   delegate->Reset();
1221
1222
1223   // Move the touch-point horizontally enough that it is considered a
1224   // horizontal scroll.
1225   tes.SendScrollEvent(event_processor(), 30, 1, kTouchId, delegate.get());
1226   EXPECT_FLOAT_EQ(0, delegate->scroll_y());
1227   EXPECT_FLOAT_EQ(20, delegate->scroll_x());
1228
1229   // Get a high x velocity, while still staying on the rail
1230   tes.SendScrollEvents(event_processor(), 1, 1,
1231                    100, 10, kTouchId, 1,
1232                    ui::GestureConfiguration::points_buffered_for_velocity(),
1233                    delegate.get());
1234
1235   delegate->Reset();
1236   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
1237                          kTouchId, tes.Now());
1238   DispatchEventUsingWindowDispatcher(&release);
1239
1240   EXPECT_TRUE(delegate->fling());
1241   EXPECT_FALSE(delegate->scroll_end());
1242   EXPECT_GT(delegate->velocity_x(), 0);
1243   EXPECT_EQ(0, delegate->velocity_y());
1244 }
1245
1246 // Check Scroll End Events report correct velocities
1247 // if the user was on a vertical rail
1248 TEST_P(GestureRecognizerTest, GestureEventVerticalRailFling) {
1249   scoped_ptr<GestureEventConsumeDelegate> delegate(
1250       new GestureEventConsumeDelegate());
1251   TimedEvents tes;
1252   const int kTouchId = 7;
1253   gfx::Rect bounds(0, 0, 1000, 1000);
1254   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
1255       delegate.get(), -1234, bounds, root_window()));
1256
1257   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0),
1258                        kTouchId, tes.Now());
1259   DispatchEventUsingWindowDispatcher(&press);
1260
1261   // Get rid of touch slop.
1262   ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(0, 10),
1263                        kTouchId, tes.Now());
1264   DispatchEventUsingWindowDispatcher(&move);
1265   delegate->Reset();
1266
1267   // Move the touch-point vertically enough that it is considered a
1268   // vertical scroll.
1269   tes.SendScrollEvent(event_processor(), 1, 30, kTouchId, delegate.get());
1270   EXPECT_EQ(20, delegate->scroll_y());
1271   EXPECT_EQ(0, delegate->scroll_x());
1272   EXPECT_EQ(0, delegate->scroll_velocity_x());
1273
1274   // Get a high y velocity, while still staying on the rail
1275   tes.SendScrollEvents(event_processor(), 1, 6,
1276                        10, 100, kTouchId, 1,
1277                        ui::GestureConfiguration::points_buffered_for_velocity(),
1278                        delegate.get());
1279   EXPECT_EQ(0, delegate->scroll_velocity_x());
1280
1281   delegate->Reset();
1282   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 206),
1283                          kTouchId, tes.Now());
1284   DispatchEventUsingWindowDispatcher(&release);
1285
1286   EXPECT_TRUE(delegate->fling());
1287   EXPECT_FALSE(delegate->scroll_end());
1288   EXPECT_EQ(0, delegate->velocity_x());
1289   EXPECT_GT(delegate->velocity_y(), 0);
1290 }
1291
1292 // Check Scroll End Events report non-zero velocities if the user is not on a
1293 // rail
1294 TEST_P(GestureRecognizerTest, GestureEventNonRailFling) {
1295   ui::GestureConfiguration::set_max_touch_move_in_pixels_for_click(0);
1296   scoped_ptr<GestureEventConsumeDelegate> delegate(
1297       new GestureEventConsumeDelegate());
1298   TimedEvents tes;
1299   const int kTouchId = 7;
1300   gfx::Rect bounds(0, 0, 1000, 1000);
1301   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
1302       delegate.get(), -1234, bounds, root_window()));
1303
1304   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0),
1305                        kTouchId, tes.Now());
1306   DispatchEventUsingWindowDispatcher(&press);
1307
1308   // Move the touch-point such that a non-rail scroll begins, and we're outside
1309   // the snap channel for the unified GR.
1310   tes.SendScrollEvent(event_processor(), 50, 50, kTouchId, delegate.get());
1311   EXPECT_EQ(50, delegate->scroll_y());
1312   EXPECT_EQ(50, delegate->scroll_x());
1313
1314   tes.SendScrollEvents(event_processor(), 1, 1,
1315                        10, 100, kTouchId, 1,
1316                        ui::GestureConfiguration::points_buffered_for_velocity(),
1317                        delegate.get());
1318
1319   delegate->Reset();
1320   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
1321                          kTouchId, tes.Now());
1322   DispatchEventUsingWindowDispatcher(&release);
1323
1324   EXPECT_TRUE(delegate->fling());
1325   EXPECT_FALSE(delegate->scroll_end());
1326   EXPECT_GT(delegate->velocity_x(), 0);
1327   EXPECT_GT(delegate->velocity_y(), 0);
1328 }
1329
1330 // Check that appropriate touch events generate long press events
1331 TEST_P(GestureRecognizerTest, GestureEventLongPress) {
1332   ui::GestureConfiguration::set_max_touch_down_duration_in_seconds_for_click(
1333       0.0025);
1334
1335   scoped_ptr<GestureEventConsumeDelegate> delegate(
1336       new GestureEventConsumeDelegate());
1337   const int kWindowWidth = 123;
1338   const int kWindowHeight = 45;
1339   const int kTouchId = 2;
1340   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
1341   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
1342       delegate.get(), -1234, bounds, root_window()));
1343
1344   delegate->Reset();
1345
1346   TimerTestGestureRecognizer* gesture_recognizer =
1347       new TimerTestGestureRecognizer();
1348
1349   ScopedGestureRecognizerSetter gr_setter(gesture_recognizer);
1350
1351   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED,
1352                         gfx::Point(101, 201),
1353                         kTouchId,
1354                         ui::EventTimeForNow());
1355   DispatchEventUsingWindowDispatcher(&press1);
1356   EXPECT_TRUE(delegate->tap_down());
1357   EXPECT_TRUE(delegate->begin());
1358   EXPECT_FALSE(delegate->tap_cancel());
1359
1360   // We haven't pressed long enough for a long press to occur
1361   EXPECT_FALSE(delegate->long_press());
1362
1363   // Wait until the timer runs out
1364   delegate->WaitUntilReceivedGesture(ui::ET_GESTURE_LONG_PRESS);
1365   EXPECT_TRUE(delegate->long_press());
1366   EXPECT_FALSE(delegate->tap_cancel());
1367
1368   delegate->Reset();
1369   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED,
1370                           gfx::Point(101, 201),
1371                           kTouchId,
1372                           ui::EventTimeForNow());
1373   DispatchEventUsingWindowDispatcher(&release1);
1374   EXPECT_FALSE(delegate->long_press());
1375
1376   // Note the tap cancel isn't dispatched until the release
1377   EXPECT_TRUE(delegate->tap_cancel());
1378   EXPECT_FALSE(delegate->tap());
1379 }
1380
1381 // Check that scrolling cancels a long press
1382 TEST_P(GestureRecognizerTest, GestureEventLongPressCancelledByScroll) {
1383   scoped_ptr<GestureEventConsumeDelegate> delegate(
1384       new GestureEventConsumeDelegate());
1385   TimedEvents tes;
1386   const int kWindowWidth = 123;
1387   const int kWindowHeight = 45;
1388   const int kTouchId = 6;
1389   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
1390   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
1391       delegate.get(), -1234, bounds, root_window()));
1392
1393   delegate->Reset();
1394
1395   TimerTestGestureRecognizer* gesture_recognizer =
1396       new TimerTestGestureRecognizer();
1397   TimerTestGestureSequence* gesture_sequence =
1398       static_cast<TimerTestGestureSequence*>(
1399           gesture_recognizer->GetGestureSequenceForTesting(window.get()));
1400
1401   ScopedGestureRecognizerSetter gr_setter(gesture_recognizer);
1402
1403   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
1404                         kTouchId, tes.Now());
1405   DispatchEventUsingWindowDispatcher(&press1);
1406   EXPECT_TRUE(delegate->tap_down());
1407
1408   // We haven't pressed long enough for a long press to occur
1409   EXPECT_FALSE(delegate->long_press());
1410   EXPECT_FALSE(delegate->tap_cancel());
1411
1412   // Scroll around, to cancel the long press
1413   tes.SendScrollEvent(event_processor(), 130, 230, kTouchId, delegate.get());
1414   // Wait until the timer runs out
1415   gesture_sequence->ForceTimeout();
1416   EXPECT_FALSE(delegate->long_press());
1417   EXPECT_TRUE(delegate->tap_cancel());
1418
1419   delegate->Reset();
1420   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
1421                           kTouchId, tes.LeapForward(10));
1422   DispatchEventUsingWindowDispatcher(&release1);
1423   EXPECT_FALSE(delegate->long_press());
1424   EXPECT_FALSE(delegate->tap_cancel());
1425 }
1426
1427 // Check that appropriate touch events generate long tap events
1428 TEST_P(GestureRecognizerTest, GestureEventLongTap) {
1429   ui::GestureConfiguration::set_max_touch_down_duration_in_seconds_for_click(
1430       0.0025);
1431   scoped_ptr<GestureEventConsumeDelegate> delegate(
1432       new GestureEventConsumeDelegate());
1433   const int kWindowWidth = 123;
1434   const int kWindowHeight = 45;
1435   const int kTouchId = 2;
1436   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
1437   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
1438       delegate.get(), -1234, bounds, root_window()));
1439
1440   delegate->Reset();
1441
1442   TimerTestGestureRecognizer* gesture_recognizer =
1443       new TimerTestGestureRecognizer();
1444
1445   ScopedGestureRecognizerSetter gr_setter(gesture_recognizer);
1446
1447   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED,
1448                         gfx::Point(101, 201),
1449                         kTouchId,
1450                         ui::EventTimeForNow());
1451   DispatchEventUsingWindowDispatcher(&press1);
1452   EXPECT_TRUE(delegate->tap_down());
1453   EXPECT_TRUE(delegate->begin());
1454   EXPECT_FALSE(delegate->tap_cancel());
1455
1456   // We haven't pressed long enough for a long press to occur
1457   EXPECT_FALSE(delegate->long_press());
1458
1459   // Wait until the timer runs out
1460   delegate->WaitUntilReceivedGesture(ui::ET_GESTURE_LONG_PRESS);
1461   EXPECT_TRUE(delegate->long_press());
1462   EXPECT_FALSE(delegate->tap_cancel());
1463
1464   delegate->Reset();
1465   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED,
1466                           gfx::Point(101, 201),
1467                           kTouchId,
1468                           ui::EventTimeForNow());
1469   DispatchEventUsingWindowDispatcher(&release1);
1470   EXPECT_FALSE(delegate->long_press());
1471   EXPECT_TRUE(delegate->long_tap());
1472
1473   // Note the tap cancel isn't dispatched until the release
1474   EXPECT_TRUE(delegate->tap_cancel());
1475   EXPECT_FALSE(delegate->tap());
1476 }
1477
1478 // Check that second tap cancels a long press
1479 TEST_P(GestureRecognizerTest, GestureEventLongPressCancelledBySecondTap) {
1480   scoped_ptr<GestureEventConsumeDelegate> delegate(
1481       new GestureEventConsumeDelegate());
1482   TimedEvents tes;
1483   const int kWindowWidth = 300;
1484   const int kWindowHeight = 400;
1485   const int kTouchId1 = 8;
1486   const int kTouchId2 = 2;
1487   gfx::Rect bounds(5, 5, kWindowWidth, kWindowHeight);
1488   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
1489       delegate.get(), -1234, bounds, root_window()));
1490
1491   TimerTestGestureRecognizer* gesture_recognizer =
1492       new TimerTestGestureRecognizer();
1493   TimerTestGestureSequence* gesture_sequence =
1494       static_cast<TimerTestGestureSequence*>(
1495           gesture_recognizer->GetGestureSequenceForTesting(window.get()));
1496
1497   ScopedGestureRecognizerSetter gr_setter(gesture_recognizer);
1498
1499   delegate->Reset();
1500   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
1501                        kTouchId1, tes.Now());
1502   DispatchEventUsingWindowDispatcher(&press);
1503   EXPECT_TRUE(delegate->tap_down());
1504   EXPECT_TRUE(delegate->begin());
1505
1506   // We haven't pressed long enough for a long press to occur
1507   EXPECT_FALSE(delegate->long_press());
1508
1509   // Second tap, to cancel the long press
1510   delegate->Reset();
1511   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(10, 10),
1512                         kTouchId2, tes.Now());
1513   DispatchEventUsingWindowDispatcher(&press2);
1514   EXPECT_FALSE(delegate->tap_down());  // no touch down for second tap.
1515   EXPECT_TRUE(delegate->tap_cancel());
1516   EXPECT_TRUE(delegate->begin());
1517
1518   // Wait until the timer runs out
1519   gesture_sequence->ForceTimeout();
1520
1521   // No long press occurred
1522   EXPECT_FALSE(delegate->long_press());
1523
1524   delegate->Reset();
1525   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
1526                           kTouchId1, tes.Now());
1527   DispatchEventUsingWindowDispatcher(&release1);
1528   EXPECT_FALSE(delegate->long_press());
1529   EXPECT_TRUE(delegate->two_finger_tap());
1530   EXPECT_FALSE(delegate->tap_cancel());
1531 }
1532
1533 // Check that horizontal scroll gestures cause scrolls on horizontal rails.
1534 // Also tests that horizontal rails can be broken.
1535 TEST_P(GestureRecognizerTest, GestureEventHorizontalRailScroll) {
1536   scoped_ptr<GestureEventConsumeDelegate> delegate(
1537       new GestureEventConsumeDelegate());
1538   TimedEvents tes;
1539   const int kTouchId = 7;
1540   gfx::Rect bounds(0, 0, 1000, 1000);
1541   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
1542       delegate.get(), -1234, bounds, root_window()));
1543
1544   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0),
1545                        kTouchId, tes.Now());
1546   DispatchEventUsingWindowDispatcher(&press);
1547
1548   // Get rid of touch slop.
1549   ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(5, 0),
1550                       kTouchId, tes.Now());
1551
1552   DispatchEventUsingWindowDispatcher(&move);
1553   delegate->Reset();
1554
1555   // Move the touch-point horizontally enough that it is considered a
1556   // horizontal scroll.
1557   tes.SendScrollEvent(event_processor(), 25, 0, kTouchId, delegate.get());
1558   EXPECT_EQ(0, delegate->scroll_y());
1559   EXPECT_EQ(20, delegate->scroll_x());
1560
1561   tes.SendScrollEvent(event_processor(), 30, 6, kTouchId, delegate.get());
1562   EXPECT_TRUE(delegate->scroll_update());
1563   EXPECT_EQ(5, delegate->scroll_x());
1564   // y shouldn't change, as we're on a horizontal rail.
1565   EXPECT_EQ(0, delegate->scroll_y());
1566
1567   // Send enough information that a velocity can be calculated for the gesture,
1568   // and we can break the rail
1569   tes.SendScrollEvents(event_processor(), 1, 1,
1570                        6, 100, kTouchId, 1,
1571                        ui::GestureConfiguration::points_buffered_for_velocity(),
1572                        delegate.get());
1573
1574   tes.SendScrollEvent(event_processor(), 5, 0, kTouchId, delegate.get());
1575   tes.SendScrollEvent(event_processor(), 10, 5, kTouchId, delegate.get());
1576
1577   // The rail should be broken
1578   EXPECT_TRUE(delegate->scroll_update());
1579   EXPECT_EQ(5, delegate->scroll_x());
1580   EXPECT_EQ(5, delegate->scroll_y());
1581 }
1582
1583 // Check that vertical scroll gestures cause scrolls on vertical rails.
1584 // Also tests that vertical rails can be broken.
1585 TEST_P(GestureRecognizerTest, GestureEventVerticalRailScroll) {
1586   scoped_ptr<GestureEventConsumeDelegate> delegate(
1587       new GestureEventConsumeDelegate());
1588   TimedEvents tes;
1589   const int kTouchId = 7;
1590   gfx::Rect bounds(0, 0, 1000, 1000);
1591   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
1592       delegate.get(), -1234, bounds, root_window()));
1593
1594   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0),
1595                        kTouchId, tes.Now());
1596   DispatchEventUsingWindowDispatcher(&press);
1597
1598   // Get rid of touch slop.
1599   ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(0, 5),
1600                        kTouchId, tes.Now());
1601   DispatchEventUsingWindowDispatcher(&move);
1602   delegate->Reset();
1603
1604   // Move the touch-point vertically enough that it is considered a
1605   // vertical scroll.
1606   tes.SendScrollEvent(event_processor(), 0, 25, kTouchId, delegate.get());
1607   EXPECT_EQ(0, delegate->scroll_x());
1608   EXPECT_EQ(20, delegate->scroll_y());
1609
1610   tes.SendScrollEvent(event_processor(), 6, 30, kTouchId, delegate.get());
1611   EXPECT_TRUE(delegate->scroll_update());
1612   EXPECT_EQ(5, delegate->scroll_y());
1613   // x shouldn't change, as we're on a vertical rail.
1614   EXPECT_EQ(0, delegate->scroll_x());
1615   EXPECT_EQ(0, delegate->scroll_velocity_x());
1616
1617   // Send enough information that a velocity can be calculated for the gesture,
1618   // and we can break the rail
1619   tes.SendScrollEvents(event_processor(), 1, 6,
1620                        100, 1, kTouchId, 1,
1621                        ui::GestureConfiguration::points_buffered_for_velocity(),
1622                        delegate.get());
1623
1624   tes.SendScrollEvent(event_processor(), 0, 5, kTouchId, delegate.get());
1625   tes.SendScrollEvent(event_processor(), 5, 10, kTouchId, delegate.get());
1626
1627   // The rail should be broken
1628   EXPECT_TRUE(delegate->scroll_update());
1629   EXPECT_EQ(5, delegate->scroll_x());
1630   EXPECT_EQ(5, delegate->scroll_y());
1631 }
1632
1633 TEST_P(GestureRecognizerTest, GestureTapFollowedByScroll) {
1634   // We'll start by moving the touch point by (5, 5). We want all of that
1635   // distance to be consumed by the slop, so we set the slop radius to
1636   // sqrt(5 * 5 + 5 * 5).
1637   ui::GestureConfiguration::set_max_touch_move_in_pixels_for_click(
1638       sqrt(static_cast<double>(5 * 5 + 5 * 5)));
1639
1640   // First, tap. Then, do a scroll using the same touch-id.
1641   scoped_ptr<GestureEventConsumeDelegate> delegate(
1642       new GestureEventConsumeDelegate());
1643   TimedEvents tes;
1644   const int kWindowWidth = 123;
1645   const int kWindowHeight = 45;
1646   const int kTouchId = 3;
1647   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
1648   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
1649       delegate.get(), -1234, bounds, root_window()));
1650
1651   delegate->Reset();
1652   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
1653                        kTouchId, tes.Now());
1654   DispatchEventUsingWindowDispatcher(&press);
1655   EXPECT_FALSE(delegate->tap());
1656   EXPECT_TRUE(delegate->tap_down());
1657   EXPECT_FALSE(delegate->tap_cancel());
1658   EXPECT_FALSE(delegate->scroll_begin());
1659   EXPECT_FALSE(delegate->scroll_update());
1660   EXPECT_FALSE(delegate->scroll_end());
1661
1662   // Make sure there is enough delay before the touch is released so that it is
1663   // recognized as a tap.
1664   delegate->Reset();
1665   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
1666                          kTouchId, tes.LeapForward(50));
1667   DispatchEventUsingWindowDispatcher(&release);
1668   EXPECT_TRUE(delegate->tap());
1669   EXPECT_FALSE(delegate->tap_down());
1670   EXPECT_FALSE(delegate->tap_cancel());
1671   EXPECT_FALSE(delegate->scroll_begin());
1672   EXPECT_FALSE(delegate->scroll_update());
1673   EXPECT_FALSE(delegate->scroll_end());
1674
1675   // Now, do a scroll gesture. Delay it sufficiently so that it doesn't trigger
1676   // a double-tap.
1677   delegate->Reset();
1678   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
1679                         kTouchId, tes.LeapForward(1000));
1680   DispatchEventUsingWindowDispatcher(&press1);
1681   EXPECT_FALSE(delegate->tap());
1682   EXPECT_TRUE(delegate->tap_down());
1683   EXPECT_FALSE(delegate->tap_cancel());
1684   EXPECT_FALSE(delegate->scroll_begin());
1685   EXPECT_FALSE(delegate->scroll_update());
1686   EXPECT_FALSE(delegate->scroll_end());
1687
1688   // Get rid of touch slop.
1689   ui::TouchEvent move_remove_slop(ui::ET_TOUCH_MOVED, gfx::Point(116, 216),
1690                                   kTouchId, tes.Now());
1691   DispatchEventUsingWindowDispatcher(&move_remove_slop);
1692   EXPECT_TRUE(delegate->tap_cancel());
1693   EXPECT_TRUE(delegate->scroll_begin());
1694   EXPECT_TRUE(delegate->scroll_update());
1695   EXPECT_EQ(15, delegate->scroll_x_hint());
1696   EXPECT_EQ(15, delegate->scroll_y_hint());
1697
1698   delegate->Reset();
1699
1700   // Move the touch-point enough so that it is considered as a scroll. This
1701   // should generate both SCROLL_BEGIN and SCROLL_UPDATE gestures.
1702   // The first movement is diagonal, to ensure that we have a free scroll,
1703   // and not a rail scroll.
1704   delegate->Reset();
1705   ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(135, 235),
1706                       kTouchId, tes.Now());
1707   DispatchEventUsingWindowDispatcher(&move);
1708   EXPECT_FALSE(delegate->tap());
1709   EXPECT_FALSE(delegate->tap_down());
1710   EXPECT_FALSE(delegate->tap_cancel());
1711   EXPECT_FALSE(delegate->scroll_begin());
1712   EXPECT_TRUE(delegate->scroll_update());
1713   EXPECT_FALSE(delegate->scroll_end());
1714   EXPECT_EQ(19, delegate->scroll_x());
1715   EXPECT_EQ(19, delegate->scroll_y());
1716
1717   // Move some more to generate a few more scroll updates.
1718   delegate->Reset();
1719   ui::TouchEvent move1(ui::ET_TOUCH_MOVED, gfx::Point(115, 216),
1720                        kTouchId, tes.Now());
1721   DispatchEventUsingWindowDispatcher(&move1);
1722   EXPECT_FALSE(delegate->tap());
1723   EXPECT_FALSE(delegate->tap_down());
1724   EXPECT_FALSE(delegate->tap_cancel());
1725   EXPECT_FALSE(delegate->scroll_begin());
1726   EXPECT_TRUE(delegate->scroll_update());
1727   EXPECT_FALSE(delegate->scroll_end());
1728   EXPECT_EQ(-20, delegate->scroll_x());
1729   EXPECT_EQ(-19, delegate->scroll_y());
1730   EXPECT_EQ(0, delegate->scroll_x_hint());
1731   EXPECT_EQ(0, delegate->scroll_y_hint());
1732
1733   delegate->Reset();
1734   ui::TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(145, 220),
1735                        kTouchId, tes.Now());
1736   DispatchEventUsingWindowDispatcher(&move2);
1737   EXPECT_FALSE(delegate->tap());
1738   EXPECT_FALSE(delegate->tap_down());
1739   EXPECT_FALSE(delegate->tap_cancel());
1740   EXPECT_FALSE(delegate->scroll_begin());
1741   EXPECT_TRUE(delegate->scroll_update());
1742   EXPECT_FALSE(delegate->scroll_end());
1743   EXPECT_EQ(30, delegate->scroll_x());
1744   EXPECT_EQ(4, delegate->scroll_y());
1745
1746   // Release the touch. This should end the scroll.
1747   delegate->Reset();
1748   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
1749                           kTouchId, tes.Now());
1750   DispatchEventUsingWindowDispatcher(&release1);
1751   EXPECT_FALSE(delegate->tap());
1752   EXPECT_FALSE(delegate->tap_down());
1753   EXPECT_FALSE(delegate->tap_cancel());
1754   EXPECT_FALSE(delegate->scroll_begin());
1755   EXPECT_FALSE(delegate->scroll_update());
1756   EXPECT_FALSE(delegate->scroll_end());
1757   EXPECT_TRUE(delegate->fling());
1758 }
1759
1760 TEST_P(GestureRecognizerTest, AsynchronousGestureRecognition) {
1761   scoped_ptr<QueueTouchEventDelegate> queued_delegate(
1762       new QueueTouchEventDelegate(host()->dispatcher()));
1763   const int kWindowWidth = 123;
1764   const int kWindowHeight = 45;
1765   const int kTouchId1 = 6;
1766   const int kTouchId2 = 4;
1767   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
1768   scoped_ptr<aura::Window> queue(CreateTestWindowWithDelegate(
1769       queued_delegate.get(), -1234, bounds, root_window()));
1770
1771   queued_delegate->set_window(queue.get());
1772
1773   // Touch down on the window. This should not generate any gesture event.
1774   queued_delegate->Reset();
1775   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
1776                            kTouchId1, GetTime());
1777   DispatchEventUsingWindowDispatcher(&press);
1778   EXPECT_FALSE(queued_delegate->tap());
1779   EXPECT_FALSE(queued_delegate->tap_down());
1780   EXPECT_FALSE(queued_delegate->tap_cancel());
1781   EXPECT_FALSE(queued_delegate->begin());
1782   EXPECT_FALSE(queued_delegate->scroll_begin());
1783   EXPECT_FALSE(queued_delegate->scroll_update());
1784   EXPECT_FALSE(queued_delegate->scroll_end());
1785
1786   // Introduce some delay before the touch is released so that it is recognized
1787   // as a tap. However, this still should not create any gesture events.
1788   queued_delegate->Reset();
1789   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
1790                              kTouchId1, press.time_stamp() +
1791                              base::TimeDelta::FromMilliseconds(50));
1792   DispatchEventUsingWindowDispatcher(&release);
1793   EXPECT_FALSE(queued_delegate->tap());
1794   EXPECT_FALSE(queued_delegate->tap_down());
1795   EXPECT_FALSE(queued_delegate->tap_cancel());
1796   EXPECT_FALSE(queued_delegate->begin());
1797   EXPECT_FALSE(queued_delegate->end());
1798   EXPECT_FALSE(queued_delegate->scroll_begin());
1799   EXPECT_FALSE(queued_delegate->scroll_update());
1800   EXPECT_FALSE(queued_delegate->scroll_end());
1801
1802   // Create another window, and place a touch-down on it. This should create a
1803   // tap-down gesture.
1804   scoped_ptr<GestureEventConsumeDelegate> delegate(
1805       new GestureEventConsumeDelegate());
1806   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
1807       delegate.get(), -2345, gfx::Rect(0, 0, 50, 50), root_window()));
1808   delegate->Reset();
1809   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(10, 20),
1810                             kTouchId2, GetTime());
1811   DispatchEventUsingWindowDispatcher(&press2);
1812   EXPECT_FALSE(delegate->tap());
1813   EXPECT_TRUE(delegate->tap_down());
1814   EXPECT_FALSE(delegate->tap_cancel());
1815   EXPECT_FALSE(queued_delegate->begin());
1816   EXPECT_FALSE(queued_delegate->end());
1817   EXPECT_FALSE(delegate->scroll_begin());
1818   EXPECT_FALSE(delegate->scroll_update());
1819   EXPECT_FALSE(delegate->scroll_end());
1820
1821   ui::TouchEvent release2(ui::ET_TOUCH_RELEASED, gfx::Point(10, 20),
1822                               kTouchId2, GetTime());
1823   DispatchEventUsingWindowDispatcher(&release2);
1824
1825   // Process the first queued event.
1826   queued_delegate->Reset();
1827   queued_delegate->ReceivedAck();
1828   EXPECT_FALSE(queued_delegate->tap());
1829   EXPECT_TRUE(queued_delegate->tap_down());
1830   EXPECT_TRUE(queued_delegate->begin());
1831   EXPECT_FALSE(queued_delegate->tap_cancel());
1832   EXPECT_FALSE(queued_delegate->end());
1833   EXPECT_FALSE(queued_delegate->scroll_begin());
1834   EXPECT_FALSE(queued_delegate->scroll_update());
1835   EXPECT_FALSE(queued_delegate->scroll_end());
1836
1837   // Now, process the second queued event.
1838   queued_delegate->Reset();
1839   queued_delegate->ReceivedAck();
1840   EXPECT_TRUE(queued_delegate->tap());
1841   EXPECT_FALSE(queued_delegate->tap_down());
1842   EXPECT_FALSE(queued_delegate->tap_cancel());
1843   EXPECT_FALSE(queued_delegate->begin());
1844   EXPECT_TRUE(queued_delegate->end());
1845   EXPECT_FALSE(queued_delegate->scroll_begin());
1846   EXPECT_FALSE(queued_delegate->scroll_update());
1847   EXPECT_FALSE(queued_delegate->scroll_end());
1848
1849   // Start all over. Press on the first window, then press again on the second
1850   // window. The second press should still go to the first window.
1851   queued_delegate->Reset();
1852   ui::TouchEvent press3(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
1853                             kTouchId1, GetTime());
1854   DispatchEventUsingWindowDispatcher(&press3);
1855   EXPECT_FALSE(queued_delegate->tap());
1856   EXPECT_FALSE(queued_delegate->tap_down());
1857   EXPECT_FALSE(queued_delegate->tap_cancel());
1858   EXPECT_FALSE(queued_delegate->begin());
1859   EXPECT_FALSE(queued_delegate->end());
1860   EXPECT_FALSE(queued_delegate->begin());
1861   EXPECT_FALSE(queued_delegate->end());
1862   EXPECT_FALSE(queued_delegate->scroll_begin());
1863   EXPECT_FALSE(queued_delegate->scroll_update());
1864   EXPECT_FALSE(queued_delegate->scroll_end());
1865
1866   queued_delegate->Reset();
1867   delegate->Reset();
1868   ui::TouchEvent press4(ui::ET_TOUCH_PRESSED, gfx::Point(103, 203),
1869                             kTouchId2, GetTime());
1870   DispatchEventUsingWindowDispatcher(&press4);
1871   EXPECT_FALSE(delegate->tap());
1872   EXPECT_FALSE(delegate->tap_down());
1873   EXPECT_FALSE(delegate->tap_cancel());
1874   EXPECT_FALSE(delegate->begin());
1875   EXPECT_FALSE(delegate->end());
1876   EXPECT_FALSE(delegate->scroll_begin());
1877   EXPECT_FALSE(delegate->scroll_update());
1878   EXPECT_FALSE(delegate->scroll_end());
1879   EXPECT_FALSE(queued_delegate->tap());
1880   EXPECT_FALSE(queued_delegate->tap_down());
1881   EXPECT_FALSE(queued_delegate->tap_cancel());
1882   EXPECT_FALSE(queued_delegate->begin());
1883   EXPECT_FALSE(queued_delegate->end());
1884   EXPECT_FALSE(queued_delegate->scroll_begin());
1885   EXPECT_FALSE(queued_delegate->scroll_update());
1886   EXPECT_FALSE(queued_delegate->scroll_end());
1887
1888   // Move the second touch-point enough so that it is considered a pinch. This
1889   // should generate both SCROLL_BEGIN and PINCH_BEGIN gestures.
1890   queued_delegate->Reset();
1891   delegate->Reset();
1892   int x_move = ui::GestureConfiguration::max_touch_move_in_pixels_for_click();
1893   ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(203 + x_move, 303),
1894                           kTouchId2, GetTime());
1895   DispatchEventUsingWindowDispatcher(&move);
1896   EXPECT_FALSE(delegate->tap());
1897   EXPECT_FALSE(delegate->tap_down());
1898   EXPECT_FALSE(delegate->tap_cancel());
1899   EXPECT_FALSE(delegate->begin());
1900   EXPECT_FALSE(delegate->scroll_begin());
1901   EXPECT_FALSE(delegate->scroll_update());
1902   EXPECT_FALSE(delegate->scroll_end());
1903   EXPECT_FALSE(queued_delegate->tap());
1904   EXPECT_FALSE(queued_delegate->tap_down());
1905   EXPECT_FALSE(queued_delegate->tap_cancel());
1906   EXPECT_FALSE(queued_delegate->begin());
1907   EXPECT_FALSE(queued_delegate->scroll_begin());
1908   EXPECT_FALSE(queued_delegate->scroll_update());
1909   EXPECT_FALSE(queued_delegate->scroll_end());
1910
1911   queued_delegate->Reset();
1912   queued_delegate->ReceivedAck();
1913   EXPECT_FALSE(queued_delegate->tap());
1914   EXPECT_TRUE(queued_delegate->tap_down());
1915   EXPECT_TRUE(queued_delegate->begin());
1916   EXPECT_FALSE(queued_delegate->tap_cancel());
1917   EXPECT_FALSE(queued_delegate->end());
1918   EXPECT_FALSE(queued_delegate->scroll_begin());
1919   EXPECT_FALSE(queued_delegate->scroll_update());
1920   EXPECT_FALSE(queued_delegate->scroll_end());
1921
1922   queued_delegate->Reset();
1923   queued_delegate->ReceivedAck();
1924   EXPECT_FALSE(queued_delegate->tap());
1925   EXPECT_FALSE(queued_delegate->tap_down());  // no touch down for second tap.
1926   EXPECT_TRUE(queued_delegate->tap_cancel());
1927   EXPECT_TRUE(queued_delegate->begin());
1928   EXPECT_FALSE(queued_delegate->end());
1929   EXPECT_FALSE(queued_delegate->scroll_begin());
1930   EXPECT_FALSE(queued_delegate->scroll_update());
1931   EXPECT_FALSE(queued_delegate->scroll_end());
1932   EXPECT_FALSE(queued_delegate->pinch_begin());
1933   EXPECT_FALSE(queued_delegate->pinch_update());
1934   EXPECT_FALSE(queued_delegate->pinch_end());
1935
1936   queued_delegate->Reset();
1937   queued_delegate->ReceivedAck();
1938   EXPECT_FALSE(queued_delegate->tap());
1939   EXPECT_FALSE(queued_delegate->tap_down());
1940   EXPECT_FALSE(queued_delegate->tap_cancel());
1941   EXPECT_FALSE(queued_delegate->begin());
1942   EXPECT_FALSE(queued_delegate->end());
1943   EXPECT_TRUE(queued_delegate->scroll_begin());
1944   // TODO(tdresser): uncomment once we've switched to the unified GR.
1945   //  EXPECT_TRUE(queued_delegate->scroll_update());
1946   EXPECT_FALSE(queued_delegate->scroll_end());
1947   EXPECT_TRUE(queued_delegate->pinch_begin());
1948   EXPECT_FALSE(queued_delegate->pinch_update());
1949   EXPECT_FALSE(queued_delegate->pinch_end());
1950 }
1951
1952 // Check that appropriate touch events generate pinch gesture events.
1953 TEST_P(GestureRecognizerTest, GestureEventPinchFromScroll) {
1954   // Disabled for unified GR due to differences in when pinch begin is sent. The
1955   // Aura GR sends it earlier than is necessary.
1956   if (UsingUnifiedGR())
1957     return;
1958
1959   scoped_ptr<GestureEventConsumeDelegate> delegate(
1960       new GestureEventConsumeDelegate());
1961   TimedEvents tes;
1962   const int kWindowWidth = 300;
1963   const int kWindowHeight = 400;
1964   const int kTouchId1 = 5;
1965   const int kTouchId2 = 3;
1966   gfx::Rect bounds(5, 5, kWindowWidth, kWindowHeight);
1967   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
1968       delegate.get(), -1234, bounds, root_window()));
1969
1970   delegate->Reset();
1971   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
1972                        kTouchId1, tes.Now());
1973   DispatchEventUsingWindowDispatcher(&press);
1974   EXPECT_2_EVENTS(delegate->events(),
1975                   ui::ET_GESTURE_BEGIN,
1976                   ui::ET_GESTURE_TAP_DOWN);
1977
1978   // Move the touch-point enough so that it is considered as a scroll. This
1979   // should generate both SCROLL_BEGIN and SCROLL_UPDATE gestures.
1980   delegate->Reset();
1981   ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(130, 301),
1982                       kTouchId1, tes.Now());
1983   DispatchEventUsingWindowDispatcher(&move);
1984   EXPECT_3_EVENTS(delegate->events(),
1985                   ui::ET_GESTURE_TAP_CANCEL,
1986                   ui::ET_GESTURE_SCROLL_BEGIN,
1987                   ui::ET_GESTURE_SCROLL_UPDATE);
1988
1989   // Press the second finger. It should cause pinch-begin. Note that we will not
1990   // transition to two finger tap here because the touch points are far enough.
1991   delegate->Reset();
1992   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(10, 10),
1993                         kTouchId2, tes.Now());
1994   DispatchEventUsingWindowDispatcher(&press2);
1995   EXPECT_2_EVENTS(delegate->events(),
1996                  ui::ET_GESTURE_BEGIN,
1997                  ui::ET_GESTURE_PINCH_BEGIN);
1998   EXPECT_EQ(gfx::Rect(10, 10, 120, 291).ToString(),
1999             delegate->bounding_box().ToString());
2000
2001   // Move the first finger.
2002   delegate->Reset();
2003   ui::TouchEvent move3(ui::ET_TOUCH_MOVED, gfx::Point(95, 201),
2004                        kTouchId1, tes.Now());
2005   DispatchEventUsingWindowDispatcher(&move3);
2006   EXPECT_2_EVENTS(delegate->events(),
2007                   ui::ET_GESTURE_PINCH_UPDATE,
2008                   ui::ET_GESTURE_SCROLL_UPDATE);
2009   EXPECT_EQ(gfx::Rect(10, 10, 85, 191).ToString(),
2010             delegate->bounding_box().ToString());
2011
2012   // Now move the second finger.
2013   delegate->Reset();
2014   ui::TouchEvent move4(ui::ET_TOUCH_MOVED, gfx::Point(55, 15),
2015                        kTouchId2, tes.Now());
2016   DispatchEventUsingWindowDispatcher(&move4);
2017   EXPECT_2_EVENTS(delegate->events(),
2018                   ui::ET_GESTURE_PINCH_UPDATE,
2019                   ui::ET_GESTURE_SCROLL_UPDATE);
2020   EXPECT_EQ(gfx::Rect(55, 15, 40, 186).ToString(),
2021             delegate->bounding_box().ToString());
2022
2023   // Release the first finger. This should end pinch.
2024   delegate->Reset();
2025   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
2026                          kTouchId1, tes.Now());
2027   DispatchEventUsingWindowDispatcher(&release);
2028   EXPECT_2_EVENTS(delegate->events(),
2029                  ui::ET_GESTURE_PINCH_END,
2030                  ui::ET_GESTURE_END);
2031   EXPECT_EQ(gfx::Rect(55, 15, 46, 186).ToString(),
2032             delegate->bounding_box().ToString());
2033
2034   // Move the second finger. This should still generate a scroll.
2035   delegate->Reset();
2036   ui::TouchEvent move5(ui::ET_TOUCH_MOVED, gfx::Point(25, 10),
2037                        kTouchId2, tes.Now());
2038   DispatchEventUsingWindowDispatcher(&move5);
2039   EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE);
2040   EXPECT_TRUE(delegate->bounding_box().IsEmpty());
2041 }
2042
2043 TEST_P(GestureRecognizerTest, GestureEventPinchFromScrollFromPinch) {
2044 scoped_ptr<GestureEventConsumeDelegate> delegate(
2045       new GestureEventConsumeDelegate());
2046   TimedEvents tes;
2047   const int kWindowWidth = 300;
2048   const int kWindowHeight = 400;
2049   const int kTouchId1 = 5;
2050   const int kTouchId2 = 3;
2051   gfx::Rect bounds(5, 5, kWindowWidth, kWindowHeight);
2052   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2053       delegate.get(), -1234, bounds, root_window()));
2054
2055   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 301),
2056                        kTouchId1, tes.Now());
2057   DispatchEventUsingWindowDispatcher(&press);
2058   delegate->Reset();
2059   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(10, 10),
2060                         kTouchId2, tes.Now());
2061   DispatchEventUsingWindowDispatcher(&press2);
2062   EXPECT_FALSE(delegate->pinch_begin());
2063
2064   // Touch move triggers pinch begin.
2065   tes.SendScrollEvent(event_processor(), 130, 230, kTouchId1, delegate.get());
2066   EXPECT_TRUE(delegate->pinch_begin());
2067   EXPECT_FALSE(delegate->pinch_update());
2068
2069   // Touch move triggers pinch update.
2070   tes.SendScrollEvent(event_processor(), 160, 200, kTouchId1, delegate.get());
2071   EXPECT_FALSE(delegate->pinch_begin());
2072   EXPECT_TRUE(delegate->pinch_update());
2073
2074   // Pinch has started, now release the second finger
2075   delegate->Reset();
2076   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
2077                          kTouchId1, tes.Now());
2078   DispatchEventUsingWindowDispatcher(&release);
2079   EXPECT_TRUE(delegate->pinch_end());
2080
2081   tes.SendScrollEvent(event_processor(), 130, 230, kTouchId2, delegate.get());
2082   EXPECT_TRUE(delegate->scroll_update());
2083
2084   // Pinch again
2085   delegate->Reset();
2086   ui::TouchEvent press3(ui::ET_TOUCH_PRESSED, gfx::Point(10, 10),
2087                         kTouchId1, tes.Now());
2088   DispatchEventUsingWindowDispatcher(&press3);
2089   // Now the touch points are close. So we will go into two finger tap.
2090   // Move the touch-point enough to break two-finger-tap and enter pinch.
2091   ui::TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(101, 50),
2092                        kTouchId1, tes.Now());
2093   DispatchEventUsingWindowDispatcher(&move2);
2094   EXPECT_TRUE(delegate->pinch_begin());
2095
2096   tes.SendScrollEvent(event_processor(), 350, 350, kTouchId1, delegate.get());
2097   EXPECT_TRUE(delegate->pinch_update());
2098 }
2099
2100 TEST_P(GestureRecognizerTest, GestureEventPinchFromTap) {
2101   // TODO(tdresser): enable this test with unified GR once two finger tap.
2102   if (UsingUnifiedGR())
2103     return;
2104
2105   scoped_ptr<GestureEventConsumeDelegate> delegate(
2106       new GestureEventConsumeDelegate());
2107   TimedEvents tes;
2108   const int kWindowWidth = 300;
2109   const int kWindowHeight = 400;
2110   const int kTouchId1 = 3;
2111   const int kTouchId2 = 5;
2112   gfx::Rect bounds(5, 5, kWindowWidth, kWindowHeight);
2113   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2114       delegate.get(), -1234, bounds, root_window()));
2115
2116   delegate->Reset();
2117   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 301),
2118                        kTouchId1, tes.Now());
2119   DispatchEventUsingWindowDispatcher(&press);
2120   EXPECT_2_EVENTS(delegate->events(),
2121                   ui::ET_GESTURE_BEGIN,
2122                   ui::ET_GESTURE_TAP_DOWN);
2123   EXPECT_TRUE(delegate->bounding_box().IsEmpty());
2124
2125   // Press the second finger far enough to break two finger tap.
2126   delegate->Reset();
2127   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(10, 10),
2128                         kTouchId2, tes.Now());
2129   DispatchEventUsingWindowDispatcher(&press2);
2130   EXPECT_2_EVENTS(delegate->events(),
2131                   ui::ET_GESTURE_TAP_CANCEL,
2132                   ui::ET_GESTURE_BEGIN);
2133   EXPECT_EQ(gfx::Rect(10, 10, 91, 291).ToString(),
2134             delegate->bounding_box().ToString());
2135
2136   // Move the first finger.
2137   delegate->Reset();
2138   ui::TouchEvent move3(ui::ET_TOUCH_MOVED, gfx::Point(65, 201),
2139                        kTouchId1, tes.Now());
2140   DispatchEventUsingWindowDispatcher(&move3);
2141   EXPECT_2_EVENTS(delegate->events(),
2142                   ui::ET_GESTURE_SCROLL_BEGIN,
2143                   ui::ET_GESTURE_PINCH_BEGIN);
2144   EXPECT_EQ(gfx::Rect(10, 10, 55, 191).ToString(),
2145             delegate->bounding_box().ToString());
2146
2147   // Now move the second finger.
2148   delegate->Reset();
2149   ui::TouchEvent move4(ui::ET_TOUCH_MOVED, gfx::Point(55, 15),
2150                        kTouchId2, tes.Now());
2151   DispatchEventUsingWindowDispatcher(&move4);
2152   EXPECT_2_EVENTS(delegate->events(),
2153                   ui::ET_GESTURE_PINCH_UPDATE,
2154                   ui::ET_GESTURE_SCROLL_UPDATE);
2155   EXPECT_EQ(gfx::Rect(55, 15, 10, 186).ToString(),
2156             delegate->bounding_box().ToString());
2157
2158   // Release the first finger. This should end pinch.
2159   delegate->Reset();
2160   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
2161                          kTouchId1, tes.LeapForward(10));
2162   DispatchEventUsingWindowDispatcher(&release);
2163   EXPECT_2_EVENTS(delegate->events(),
2164                   ui::ET_GESTURE_PINCH_END,
2165                   ui::ET_GESTURE_END);
2166   EXPECT_EQ(gfx::Rect(55, 15, 46, 186).ToString(),
2167             delegate->bounding_box().ToString());
2168
2169   // Move the second finger. This should still generate a scroll.
2170   delegate->Reset();
2171   ui::TouchEvent move5(ui::ET_TOUCH_MOVED, gfx::Point(25, 10),
2172                        kTouchId2, tes.Now());
2173   DispatchEventUsingWindowDispatcher(&move5);
2174   EXPECT_1_EVENT(delegate->events(), ui::ET_GESTURE_SCROLL_UPDATE);
2175   EXPECT_TRUE(delegate->bounding_box().IsEmpty());
2176 }
2177
2178 TEST_P(GestureRecognizerTest, GestureEventIgnoresDisconnectedEvents) {
2179   scoped_ptr<GestureEventConsumeDelegate> delegate(
2180       new GestureEventConsumeDelegate());
2181   TimedEvents tes;
2182
2183   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
2184                           6, tes.Now());
2185   DispatchEventUsingWindowDispatcher(&release1);
2186   EXPECT_FALSE(delegate->tap());
2187   EXPECT_FALSE(delegate->tap_down());
2188 }
2189
2190 // Check that a touch is locked to the window of the closest current touch
2191 // within max_separation_for_gesture_touches_in_pixels
2192 TEST_P(GestureRecognizerTest, GestureEventTouchLockSelectsCorrectWindow) {
2193   ui::GestureRecognizer* gesture_recognizer = new ui::GestureRecognizerImpl();
2194   TimedEvents tes;
2195   ScopedGestureRecognizerSetter gr_setter(gesture_recognizer);
2196
2197   ui::GestureConsumer* target;
2198   const int kNumWindows = 4;
2199
2200   scoped_ptr<GestureEventConsumeDelegate*[]> delegates(
2201       new GestureEventConsumeDelegate*[kNumWindows]);
2202
2203   ui::GestureConfiguration::
2204       set_max_separation_for_gesture_touches_in_pixels(499);
2205
2206   scoped_ptr<gfx::Rect[]> window_bounds(new gfx::Rect[kNumWindows]);
2207   window_bounds[0] = gfx::Rect(0, 0, 1, 1);
2208   window_bounds[1] = gfx::Rect(500, 0, 1, 1);
2209   window_bounds[2] = gfx::Rect(0, 500, 1, 1);
2210   window_bounds[3] = gfx::Rect(500, 500, 1, 1);
2211
2212   scoped_ptr<aura::Window*[]> windows(new aura::Window*[kNumWindows]);
2213
2214   // Instantiate windows with |window_bounds| and touch each window at
2215   // its origin.
2216   for (int i = 0; i < kNumWindows; ++i) {
2217     delegates[i] = new GestureEventConsumeDelegate();
2218     windows[i] = CreateTestWindowWithDelegate(
2219         delegates[i], i, window_bounds[i], root_window());
2220     windows[i]->set_id(i);
2221     ui::TouchEvent press(ui::ET_TOUCH_PRESSED, window_bounds[i].origin(),
2222                          i, tes.Now());
2223     DispatchEventUsingWindowDispatcher(&press);
2224   }
2225
2226   // Touches should now be associated with the closest touch within
2227   // ui::GestureConfiguration::max_separation_for_gesture_touches_in_pixels
2228   target = gesture_recognizer->GetTargetForLocation(gfx::Point(11, 11), -1);
2229   EXPECT_EQ("0", WindowIDAsString(target));
2230   target = gesture_recognizer->GetTargetForLocation(gfx::Point(511, 11), -1);
2231   EXPECT_EQ("1", WindowIDAsString(target));
2232   target = gesture_recognizer->GetTargetForLocation(gfx::Point(11, 511), -1);
2233   EXPECT_EQ("2", WindowIDAsString(target));
2234   target = gesture_recognizer->GetTargetForLocation(gfx::Point(511, 511), -1);
2235   EXPECT_EQ("3", WindowIDAsString(target));
2236
2237   // Add a touch in the middle associated with windows[2]
2238   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(0, 500),
2239                        kNumWindows, tes.Now());
2240   DispatchEventUsingWindowDispatcher(&press);
2241   ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(250, 250),
2242                       kNumWindows, tes.Now());
2243   DispatchEventUsingWindowDispatcher(&move);
2244
2245   target = gesture_recognizer->GetTargetForLocation(gfx::Point(250, 250), -1);
2246   EXPECT_EQ("2", WindowIDAsString(target));
2247
2248   // Make sure that ties are broken by distance to a current touch
2249   // Closer to the point in the bottom right.
2250   target = gesture_recognizer->GetTargetForLocation(gfx::Point(380, 380), -1);
2251   EXPECT_EQ("3", WindowIDAsString(target));
2252
2253   // This touch is closer to the point in the middle
2254   target = gesture_recognizer->GetTargetForLocation(gfx::Point(300, 300), -1);
2255   EXPECT_EQ("2", WindowIDAsString(target));
2256
2257   // A touch too far from other touches won't be locked to anything
2258   target = gesture_recognizer->GetTargetForLocation(gfx::Point(1000, 1000), -1);
2259   EXPECT_TRUE(target == NULL);
2260
2261   // Move a touch associated with windows[2] to 1000, 1000
2262   ui::TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(1000, 1000),
2263                        kNumWindows, tes.Now());
2264   DispatchEventUsingWindowDispatcher(&move2);
2265
2266   target = gesture_recognizer->GetTargetForLocation(gfx::Point(1000, 1000), -1);
2267   EXPECT_EQ("2", WindowIDAsString(target));
2268
2269   for (int i = 0; i < kNumWindows; ++i) {
2270     // Delete windows before deleting delegates.
2271     delete windows[i];
2272     delete delegates[i];
2273   }
2274 }
2275
2276 // Check that a touch's target will not be effected by a touch on a different
2277 // screen.
2278 TEST_P(GestureRecognizerTest, GestureEventTouchLockIgnoresOtherScreens) {
2279   scoped_ptr<GestureEventConsumeDelegate> delegate(
2280       new GestureEventConsumeDelegate());
2281   gfx::Rect bounds(0, 0, 10, 10);
2282   scoped_ptr<aura::Window> window(
2283       CreateTestWindowWithDelegate(delegate.get(), 0, bounds, root_window()));
2284
2285   const int kTouchId1 = 8;
2286   const int kTouchId2 = 2;
2287   TimedEvents tes;
2288
2289   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(5, 5),
2290                         kTouchId1, tes.Now());
2291   press1.set_source_device_id(1);
2292   DispatchEventUsingWindowDispatcher(&press1);
2293
2294   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(20, 20),
2295                         kTouchId2, tes.Now());
2296   press2.set_source_device_id(2);
2297   DispatchEventUsingWindowDispatcher(&press2);
2298
2299   // The second press should not have been locked to the same target as the
2300   // first, as they occured on different displays.
2301   EXPECT_NE(
2302       ui::GestureRecognizer::Get()->GetTouchLockedTarget(press1),
2303       ui::GestureRecognizer::Get()->GetTouchLockedTarget(press2));
2304 }
2305
2306 // Check that touch events outside the root window are still handled
2307 // by the root window's gesture sequence.
2308 TEST_P(GestureRecognizerTest, GestureEventOutsideRootWindowTap) {
2309   // TODO(tdresser): write a version of this test for the unified GR.
2310   if (UsingUnifiedGR())
2311     return;
2312
2313   TestGestureRecognizer* gesture_recognizer =
2314       new TestGestureRecognizer();
2315   TimedEvents tes;
2316   ScopedGestureRecognizerSetter gr_setter(gesture_recognizer);
2317
2318   scoped_ptr<aura::Window> window(CreateTestWindowWithBounds(
2319       gfx::Rect(-100, -100, 2000, 2000), root_window()));
2320
2321   ui::GestureSequence* window_gesture_sequence =
2322       gesture_recognizer->GetGestureSequenceForTesting(window.get());
2323
2324   ui::GestureSequence* root_window_gesture_sequence =
2325       gesture_recognizer->GetGestureSequenceForTesting(root_window());
2326
2327   gfx::Point pos1(-10, -10);
2328   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, pos1, 0, tes.Now());
2329   DispatchEventUsingWindowDispatcher(&press1);
2330
2331   gfx::Point pos2(1000, 1000);
2332   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, pos2, 1, tes.Now());
2333   DispatchEventUsingWindowDispatcher(&press2);
2334
2335   // As these presses were outside the root window, they should be
2336   // associated with the root window.
2337   EXPECT_EQ(0, window_gesture_sequence->point_count());
2338   EXPECT_EQ(2, root_window_gesture_sequence->point_count());
2339 }
2340
2341 TEST_P(GestureRecognizerTest, NoTapWithPreventDefaultedRelease) {
2342   scoped_ptr<QueueTouchEventDelegate> delegate(
2343       new QueueTouchEventDelegate(host()->dispatcher()));
2344   TimedEvents tes;
2345   const int kTouchId = 2;
2346   gfx::Rect bounds(100, 200, 100, 100);
2347   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2348       delegate.get(), -1234, bounds, root_window()));
2349   delegate->set_window(window.get());
2350
2351   delegate->Reset();
2352   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
2353                        kTouchId, tes.Now());
2354   DispatchEventUsingWindowDispatcher(&press);
2355   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
2356                          kTouchId, tes.LeapForward(50));
2357   DispatchEventUsingWindowDispatcher(&release);
2358
2359   delegate->Reset();
2360   delegate->ReceivedAck();
2361   EXPECT_TRUE(delegate->tap_down());
2362   delegate->Reset();
2363   delegate->ReceivedAckPreventDefaulted();
2364   EXPECT_FALSE(delegate->tap());
2365   EXPECT_TRUE(delegate->tap_cancel());
2366 }
2367
2368 TEST_P(GestureRecognizerTest, PinchScrollWithPreventDefaultedRelease) {
2369   // Disabled for unified GR due to differences in when pinch begin is sent. The
2370   // Aura GR sends it earlier than is necessary.
2371   if (UsingUnifiedGR())
2372     return;
2373
2374   scoped_ptr<QueueTouchEventDelegate> delegate(
2375       new QueueTouchEventDelegate(host()->dispatcher()));
2376   TimedEvents tes;
2377   const int kTouchId1 = 7;
2378   const int kTouchId2 = 5;
2379   gfx::Rect bounds(10, 20, 100, 100);
2380   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2381       delegate.get(), -1234, bounds, root_window()));
2382   delegate->set_window(window.get());
2383
2384   {
2385     delegate->Reset();
2386     ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(15, 25), kTouchId1,
2387                          tes.Now());
2388     ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(20, 95), kTouchId1,
2389                         tes.LeapForward(200));
2390     ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(15, 25), kTouchId1,
2391                            tes.LeapForward(50));
2392     DispatchEventUsingWindowDispatcher(&press);
2393     DispatchEventUsingWindowDispatcher(&move);
2394     DispatchEventUsingWindowDispatcher(&release);
2395     delegate->Reset();
2396
2397     // Ack the press event.
2398     delegate->ReceivedAck();
2399     EXPECT_TRUE(delegate->tap_down());
2400     delegate->Reset();
2401
2402     // Ack the move event.
2403     delegate->ReceivedAck();
2404     EXPECT_TRUE(delegate->tap_cancel());
2405     EXPECT_TRUE(delegate->scroll_begin());
2406     delegate->Reset();
2407
2408     // Ack the release event. Although the release event has been processed, it
2409     // should still generate a scroll-end event.
2410     delegate->ReceivedAckPreventDefaulted();
2411     EXPECT_TRUE(delegate->scroll_end());
2412   }
2413
2414   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(15, 25), kTouchId1,
2415                        tes.Now());
2416   ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(20, 95), kTouchId1,
2417                       tes.LeapForward(200));
2418   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(15, 25), kTouchId1,
2419                          tes.LeapForward(50));
2420   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(55, 25), kTouchId2,
2421                         tes.Now());
2422   ui::TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(45, 85), kTouchId2,
2423                        tes.LeapForward(1000));
2424   ui::TouchEvent release2(ui::ET_TOUCH_RELEASED, gfx::Point(45, 85), kTouchId2,
2425                           tes.LeapForward(14));
2426
2427   // Do a pinch.
2428   DispatchEventUsingWindowDispatcher(&press);
2429   DispatchEventUsingWindowDispatcher(&move);
2430   DispatchEventUsingWindowDispatcher(&press2);
2431   DispatchEventUsingWindowDispatcher(&move2);
2432   DispatchEventUsingWindowDispatcher(&release);
2433   DispatchEventUsingWindowDispatcher(&release2);
2434
2435   // Ack the press and move events.
2436   delegate->Reset();
2437   delegate->ReceivedAck();
2438   EXPECT_TRUE(delegate->begin());
2439   EXPECT_TRUE(delegate->tap_down());
2440
2441   delegate->Reset();
2442   delegate->ReceivedAck();
2443   EXPECT_TRUE(delegate->scroll_begin());
2444
2445   delegate->Reset();
2446   delegate->ReceivedAck();
2447   EXPECT_TRUE(delegate->begin());
2448   EXPECT_TRUE(delegate->pinch_begin());
2449
2450   delegate->Reset();
2451   delegate->ReceivedAck();
2452   EXPECT_TRUE(delegate->pinch_update());
2453
2454   // Ack the first release. Although the release is processed, it should still
2455   // generate a pinch-end event.
2456   delegate->Reset();
2457   delegate->ReceivedAckPreventDefaulted();
2458   EXPECT_TRUE(delegate->pinch_end());
2459   EXPECT_TRUE(delegate->end());
2460
2461   delegate->Reset();
2462   delegate->ReceivedAckPreventDefaulted();
2463   EXPECT_TRUE(delegate->scroll_end());
2464   EXPECT_TRUE(delegate->end());
2465 }
2466
2467 TEST_P(GestureRecognizerTest, GestureEndLocation) {
2468   GestureEventConsumeDelegate delegate;
2469   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2470       &delegate, -1234, gfx::Rect(10, 10, 300, 300), root_window()));
2471   EventGenerator generator(root_window(), window.get());
2472   const gfx::Point begin(20, 20);
2473   const gfx::Point end(150, 150);
2474   const gfx::Vector2d window_offset =
2475       window->bounds().origin().OffsetFromOrigin();
2476   generator.GestureScrollSequence(begin, end,
2477                                   base::TimeDelta::FromMilliseconds(20),
2478                                   10);
2479   EXPECT_EQ((begin - window_offset).ToString(),
2480             delegate.scroll_begin_position().ToString());
2481   EXPECT_EQ((end - window_offset).ToString(),
2482             delegate.gesture_end_location().ToString());
2483 }
2484
2485 TEST_P(GestureRecognizerTest, CaptureSendsGestureEnd) {
2486   scoped_ptr<GestureEventConsumeDelegate> delegate(
2487       new GestureEventConsumeDelegate());
2488   TestGestureRecognizer* gesture_recognizer =
2489       new TestGestureRecognizer();
2490   ScopedGestureRecognizerSetter gr_setter(gesture_recognizer);
2491
2492   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2493       delegate.get(), -1234, gfx::Rect(10, 10, 300, 300), root_window()));
2494   EventGenerator generator(root_window());
2495
2496   generator.MoveMouseRelativeTo(window.get(), gfx::Point(10, 10));
2497   generator.PressTouch();
2498   RunAllPendingInMessageLoop();
2499
2500   EXPECT_TRUE(delegate->tap_down());
2501
2502   scoped_ptr<aura::Window> capture(CreateTestWindowWithBounds(
2503       gfx::Rect(10, 10, 200, 200), root_window()));
2504   capture->SetCapture();
2505   RunAllPendingInMessageLoop();
2506
2507   EXPECT_TRUE(delegate->end());
2508   EXPECT_TRUE(delegate->tap_cancel());
2509 }
2510
2511 // Check that previous touch actions that are completely finished (either
2512 // released or cancelled), do not receive extra synthetic cancels upon change of
2513 // capture.
2514 TEST_P(GestureRecognizerTest, CaptureDoesNotCancelFinishedTouches) {
2515   scoped_ptr<GestureEventConsumeDelegate> delegate(
2516       new GestureEventConsumeDelegate());
2517   scoped_ptr<TestEventHandler> handler(new TestEventHandler);
2518   root_window()->AddPreTargetHandler(handler.get());
2519
2520   // Create a window and set it as the capture window.
2521   scoped_ptr<aura::Window> window1(CreateTestWindowWithDelegate(delegate.get(),
2522       -1234, gfx::Rect(10, 10, 300, 300), root_window()));
2523   window1->SetCapture();
2524
2525   EventGenerator generator(root_window());
2526   TimedEvents tes;
2527
2528   // Generate two touch-press events on the window.
2529   scoped_ptr<ui::TouchEvent> touch0(new ui::TouchEvent(ui::ET_TOUCH_PRESSED,
2530                                                        gfx::Point(20, 20), 0,
2531                                                        tes.Now()));
2532   scoped_ptr<ui::TouchEvent> touch1(new ui::TouchEvent(ui::ET_TOUCH_PRESSED,
2533                                                        gfx::Point(30, 30), 1,
2534                                                        tes.Now()));
2535   generator.Dispatch(touch0.get());
2536   generator.Dispatch(touch1.get());
2537   RunAllPendingInMessageLoop();
2538   EXPECT_EQ(2, handler->touch_pressed_count());
2539
2540   // Advance time.
2541   tes.LeapForward(1000);
2542
2543   // End the two touches, one by a touch-release and one by a touch-cancel; to
2544   // cover both cases.
2545   touch0.reset(new ui::TouchEvent(ui::ET_TOUCH_RELEASED, gfx::Point(20, 20), 0,
2546                                   tes.Now()));
2547   touch1.reset(new ui::TouchEvent(ui::ET_TOUCH_CANCELLED, gfx::Point(30, 30), 1,
2548                                   tes.Now()));
2549   generator.Dispatch(touch0.get());
2550   generator.Dispatch(touch1.get());
2551   RunAllPendingInMessageLoop();
2552   EXPECT_EQ(1, handler->touch_released_count());
2553   EXPECT_EQ(1, handler->touch_cancelled_count());
2554
2555   // Create a new window and set it as the new capture window.
2556   scoped_ptr<aura::Window> window2(CreateTestWindowWithBounds(
2557       gfx::Rect(100, 100, 300, 300), root_window()));
2558   window2->SetCapture();
2559   RunAllPendingInMessageLoop();
2560   // Check that setting capture does not generate any synthetic touch-cancels
2561   // for the two previously finished touch actions.
2562   EXPECT_EQ(1, handler->touch_cancelled_count());
2563
2564   root_window()->RemovePreTargetHandler(handler.get());
2565 }
2566
2567 // Tests that a press with the same touch id as an existing touch is ignored.
2568 TEST_P(GestureRecognizerTest, PressDoesNotCrash) {
2569   scoped_ptr<GestureEventConsumeDelegate> delegate(
2570       new GestureEventConsumeDelegate());
2571   TestGestureRecognizer* gesture_recognizer =
2572       new TestGestureRecognizer();
2573   ScopedGestureRecognizerSetter gr_setter(gesture_recognizer);
2574   TimedEvents tes;
2575
2576   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2577       delegate.get(), -1234, gfx::Rect(10, 10, 300, 300), root_window()));
2578
2579   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(45, 45), 7, tes.Now());
2580   press.set_radius_x(40);
2581   DispatchEventUsingWindowDispatcher(&press);
2582   EXPECT_TRUE(delegate->tap_down());
2583   EXPECT_EQ(gfx::Rect(5, 5, 80, 80).ToString(),
2584             delegate->bounding_box().ToString());
2585   delegate->Reset();
2586
2587   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(55, 45), 7, tes.Now());
2588   DispatchEventUsingWindowDispatcher(&press2);
2589
2590   // This new press should not generate a tap-down.
2591   EXPECT_FALSE(delegate->begin());
2592   EXPECT_FALSE(delegate->tap_down());
2593   EXPECT_FALSE(delegate->tap_cancel());
2594   EXPECT_FALSE(delegate->scroll_begin());
2595 }
2596
2597 TEST_P(GestureRecognizerTest, TwoFingerTap) {
2598   // TODO(tdresser): enable this test with unified GR once two finger tap is
2599   // supported. See crbug.com/354396.
2600   if (UsingUnifiedGR())
2601     return;
2602
2603   scoped_ptr<GestureEventConsumeDelegate> delegate(
2604       new GestureEventConsumeDelegate());
2605   const int kWindowWidth = 123;
2606   const int kWindowHeight = 45;
2607   const int kTouchId1 = 2;
2608   const int kTouchId2 = 3;
2609   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
2610   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2611       delegate.get(), -1234, bounds, root_window()));
2612   TimedEvents tes;
2613
2614   delegate->Reset();
2615   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
2616                         kTouchId1, tes.Now());
2617   DispatchEventUsingWindowDispatcher(&press1);
2618   EXPECT_FALSE(delegate->tap());
2619   EXPECT_TRUE(delegate->tap_down());
2620   EXPECT_FALSE(delegate->tap_cancel());
2621   EXPECT_FALSE(delegate->scroll_begin());
2622   EXPECT_FALSE(delegate->scroll_update());
2623   EXPECT_FALSE(delegate->scroll_end());
2624   EXPECT_FALSE(delegate->long_press());
2625   EXPECT_FALSE(delegate->two_finger_tap());
2626
2627   delegate->Reset();
2628   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(130, 201),
2629                         kTouchId2, tes.Now());
2630   DispatchEventUsingWindowDispatcher(&press2);
2631   EXPECT_FALSE(delegate->tap());
2632   EXPECT_FALSE(delegate->tap_down());  // no touch down for second tap.
2633   EXPECT_TRUE(delegate->tap_cancel());
2634   EXPECT_FALSE(delegate->scroll_begin());
2635   EXPECT_FALSE(delegate->scroll_update());
2636   EXPECT_FALSE(delegate->scroll_end());
2637   EXPECT_FALSE(delegate->long_press());
2638   EXPECT_FALSE(delegate->two_finger_tap());
2639
2640   // Little bit of touch move should not affect our state.
2641   delegate->Reset();
2642   ui::TouchEvent move1(ui::ET_TOUCH_MOVED, gfx::Point(102, 202),
2643                        kTouchId1, tes.Now());
2644   DispatchEventUsingWindowDispatcher(&move1);
2645   ui::TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(131, 202),
2646                        kTouchId2, tes.Now());
2647   DispatchEventUsingWindowDispatcher(&move2);
2648   EXPECT_FALSE(delegate->tap());
2649   EXPECT_FALSE(delegate->tap_down());
2650   EXPECT_FALSE(delegate->tap_cancel());
2651   EXPECT_FALSE(delegate->scroll_begin());
2652   EXPECT_FALSE(delegate->scroll_update());
2653   EXPECT_FALSE(delegate->scroll_end());
2654   EXPECT_FALSE(delegate->long_press());
2655   EXPECT_FALSE(delegate->two_finger_tap());
2656
2657   // Make sure there is enough delay before the touch is released so that it is
2658   // recognized as a tap.
2659   delegate->Reset();
2660   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
2661                           kTouchId1, tes.LeapForward(50));
2662
2663   DispatchEventUsingWindowDispatcher(&release1);
2664   EXPECT_FALSE(delegate->tap());
2665   EXPECT_FALSE(delegate->tap_down());
2666   EXPECT_FALSE(delegate->tap_cancel());
2667   EXPECT_TRUE(delegate->scroll_begin());
2668   EXPECT_FALSE(delegate->scroll_update());
2669   EXPECT_FALSE(delegate->scroll_end());
2670   EXPECT_TRUE(delegate->two_finger_tap());
2671
2672   // Lift second finger.
2673   // Make sure there is enough delay before the touch is released so that it is
2674   // recognized as a tap.
2675   delegate->Reset();
2676   ui::TouchEvent release2(ui::ET_TOUCH_RELEASED, gfx::Point(130, 201),
2677                           kTouchId2, tes.LeapForward(50));
2678
2679   DispatchEventUsingWindowDispatcher(&release2);
2680   EXPECT_FALSE(delegate->tap());
2681   EXPECT_FALSE(delegate->tap_down());
2682   EXPECT_FALSE(delegate->tap_cancel());
2683   EXPECT_FALSE(delegate->scroll_begin());
2684   EXPECT_FALSE(delegate->scroll_update());
2685   EXPECT_FALSE(delegate->scroll_end());
2686   EXPECT_TRUE(delegate->fling());
2687   EXPECT_FALSE(delegate->two_finger_tap());
2688 }
2689
2690 TEST_P(GestureRecognizerTest, TwoFingerTapExpired) {
2691   scoped_ptr<GestureEventConsumeDelegate> delegate(
2692       new GestureEventConsumeDelegate());
2693   const int kWindowWidth = 123;
2694   const int kWindowHeight = 45;
2695   const int kTouchId1 = 2;
2696   const int kTouchId2 = 3;
2697   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
2698   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2699       delegate.get(), -1234, bounds, root_window()));
2700   TimedEvents tes;
2701
2702   delegate->Reset();
2703   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
2704                         kTouchId1, tes.Now());
2705   DispatchEventUsingWindowDispatcher(&press1);
2706
2707   delegate->Reset();
2708   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(130, 201),
2709                         kTouchId2, tes.Now());
2710   DispatchEventUsingWindowDispatcher(&press2);
2711
2712   // Send release event after sufficient delay so that two finger time expires.
2713   delegate->Reset();
2714   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
2715                           kTouchId1, tes.LeapForward(1000));
2716
2717   DispatchEventUsingWindowDispatcher(&release1);
2718   EXPECT_FALSE(delegate->two_finger_tap());
2719
2720   // Lift second finger.
2721   // Make sure there is enough delay before the touch is released so that it is
2722   // recognized as a tap.
2723   delegate->Reset();
2724   ui::TouchEvent release2(ui::ET_TOUCH_RELEASED, gfx::Point(130, 201),
2725                           kTouchId2, tes.LeapForward(50));
2726
2727   DispatchEventUsingWindowDispatcher(&release2);
2728   EXPECT_FALSE(delegate->two_finger_tap());
2729 }
2730
2731 TEST_P(GestureRecognizerTest, TwoFingerTapChangesToPinch) {
2732   scoped_ptr<GestureEventConsumeDelegate> delegate(
2733       new GestureEventConsumeDelegate());
2734   const int kWindowWidth = 123;
2735   const int kWindowHeight = 45;
2736   const int kTouchId1 = 2;
2737   const int kTouchId2 = 3;
2738   TimedEvents tes;
2739
2740   // Test moving first finger
2741   {
2742     gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
2743     scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2744         delegate.get(), -1234, bounds, root_window()));
2745
2746     delegate->Reset();
2747     ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
2748                           kTouchId1, tes.Now());
2749     DispatchEventUsingWindowDispatcher(&press1);
2750
2751     delegate->Reset();
2752     ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(130, 201),
2753                           kTouchId2, tes.Now());
2754     DispatchEventUsingWindowDispatcher(&press2);
2755
2756     tes.SendScrollEvent(event_processor(), 230, 330, kTouchId1, delegate.get());
2757     EXPECT_FALSE(delegate->two_finger_tap());
2758     EXPECT_TRUE(delegate->pinch_begin());
2759
2760     // Make sure there is enough delay before the touch is released so that it
2761     // is recognized as a tap.
2762     delegate->Reset();
2763     ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
2764                            kTouchId2, tes.LeapForward(50));
2765
2766     DispatchEventUsingWindowDispatcher(&release);
2767     EXPECT_FALSE(delegate->two_finger_tap());
2768     EXPECT_TRUE(delegate->pinch_end());
2769   }
2770
2771   // Test moving second finger
2772   {
2773     gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
2774     scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2775         delegate.get(), -1234, bounds, root_window()));
2776
2777     delegate->Reset();
2778     ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
2779                           kTouchId1, tes.Now());
2780     DispatchEventUsingWindowDispatcher(&press1);
2781
2782     delegate->Reset();
2783     ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(130, 201),
2784                           kTouchId2, tes.Now());
2785     DispatchEventUsingWindowDispatcher(&press2);
2786
2787     tes.SendScrollEvent(event_processor(), 301, 230, kTouchId2, delegate.get());
2788     EXPECT_FALSE(delegate->two_finger_tap());
2789     EXPECT_TRUE(delegate->pinch_begin());
2790
2791     // Make sure there is enough delay before the touch is released so that it
2792     // is recognized as a tap.
2793     delegate->Reset();
2794     ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
2795                            kTouchId1, tes.LeapForward(50));
2796
2797     DispatchEventUsingWindowDispatcher(&release);
2798     EXPECT_FALSE(delegate->two_finger_tap());
2799     EXPECT_TRUE(delegate->pinch_end());
2800   }
2801 }
2802
2803 TEST_P(GestureRecognizerTest, NoTwoFingerTapWhenFirstFingerHasScrolled) {
2804   // Disabled for unified GR due to differences in when pinch begin is sent. The
2805   // Aura GR sends it earlier than is necessary.
2806   if (UsingUnifiedGR())
2807     return;
2808
2809   scoped_ptr<GestureEventConsumeDelegate> delegate(
2810       new GestureEventConsumeDelegate());
2811   const int kWindowWidth = 123;
2812   const int kWindowHeight = 45;
2813   const int kTouchId1 = 2;
2814   const int kTouchId2 = 3;
2815   TimedEvents tes;
2816
2817   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
2818   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2819       delegate.get(), -1234, bounds, root_window()));
2820
2821   delegate->Reset();
2822   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
2823                         kTouchId1, tes.Now());
2824   DispatchEventUsingWindowDispatcher(&press1);
2825   tes.SendScrollEvent(event_processor(), 130, 230, kTouchId1, delegate.get());
2826
2827   delegate->Reset();
2828   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(130, 201),
2829                         kTouchId2, tes.Now());
2830   DispatchEventUsingWindowDispatcher(&press2);
2831
2832   EXPECT_TRUE(delegate->pinch_begin());
2833
2834   // Make sure there is enough delay before the touch is released so that it
2835   // is recognized as a tap.
2836   delegate->Reset();
2837   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
2838                          kTouchId2, tes.LeapForward(50));
2839
2840   DispatchEventUsingWindowDispatcher(&release);
2841   EXPECT_FALSE(delegate->two_finger_tap());
2842   EXPECT_TRUE(delegate->pinch_end());
2843 }
2844
2845 TEST_P(GestureRecognizerTest, MultiFingerSwipe) {
2846   scoped_ptr<GestureEventConsumeDelegate> delegate(
2847       new GestureEventConsumeDelegate());
2848   const int kWindowWidth = 123;
2849   const int kWindowHeight = 45;
2850
2851   gfx::Rect bounds(5, 10, kWindowWidth, kWindowHeight);
2852   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2853       delegate.get(), -1234, bounds, root_window()));
2854
2855   const int kSteps = 15;
2856   const int kTouchPoints = 4;
2857   gfx::Point points[kTouchPoints] = {
2858     gfx::Point(10, 30),
2859     gfx::Point(30, 20),
2860     gfx::Point(50, 30),
2861     gfx::Point(80, 50)
2862   };
2863
2864   aura::test::EventGenerator generator(root_window(), window.get());
2865
2866   // The unified gesture recognizer assumes a finger has stopped if it hasn't
2867   // moved for too long. See ui/events/gesture_detection/velocity_tracker.cc's
2868   // kAssumePointerStoppedTimeMs.
2869   for (int count = 2; count <= kTouchPoints; ++count) {
2870     generator.GestureMultiFingerScroll(
2871         count, points, 10, kSteps, 0, -11 * kSteps);
2872     EXPECT_TRUE(delegate->swipe_up());
2873     delegate->Reset();
2874
2875     generator.GestureMultiFingerScroll(
2876         count, points, 10, kSteps, 0, 11 * kSteps);
2877     EXPECT_TRUE(delegate->swipe_down());
2878     delegate->Reset();
2879
2880     generator.GestureMultiFingerScroll(
2881         count, points, 10, kSteps, -11 * kSteps, 0);
2882     EXPECT_TRUE(delegate->swipe_left());
2883     delegate->Reset();
2884
2885     generator.GestureMultiFingerScroll(
2886         count, points, 10, kSteps, 11 * kSteps, 0);
2887     EXPECT_TRUE(delegate->swipe_right());
2888     delegate->Reset();
2889   }
2890 }
2891
2892 TEST_P(GestureRecognizerTest, TwoFingerTapCancelled) {
2893   scoped_ptr<GestureEventConsumeDelegate> delegate(
2894       new GestureEventConsumeDelegate());
2895   const int kWindowWidth = 123;
2896   const int kWindowHeight = 45;
2897   const int kTouchId1 = 2;
2898   const int kTouchId2 = 3;
2899   TimedEvents tes;
2900
2901   // Test canceling first finger.
2902   {
2903     gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
2904     scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2905         delegate.get(), -1234, bounds, root_window()));
2906
2907     delegate->Reset();
2908     ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
2909                           kTouchId1, tes.Now());
2910     DispatchEventUsingWindowDispatcher(&press1);
2911
2912     delegate->Reset();
2913     ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(130, 201),
2914                           kTouchId2, tes.Now());
2915     DispatchEventUsingWindowDispatcher(&press2);
2916
2917     delegate->Reset();
2918     ui::TouchEvent cancel(ui::ET_TOUCH_CANCELLED, gfx::Point(130, 201),
2919                           kTouchId1, tes.Now());
2920     DispatchEventUsingWindowDispatcher(&cancel);
2921     EXPECT_FALSE(delegate->two_finger_tap());
2922
2923     // Make sure there is enough delay before the touch is released so that it
2924     // is recognized as a tap.
2925     delegate->Reset();
2926     ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
2927                            kTouchId2, tes.LeapForward(50));
2928
2929     DispatchEventUsingWindowDispatcher(&release);
2930     EXPECT_FALSE(delegate->two_finger_tap());
2931   }
2932
2933   // Test canceling second finger
2934   {
2935     gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
2936     scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2937         delegate.get(), -1234, bounds, root_window()));
2938
2939     delegate->Reset();
2940     ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
2941                           kTouchId1, tes.Now());
2942     DispatchEventUsingWindowDispatcher(&press1);
2943
2944     delegate->Reset();
2945     ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(130, 201),
2946                           kTouchId2, tes.Now());
2947     DispatchEventUsingWindowDispatcher(&press2);
2948
2949     delegate->Reset();
2950     ui::TouchEvent cancel(ui::ET_TOUCH_CANCELLED, gfx::Point(130, 201),
2951                           kTouchId2, tes.Now());
2952     DispatchEventUsingWindowDispatcher(&cancel);
2953     EXPECT_FALSE(delegate->two_finger_tap());
2954
2955     // Make sure there is enough delay before the touch is released so that it
2956     // is recognized as a tap.
2957     delegate->Reset();
2958     ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
2959                            kTouchId1, tes.LeapForward(50));
2960
2961     DispatchEventUsingWindowDispatcher(&release);
2962     EXPECT_FALSE(delegate->two_finger_tap());
2963   }
2964 }
2965
2966 TEST_P(GestureRecognizerTest, VeryWideTwoFingerTouchDownShouldBeAPinch) {
2967   // Disabled for unified GR due to differences in when scroll update is
2968   // sent. The Aura GR will never send a ScrollUpdate with a ScrollBegin, but
2969   // the unified GR will.
2970   if (UsingUnifiedGR())
2971     return;
2972
2973   scoped_ptr<GestureEventConsumeDelegate> delegate(
2974       new GestureEventConsumeDelegate());
2975   const int kWindowWidth = 523;
2976   const int kWindowHeight = 45;
2977   const int kTouchId1 = 2;
2978   const int kTouchId2 = 3;
2979   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
2980   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
2981       delegate.get(), -1234, bounds, root_window()));
2982   TimedEvents tes;
2983
2984   delegate->Reset();
2985   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
2986                         kTouchId1, tes.Now());
2987   DispatchEventUsingWindowDispatcher(&press1);
2988   EXPECT_FALSE(delegate->tap());
2989   EXPECT_TRUE(delegate->tap_down());
2990   EXPECT_FALSE(delegate->tap_cancel());
2991   EXPECT_FALSE(delegate->scroll_begin());
2992   EXPECT_FALSE(delegate->scroll_update());
2993   EXPECT_FALSE(delegate->scroll_end());
2994   EXPECT_FALSE(delegate->long_press());
2995   EXPECT_FALSE(delegate->two_finger_tap());
2996
2997   delegate->Reset();
2998   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(430, 201),
2999                         kTouchId2, tes.Now());
3000   DispatchEventUsingWindowDispatcher(&press2);
3001   EXPECT_FALSE(delegate->tap());
3002   EXPECT_FALSE(delegate->tap_down());  // no touch down for second tap.
3003   EXPECT_TRUE(delegate->tap_cancel());
3004   EXPECT_FALSE(delegate->scroll_begin());
3005   EXPECT_FALSE(delegate->scroll_update());
3006   EXPECT_FALSE(delegate->scroll_end());
3007   EXPECT_FALSE(delegate->long_press());
3008   EXPECT_FALSE(delegate->two_finger_tap());
3009   EXPECT_FALSE(delegate->pinch_begin());
3010
3011   delegate->Reset();
3012   ui::TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(530, 301),
3013                        kTouchId2, tes.Now());
3014   DispatchEventUsingWindowDispatcher(&move2);
3015   EXPECT_FALSE(delegate->tap());
3016   EXPECT_FALSE(delegate->tap_down());
3017   EXPECT_FALSE(delegate->tap_cancel());
3018   // Pinch & Scroll only when there is enough movement.
3019   EXPECT_TRUE(delegate->scroll_begin());
3020   EXPECT_FALSE(delegate->scroll_update());
3021   EXPECT_FALSE(delegate->scroll_end());
3022   EXPECT_FALSE(delegate->long_press());
3023   EXPECT_FALSE(delegate->two_finger_tap());
3024   EXPECT_TRUE(delegate->pinch_begin());
3025 }
3026
3027 // Verifies if a window is the target of multiple touch-ids and we hide the
3028 // window everything is cleaned up correctly.
3029 TEST_P(GestureRecognizerTest, FlushAllOnHide) {
3030   scoped_ptr<GestureEventConsumeDelegate> delegate(
3031       new GestureEventConsumeDelegate());
3032   gfx::Rect bounds(0, 0, 200, 200);
3033   scoped_ptr<aura::Window> window(
3034       CreateTestWindowWithDelegate(delegate.get(), 0, bounds, root_window()));
3035   const int kTouchId1 = 8;
3036   const int kTouchId2 = 2;
3037   TimedEvents tes;
3038
3039   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(10, 10),
3040                         kTouchId1, tes.Now());
3041   DispatchEventUsingWindowDispatcher(&press1);
3042   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(20, 20),
3043                         kTouchId2, tes.Now());
3044   DispatchEventUsingWindowDispatcher(&press2);
3045   window->Hide();
3046   EXPECT_EQ(NULL,
3047       ui::GestureRecognizer::Get()->GetTouchLockedTarget(press1));
3048   EXPECT_EQ(NULL,
3049       ui::GestureRecognizer::Get()->GetTouchLockedTarget(press2));
3050 }
3051
3052 TEST_P(GestureRecognizerTest, LongPressTimerStopsOnPreventDefaultedTouchMoves) {
3053   // TODO(tdresser): write a version of this test for the unified GR.
3054   if (UsingUnifiedGR())
3055     return;
3056
3057   scoped_ptr<QueueTouchEventDelegate> delegate(
3058       new QueueTouchEventDelegate(host()->dispatcher()));
3059   const int kTouchId = 2;
3060   gfx::Rect bounds(100, 200, 100, 100);
3061   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3062       delegate.get(), -1234, bounds, root_window()));
3063   delegate->set_window(window.get());
3064   TimedEvents tes;
3065
3066   TimerTestGestureRecognizer* gesture_recognizer =
3067       new TimerTestGestureRecognizer();
3068   TimerTestGestureSequence* gesture_sequence =
3069       static_cast<TimerTestGestureSequence*>(
3070           gesture_recognizer->GetGestureSequenceForTesting(window.get()));
3071
3072   ScopedGestureRecognizerSetter gr_setter(gesture_recognizer);
3073
3074   delegate->Reset();
3075   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
3076                        kTouchId, tes.Now());
3077   DispatchEventUsingWindowDispatcher(&press);
3078   // Scroll around, to cancel the long press
3079   tes.SendScrollEvent(event_processor(), 130, 230, kTouchId, delegate.get());
3080
3081   delegate->Reset();
3082   delegate->ReceivedAck();
3083   EXPECT_TRUE(delegate->tap_down());
3084   EXPECT_TRUE(gesture_sequence->IsTimerRunning());
3085
3086   delegate->Reset();
3087   delegate->ReceivedAckPreventDefaulted();
3088   EXPECT_FALSE(gesture_sequence->IsTimerRunning());
3089   gesture_sequence->ForceTimeout();
3090   EXPECT_FALSE(delegate->long_press());
3091 }
3092
3093 // Same as GestureEventConsumeDelegate, but consumes all the touch-move events.
3094 class ConsumesTouchMovesDelegate : public GestureEventConsumeDelegate {
3095  public:
3096   ConsumesTouchMovesDelegate() : consume_touch_move_(true) {}
3097   virtual ~ConsumesTouchMovesDelegate() {}
3098
3099   void set_consume_touch_move(bool consume) { consume_touch_move_ = consume; }
3100
3101  private:
3102   virtual void OnTouchEvent(ui::TouchEvent* touch) OVERRIDE {
3103     if (consume_touch_move_ && touch->type() == ui::ET_TOUCH_MOVED)
3104       touch->SetHandled();
3105     else
3106       GestureEventConsumeDelegate::OnTouchEvent(touch);
3107   }
3108
3109   bool consume_touch_move_;
3110
3111   DISALLOW_COPY_AND_ASSIGN(ConsumesTouchMovesDelegate);
3112 };
3113
3114 // Same as GestureEventScroll, but tests that the behavior is the same
3115 // even if all the touch-move events are consumed.
3116 TEST_P(GestureRecognizerTest, GestureEventScrollTouchMoveConsumed) {
3117   scoped_ptr<ConsumesTouchMovesDelegate> delegate(
3118       new ConsumesTouchMovesDelegate());
3119   const int kWindowWidth = 123;
3120   const int kWindowHeight = 45;
3121   const int kTouchId = 5;
3122   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
3123   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3124       delegate.get(), -1234, bounds, root_window()));
3125   TimedEvents tes;
3126
3127   delegate->Reset();
3128   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
3129                        kTouchId, tes.Now());
3130   DispatchEventUsingWindowDispatcher(&press);
3131   EXPECT_FALSE(delegate->tap());
3132   EXPECT_TRUE(delegate->tap_down());
3133   EXPECT_FALSE(delegate->tap_cancel());
3134   EXPECT_TRUE(delegate->begin());
3135   EXPECT_FALSE(delegate->scroll_begin());
3136   EXPECT_FALSE(delegate->scroll_update());
3137   EXPECT_FALSE(delegate->scroll_end());
3138
3139   // Move the touch-point enough so that it would normally be considered a
3140   // scroll. But since the touch-moves will be consumed, the scroll should not
3141   // start.
3142   tes.SendScrollEvent(event_processor(), 130, 230, kTouchId, delegate.get());
3143   EXPECT_FALSE(delegate->tap());
3144   EXPECT_FALSE(delegate->tap_down());
3145   EXPECT_TRUE(delegate->tap_cancel());
3146   EXPECT_FALSE(delegate->begin());
3147   EXPECT_FALSE(delegate->scroll_begin());
3148   EXPECT_FALSE(delegate->scroll_update());
3149   EXPECT_FALSE(delegate->scroll_end());
3150
3151   // Release the touch back at the start point. This should end without causing
3152   // a tap.
3153   delegate->Reset();
3154   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(130, 230),
3155                          kTouchId, tes.LeapForward(50));
3156   DispatchEventUsingWindowDispatcher(&release);
3157   EXPECT_FALSE(delegate->tap());
3158   EXPECT_FALSE(delegate->tap_down());
3159   EXPECT_FALSE(delegate->tap_cancel());
3160   EXPECT_FALSE(delegate->begin());
3161   EXPECT_TRUE(delegate->end());
3162   EXPECT_FALSE(delegate->scroll_begin());
3163   EXPECT_FALSE(delegate->scroll_update());
3164   EXPECT_FALSE(delegate->scroll_end());
3165 }
3166
3167 // Tests the behavior of 2F scroll when all the touch-move events are consumed.
3168 TEST_P(GestureRecognizerTest, GestureEventScrollTwoFingerTouchMoveConsumed) {
3169   // TODO(tdresser): enable this test with unified GR once two finger tap is
3170   // supported. See crbug.com/354396.
3171   if (UsingUnifiedGR())
3172     return;
3173
3174   scoped_ptr<ConsumesTouchMovesDelegate> delegate(
3175       new ConsumesTouchMovesDelegate());
3176   const int kWindowWidth = 123;
3177   const int kWindowHeight = 100;
3178   const int kTouchId1 = 2;
3179   const int kTouchId2 = 3;
3180   TimedEvents tes;
3181
3182   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
3183   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3184       delegate.get(), -1234, bounds, root_window()));
3185
3186   delegate->Reset();
3187   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
3188                         kTouchId1, tes.Now());
3189   DispatchEventUsingWindowDispatcher(&press1);
3190   tes.SendScrollEvent(event_processor(), 131, 231, kTouchId1, delegate.get());
3191
3192   // First finger touches down and moves.
3193   EXPECT_FALSE(delegate->tap());
3194   EXPECT_FALSE(delegate->scroll_begin());
3195   EXPECT_FALSE(delegate->scroll_update());
3196   EXPECT_FALSE(delegate->scroll_end());
3197
3198   delegate->Reset();
3199   // Second finger touches down and moves.
3200   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(130, 201),
3201                         kTouchId2, tes.LeapForward(50));
3202   DispatchEventUsingWindowDispatcher(&press2);
3203   tes.SendScrollEvent(event_processor(), 161, 231, kTouchId2, delegate.get());
3204
3205   // PinchBegin & ScrollBegin were not sent if the touch-move events were
3206   // consumed.
3207   EXPECT_FALSE(delegate->pinch_begin());
3208   EXPECT_FALSE(delegate->scroll_begin());
3209
3210   EXPECT_FALSE(delegate->tap());
3211   EXPECT_FALSE(delegate->two_finger_tap());
3212
3213   // Should be no PinchUpdate & ScrollUpdate.
3214   EXPECT_FALSE(delegate->pinch_update());
3215   EXPECT_FALSE(delegate->pinch_end());
3216   EXPECT_FALSE(delegate->scroll_update());
3217   EXPECT_FALSE(delegate->scroll_end());
3218
3219   delegate->Reset();
3220   // Moves First finger again, no PinchUpdate & ScrollUpdate.
3221   tes.SendScrollEvent(event_processor(), 161, 261, kTouchId1, delegate.get());
3222
3223   EXPECT_FALSE(delegate->pinch_update());
3224   EXPECT_FALSE(delegate->pinch_end());
3225   EXPECT_FALSE(delegate->scroll_update());
3226   EXPECT_FALSE(delegate->scroll_end());
3227
3228   // Stops consuming touch-move.
3229   delegate->set_consume_touch_move(false);
3230
3231   delegate->Reset();
3232   // Making a pinch gesture.
3233   tes.SendScrollEvent(event_processor(), 161, 251, kTouchId1, delegate.get());
3234   // If touch moves are ever consumed, we should not see PinchBegin/Update
3235   // even touch moves become not consumed.
3236   EXPECT_FALSE(delegate->scroll_begin());
3237   EXPECT_FALSE(delegate->scroll_update());
3238   EXPECT_FALSE(delegate->scroll_end());
3239
3240   EXPECT_FALSE(delegate->pinch_begin());
3241   EXPECT_FALSE(delegate->pinch_update());
3242   EXPECT_FALSE(delegate->pinch_end());
3243
3244   delegate->Reset();
3245   tes.SendScrollEvent(event_processor(), 161, 241, kTouchId2, delegate.get());
3246   EXPECT_FALSE(delegate->scroll_begin());
3247   EXPECT_FALSE(delegate->scroll_update());
3248   EXPECT_FALSE(delegate->scroll_end());
3249
3250   EXPECT_FALSE(delegate->pinch_begin());
3251   EXPECT_FALSE(delegate->pinch_update());
3252   EXPECT_FALSE(delegate->pinch_end());
3253
3254   delegate->Reset();
3255   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
3256                           kTouchId1, tes.Now());
3257   ui::TouchEvent release2(ui::ET_TOUCH_RELEASED, gfx::Point(130, 201),
3258                           kTouchId2, tes.Now());
3259   DispatchEventUsingWindowDispatcher(&release1);
3260   DispatchEventUsingWindowDispatcher(&release2);
3261
3262   EXPECT_FALSE(delegate->tap());
3263   // Touch release is not consumed, so we still see two finger tap.
3264   EXPECT_TRUE(delegate->two_finger_tap());
3265
3266   // Should not see PinchEnd.
3267   EXPECT_TRUE(delegate->scroll_begin());
3268   EXPECT_FALSE(delegate->scroll_update());
3269   EXPECT_FALSE(delegate->scroll_end());
3270   EXPECT_TRUE(delegate->fling());
3271
3272   EXPECT_FALSE(delegate->pinch_begin());
3273   EXPECT_FALSE(delegate->pinch_update());
3274   EXPECT_FALSE(delegate->pinch_end());
3275 }
3276
3277 // Like as GestureEventTouchMoveConsumed but tests the different behavior
3278 // depending on whether the events were consumed before or after the scroll
3279 // started.
3280 TEST_P(GestureRecognizerTest, GestureEventScrollTouchMovePartialConsumed) {
3281   scoped_ptr<ConsumesTouchMovesDelegate> delegate(
3282       new ConsumesTouchMovesDelegate());
3283   const int kWindowWidth = 123;
3284   const int kWindowHeight = 45;
3285   const int kTouchId = 5;
3286   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
3287   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3288       delegate.get(), -1234, bounds, root_window()));
3289   TimedEvents tes;
3290
3291   delegate->Reset();
3292   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
3293                        kTouchId, tes.Now());
3294   DispatchEventUsingWindowDispatcher(&press);
3295   EXPECT_FALSE(delegate->tap());
3296   EXPECT_TRUE(delegate->tap_down());
3297   EXPECT_FALSE(delegate->tap_cancel());
3298   EXPECT_TRUE(delegate->begin());
3299   EXPECT_FALSE(delegate->scroll_begin());
3300   EXPECT_FALSE(delegate->scroll_update());
3301   EXPECT_FALSE(delegate->scroll_end());
3302
3303   // Move the touch-point enough so that it would normally be considered a
3304   // scroll. But since the touch-moves will be consumed, the scroll should not
3305   // start.
3306   tes.SendScrollEvent(event_processor(), 130, 230, kTouchId, delegate.get());
3307   EXPECT_FALSE(delegate->tap());
3308   EXPECT_FALSE(delegate->tap_down());
3309   EXPECT_TRUE(delegate->tap_cancel());
3310   EXPECT_FALSE(delegate->begin());
3311   EXPECT_FALSE(delegate->scroll_begin());
3312   EXPECT_FALSE(delegate->scroll_update());
3313   EXPECT_FALSE(delegate->scroll_end());
3314
3315   // Now, stop consuming touch-move events, and move the touch-point again.
3316   delegate->set_consume_touch_move(false);
3317   tes.SendScrollEvent(event_processor(), 159, 259, kTouchId, delegate.get());
3318   EXPECT_FALSE(delegate->tap());
3319   EXPECT_FALSE(delegate->tap_down());
3320   EXPECT_FALSE(delegate->tap_cancel());
3321   EXPECT_FALSE(delegate->begin());
3322   EXPECT_FALSE(delegate->scroll_begin());
3323   EXPECT_FALSE(delegate->scroll_update());
3324   EXPECT_FALSE(delegate->scroll_end());
3325   // No scroll has occurred, because an early touch move was consumed.
3326   EXPECT_EQ(0, delegate->scroll_x());
3327   EXPECT_EQ(0, delegate->scroll_y());
3328   EXPECT_EQ(gfx::Point(0, 0).ToString(),
3329             delegate->scroll_begin_position().ToString());
3330
3331   // Start consuming touch-move events again.
3332   delegate->set_consume_touch_move(true);
3333
3334   // Move some more to generate a few more scroll updates.
3335   tes.SendScrollEvent(event_processor(), 110, 211, kTouchId, delegate.get());
3336   EXPECT_FALSE(delegate->tap());
3337   EXPECT_FALSE(delegate->tap_down());
3338   EXPECT_FALSE(delegate->tap_cancel());
3339   EXPECT_FALSE(delegate->begin());
3340   EXPECT_FALSE(delegate->scroll_begin());
3341   EXPECT_FALSE(delegate->scroll_update());
3342   EXPECT_FALSE(delegate->scroll_end());
3343   EXPECT_EQ(0, delegate->scroll_x());
3344   EXPECT_EQ(0, delegate->scroll_y());
3345
3346   tes.SendScrollEvent(event_processor(), 140, 215, kTouchId, delegate.get());
3347   EXPECT_FALSE(delegate->tap());
3348   EXPECT_FALSE(delegate->tap_down());
3349   EXPECT_FALSE(delegate->tap_cancel());
3350   EXPECT_FALSE(delegate->begin());
3351   EXPECT_FALSE(delegate->scroll_begin());
3352   EXPECT_FALSE(delegate->scroll_update());
3353   EXPECT_FALSE(delegate->scroll_end());
3354   EXPECT_EQ(0, delegate->scroll_x());
3355   EXPECT_EQ(0, delegate->scroll_y());
3356
3357   // Release the touch.
3358   delegate->Reset();
3359   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
3360                          kTouchId, tes.LeapForward(50));
3361   DispatchEventUsingWindowDispatcher(&release);
3362   EXPECT_FALSE(delegate->tap());
3363   EXPECT_FALSE(delegate->tap_down());
3364   EXPECT_FALSE(delegate->tap_cancel());
3365   EXPECT_FALSE(delegate->begin());
3366   EXPECT_TRUE(delegate->end());
3367   EXPECT_FALSE(delegate->scroll_begin());
3368   EXPECT_FALSE(delegate->scroll_update());
3369   EXPECT_FALSE(delegate->scroll_end());
3370   EXPECT_FALSE(delegate->fling());
3371 }
3372
3373 // Check that appropriate touch events generate double tap gesture events.
3374 TEST_P(GestureRecognizerTest, GestureEventDoubleTap) {
3375   scoped_ptr<GestureEventConsumeDelegate> delegate(
3376       new GestureEventConsumeDelegate());
3377   const int kWindowWidth = 123;
3378   const int kWindowHeight = 45;
3379   const int kTouchId = 2;
3380   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
3381   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3382       delegate.get(), -1234, bounds, root_window()));
3383   TimedEvents tes;
3384
3385   // First tap (tested in GestureEventTap)
3386   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(104, 201),
3387                         kTouchId, tes.Now());
3388   DispatchEventUsingWindowDispatcher(&press1);
3389   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(104, 201),
3390                           kTouchId, tes.LeapForward(50));
3391   DispatchEventUsingWindowDispatcher(&release1);
3392   delegate->Reset();
3393
3394   // Second tap
3395   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(101, 203),
3396                         kTouchId, tes.LeapForward(200));
3397   DispatchEventUsingWindowDispatcher(&press2);
3398   ui::TouchEvent release2(ui::ET_TOUCH_RELEASED, gfx::Point(102, 206),
3399                           kTouchId, tes.LeapForward(50));
3400   DispatchEventUsingWindowDispatcher(&release2);
3401
3402   EXPECT_TRUE(delegate->tap());
3403   EXPECT_TRUE(delegate->tap_down());
3404   EXPECT_FALSE(delegate->tap_cancel());
3405   EXPECT_TRUE(delegate->begin());
3406   EXPECT_TRUE(delegate->end());
3407   EXPECT_FALSE(delegate->scroll_begin());
3408   EXPECT_FALSE(delegate->scroll_update());
3409   EXPECT_FALSE(delegate->scroll_end());
3410
3411   EXPECT_EQ(2, delegate->tap_count());
3412 }
3413
3414 // Check that appropriate touch events generate triple tap gesture events.
3415 TEST_P(GestureRecognizerTest, GestureEventTripleTap) {
3416   scoped_ptr<GestureEventConsumeDelegate> delegate(
3417       new GestureEventConsumeDelegate());
3418   const int kWindowWidth = 123;
3419   const int kWindowHeight = 45;
3420   const int kTouchId = 2;
3421   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
3422   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3423       delegate.get(), -1234, bounds, root_window()));
3424   TimedEvents tes;
3425
3426   // First tap (tested in GestureEventTap)
3427   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(104, 201),
3428                         kTouchId, tes.Now());
3429   DispatchEventUsingWindowDispatcher(&press1);
3430   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(104, 201),
3431                           kTouchId, tes.LeapForward(50));
3432   DispatchEventUsingWindowDispatcher(&release1);
3433
3434   EXPECT_EQ(1, delegate->tap_count());
3435   delegate->Reset();
3436
3437   // Second tap (tested in GestureEventDoubleTap)
3438   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(101, 203),
3439                         kTouchId, tes.LeapForward(200));
3440   DispatchEventUsingWindowDispatcher(&press2);
3441   ui::TouchEvent release2(ui::ET_TOUCH_RELEASED, gfx::Point(102, 206),
3442                           kTouchId, tes.LeapForward(50));
3443   DispatchEventUsingWindowDispatcher(&release2);
3444
3445   EXPECT_EQ(2, delegate->tap_count());
3446   delegate->Reset();
3447
3448   // Third tap
3449   ui::TouchEvent press3(ui::ET_TOUCH_PRESSED, gfx::Point(102, 206),
3450                         kTouchId, tes.LeapForward(200));
3451   DispatchEventUsingWindowDispatcher(&press3);
3452   ui::TouchEvent release3(ui::ET_TOUCH_RELEASED, gfx::Point(102, 206),
3453                           kTouchId, tes.LeapForward(50));
3454   DispatchEventUsingWindowDispatcher(&release3);
3455
3456   // Third, Fourth and Fifth Taps. Taps after the third should have their
3457   // |tap_count| wrap around back to 1.
3458   for (int i = 3; i < 5; ++i) {
3459     ui::TouchEvent press3(ui::ET_TOUCH_PRESSED,
3460                           gfx::Point(102, 206),
3461                           kTouchId,
3462                           tes.LeapForward(200));
3463     DispatchEventUsingWindowDispatcher(&press3);
3464     ui::TouchEvent release3(ui::ET_TOUCH_RELEASED,
3465                             gfx::Point(102, 206),
3466                             kTouchId,
3467                             tes.LeapForward(50));
3468     DispatchEventUsingWindowDispatcher(&release3);
3469
3470     EXPECT_TRUE(delegate->tap());
3471     EXPECT_TRUE(delegate->tap_down());
3472     EXPECT_FALSE(delegate->tap_cancel());
3473     EXPECT_TRUE(delegate->begin());
3474     EXPECT_TRUE(delegate->end());
3475     EXPECT_FALSE(delegate->scroll_begin());
3476     EXPECT_FALSE(delegate->scroll_update());
3477     EXPECT_FALSE(delegate->scroll_end());
3478
3479     // The behavior for the Aura GR is incorrect.
3480     if (UsingUnifiedGR())
3481       EXPECT_EQ(1 + (i % 3), delegate->tap_count());
3482     else
3483       EXPECT_EQ(3, delegate->tap_count());
3484   }
3485 }
3486
3487 // Check that we don't get a double tap when the two taps are far apart.
3488 TEST_P(GestureRecognizerTest, TwoTapsFarApart) {
3489   scoped_ptr<GestureEventConsumeDelegate> delegate(
3490       new GestureEventConsumeDelegate());
3491   const int kWindowWidth = 123;
3492   const int kWindowHeight = 45;
3493   const int kTouchId = 2;
3494   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
3495   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3496       delegate.get(), -1234, bounds, root_window()));
3497   TimedEvents tes;
3498
3499   // First tap (tested in GestureEventTap)
3500   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
3501                         kTouchId, tes.Now());
3502   DispatchEventUsingWindowDispatcher(&press1);
3503   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
3504                           kTouchId, tes.LeapForward(50));
3505   DispatchEventUsingWindowDispatcher(&release1);
3506   delegate->Reset();
3507
3508   // Second tap, close in time but far in distance
3509   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(201, 201),
3510                         kTouchId, tes.LeapForward(200));
3511   DispatchEventUsingWindowDispatcher(&press2);
3512   ui::TouchEvent release2(ui::ET_TOUCH_RELEASED, gfx::Point(201, 201),
3513                           kTouchId, tes.LeapForward(50));
3514   DispatchEventUsingWindowDispatcher(&release2);
3515
3516   EXPECT_TRUE(delegate->tap());
3517   EXPECT_TRUE(delegate->tap_down());
3518   EXPECT_FALSE(delegate->tap_cancel());
3519   EXPECT_TRUE(delegate->begin());
3520   EXPECT_TRUE(delegate->end());
3521   EXPECT_FALSE(delegate->scroll_begin());
3522   EXPECT_FALSE(delegate->scroll_update());
3523   EXPECT_FALSE(delegate->scroll_end());
3524
3525   EXPECT_EQ(1, delegate->tap_count());
3526 }
3527
3528 // Check that we don't get a double tap when the two taps have a long enough
3529 // delay in between.
3530 TEST_P(GestureRecognizerTest, TwoTapsWithDelayBetween) {
3531   scoped_ptr<GestureEventConsumeDelegate> delegate(
3532       new GestureEventConsumeDelegate());
3533   const int kWindowWidth = 123;
3534   const int kWindowHeight = 45;
3535   const int kTouchId = 2;
3536   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
3537   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3538       delegate.get(), -1234, bounds, root_window()));
3539   TimedEvents tes;
3540
3541   // First tap (tested in GestureEventTap)
3542   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
3543                         kTouchId, tes.Now());
3544   DispatchEventUsingWindowDispatcher(&press1);
3545   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
3546                           kTouchId, tes.LeapForward(50));
3547   DispatchEventUsingWindowDispatcher(&release1);
3548   delegate->Reset();
3549
3550   // Second tap, close in distance but after some delay
3551   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
3552                         kTouchId, tes.LeapForward(2000));
3553   DispatchEventUsingWindowDispatcher(&press2);
3554   ui::TouchEvent release2(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
3555                           kTouchId, tes.LeapForward(50));
3556   DispatchEventUsingWindowDispatcher(&release2);
3557
3558   EXPECT_TRUE(delegate->tap());
3559   EXPECT_TRUE(delegate->tap_down());
3560   EXPECT_FALSE(delegate->tap_cancel());
3561   EXPECT_TRUE(delegate->begin());
3562   EXPECT_TRUE(delegate->end());
3563   EXPECT_FALSE(delegate->scroll_begin());
3564   EXPECT_FALSE(delegate->scroll_update());
3565   EXPECT_FALSE(delegate->scroll_end());
3566
3567   EXPECT_EQ(1, delegate->tap_count());
3568 }
3569
3570 // Checks that if the bounding-box of a gesture changes because of change in
3571 // radius of a touch-point, and not because of change in position, then there
3572 // are not gesture events from that.
3573 TEST_P(GestureRecognizerTest, BoundingBoxRadiusChange) {
3574   // TODO(tdresser): enable this test with unified GR when (if?) bounding box
3575   // behavior is unified.
3576   if (UsingUnifiedGR())
3577     return;
3578
3579   scoped_ptr<GestureEventConsumeDelegate> delegate(
3580       new GestureEventConsumeDelegate());
3581   const int kWindowWidth = 234;
3582   const int kWindowHeight = 345;
3583   const int kTouchId = 5, kTouchId2 = 7;
3584   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
3585   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3586       delegate.get(), -1234, bounds, root_window()));
3587   TimedEvents tes;
3588
3589   ui::TouchEvent press1(
3590       ui::ET_TOUCH_PRESSED, gfx::Point(101, 201), kTouchId, tes.Now());
3591   DispatchEventUsingWindowDispatcher(&press1);
3592   EXPECT_TRUE(delegate->bounding_box().IsEmpty());
3593
3594   delegate->Reset();
3595
3596   ui::TouchEvent press2(
3597       ui::ET_TOUCH_PRESSED, gfx::Point(201, 201), kTouchId2,
3598       tes.LeapForward(400));
3599   press2.set_radius_x(5);
3600   DispatchEventUsingWindowDispatcher(&press2);
3601   EXPECT_FALSE(delegate->pinch_begin());
3602   EXPECT_EQ(gfx::Rect(101, 201, 100, 0).ToString(),
3603             delegate->bounding_box().ToString());
3604
3605   delegate->Reset();
3606
3607   ui::TouchEvent move1(ui::ET_TOUCH_MOVED, gfx::Point(141, 201), kTouchId,
3608                        tes.LeapForward(40));
3609   DispatchEventUsingWindowDispatcher(&move1);
3610   EXPECT_TRUE(delegate->pinch_begin());
3611   EXPECT_EQ(gfx::Rect(141, 201, 60, 0).ToString(),
3612             delegate->bounding_box().ToString());
3613
3614   delegate->Reset();
3615
3616   // The position doesn't move, but the radius changes.
3617   ui::TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(101, 201), kTouchId,
3618                        tes.LeapForward(40));
3619   move2.set_radius_x(50);
3620   move2.set_radius_y(60);
3621   DispatchEventUsingWindowDispatcher(&move2);
3622   EXPECT_FALSE(delegate->tap());
3623   EXPECT_FALSE(delegate->tap_cancel());
3624   EXPECT_FALSE(delegate->scroll_update());
3625   EXPECT_FALSE(delegate->pinch_update());
3626
3627   delegate->Reset();
3628 }
3629
3630 // Checks that slow scrolls deliver the correct deltas.
3631 // In particular, fix for http;//crbug.com/150573.
3632 TEST_P(GestureRecognizerTest, NoDriftInScroll) {
3633   ui::GestureConfiguration::set_max_touch_move_in_pixels_for_click(3);
3634   ui::GestureConfiguration::set_min_scroll_delta_squared(9);
3635   scoped_ptr<GestureEventConsumeDelegate> delegate(
3636       new GestureEventConsumeDelegate());
3637   const int kWindowWidth = 234;
3638   const int kWindowHeight = 345;
3639   const int kTouchId = 5;
3640   TimedEvents tes;
3641   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
3642   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3643       delegate.get(), -1234, bounds, root_window()));
3644
3645   ui::TouchEvent press1(
3646       ui::ET_TOUCH_PRESSED, gfx::Point(101, 208), kTouchId, tes.Now());
3647   DispatchEventUsingWindowDispatcher(&press1);
3648   EXPECT_TRUE(delegate->begin());
3649
3650   delegate->Reset();
3651
3652   ui::TouchEvent move1(ui::ET_TOUCH_MOVED, gfx::Point(101, 206), kTouchId,
3653                        tes.LeapForward(40));
3654   DispatchEventUsingWindowDispatcher(&move1);
3655   EXPECT_FALSE(delegate->scroll_begin());
3656
3657   delegate->Reset();
3658
3659   ui::TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(101, 204), kTouchId,
3660                        tes.LeapForward(40));
3661   DispatchEventUsingWindowDispatcher(&move2);
3662   EXPECT_TRUE(delegate->tap_cancel());
3663   EXPECT_TRUE(delegate->scroll_begin());
3664   EXPECT_TRUE(delegate->scroll_update());
3665   // 3 px consumed by touch slop region.
3666   EXPECT_EQ(-1, delegate->scroll_y());
3667   EXPECT_EQ(-4, delegate->scroll_y_hint());
3668
3669   delegate->Reset();
3670
3671   ui::TouchEvent move3(ui::ET_TOUCH_MOVED, gfx::Point(101, 204), kTouchId,
3672                        tes.LeapForward(40));
3673   DispatchEventUsingWindowDispatcher(&move3);
3674   EXPECT_FALSE(delegate->scroll_update());
3675
3676   delegate->Reset();
3677
3678   ui::TouchEvent move4(ui::ET_TOUCH_MOVED, gfx::Point(101, 203), kTouchId,
3679                        tes.LeapForward(40));
3680   DispatchEventUsingWindowDispatcher(&move4);
3681   EXPECT_TRUE(delegate->scroll_update());
3682   EXPECT_EQ(-1, delegate->scroll_y());
3683
3684   delegate->Reset();
3685 }
3686
3687 // Ensure that move events which are preventDefaulted will cause a tap
3688 // cancel gesture event to be fired if the move would normally cause a
3689 // scroll. See bug http://crbug.com/146397.
3690 TEST_P(GestureRecognizerTest, GestureEventConsumedTouchMoveCanFireTapCancel) {
3691   scoped_ptr<ConsumesTouchMovesDelegate> delegate(
3692       new ConsumesTouchMovesDelegate());
3693   const int kTouchId = 5;
3694   gfx::Rect bounds(100, 200, 123, 45);
3695   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3696       delegate.get(), -1234, bounds, root_window()));
3697   TimedEvents tes;
3698
3699   delegate->Reset();
3700   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
3701                        kTouchId, tes.Now());
3702
3703   delegate->set_consume_touch_move(false);
3704   DispatchEventUsingWindowDispatcher(&press);
3705   delegate->set_consume_touch_move(true);
3706   delegate->Reset();
3707   // Move the touch-point enough so that it would normally be considered a
3708   // scroll. But since the touch-moves will be consumed, the scroll should not
3709   // start.
3710   tes.SendScrollEvent(event_processor(), 130, 230, kTouchId, delegate.get());
3711   EXPECT_FALSE(delegate->tap());
3712   EXPECT_FALSE(delegate->tap_down());
3713   EXPECT_TRUE(delegate->tap_cancel());
3714   EXPECT_FALSE(delegate->begin());
3715   EXPECT_FALSE(delegate->scroll_begin());
3716   EXPECT_FALSE(delegate->scroll_update());
3717   EXPECT_FALSE(delegate->scroll_end());
3718 }
3719
3720 TEST_P(GestureRecognizerTest,
3721        TransferEventDispatchesTouchCancel) {
3722   scoped_ptr<GestureEventConsumeDelegate> delegate(
3723       new GestureEventConsumeDelegate());
3724   TimedEvents tes;
3725   const int kWindowWidth = 800;
3726   const int kWindowHeight = 600;
3727   const int kTouchId = 2;
3728   gfx::Rect bounds(0, 0, kWindowWidth, kWindowHeight);
3729   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3730       delegate.get(), -1234, bounds, root_window()));
3731   scoped_ptr<RemoveOnTouchCancelHandler>
3732       handler(new RemoveOnTouchCancelHandler());
3733   window->AddPreTargetHandler(handler.get());
3734
3735   // Start a gesture sequence on |window|. Then transfer the events to NULL.
3736   // Make sure |window| receives a touch-cancel event.
3737   delegate->Reset();
3738   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
3739                        kTouchId, tes.Now());
3740   ui::TouchEvent p2(ui::ET_TOUCH_PRESSED, gfx::Point(50, 50), 1, tes.Now());
3741   DispatchEventUsingWindowDispatcher(&press);
3742   DispatchEventUsingWindowDispatcher(&p2);
3743   EXPECT_FALSE(delegate->tap());
3744   EXPECT_TRUE(delegate->tap_down());
3745   EXPECT_TRUE(delegate->tap_cancel());
3746   EXPECT_TRUE(delegate->begin());
3747   EXPECT_EQ(2, handler->touch_pressed_count());
3748   delegate->Reset();
3749   handler->Reset();
3750
3751   ui::GestureRecognizer* gesture_recognizer = ui::GestureRecognizer::Get();
3752   EXPECT_EQ(window.get(),
3753             gesture_recognizer->GetTouchLockedTarget(press));
3754   gesture_recognizer->TransferEventsTo(window.get(), NULL);
3755   EXPECT_EQ(NULL,
3756             gesture_recognizer->GetTouchLockedTarget(press));
3757   // The event-handler removes |window| from its parent on the first
3758   // touch-cancel event, so it won't receive the second touch-cancel event.
3759   EXPECT_EQ(1, handler->touch_cancelled_count());
3760 }
3761
3762 // Check that appropriate touch events generate show press events
3763 TEST_P(GestureRecognizerTest, GestureEventShowPress) {
3764   scoped_ptr<GestureEventConsumeDelegate> delegate(
3765       new GestureEventConsumeDelegate());
3766   TimedEvents tes;
3767   const int kWindowWidth = 123;
3768   const int kWindowHeight = 45;
3769   const int kTouchId = 2;
3770   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
3771   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3772       delegate.get(), -1234, bounds, root_window()));
3773
3774   delegate->Reset();
3775
3776   TimerTestGestureRecognizer* gesture_recognizer =
3777       new TimerTestGestureRecognizer();
3778
3779   ScopedGestureRecognizerSetter gr_setter(gesture_recognizer);
3780
3781   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
3782                         kTouchId, tes.Now());
3783   DispatchEventUsingWindowDispatcher(&press1);
3784   EXPECT_TRUE(delegate->tap_down());
3785   EXPECT_TRUE(delegate->begin());
3786   EXPECT_FALSE(delegate->tap_cancel());
3787
3788   // We haven't pressed long enough for a show press to occur
3789   EXPECT_FALSE(delegate->show_press());
3790
3791   // Wait until the timer runs out
3792   delegate->WaitUntilReceivedGesture(ui::ET_GESTURE_SHOW_PRESS);
3793   EXPECT_TRUE(delegate->show_press());
3794   EXPECT_FALSE(delegate->tap_cancel());
3795
3796   delegate->Reset();
3797   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
3798                           kTouchId, tes.Now());
3799   DispatchEventUsingWindowDispatcher(&release1);
3800   EXPECT_FALSE(delegate->long_press());
3801
3802   // Note the tap isn't dispatched until the release
3803   EXPECT_FALSE(delegate->tap_cancel());
3804   EXPECT_TRUE(delegate->tap());
3805 }
3806
3807 // Check that scrolling cancels a show press
3808 TEST_P(GestureRecognizerTest, GestureEventShowPressCancelledByScroll) {
3809   scoped_ptr<GestureEventConsumeDelegate> delegate(
3810       new GestureEventConsumeDelegate());
3811   TimedEvents tes;
3812   const int kWindowWidth = 123;
3813   const int kWindowHeight = 45;
3814   const int kTouchId = 6;
3815   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
3816   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3817       delegate.get(), -1234, bounds, root_window()));
3818
3819   delegate->Reset();
3820
3821   TimerTestGestureRecognizer* gesture_recognizer =
3822       new TimerTestGestureRecognizer();
3823
3824   ScopedGestureRecognizerSetter gr_setter(gesture_recognizer);
3825
3826   TimerTestGestureSequence* gesture_sequence =
3827       static_cast<TimerTestGestureSequence*>(
3828           gesture_recognizer->GetGestureSequenceForTesting(window.get()));
3829
3830   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
3831                         kTouchId, tes.Now());
3832   DispatchEventUsingWindowDispatcher(&press1);
3833   EXPECT_TRUE(delegate->tap_down());
3834
3835   // We haven't pressed long enough for a show press to occur
3836   EXPECT_FALSE(delegate->show_press());
3837   EXPECT_FALSE(delegate->tap_cancel());
3838
3839   // Scroll around, to cancel the show press
3840   tes.SendScrollEvent(event_processor(), 130, 230, kTouchId, delegate.get());
3841   // Wait until the timer runs out
3842   gesture_sequence->ForceTimeout();
3843   EXPECT_FALSE(delegate->show_press());
3844   EXPECT_TRUE(delegate->tap_cancel());
3845
3846   delegate->Reset();
3847   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
3848                           kTouchId, tes.LeapForward(10));
3849   DispatchEventUsingWindowDispatcher(&release1);
3850   EXPECT_FALSE(delegate->show_press());
3851   EXPECT_FALSE(delegate->tap_cancel());
3852 }
3853
3854 // Test that show press events are sent immediately on tap
3855 TEST_P(GestureRecognizerTest, GestureEventShowPressSentOnTap) {
3856   scoped_ptr<GestureEventConsumeDelegate> delegate(
3857       new GestureEventConsumeDelegate());
3858   TimedEvents tes;
3859   const int kWindowWidth = 123;
3860   const int kWindowHeight = 45;
3861   const int kTouchId = 6;
3862   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
3863   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3864       delegate.get(), -1234, bounds, root_window()));
3865
3866   delegate->Reset();
3867
3868   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
3869                         kTouchId, tes.Now());
3870   DispatchEventUsingWindowDispatcher(&press1);
3871   EXPECT_TRUE(delegate->tap_down());
3872
3873   // We haven't pressed long enough for a show press to occur
3874   EXPECT_FALSE(delegate->show_press());
3875   EXPECT_FALSE(delegate->tap_cancel());
3876
3877   delegate->Reset();
3878   ui::TouchEvent release1(ui::ET_TOUCH_RELEASED, gfx::Point(101, 201),
3879                           kTouchId, tes.LeapForward(50));
3880   DispatchEventUsingWindowDispatcher(&release1);
3881   EXPECT_TRUE(delegate->show_press());
3882   EXPECT_FALSE(delegate->tap_cancel());
3883   EXPECT_TRUE(delegate->tap());
3884 }
3885
3886 // Test that consuming the first move touch event prevents a scroll.
3887 TEST_P(GestureRecognizerTest, GestureEventConsumedTouchMoveScrollTest) {
3888   scoped_ptr<QueueTouchEventDelegate> delegate(
3889       new QueueTouchEventDelegate(host()->dispatcher()));
3890   TimedEvents tes;
3891   const int kTouchId = 7;
3892   gfx::Rect bounds(0, 0, 1000, 1000);
3893   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3894       delegate.get(), -1234, bounds, root_window()));
3895
3896   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0),
3897                        kTouchId, tes.Now());
3898   DispatchEventUsingWindowDispatcher(&press);
3899   delegate->ReceivedAck();
3900
3901   // A touch move within the slop region is never consumed in web contents. The
3902   // unified GR won't prevent scroll if a touch move within the slop region is
3903   // consumed, so make sure this touch move exceeds the slop region.
3904   ui::TouchEvent move1(ui::ET_TOUCH_MOVED, gfx::Point(10, 10),
3905                        kTouchId, tes.Now());
3906   DispatchEventUsingWindowDispatcher(&move1);
3907   delegate->ReceivedAckPreventDefaulted();
3908
3909   ui::TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(20, 20),
3910                        kTouchId, tes.Now());
3911   DispatchEventUsingWindowDispatcher(&move2);
3912   delegate->ReceivedAck();
3913
3914   EXPECT_FALSE(delegate->scroll_begin());
3915   EXPECT_FALSE(delegate->scroll_update());
3916 }
3917
3918 // Test that consuming the first touch move event of a touch point doesn't
3919 // prevent pinching once an additional touch has been pressed.
3920 TEST_P(GestureRecognizerTest, GestureEventConsumedTouchMovePinchTest) {
3921   // Consuming moves within the touch slop and the the disposition handling of
3922   // pinch events behave differently between the Unified GR and the Aura GR.
3923   if (UsingUnifiedGR())
3924     return;
3925
3926   scoped_ptr<QueueTouchEventDelegate> delegate(
3927       new QueueTouchEventDelegate(host()->dispatcher()));
3928   TimedEvents tes;
3929   const int kTouchId1 = 7;
3930   const int kTouchId2 = 4;
3931   gfx::Rect bounds(0, 0, 1000, 1000);
3932   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3933       delegate.get(), -1234, bounds, root_window()));
3934
3935   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0),
3936                        kTouchId1, tes.Now());
3937   DispatchEventUsingWindowDispatcher(&press1);
3938   delegate->ReceivedAck();
3939
3940   ui::TouchEvent move1(ui::ET_TOUCH_MOVED, gfx::Point(2, 2),
3941                        kTouchId1, tes.Now());
3942   DispatchEventUsingWindowDispatcher(&move1);
3943   delegate->ReceivedAckPreventDefaulted();
3944
3945   ui::TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(20, 20),
3946                        kTouchId1, tes.Now());
3947   DispatchEventUsingWindowDispatcher(&move2);
3948   delegate->ReceivedAck();
3949
3950   // We can't scroll, because a move has been consumed.
3951   EXPECT_FALSE(delegate->scroll_begin());
3952   EXPECT_FALSE(delegate->scroll_update());
3953   EXPECT_FALSE(delegate->pinch_begin());
3954
3955   // An additional press will allow us to pinch.
3956   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0),
3957                        kTouchId2, tes.Now());
3958   DispatchEventUsingWindowDispatcher(&press2);
3959   delegate->ReceivedAck();
3960
3961   ui::TouchEvent move3(ui::ET_TOUCH_MOVED, gfx::Point(20, 20),
3962                        kTouchId2, tes.Now());
3963   DispatchEventUsingWindowDispatcher(&move3);
3964   delegate->ReceivedAck();
3965
3966   EXPECT_TRUE(delegate->pinch_begin());
3967   EXPECT_FALSE(delegate->pinch_update());
3968
3969   delegate->Reset();
3970
3971   ui::TouchEvent move4(ui::ET_TOUCH_MOVED, gfx::Point(40, 40),
3972                        kTouchId2, tes.Now());
3973   DispatchEventUsingWindowDispatcher(&move4);
3974   delegate->ReceivedAck();
3975
3976   EXPECT_TRUE(delegate->pinch_update());
3977   EXPECT_EQ(10, delegate->scroll_x());
3978   EXPECT_EQ(10, delegate->scroll_y());
3979 }
3980
3981 // Test that consuming the first move touch doesn't prevent a tap.
3982 TEST_P(GestureRecognizerTest, GestureEventConsumedTouchMoveTapTest) {
3983   scoped_ptr<QueueTouchEventDelegate> delegate(
3984       new QueueTouchEventDelegate(host()->dispatcher()));
3985   TimedEvents tes;
3986   const int kTouchId = 7;
3987   gfx::Rect bounds(0, 0, 1000, 1000);
3988   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
3989       delegate.get(), -1234, bounds, root_window()));
3990
3991   ui::TouchEvent press(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0),
3992                        kTouchId, tes.Now());
3993   DispatchEventUsingWindowDispatcher(&press);
3994   delegate->ReceivedAck();
3995
3996   ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(2, 2),
3997                        kTouchId, tes.Now());
3998   DispatchEventUsingWindowDispatcher(&move);
3999   delegate->ReceivedAckPreventDefaulted();
4000
4001   ui::TouchEvent release(ui::ET_TOUCH_RELEASED, gfx::Point(2, 2),
4002                          kTouchId, tes.LeapForward(50));
4003   DispatchEventUsingWindowDispatcher(&release);
4004   delegate->ReceivedAck();
4005
4006   EXPECT_TRUE(delegate->tap());
4007 }
4008
4009 // Test that consuming the first move touch doesn't prevent a long press.
4010 TEST_P(GestureRecognizerTest, GestureEventConsumedTouchMoveLongPressTest) {
4011   scoped_ptr<QueueTouchEventDelegate> delegate(
4012       new QueueTouchEventDelegate(host()->dispatcher()));
4013   TimedEvents tes;
4014   const int kWindowWidth = 123;
4015   const int kWindowHeight = 45;
4016   const int kTouchId = 2;
4017   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
4018   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
4019       delegate.get(), -1234, bounds, root_window()));
4020
4021   delegate->Reset();
4022
4023   TimerTestGestureRecognizer* gesture_recognizer =
4024       new TimerTestGestureRecognizer();
4025
4026   ScopedGestureRecognizerSetter gr_setter(gesture_recognizer);
4027
4028   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
4029                         kTouchId, tes.Now());
4030   DispatchEventUsingWindowDispatcher(&press1);
4031   delegate->ReceivedAck();
4032
4033   ui::TouchEvent move(ui::ET_TOUCH_MOVED, gfx::Point(103, 203),
4034                        kTouchId, tes.Now());
4035   DispatchEventUsingWindowDispatcher(&move);
4036   delegate->ReceivedAckPreventDefaulted();
4037
4038   // Wait until the timer runs out
4039   delegate->WaitUntilReceivedGesture(ui::ET_GESTURE_LONG_PRESS);
4040   EXPECT_TRUE(delegate->long_press());
4041 }
4042
4043 // Tests that the deltas are correct when leaving the slop region very slowly.
4044 TEST_P(GestureRecognizerTest, TestExceedingSlopSlowly) {
4045   // Disabled for unified GR due to subtle differences in touch slop handling.
4046   if (UsingUnifiedGR())
4047     return;
4048
4049   ui::GestureConfiguration::set_max_touch_move_in_pixels_for_click(3);
4050   scoped_ptr<GestureEventConsumeDelegate> delegate(
4051       new GestureEventConsumeDelegate());
4052   const int kWindowWidth = 234;
4053   const int kWindowHeight = 345;
4054   const int kTouchId = 5;
4055   TimedEvents tes;
4056   gfx::Rect bounds(0, 0, kWindowWidth, kWindowHeight);
4057   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
4058       delegate.get(), -1234, bounds, root_window()));
4059
4060   ui::TouchEvent press(
4061       ui::ET_TOUCH_PRESSED, gfx::Point(10, 10), kTouchId, tes.Now());
4062   DispatchEventUsingWindowDispatcher(&press);
4063   EXPECT_FALSE(delegate->scroll_begin());
4064   EXPECT_FALSE(delegate->scroll_update());
4065   delegate->Reset();
4066
4067   ui::TouchEvent move1(ui::ET_TOUCH_MOVED, gfx::Point(11, 10), kTouchId,
4068                        tes.LeapForward(40));
4069   DispatchEventUsingWindowDispatcher(&move1);
4070   EXPECT_FALSE(delegate->scroll_begin());
4071   EXPECT_FALSE(delegate->scroll_update());
4072   EXPECT_EQ(0, delegate->scroll_x());
4073   EXPECT_EQ(0, delegate->scroll_x_hint());
4074   delegate->Reset();
4075
4076   ui::TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(12, 10), kTouchId,
4077                        tes.LeapForward(40));
4078   DispatchEventUsingWindowDispatcher(&move2);
4079   EXPECT_FALSE(delegate->scroll_begin());
4080   EXPECT_FALSE(delegate->scroll_update());
4081   EXPECT_EQ(0, delegate->scroll_x());
4082   EXPECT_EQ(0, delegate->scroll_x_hint());
4083   delegate->Reset();
4084
4085
4086   ui::TouchEvent move3(ui::ET_TOUCH_MOVED, gfx::Point(13, 10), kTouchId,
4087                        tes.LeapForward(40));
4088   DispatchEventUsingWindowDispatcher(&move3);
4089   EXPECT_TRUE(delegate->scroll_begin());
4090   EXPECT_FALSE(delegate->scroll_update());
4091   EXPECT_EQ(0, delegate->scroll_x());
4092   EXPECT_EQ(3, delegate->scroll_x_hint());
4093   delegate->Reset();
4094
4095
4096   ui::TouchEvent move4(ui::ET_TOUCH_MOVED, gfx::Point(14, 10), kTouchId,
4097                        tes.LeapForward(40));
4098   DispatchEventUsingWindowDispatcher(&move4);
4099   EXPECT_FALSE(delegate->scroll_begin());
4100   EXPECT_TRUE(delegate->scroll_update());
4101   EXPECT_EQ(1, delegate->scroll_x());
4102   EXPECT_EQ(0, delegate->scroll_x_hint());
4103   delegate->Reset();
4104 }
4105
4106 TEST_P(GestureRecognizerTest, ScrollAlternatelyConsumedTest) {
4107   scoped_ptr<QueueTouchEventDelegate> delegate(
4108       new QueueTouchEventDelegate(host()->dispatcher()));
4109   TimedEvents tes;
4110   const int kWindowWidth = 3000;
4111   const int kWindowHeight = 3000;
4112   const int kTouchId = 2;
4113   gfx::Rect bounds(0, 0, kWindowWidth, kWindowHeight);
4114   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
4115       delegate.get(), -1234, bounds, root_window()));
4116
4117   delegate->Reset();
4118
4119   int x = 0;
4120   int y = 0;
4121
4122   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(x, y),
4123                         kTouchId, tes.Now());
4124   DispatchEventUsingWindowDispatcher(&press1);
4125   delegate->ReceivedAck();
4126   EXPECT_FALSE(delegate->scroll_begin());
4127   EXPECT_FALSE(delegate->scroll_update());
4128   delegate->Reset();
4129
4130   x += 100;
4131   y += 100;
4132   ui::TouchEvent move1(ui::ET_TOUCH_MOVED, gfx::Point(x, y),
4133                        kTouchId, tes.Now());
4134   DispatchEventUsingWindowDispatcher(&move1);
4135   delegate->ReceivedAck();
4136   EXPECT_TRUE(delegate->scroll_begin());
4137   EXPECT_TRUE(delegate->scroll_update());
4138   delegate->Reset();
4139
4140   for (int i = 0; i < 3; ++i) {
4141     x += 10;
4142     y += 10;
4143     ui::TouchEvent move2(
4144         ui::ET_TOUCH_MOVED, gfx::Point(x, y), kTouchId, tes.Now());
4145     DispatchEventUsingWindowDispatcher(&move2);
4146     delegate->ReceivedAck();
4147     EXPECT_FALSE(delegate->scroll_begin());
4148     EXPECT_TRUE(delegate->scroll_update());
4149     EXPECT_EQ(10, delegate->scroll_x());
4150     EXPECT_EQ(10, delegate->scroll_y());
4151     delegate->Reset();
4152
4153     x += 20;
4154     y += 20;
4155     ui::TouchEvent move3(
4156         ui::ET_TOUCH_MOVED, gfx::Point(x, y), kTouchId, tes.Now());
4157     DispatchEventUsingWindowDispatcher(&move3);
4158     delegate->ReceivedAckPreventDefaulted();
4159     EXPECT_FALSE(delegate->scroll_begin());
4160     EXPECT_FALSE(delegate->scroll_update());
4161     delegate->Reset();
4162   }
4163 }
4164
4165 TEST_P(GestureRecognizerTest, PinchAlternatelyConsumedTest) {
4166   // Disabled for unified GR due to differences in when scroll update is
4167   // sent. The Aura GR will never send a ScrollUpdate with a ScrollBegin, but
4168   // the unified GR will.
4169   if (UsingUnifiedGR())
4170     return;
4171
4172   scoped_ptr<QueueTouchEventDelegate> delegate(
4173       new QueueTouchEventDelegate(host()->dispatcher()));
4174   TimedEvents tes;
4175   const int kWindowWidth = 3000;
4176   const int kWindowHeight = 3000;
4177   const int kTouchId1 = 5;
4178   const int kTouchId2 = 7;
4179   gfx::Rect bounds(0, 0, kWindowWidth, kWindowHeight);
4180   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
4181       delegate.get(), -1234, bounds, root_window()));
4182
4183   delegate->Reset();
4184
4185   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(0, 0),
4186                         kTouchId1, tes.Now());
4187   DispatchEventUsingWindowDispatcher(&press1);
4188   delegate->ReceivedAck();
4189   EXPECT_FALSE(delegate->scroll_begin());
4190   EXPECT_FALSE(delegate->scroll_update());
4191   delegate->Reset();
4192
4193   int x = 0;
4194   int y = 0;
4195
4196   ui::TouchEvent press2(ui::ET_TOUCH_PRESSED, gfx::Point(x, y),
4197                         kTouchId2, tes.Now());
4198   DispatchEventUsingWindowDispatcher(&press2);
4199   delegate->ReceivedAck();
4200   EXPECT_FALSE(delegate->scroll_begin());
4201   EXPECT_FALSE(delegate->scroll_update());
4202   EXPECT_FALSE(delegate->pinch_begin());
4203   EXPECT_FALSE(delegate->pinch_update());
4204
4205   delegate->Reset();
4206
4207   x += 100;
4208   y += 100;
4209   ui::TouchEvent move1(ui::ET_TOUCH_MOVED, gfx::Point(x, y),
4210                        kTouchId2, tes.Now());
4211   DispatchEventUsingWindowDispatcher(&move1);
4212   delegate->ReceivedAck();
4213   EXPECT_TRUE(delegate->scroll_begin());
4214   EXPECT_FALSE(delegate->scroll_update());
4215   EXPECT_TRUE(delegate->pinch_begin());
4216   EXPECT_FALSE(delegate->pinch_update());
4217   delegate->Reset();
4218
4219   const float expected_scales[] = {1.5f, 1.2f, 1.125f};
4220
4221   for (int i = 0; i < 3; ++i) {
4222     x += 50;
4223     y += 50;
4224     ui::TouchEvent move2(
4225         ui::ET_TOUCH_MOVED, gfx::Point(x, y), kTouchId2, tes.Now());
4226     DispatchEventUsingWindowDispatcher(&move2);
4227     delegate->ReceivedAck();
4228     EXPECT_FALSE(delegate->scroll_begin());
4229     EXPECT_TRUE(delegate->scroll_update());
4230     EXPECT_FALSE(delegate->scroll_end());
4231     EXPECT_FALSE(delegate->pinch_begin());
4232     EXPECT_TRUE(delegate->pinch_update());
4233     EXPECT_FALSE(delegate->pinch_end());
4234     EXPECT_EQ(25, delegate->scroll_x());
4235     EXPECT_EQ(25, delegate->scroll_y());
4236     EXPECT_FLOAT_EQ(expected_scales[i], delegate->scale());
4237     delegate->Reset();
4238
4239     x += 100;
4240     y += 100;
4241     ui::TouchEvent move3(
4242         ui::ET_TOUCH_MOVED, gfx::Point(x, y), kTouchId2, tes.Now());
4243     DispatchEventUsingWindowDispatcher(&move3);
4244     delegate->ReceivedAckPreventDefaulted();
4245     EXPECT_FALSE(delegate->scroll_begin());
4246     EXPECT_FALSE(delegate->scroll_update());
4247     EXPECT_FALSE(delegate->scroll_end());
4248     EXPECT_FALSE(delegate->pinch_begin());
4249     EXPECT_FALSE(delegate->pinch_update());
4250     EXPECT_FALSE(delegate->pinch_end());
4251     delegate->Reset();
4252   }
4253 }
4254
4255 // Test that touch event flags are passed through to the gesture event.
4256 TEST_P(GestureRecognizerTest, GestureEventFlagsPassedFromTouchEvent) {
4257   scoped_ptr<GestureEventConsumeDelegate> delegate(
4258       new GestureEventConsumeDelegate());
4259   TimedEvents tes;
4260   const int kWindowWidth = 123;
4261   const int kWindowHeight = 45;
4262   const int kTouchId = 6;
4263   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
4264   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
4265       delegate.get(), -1234, bounds, root_window()));
4266
4267   delegate->Reset();
4268
4269   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
4270                         kTouchId, tes.Now());
4271   DispatchEventUsingWindowDispatcher(&press1);
4272   EXPECT_TRUE(delegate->tap_down());
4273
4274   int default_flags = delegate->flags();
4275
4276   ui::TouchEvent move1(
4277       ui::ET_TOUCH_MOVED, gfx::Point(397, 149), kTouchId, tes.LeapForward(50));
4278   move1.set_flags(992);
4279
4280   DispatchEventUsingWindowDispatcher(&move1);
4281   EXPECT_NE(default_flags, delegate->flags());
4282 }
4283
4284 // Test that latency info is passed through to the gesture event.
4285 TEST_P(GestureRecognizerTest, LatencyPassedFromTouchEvent) {
4286   scoped_ptr<GestureEventConsumeDelegate> delegate(
4287       new GestureEventConsumeDelegate());
4288   TimedEvents tes;
4289   const int kWindowWidth = 123;
4290   const int kWindowHeight = 45;
4291   const int kTouchId = 6;
4292
4293   const base::TimeTicks time_original = base::TimeTicks::FromInternalValue(100);
4294   const base::TimeTicks time_ui = base::TimeTicks::FromInternalValue(200);
4295   const base::TimeTicks time_acked = base::TimeTicks::FromInternalValue(300);
4296
4297   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
4298   scoped_ptr<aura::Window> window(CreateTestWindowWithDelegate(
4299       delegate.get(), -1234, bounds, root_window()));
4300
4301   delegate->Reset();
4302
4303   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED, gfx::Point(101, 201),
4304                         kTouchId, tes.Now());
4305
4306   // Ensure the only components around are the ones we add.
4307   press1.latency()->Clear();
4308
4309   press1.latency()->AddLatencyNumberWithTimestamp(
4310       ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, 0, time_original, 1);
4311
4312   press1.latency()->AddLatencyNumberWithTimestamp(
4313       ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0, time_ui, 1);
4314
4315   press1.latency()->AddLatencyNumberWithTimestamp(
4316       ui::INPUT_EVENT_LATENCY_ACKED_TOUCH_COMPONENT, 0, 0, time_acked, 1);
4317
4318   DispatchEventUsingWindowDispatcher(&press1);
4319   EXPECT_TRUE(delegate->tap_down());
4320
4321   ui::LatencyInfo::LatencyComponent component;
4322
4323   EXPECT_EQ(3U, delegate->latency_info().latency_components.size());
4324   ASSERT_TRUE(delegate->latency_info().FindLatency(
4325       ui::INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 0, &component));
4326   EXPECT_EQ(time_original, component.event_time);
4327
4328   ASSERT_TRUE(delegate->latency_info().FindLatency(
4329       ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, &component));
4330   EXPECT_EQ(time_ui, component.event_time);
4331
4332   ASSERT_TRUE(delegate->latency_info().FindLatency(
4333       ui::INPUT_EVENT_LATENCY_ACKED_TOUCH_COMPONENT, 0, &component));
4334   EXPECT_EQ(time_acked, component.event_time);
4335
4336   delegate->WaitUntilReceivedGesture(ui::ET_GESTURE_SHOW_PRESS);
4337   EXPECT_TRUE(delegate->show_press());
4338   EXPECT_EQ(0U, delegate->latency_info().latency_components.size());
4339 }
4340
4341 // A delegate that deletes a window on long press.
4342 class GestureEventDeleteWindowOnLongPress : public GestureEventConsumeDelegate {
4343  public:
4344   GestureEventDeleteWindowOnLongPress()
4345       : window_(NULL) {}
4346
4347   void set_window(aura::Window** window) { window_ = window; }
4348
4349   virtual void OnGestureEvent(ui::GestureEvent* gesture) OVERRIDE {
4350     GestureEventConsumeDelegate::OnGestureEvent(gesture);
4351     if (gesture->type() != ui::ET_GESTURE_LONG_PRESS)
4352       return;
4353     ui::GestureRecognizer::Get()->CleanupStateForConsumer(*window_);
4354     delete *window_;
4355     *window_ = NULL;
4356   }
4357
4358  private:
4359   aura::Window** window_;
4360   DISALLOW_COPY_AND_ASSIGN(GestureEventDeleteWindowOnLongPress);
4361 };
4362
4363 // Check that deleting the window in response to a long press gesture doesn't
4364 // crash.
4365 TEST_P(GestureRecognizerTest, GestureEventLongPressDeletingWindow) {
4366   GestureEventDeleteWindowOnLongPress delegate;
4367   const int kWindowWidth = 123;
4368   const int kWindowHeight = 45;
4369   const int kTouchId = 2;
4370   gfx::Rect bounds(100, 200, kWindowWidth, kWindowHeight);
4371   aura::Window* window(CreateTestWindowWithDelegate(
4372       &delegate, -1234, bounds, root_window()));
4373   delegate.set_window(&window);
4374
4375   ui::TouchEvent press1(ui::ET_TOUCH_PRESSED,
4376                         gfx::Point(101, 201),
4377                         kTouchId,
4378                         ui::EventTimeForNow());
4379   DispatchEventUsingWindowDispatcher(&press1);
4380   EXPECT_TRUE(window != NULL);
4381
4382   // Wait until the timer runs out.
4383   delegate.WaitUntilReceivedGesture(ui::ET_GESTURE_LONG_PRESS);
4384   EXPECT_EQ(NULL, window);
4385 }
4386
4387 INSTANTIATE_TEST_CASE_P(GestureRecognizer,
4388                         GestureRecognizerTest,
4389                         ::testing::Bool());
4390
4391 }  // namespace test
4392 }  // namespace aura