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