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.
7 #include "base/command_line.h"
8 #include "base/memory/scoped_vector.h"
9 #include "base/run_loop.h"
10 #include "base/strings/string_number_conversions.h"
11 #include "base/timer/timer.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 #include "ui/aura/env.h"
14 #include "ui/aura/test/aura_test_base.h"
15 #include "ui/aura/test/test_window_delegate.h"
16 #include "ui/aura/test/test_windows.h"
17 #include "ui/aura/window.h"
18 #include "ui/aura/window_event_dispatcher.h"
19 #include "ui/base/hit_test.h"
20 #include "ui/base/ui_base_switches.h"
21 #include "ui/events/event.h"
22 #include "ui/events/event_switches.h"
23 #include "ui/events/event_utils.h"
24 #include "ui/events/gesture_detection/gesture_configuration.h"
25 #include "ui/events/gestures/gesture_recognizer_impl.h"
26 #include "ui/events/gestures/gesture_types.h"
27 #include "ui/events/test/event_generator.h"
28 #include "ui/events/test/events_test_utils.h"
29 #include "ui/gfx/geometry/point.h"
30 #include "ui/gfx/geometry/rect.h"
37 std::string
WindowIDAsString(ui::GestureConsumer
* consumer
) {
39 base::IntToString(static_cast<Window
*>(consumer
)->id()) : "?";
42 #define EXPECT_0_EVENTS(events) \
43 EXPECT_EQ(0u, events.size())
45 #define EXPECT_1_EVENT(events, e0) \
46 EXPECT_EQ(1u, events.size()); \
47 EXPECT_EQ(e0, events[0])
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])
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])
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])
67 // A delegate that keeps track of gesture events.
68 class GestureEventConsumeDelegate
: public TestWindowDelegate
{
70 GestureEventConsumeDelegate()
77 scroll_update_(false),
84 two_finger_tap_(false),
92 scroll_velocity_x_(0),
93 scroll_velocity_y_(0),
100 wait_until_event_(ui::ET_UNKNOWN
) {}
102 ~GestureEventConsumeDelegate() override
{}
111 scroll_begin_
= false;
112 scroll_update_
= false;
114 pinch_begin_
= false;
115 pinch_update_
= false;
119 two_finger_tap_
= false;
122 swipe_right_
= false;
126 scroll_begin_position_
.SetPoint(0, 0);
127 tap_location_
.SetPoint(0, 0);
128 gesture_end_location_
.SetPoint(0, 0);
132 scroll_velocity_x_
= 0;
133 scroll_velocity_y_
= 0;
143 const std::vector
<ui::EventType
>& events() const { return events_
; };
145 bool tap() const { return tap_
; }
146 bool tap_down() const { return tap_down_
; }
147 bool tap_cancel() const { return tap_cancel_
; }
148 bool begin() const { return begin_
; }
149 bool end() const { return end_
; }
150 bool scroll_begin() const { return scroll_begin_
; }
151 bool scroll_update() const { return scroll_update_
; }
152 bool scroll_end() const { return scroll_end_
; }
153 bool pinch_begin() const { return pinch_begin_
; }
154 bool pinch_update() const { return pinch_update_
; }
155 bool pinch_end() const { return pinch_end_
; }
156 bool long_press() const { return long_press_
; }
157 bool long_tap() const { return long_tap_
; }
158 bool fling() const { return fling_
; }
159 bool two_finger_tap() const { return two_finger_tap_
; }
160 bool show_press() const { return show_press_
; }
161 bool swipe_left() const { return swipe_left_
; }
162 bool swipe_right() const { return swipe_right_
; }
163 bool swipe_up() const { return swipe_up_
; }
164 bool swipe_down() const { return swipe_down_
; }
166 const gfx::Point
& scroll_begin_position() const {
167 return scroll_begin_position_
;
170 const gfx::Point
& tap_location() const {
171 return tap_location_
;
174 const gfx::Point
& gesture_end_location() const {
175 return gesture_end_location_
;
178 float scroll_x() const { return scroll_x_
; }
179 float scroll_y() const { return scroll_y_
; }
180 float scroll_velocity_x() const { return scroll_velocity_x_
; }
181 float scroll_velocity_y() const { return scroll_velocity_y_
; }
182 float velocity_x() const { return velocity_x_
; }
183 float velocity_y() const { return velocity_y_
; }
184 float scroll_x_hint() const { return scroll_x_hint_
; }
185 float scroll_y_hint() const { return scroll_y_hint_
; }
186 float scale() const { return scale_
; }
187 const gfx::Rect
& bounding_box() const { return bounding_box_
; }
188 int tap_count() const { return tap_count_
; }
189 int flags() const { return flags_
; }
191 void WaitUntilReceivedGesture(ui::EventType type
) {
192 wait_until_event_
= type
;
193 run_loop_
.reset(new base::RunLoop());
197 void OnGestureEvent(ui::GestureEvent
* gesture
) override
{
198 events_
.push_back(gesture
->type());
199 bounding_box_
= gesture
->details().bounding_box();
200 flags_
= gesture
->flags();
201 switch (gesture
->type()) {
202 case ui::ET_GESTURE_TAP
:
203 tap_location_
= gesture
->location();
204 tap_count_
= gesture
->details().tap_count();
207 case ui::ET_GESTURE_TAP_DOWN
:
210 case ui::ET_GESTURE_TAP_CANCEL
:
213 case ui::ET_GESTURE_BEGIN
:
216 case ui::ET_GESTURE_END
:
218 gesture_end_location_
= gesture
->location();
220 case ui::ET_GESTURE_SCROLL_BEGIN
:
221 scroll_begin_
= true;
222 scroll_begin_position_
= gesture
->location();
223 scroll_x_hint_
= gesture
->details().scroll_x_hint();
224 scroll_y_hint_
= gesture
->details().scroll_y_hint();
226 case ui::ET_GESTURE_SCROLL_UPDATE
:
227 scroll_update_
= true;
228 scroll_x_
+= gesture
->details().scroll_x();
229 scroll_y_
+= gesture
->details().scroll_y();
231 case ui::ET_GESTURE_SCROLL_END
:
232 EXPECT_TRUE(velocity_x_
== 0 && velocity_y_
== 0);
235 case ui::ET_GESTURE_PINCH_BEGIN
:
238 case ui::ET_GESTURE_PINCH_UPDATE
:
239 pinch_update_
= true;
240 scale_
= gesture
->details().scale();
242 case ui::ET_GESTURE_PINCH_END
:
245 case ui::ET_GESTURE_LONG_PRESS
:
248 case ui::ET_GESTURE_LONG_TAP
:
251 case ui::ET_SCROLL_FLING_START
:
252 EXPECT_TRUE(gesture
->details().velocity_x() != 0 ||
253 gesture
->details().velocity_y() != 0);
254 EXPECT_FALSE(scroll_end_
);
256 velocity_x_
= gesture
->details().velocity_x();
257 velocity_y_
= gesture
->details().velocity_y();
259 case ui::ET_GESTURE_TWO_FINGER_TAP
:
260 two_finger_tap_
= true;
262 case ui::ET_GESTURE_SHOW_PRESS
:
265 case ui::ET_GESTURE_SWIPE
:
266 swipe_left_
= gesture
->details().swipe_left();
267 swipe_right_
= gesture
->details().swipe_right();
268 swipe_up_
= gesture
->details().swipe_up();
269 swipe_down_
= gesture
->details().swipe_down();
271 case ui::ET_SCROLL_FLING_CANCEL
:
272 // Only used in unified gesture detection.
277 if (wait_until_event_
== gesture
->type() && run_loop_
) {
279 wait_until_event_
= ui::ET_UNKNOWN
;
281 gesture
->StopPropagation();
285 scoped_ptr
<base::RunLoop
> run_loop_
;
286 std::vector
<ui::EventType
> events_
;
302 bool two_finger_tap_
;
309 gfx::Point scroll_begin_position_
;
310 gfx::Point tap_location_
;
311 gfx::Point gesture_end_location_
;
315 float scroll_velocity_x_
;
316 float scroll_velocity_y_
;
319 float scroll_x_hint_
;
320 float scroll_y_hint_
;
322 gfx::Rect bounding_box_
;
326 ui::EventType wait_until_event_
;
328 DISALLOW_COPY_AND_ASSIGN(GestureEventConsumeDelegate
);
331 class QueueTouchEventDelegate
: public GestureEventConsumeDelegate
{
333 explicit QueueTouchEventDelegate(WindowEventDispatcher
* dispatcher
)
335 dispatcher_(dispatcher
),
336 synchronous_ack_for_next_event_(AckState::PENDING
) {}
338 ~QueueTouchEventDelegate() override
{}
340 void OnTouchEvent(ui::TouchEvent
* event
) override
{
341 event
->DisableSynchronousHandling();
342 if (synchronous_ack_for_next_event_
!= AckState::PENDING
) {
343 ui::GestureRecognizer::Get()->AckTouchEvent(
344 event
->unique_event_id(),
345 synchronous_ack_for_next_event_
== AckState::CONSUMED
349 synchronous_ack_for_next_event_
= AckState::PENDING
;
351 sent_events_ids_
.push_back(event
->unique_event_id());
356 ReceivedAckImpl(false);
359 void ReceivedAckPreventDefaulted() {
360 ReceivedAckImpl(true);
363 void set_window(Window
* w
) { window_
= w
; }
364 void set_synchronous_ack_for_next_event(bool consumed
) {
365 DCHECK(synchronous_ack_for_next_event_
== AckState::PENDING
);
366 synchronous_ack_for_next_event_
=
367 consumed
? AckState::CONSUMED
: AckState::UNCONSUMED
;
371 enum class AckState
{
377 void ReceivedAckImpl(bool prevent_defaulted
) {
378 DCHECK(!sent_events_ids_
.empty());
379 if (sent_events_ids_
.empty())
381 uint32 sent_event_id
= sent_events_ids_
.front();
382 sent_events_ids_
.pop_front();
383 dispatcher_
->ProcessedTouchEvent(
384 sent_event_id
, window_
,
385 prevent_defaulted
? ui::ER_HANDLED
: ui::ER_UNHANDLED
);
389 WindowEventDispatcher
* dispatcher_
;
390 AckState synchronous_ack_for_next_event_
;
391 std::list
<uint32
> sent_events_ids_
;
393 DISALLOW_COPY_AND_ASSIGN(QueueTouchEventDelegate
);
396 // A delegate that ignores gesture events but keeps track of [synthetic] mouse
398 class GestureEventSynthDelegate
: public TestWindowDelegate
{
400 GestureEventSynthDelegate()
401 : mouse_enter_(false),
404 mouse_release_(false),
406 double_click_(false) {
410 mouse_enter_
= false;
412 mouse_press_
= false;
413 mouse_release_
= false;
415 double_click_
= false;
418 bool mouse_enter() const { return mouse_enter_
; }
419 bool mouse_exit() const { return mouse_exit_
; }
420 bool mouse_press() const { return mouse_press_
; }
421 bool mouse_move() const { return mouse_move_
; }
422 bool mouse_release() const { return mouse_release_
; }
423 bool double_click() const { return double_click_
; }
425 void OnMouseEvent(ui::MouseEvent
* event
) override
{
426 switch (event
->type()) {
427 case ui::ET_MOUSE_PRESSED
:
428 double_click_
= event
->flags() & ui::EF_IS_DOUBLE_CLICK
;
431 case ui::ET_MOUSE_RELEASED
:
432 mouse_release_
= true;
434 case ui::ET_MOUSE_MOVED
:
437 case ui::ET_MOUSE_ENTERED
:
440 case ui::ET_MOUSE_EXITED
:
457 DISALLOW_COPY_AND_ASSIGN(GestureEventSynthDelegate
);
460 class ScopedGestureRecognizerSetter
{
462 // Takes ownership of |new_gr|.
463 explicit ScopedGestureRecognizerSetter(ui::GestureRecognizer
* new_gr
)
465 original_gr_
= ui::GestureRecognizer::Get();
466 ui::SetGestureRecognizerForTesting(new_gr_
.get());
469 virtual ~ScopedGestureRecognizerSetter() {
470 ui::SetGestureRecognizerForTesting(original_gr_
);
474 ui::GestureRecognizer
* original_gr_
;
475 scoped_ptr
<ui::GestureRecognizer
> new_gr_
;
477 DISALLOW_COPY_AND_ASSIGN(ScopedGestureRecognizerSetter
);
485 // Use a non-zero start time to pass DCHECKs which ensure events have had a
487 TimedEvents() : simulated_now_(1) {
490 base::TimeDelta
Now() {
491 base::TimeDelta t
= base::TimeDelta::FromMilliseconds(simulated_now_
);
496 base::TimeDelta
LeapForward(int time_in_millis
) {
497 simulated_now_
+= time_in_millis
;
498 return base::TimeDelta::FromMilliseconds(simulated_now_
);
501 base::TimeDelta
InFuture(int time_in_millis
) {
502 return base::TimeDelta::FromMilliseconds(simulated_now_
+ time_in_millis
);
505 void SendScrollEvents(ui::EventProcessor
* dispatcher
,
513 GestureEventConsumeDelegate
* delegate
) {
517 for (int i
= 0; i
< num_steps
; i
++) {
520 ui::TouchEvent
move(ui::ET_TOUCH_MOVED
, gfx::PointF(x
, y
),
522 base::TimeDelta::FromMilliseconds(simulated_now_
));
523 ui::EventDispatchDetails details
= dispatcher
->OnEventFromSource(&move
);
524 ASSERT_FALSE(details
.dispatcher_destroyed
);
525 simulated_now_
+= time_step
;
529 void SendScrollEvent(ui::EventProcessor
* dispatcher
,
533 GestureEventConsumeDelegate
* delegate
) {
535 ui::TouchEvent
move(ui::ET_TOUCH_MOVED
, gfx::PointF(x
, y
),
537 base::TimeDelta::FromMilliseconds(simulated_now_
));
538 ui::EventDispatchDetails details
= dispatcher
->OnEventFromSource(&move
);
539 ASSERT_FALSE(details
.dispatcher_destroyed
);
544 // An event handler to keep track of events.
545 class TestEventHandler
: public ui::EventHandler
{
548 : touch_released_count_(0),
549 touch_pressed_count_(0),
550 touch_moved_count_(0) {}
552 ~TestEventHandler() override
{}
554 void OnTouchEvent(ui::TouchEvent
* event
) override
{
555 switch (event
->type()) {
556 case ui::ET_TOUCH_RELEASED
:
557 touch_released_count_
++;
559 case ui::ET_TOUCH_PRESSED
:
560 touch_pressed_count_
++;
562 case ui::ET_TOUCH_MOVED
:
563 touch_moved_count_
++;
565 case ui::ET_TOUCH_CANCELLED
:
566 cancelled_touch_points_
.push_back(event
->location());
574 touch_released_count_
= 0;
575 touch_pressed_count_
= 0;
576 touch_moved_count_
= 0;
577 cancelled_touch_points_
.clear();
580 int touch_released_count() const { return touch_released_count_
; }
581 int touch_pressed_count() const { return touch_pressed_count_
; }
582 int touch_moved_count() const { return touch_moved_count_
; }
583 int touch_cancelled_count() const {
584 return static_cast<int>(cancelled_touch_points_
.size());
586 const std::vector
<gfx::PointF
>& cancelled_touch_points() const {
587 return cancelled_touch_points_
;
591 int touch_released_count_
;
592 int touch_pressed_count_
;
593 int touch_moved_count_
;
594 std::vector
<gfx::PointF
> cancelled_touch_points_
;
596 DISALLOW_COPY_AND_ASSIGN(TestEventHandler
);
599 // Removes the target window from its parent when it receives a touch-cancel
601 class RemoveOnTouchCancelHandler
: public TestEventHandler
{
603 RemoveOnTouchCancelHandler() {}
604 ~RemoveOnTouchCancelHandler() override
{}
608 void OnTouchEvent(ui::TouchEvent
* event
) override
{
609 TestEventHandler::OnTouchEvent(event
);
610 if (event
->type() == ui::ET_TOUCH_CANCELLED
) {
611 Window
* target
= static_cast<Window
*>(event
->target());
612 target
->parent()->RemoveChild(target
);
616 DISALLOW_COPY_AND_ASSIGN(RemoveOnTouchCancelHandler
);
619 void DelayByLongPressTimeout() {
620 ui::GestureProvider::Config config
;
621 base::RunLoop run_loop
;
622 base::MessageLoop::current()->PostDelayedTask(
624 run_loop
.QuitClosure(),
625 config
.gesture_detector_config
.longpress_timeout
* 2);
629 void DelayByShowPressTimeout() {
630 ui::GestureProvider::Config config
;
631 base::RunLoop run_loop
;
632 base::MessageLoop::current()->PostDelayedTask(
634 run_loop
.QuitClosure(),
635 config
.gesture_detector_config
.showpress_timeout
* 2);
641 class GestureRecognizerTest
: public AuraTestBase
,
642 public ::testing::WithParamInterface
<bool> {
644 GestureRecognizerTest() {}
646 void SetUp() override
{
647 AuraTestBase::SetUp();
648 ui::GestureConfiguration::GetInstance()->set_show_press_delay_in_ms(2);
649 ui::GestureConfiguration::GetInstance()->set_long_press_time_in_ms(3);
653 DISALLOW_COPY_AND_ASSIGN(GestureRecognizerTest
);
656 class GestureRecognizerWithSwitchTest
: public GestureRecognizerTest
{
658 GestureRecognizerWithSwitchTest() {}
660 void SetUp() override
{
661 GestureRecognizerTest::SetUp();
662 base::CommandLine::ForCurrentProcess()->AppendSwitch(
663 switches::kCompensateForUnstablePinchZoom
);
664 ui::GestureConfiguration::GetInstance()->set_min_pinch_update_span_delta(5);
668 DISALLOW_COPY_AND_ASSIGN(GestureRecognizerWithSwitchTest
);
671 // Check that appropriate touch events generate tap gesture events.
672 TEST_F(GestureRecognizerTest
, GestureEventTap
) {
673 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
674 new GestureEventConsumeDelegate());
676 const int kWindowWidth
= 123;
677 const int kWindowHeight
= 45;
678 const int kTouchId
= 2;
679 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
680 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
681 delegate
.get(), -1234, bounds
, root_window()));
684 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
685 kTouchId
, tes
.Now());
686 DispatchEventUsingWindowDispatcher(&press
);
687 EXPECT_FALSE(delegate
->tap());
688 EXPECT_FALSE(delegate
->show_press());
689 EXPECT_TRUE(delegate
->tap_down());
690 EXPECT_FALSE(delegate
->tap_cancel());
691 EXPECT_TRUE(delegate
->begin());
692 EXPECT_FALSE(delegate
->scroll_begin());
693 EXPECT_FALSE(delegate
->scroll_update());
694 EXPECT_FALSE(delegate
->scroll_end());
695 EXPECT_FALSE(delegate
->long_press());
698 delegate
->WaitUntilReceivedGesture(ui::ET_GESTURE_SHOW_PRESS
);
699 EXPECT_TRUE(delegate
->show_press());
700 EXPECT_FALSE(delegate
->tap_down());
702 // Make sure there is enough delay before the touch is released so that it is
703 // recognized as a tap.
705 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
706 kTouchId
, tes
.LeapForward(50));
708 DispatchEventUsingWindowDispatcher(&release
);
709 EXPECT_TRUE(delegate
->tap());
710 EXPECT_FALSE(delegate
->tap_down());
711 EXPECT_FALSE(delegate
->tap_cancel());
712 EXPECT_FALSE(delegate
->begin());
713 EXPECT_TRUE(delegate
->end());
714 EXPECT_FALSE(delegate
->scroll_begin());
715 EXPECT_FALSE(delegate
->scroll_update());
716 EXPECT_FALSE(delegate
->scroll_end());
718 EXPECT_EQ(1, delegate
->tap_count());
721 // Check that appropriate touch events generate tap gesture events
722 // when information about the touch radii are provided.
723 TEST_F(GestureRecognizerTest
, GestureEventTapRegion
) {
724 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
725 new GestureEventConsumeDelegate());
727 const int kWindowWidth
= 800;
728 const int kWindowHeight
= 600;
729 const int kTouchId
= 2;
730 gfx::Rect
bounds(0, 0, kWindowWidth
, kWindowHeight
);
731 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
732 delegate
.get(), -1234, bounds
, root_window()));
734 // Test with no ET_TOUCH_MOVED events.
737 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
738 kTouchId
, tes
.Now());
739 press
.set_radius_x(5);
740 press
.set_radius_y(12);
741 DispatchEventUsingWindowDispatcher(&press
);
742 EXPECT_FALSE(delegate
->tap());
743 EXPECT_TRUE(delegate
->tap_down());
744 EXPECT_FALSE(delegate
->tap_cancel());
745 EXPECT_TRUE(delegate
->begin());
746 EXPECT_FALSE(delegate
->scroll_begin());
747 EXPECT_FALSE(delegate
->scroll_update());
748 EXPECT_FALSE(delegate
->scroll_end());
749 EXPECT_FALSE(delegate
->long_press());
751 // Make sure there is enough delay before the touch is released so that it
752 // is recognized as a tap.
754 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
755 kTouchId
, tes
.LeapForward(50));
756 release
.set_radius_x(5);
757 release
.set_radius_y(12);
759 DispatchEventUsingWindowDispatcher(&release
);
760 EXPECT_TRUE(delegate
->tap());
761 EXPECT_FALSE(delegate
->tap_down());
762 EXPECT_FALSE(delegate
->tap_cancel());
763 EXPECT_FALSE(delegate
->begin());
764 EXPECT_TRUE(delegate
->end());
765 EXPECT_FALSE(delegate
->scroll_begin());
766 EXPECT_FALSE(delegate
->scroll_update());
767 EXPECT_FALSE(delegate
->scroll_end());
769 EXPECT_EQ(1, delegate
->tap_count());
770 gfx::Point
actual_point(delegate
->tap_location());
771 EXPECT_EQ(24, delegate
->bounding_box().width());
772 EXPECT_EQ(24, delegate
->bounding_box().height());
773 EXPECT_EQ(101, actual_point
.x());
774 EXPECT_EQ(201, actual_point
.y());
777 // Test with no ET_TOUCH_MOVED events but different touch points and radii.
780 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(365, 290),
781 kTouchId
, tes
.Now());
782 press
.set_radius_x(8);
783 press
.set_radius_y(14);
784 DispatchEventUsingWindowDispatcher(&press
);
785 EXPECT_FALSE(delegate
->tap());
786 EXPECT_TRUE(delegate
->tap_down());
787 EXPECT_FALSE(delegate
->tap_cancel());
788 EXPECT_TRUE(delegate
->begin());
789 EXPECT_FALSE(delegate
->scroll_begin());
790 EXPECT_FALSE(delegate
->scroll_update());
791 EXPECT_FALSE(delegate
->scroll_end());
792 EXPECT_FALSE(delegate
->long_press());
795 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(367, 291),
796 kTouchId
, tes
.LeapForward(50));
797 release
.set_radius_x(20);
798 release
.set_radius_y(13);
800 DispatchEventUsingWindowDispatcher(&release
);
801 EXPECT_TRUE(delegate
->tap());
802 EXPECT_FALSE(delegate
->tap_down());
803 EXPECT_FALSE(delegate
->tap_cancel());
804 EXPECT_FALSE(delegate
->begin());
805 EXPECT_TRUE(delegate
->end());
806 EXPECT_FALSE(delegate
->scroll_begin());
807 EXPECT_FALSE(delegate
->scroll_update());
808 EXPECT_FALSE(delegate
->scroll_end());
810 EXPECT_EQ(1, delegate
->tap_count());
811 gfx::Point
actual_point(delegate
->tap_location());
812 EXPECT_EQ(40, delegate
->bounding_box().width());
813 EXPECT_EQ(40, delegate
->bounding_box().height());
814 EXPECT_EQ(367, actual_point
.x());
815 EXPECT_EQ(291, actual_point
.y());
818 // Test with a single ET_TOUCH_MOVED event.
821 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(46, 205),
822 kTouchId
, tes
.Now());
823 press
.set_radius_x(6);
824 press
.set_radius_y(10);
825 DispatchEventUsingWindowDispatcher(&press
);
826 EXPECT_FALSE(delegate
->tap());
827 EXPECT_TRUE(delegate
->tap_down());
828 EXPECT_FALSE(delegate
->tap_cancel());
829 EXPECT_TRUE(delegate
->begin());
830 EXPECT_FALSE(delegate
->tap_cancel());
831 EXPECT_FALSE(delegate
->scroll_begin());
832 EXPECT_FALSE(delegate
->scroll_update());
833 EXPECT_FALSE(delegate
->scroll_end());
834 EXPECT_FALSE(delegate
->long_press());
837 ui::TouchEvent
move(ui::ET_TOUCH_MOVED
, gfx::Point(49, 204),
838 kTouchId
, tes
.LeapForward(50));
839 move
.set_radius_x(8);
840 move
.set_radius_y(12);
841 DispatchEventUsingWindowDispatcher(&move
);
842 EXPECT_FALSE(delegate
->tap());
843 EXPECT_FALSE(delegate
->tap_down());
844 EXPECT_FALSE(delegate
->tap_cancel());
845 EXPECT_FALSE(delegate
->begin());
846 EXPECT_FALSE(delegate
->scroll_begin());
847 EXPECT_FALSE(delegate
->scroll_update());
848 EXPECT_FALSE(delegate
->scroll_end());
849 EXPECT_FALSE(delegate
->long_press());
852 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(49, 204),
853 kTouchId
, tes
.LeapForward(50));
854 release
.set_radius_x(4);
855 release
.set_radius_y(8);
857 DispatchEventUsingWindowDispatcher(&release
);
858 EXPECT_TRUE(delegate
->tap());
859 EXPECT_FALSE(delegate
->tap_down());
860 EXPECT_FALSE(delegate
->tap_cancel());
861 EXPECT_FALSE(delegate
->begin());
862 EXPECT_TRUE(delegate
->end());
863 EXPECT_FALSE(delegate
->scroll_begin());
864 EXPECT_FALSE(delegate
->scroll_update());
865 EXPECT_FALSE(delegate
->scroll_end());
867 EXPECT_EQ(1, delegate
->tap_count());
868 gfx::Point
actual_point(delegate
->tap_location());
869 EXPECT_EQ(16, delegate
->bounding_box().width());
870 EXPECT_EQ(16, delegate
->bounding_box().height());
871 EXPECT_EQ(49, actual_point
.x());
872 EXPECT_EQ(204, actual_point
.y());
875 // Test with a few ET_TOUCH_MOVED events.
878 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(400, 150),
879 kTouchId
, tes
.Now());
880 press
.set_radius_x(7);
881 press
.set_radius_y(10);
882 DispatchEventUsingWindowDispatcher(&press
);
883 EXPECT_FALSE(delegate
->tap());
884 EXPECT_TRUE(delegate
->tap_down());
885 EXPECT_FALSE(delegate
->tap_cancel());
886 EXPECT_TRUE(delegate
->begin());
887 EXPECT_FALSE(delegate
->scroll_begin());
888 EXPECT_FALSE(delegate
->scroll_update());
889 EXPECT_FALSE(delegate
->scroll_end());
890 EXPECT_FALSE(delegate
->long_press());
893 ui::TouchEvent
move(ui::ET_TOUCH_MOVED
, gfx::Point(397, 151),
894 kTouchId
, tes
.LeapForward(50));
895 move
.set_radius_x(13);
896 move
.set_radius_y(12);
897 DispatchEventUsingWindowDispatcher(&move
);
898 EXPECT_FALSE(delegate
->tap());
899 EXPECT_FALSE(delegate
->tap_down());
900 EXPECT_FALSE(delegate
->tap_cancel());
901 EXPECT_FALSE(delegate
->begin());
902 EXPECT_FALSE(delegate
->scroll_begin());
903 EXPECT_FALSE(delegate
->scroll_update());
904 EXPECT_FALSE(delegate
->scroll_end());
905 EXPECT_FALSE(delegate
->long_press());
908 ui::TouchEvent
move1(ui::ET_TOUCH_MOVED
, gfx::Point(397, 149),
909 kTouchId
, tes
.LeapForward(50));
910 move1
.set_radius_x(16);
911 move1
.set_radius_y(16);
912 DispatchEventUsingWindowDispatcher(&move1
);
913 EXPECT_FALSE(delegate
->tap());
914 EXPECT_FALSE(delegate
->tap_down());
915 EXPECT_FALSE(delegate
->tap_cancel());
916 EXPECT_FALSE(delegate
->begin());
917 EXPECT_FALSE(delegate
->scroll_begin());
918 EXPECT_FALSE(delegate
->scroll_update());
919 EXPECT_FALSE(delegate
->scroll_end());
920 EXPECT_FALSE(delegate
->long_press());
923 ui::TouchEvent
move2(ui::ET_TOUCH_MOVED
, gfx::Point(400, 150),
924 kTouchId
, tes
.LeapForward(50));
925 move2
.set_radius_x(14);
926 move2
.set_radius_y(10);
927 DispatchEventUsingWindowDispatcher(&move2
);
928 EXPECT_FALSE(delegate
->tap());
929 EXPECT_FALSE(delegate
->tap_down());
930 EXPECT_FALSE(delegate
->tap_cancel());
931 EXPECT_FALSE(delegate
->begin());
932 EXPECT_FALSE(delegate
->scroll_begin());
933 EXPECT_FALSE(delegate
->scroll_update());
934 EXPECT_FALSE(delegate
->scroll_end());
935 EXPECT_FALSE(delegate
->long_press());
938 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(401, 149),
939 kTouchId
, tes
.LeapForward(50));
940 release
.set_radius_x(8);
941 release
.set_radius_y(9);
943 DispatchEventUsingWindowDispatcher(&release
);
944 EXPECT_TRUE(delegate
->tap());
945 EXPECT_FALSE(delegate
->tap_down());
946 EXPECT_FALSE(delegate
->tap_cancel());
947 EXPECT_FALSE(delegate
->begin());
948 EXPECT_TRUE(delegate
->end());
949 EXPECT_FALSE(delegate
->scroll_begin());
950 EXPECT_FALSE(delegate
->scroll_update());
951 EXPECT_FALSE(delegate
->scroll_end());
953 EXPECT_EQ(1, delegate
->tap_count());
954 gfx::Point
actual_point(delegate
->tap_location());
955 EXPECT_EQ(18, delegate
->bounding_box().width());
956 EXPECT_EQ(18, delegate
->bounding_box().height());
957 EXPECT_EQ(401, actual_point
.x());
958 EXPECT_EQ(149, actual_point
.y());
962 // Check that appropriate touch events generate scroll gesture events.
963 TEST_F(GestureRecognizerTest
, GestureEventScroll
) {
964 // We'll start by moving the touch point by (10.5, 10.5). We want 5 dips of
965 // that distance to be consumed by the slop, so we set the slop radius to
966 // sqrt(5 * 5 + 5 * 5).
967 ui::GestureConfiguration::GetInstance()
968 ->set_max_touch_move_in_pixels_for_click(sqrt(5.f
* 5 + 5 * 5));
969 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
970 new GestureEventConsumeDelegate());
972 const int kWindowWidth
= 123;
973 const int kWindowHeight
= 45;
974 const int kTouchId
= 5;
975 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
976 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
977 delegate
.get(), -1234, bounds
, root_window()));
980 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
981 kTouchId
, tes
.Now());
982 DispatchEventUsingWindowDispatcher(&press
);
983 EXPECT_2_EVENTS(delegate
->events(),
984 ui::ET_GESTURE_BEGIN
,
985 ui::ET_GESTURE_TAP_DOWN
);
987 // Move the touch-point enough so that it is considered as a scroll. This
988 // should generate both SCROLL_BEGIN and SCROLL_UPDATE gestures.
989 // The first movement is diagonal, to ensure that we have a free scroll,
990 // and not a rail scroll.
991 tes
.SendScrollEvent(event_processor(), 111.5, 211.5, kTouchId
,
993 EXPECT_3_EVENTS(delegate
->events(),
994 ui::ET_GESTURE_TAP_CANCEL
,
995 ui::ET_GESTURE_SCROLL_BEGIN
,
996 ui::ET_GESTURE_SCROLL_UPDATE
);
997 // The slop consumed 5 dips
998 EXPECT_FLOAT_EQ(5.5, delegate
->scroll_x());
999 EXPECT_FLOAT_EQ(5.5, delegate
->scroll_y());
1000 EXPECT_EQ(gfx::Point(1, 1).ToString(),
1001 delegate
->scroll_begin_position().ToString());
1003 // When scrolling with a single finger, the bounding box of the gesture should
1004 // be empty, since it's a single point and the radius for testing is zero.
1005 EXPECT_TRUE(delegate
->bounding_box().IsEmpty());
1007 // Move some more to generate a few more scroll updates. Make sure that we get
1008 // out of the snap channel for the unified GR.
1009 tes
.SendScrollEvent(event_processor(), 20, 120, kTouchId
, delegate
.get());
1010 EXPECT_1_EVENT(delegate
->events(), ui::ET_GESTURE_SCROLL_UPDATE
);
1011 EXPECT_FLOAT_EQ(-91.5, delegate
->scroll_x());
1012 EXPECT_FLOAT_EQ(-91.5, delegate
->scroll_y());
1013 EXPECT_TRUE(delegate
->bounding_box().IsEmpty());
1015 tes
.SendScrollEvent(event_processor(), 50, 124, kTouchId
, delegate
.get());
1016 EXPECT_1_EVENT(delegate
->events(), ui::ET_GESTURE_SCROLL_UPDATE
);
1017 EXPECT_EQ(30, delegate
->scroll_x());
1018 EXPECT_EQ(4, delegate
->scroll_y());
1019 EXPECT_TRUE(delegate
->bounding_box().IsEmpty());
1021 // Release the touch. This should end the scroll.
1023 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
1025 tes
.LeapForward(50));
1026 DispatchEventUsingWindowDispatcher(&release
);
1027 EXPECT_2_EVENTS(delegate
->events(),
1028 ui::ET_SCROLL_FLING_START
,
1029 ui::ET_GESTURE_END
);
1030 EXPECT_TRUE(delegate
->bounding_box().IsEmpty());
1033 // Check that predicted scroll update positions are correct.
1034 TEST_F(GestureRecognizerTest
, GestureEventScrollPrediction
) {
1035 // We'll start by moving the touch point by (5, 5). We want all of that
1036 // distance to be consumed by the slop, so we set the slop radius to
1037 // sqrt(5 * 5 + 5 * 5).
1038 ui::GestureConfiguration::GetInstance()
1039 ->set_max_touch_move_in_pixels_for_click(sqrt(5.f
* 5 + 5 * 5));
1041 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
1042 new GestureEventConsumeDelegate());
1044 const int kWindowWidth
= 123;
1045 const int kWindowHeight
= 45;
1046 const int kTouchId
= 5;
1047 gfx::Rect
bounds(95, 195, kWindowWidth
, kWindowHeight
);
1048 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
1049 delegate
.get(), -1234, bounds
, root_window()));
1052 // Tracks the total scroll since we want to verify that the correct position
1053 // will be scrolled to throughout the prediction.
1054 gfx::Vector2dF total_scroll
;
1055 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(96, 196),
1056 kTouchId
, tes
.Now());
1057 DispatchEventUsingWindowDispatcher(&press
);
1058 EXPECT_2_EVENTS(delegate
->events(),
1059 ui::ET_GESTURE_BEGIN
,
1060 ui::ET_GESTURE_TAP_DOWN
);
1063 // Get rid of touch slop.
1064 ui::TouchEvent
move(ui::ET_TOUCH_MOVED
, gfx::Point(111, 211),
1065 kTouchId
, tes
.Now());
1066 DispatchEventUsingWindowDispatcher(&move
);
1067 EXPECT_3_EVENTS(delegate
->events(),
1068 ui::ET_GESTURE_TAP_CANCEL
,
1069 ui::ET_GESTURE_SCROLL_BEGIN
,
1070 ui::ET_GESTURE_SCROLL_UPDATE
);
1071 total_scroll
.set_x(total_scroll
.x() + delegate
->scroll_x());
1072 total_scroll
.set_y(total_scroll
.y() + delegate
->scroll_y());
1074 // Move the touch-point enough so that it is considered as a scroll. This
1075 // should generate both SCROLL_BEGIN and SCROLL_UPDATE gestures.
1076 // The first movement is diagonal, to ensure that we have a free scroll,
1077 // and not a rail scroll.
1078 tes
.LeapForward(30);
1079 tes
.SendScrollEvent(event_processor(), 130, 230, kTouchId
, delegate
.get());
1080 EXPECT_1_EVENT(delegate
->events(),
1081 ui::ET_GESTURE_SCROLL_UPDATE
);
1082 total_scroll
.set_x(total_scroll
.x() + delegate
->scroll_x());
1083 total_scroll
.set_y(total_scroll
.y() + delegate
->scroll_y());
1085 // Move some more to generate a few more scroll updates.
1086 tes
.LeapForward(30);
1087 tes
.SendScrollEvent(event_processor(), 110, 211, kTouchId
, delegate
.get());
1088 EXPECT_1_EVENT(delegate
->events(), ui::ET_GESTURE_SCROLL_UPDATE
);
1089 total_scroll
.set_x(total_scroll
.x() + delegate
->scroll_x());
1090 total_scroll
.set_y(total_scroll
.y() + delegate
->scroll_y());
1092 tes
.LeapForward(30);
1093 tes
.SendScrollEvent(event_processor(), 140, 215, kTouchId
, delegate
.get());
1094 EXPECT_1_EVENT(delegate
->events(), ui::ET_GESTURE_SCROLL_UPDATE
);
1095 total_scroll
.set_x(total_scroll
.x() + delegate
->scroll_x());
1096 total_scroll
.set_y(total_scroll
.y() + delegate
->scroll_y());
1098 // Release the touch. This should end the scroll.
1100 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
1102 tes
.LeapForward(50));
1103 DispatchEventUsingWindowDispatcher(&release
);
1106 // Check that the bounding box during a scroll event is correct.
1107 TEST_F(GestureRecognizerTest
, GestureEventScrollBoundingBox
) {
1109 for (float radius
= 1; radius
<= 10; ++radius
) {
1110 ui::GestureConfiguration::GetInstance()->set_default_radius(radius
);
1111 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
1112 new GestureEventConsumeDelegate());
1113 const int kWindowWidth
= 123;
1114 const int kWindowHeight
= 45;
1115 const int kTouchId
= 5;
1116 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
1117 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
1118 delegate
.get(), -1234, bounds
, root_window()));
1120 const float kPositionX
= 101;
1121 const float kPositionY
= 201;
1123 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
,
1124 gfx::PointF(kPositionX
, kPositionY
),
1127 DispatchEventUsingWindowDispatcher(&press
);
1128 EXPECT_EQ(gfx::RectF(kPositionX
- radius
,
1129 kPositionY
- radius
,
1132 delegate
->bounding_box());
1134 const int kScrollAmount
= 50;
1135 tes
.SendScrollEvents(event_processor(), kPositionX
, kPositionY
,
1136 1, 1, kTouchId
, 1, kScrollAmount
, delegate
.get());
1137 EXPECT_EQ(gfx::Point(1, 1).ToString(),
1138 delegate
->scroll_begin_position().ToString());
1139 EXPECT_EQ(gfx::RectF(kPositionX
+ kScrollAmount
- radius
,
1140 kPositionY
+ kScrollAmount
- radius
,
1143 delegate
->bounding_box());
1145 // Release the touch. This should end the scroll.
1147 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
,
1148 gfx::PointF(kPositionX
+ kScrollAmount
,
1149 kPositionY
+ kScrollAmount
),
1150 kTouchId
, press
.time_stamp() +
1151 base::TimeDelta::FromMilliseconds(50));
1152 DispatchEventUsingWindowDispatcher(&release
);
1153 EXPECT_EQ(gfx::RectF(kPositionX
+ kScrollAmount
- radius
,
1154 kPositionY
+ kScrollAmount
- radius
,
1157 delegate
->bounding_box());
1159 ui::GestureConfiguration::GetInstance()->set_default_radius(0);
1162 // Check Scroll End Events report correct velocities
1163 // if the user was on a horizontal rail
1164 TEST_F(GestureRecognizerTest
, GestureEventHorizontalRailFling
) {
1165 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
1166 new GestureEventConsumeDelegate());
1168 const int kTouchId
= 7;
1169 gfx::Rect
bounds(0, 0, 1000, 1000);
1170 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
1171 delegate
.get(), -1234, bounds
, root_window()));
1173 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(0, 0),
1174 kTouchId
, tes
.Now());
1175 DispatchEventUsingWindowDispatcher(&press
);
1177 // Get rid of touch slop.
1178 ui::TouchEvent
move(ui::ET_TOUCH_MOVED
, gfx::Point(10, 0),
1179 kTouchId
, tes
.Now());
1180 DispatchEventUsingWindowDispatcher(&move
);
1184 // Move the touch-point horizontally enough that it is considered a
1185 // horizontal scroll.
1186 tes
.SendScrollEvent(event_processor(), 30, 1, kTouchId
, delegate
.get());
1187 EXPECT_FLOAT_EQ(0, delegate
->scroll_y());
1188 EXPECT_FLOAT_EQ(20, delegate
->scroll_x());
1190 // Get a high x velocity, while still staying on the rail
1191 const int kScrollAmount
= 8;
1192 tes
.SendScrollEvents(event_processor(),
1203 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
1204 kTouchId
, tes
.Now());
1205 DispatchEventUsingWindowDispatcher(&release
);
1207 EXPECT_TRUE(delegate
->fling());
1208 EXPECT_FALSE(delegate
->scroll_end());
1209 EXPECT_GT(delegate
->velocity_x(), 0);
1210 EXPECT_EQ(0, delegate
->velocity_y());
1213 // Check Scroll End Events report correct velocities
1214 // if the user was on a vertical rail
1215 TEST_F(GestureRecognizerTest
, GestureEventVerticalRailFling
) {
1216 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
1217 new GestureEventConsumeDelegate());
1219 const int kTouchId
= 7;
1220 gfx::Rect
bounds(0, 0, 1000, 1000);
1221 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
1222 delegate
.get(), -1234, bounds
, root_window()));
1224 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(0, 0),
1225 kTouchId
, tes
.Now());
1226 DispatchEventUsingWindowDispatcher(&press
);
1228 // Get rid of touch slop.
1229 ui::TouchEvent
move(ui::ET_TOUCH_MOVED
, gfx::Point(0, 10),
1230 kTouchId
, tes
.Now());
1231 DispatchEventUsingWindowDispatcher(&move
);
1234 // Move the touch-point vertically enough that it is considered a
1236 tes
.SendScrollEvent(event_processor(), 1, 30, kTouchId
, delegate
.get());
1237 EXPECT_EQ(20, delegate
->scroll_y());
1238 EXPECT_EQ(0, delegate
->scroll_x());
1239 EXPECT_EQ(0, delegate
->scroll_velocity_x());
1241 // Get a high y velocity, while still staying on the rail
1242 const int kScrollAmount
= 8;
1243 tes
.SendScrollEvents(event_processor(),
1252 EXPECT_EQ(0, delegate
->scroll_velocity_x());
1255 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 206),
1256 kTouchId
, tes
.Now());
1257 DispatchEventUsingWindowDispatcher(&release
);
1259 EXPECT_TRUE(delegate
->fling());
1260 EXPECT_FALSE(delegate
->scroll_end());
1261 EXPECT_EQ(0, delegate
->velocity_x());
1262 EXPECT_GT(delegate
->velocity_y(), 0);
1265 // Check Scroll End Events report non-zero velocities if the user is not on a
1267 TEST_F(GestureRecognizerTest
, GestureEventNonRailFling
) {
1268 ui::GestureConfiguration::GetInstance()
1269 ->set_max_touch_move_in_pixels_for_click(0);
1270 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
1271 new GestureEventConsumeDelegate());
1273 const int kTouchId
= 7;
1274 gfx::Rect
bounds(0, 0, 1000, 1000);
1275 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
1276 delegate
.get(), -1234, bounds
, root_window()));
1278 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(0, 0),
1279 kTouchId
, tes
.Now());
1280 DispatchEventUsingWindowDispatcher(&press
);
1282 // Move the touch-point such that a non-rail scroll begins, and we're outside
1283 // the snap channel for the unified GR.
1284 tes
.SendScrollEvent(event_processor(), 50, 50, kTouchId
, delegate
.get());
1285 EXPECT_EQ(50, delegate
->scroll_y());
1286 EXPECT_EQ(50, delegate
->scroll_x());
1288 const int kScrollAmount
= 8;
1289 tes
.SendScrollEvents(event_processor(),
1300 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
1301 kTouchId
, tes
.Now());
1302 DispatchEventUsingWindowDispatcher(&release
);
1304 EXPECT_TRUE(delegate
->fling());
1305 EXPECT_FALSE(delegate
->scroll_end());
1306 EXPECT_GT(delegate
->velocity_x(), 0);
1307 EXPECT_GT(delegate
->velocity_y(), 0);
1310 // Check that appropriate touch events generate long press events
1311 TEST_F(GestureRecognizerTest
, GestureEventLongPress
) {
1312 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
1313 new GestureEventConsumeDelegate());
1314 const int kWindowWidth
= 123;
1315 const int kWindowHeight
= 45;
1316 const int kTouchId
= 2;
1317 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
1318 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
1319 delegate
.get(), -1234, bounds
, root_window()));
1323 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
,
1324 gfx::Point(101, 201),
1326 ui::EventTimeForNow());
1327 DispatchEventUsingWindowDispatcher(&press1
);
1328 EXPECT_TRUE(delegate
->tap_down());
1329 EXPECT_TRUE(delegate
->begin());
1330 EXPECT_FALSE(delegate
->tap_cancel());
1332 // We haven't pressed long enough for a long press to occur
1333 EXPECT_FALSE(delegate
->long_press());
1335 // Wait until the timer runs out
1336 delegate
->WaitUntilReceivedGesture(ui::ET_GESTURE_LONG_PRESS
);
1337 EXPECT_TRUE(delegate
->long_press());
1338 EXPECT_FALSE(delegate
->tap_cancel());
1341 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
,
1342 gfx::Point(101, 201),
1344 ui::EventTimeForNow());
1345 DispatchEventUsingWindowDispatcher(&release1
);
1346 EXPECT_FALSE(delegate
->long_press());
1348 // Note the tap cancel isn't dispatched until the release
1349 EXPECT_TRUE(delegate
->tap_cancel());
1350 EXPECT_FALSE(delegate
->tap());
1353 // Check that scrolling prevents a long press.
1354 TEST_F(GestureRecognizerTest
, GestureEventLongPressCancelledByScroll
) {
1355 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
1356 new GestureEventConsumeDelegate());
1358 const int kWindowWidth
= 123;
1359 const int kWindowHeight
= 45;
1360 const int kTouchId
= 6;
1361 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
1362 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
1363 delegate
.get(), -1234, bounds
, root_window()));
1367 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
1368 kTouchId
, tes
.Now());
1369 DispatchEventUsingWindowDispatcher(&press1
);
1370 EXPECT_TRUE(delegate
->tap_down());
1372 // We haven't pressed long enough for a long press to occur
1373 EXPECT_FALSE(delegate
->long_press());
1374 EXPECT_FALSE(delegate
->tap_cancel());
1376 // Scroll around, to cancel the long press
1377 tes
.SendScrollEvent(event_processor(), 130, 230, kTouchId
, delegate
.get());
1379 // Wait until a long press event would have fired, if it hadn't been
1381 DelayByLongPressTimeout();
1383 EXPECT_FALSE(delegate
->long_press());
1384 EXPECT_TRUE(delegate
->tap_cancel());
1387 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
1388 kTouchId
, tes
.LeapForward(10));
1389 DispatchEventUsingWindowDispatcher(&release1
);
1390 EXPECT_FALSE(delegate
->long_press());
1391 EXPECT_FALSE(delegate
->tap_cancel());
1394 // Check that appropriate touch events generate long tap events
1395 TEST_F(GestureRecognizerTest
, GestureEventLongTap
) {
1396 ui::GestureConfiguration::GetInstance()
1397 ->set_max_touch_down_duration_for_click_in_ms(3);
1398 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
1399 new GestureEventConsumeDelegate());
1400 const int kWindowWidth
= 123;
1401 const int kWindowHeight
= 45;
1402 const int kTouchId
= 2;
1403 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
1404 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
1405 delegate
.get(), -1234, bounds
, root_window()));
1409 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
,
1410 gfx::Point(101, 201),
1412 ui::EventTimeForNow());
1413 DispatchEventUsingWindowDispatcher(&press1
);
1414 EXPECT_TRUE(delegate
->tap_down());
1415 EXPECT_TRUE(delegate
->begin());
1416 EXPECT_FALSE(delegate
->tap_cancel());
1418 // We haven't pressed long enough for a long press to occur
1419 EXPECT_FALSE(delegate
->long_press());
1421 // Wait until the timer runs out
1422 delegate
->WaitUntilReceivedGesture(ui::ET_GESTURE_LONG_PRESS
);
1423 EXPECT_TRUE(delegate
->long_press());
1424 EXPECT_FALSE(delegate
->tap_cancel());
1427 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
,
1428 gfx::Point(101, 201),
1430 ui::EventTimeForNow());
1431 DispatchEventUsingWindowDispatcher(&release1
);
1432 EXPECT_FALSE(delegate
->long_press());
1433 EXPECT_TRUE(delegate
->long_tap());
1435 // Note the tap cancel isn't dispatched until the release
1436 EXPECT_TRUE(delegate
->tap_cancel());
1437 EXPECT_FALSE(delegate
->tap());
1440 // Check that second tap cancels a long press
1441 TEST_F(GestureRecognizerTest
, GestureEventLongPressCancelledBySecondTap
) {
1442 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
1443 new GestureEventConsumeDelegate());
1445 const int kWindowWidth
= 300;
1446 const int kWindowHeight
= 400;
1447 const int kTouchId1
= 8;
1448 const int kTouchId2
= 2;
1449 gfx::Rect
bounds(5, 5, kWindowWidth
, kWindowHeight
);
1450 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
1451 delegate
.get(), -1234, bounds
, root_window()));
1454 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
1455 kTouchId1
, tes
.Now());
1456 DispatchEventUsingWindowDispatcher(&press
);
1457 EXPECT_TRUE(delegate
->tap_down());
1458 EXPECT_TRUE(delegate
->begin());
1460 // We haven't pressed long enough for a long press to occur
1461 EXPECT_FALSE(delegate
->long_press());
1463 // Second tap, to cancel the long press
1465 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(10, 10),
1466 kTouchId2
, tes
.Now());
1467 DispatchEventUsingWindowDispatcher(&press2
);
1468 EXPECT_FALSE(delegate
->tap_down()); // no touch down for second tap.
1469 EXPECT_TRUE(delegate
->tap_cancel());
1470 EXPECT_TRUE(delegate
->begin());
1472 // Wait until the timer runs out
1473 DelayByLongPressTimeout();
1475 // No long press occurred
1476 EXPECT_FALSE(delegate
->long_press());
1479 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
1480 kTouchId1
, tes
.Now());
1481 DispatchEventUsingWindowDispatcher(&release1
);
1482 EXPECT_FALSE(delegate
->long_press());
1483 EXPECT_TRUE(delegate
->two_finger_tap());
1484 EXPECT_FALSE(delegate
->tap_cancel());
1487 // Check that horizontal scroll gestures cause scrolls on horizontal rails.
1488 // Also tests that horizontal rails can be broken.
1489 TEST_F(GestureRecognizerTest
, GestureEventHorizontalRailScroll
) {
1490 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
1491 new GestureEventConsumeDelegate());
1493 const int kTouchId
= 7;
1494 gfx::Rect
bounds(0, 0, 1000, 1000);
1495 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
1496 delegate
.get(), -1234, bounds
, root_window()));
1498 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(0, 0),
1499 kTouchId
, tes
.Now());
1500 DispatchEventUsingWindowDispatcher(&press
);
1502 // Get rid of touch slop.
1503 ui::TouchEvent
move(ui::ET_TOUCH_MOVED
, gfx::Point(5, 0),
1504 kTouchId
, tes
.Now());
1506 DispatchEventUsingWindowDispatcher(&move
);
1509 // Move the touch-point horizontally enough that it is considered a
1510 // horizontal scroll.
1511 tes
.SendScrollEvent(event_processor(), 25, 0, kTouchId
, delegate
.get());
1512 EXPECT_EQ(0, delegate
->scroll_y());
1513 EXPECT_EQ(20, delegate
->scroll_x());
1515 tes
.SendScrollEvent(event_processor(), 30, 6, kTouchId
, delegate
.get());
1516 EXPECT_TRUE(delegate
->scroll_update());
1517 EXPECT_EQ(5, delegate
->scroll_x());
1518 // y shouldn't change, as we're on a horizontal rail.
1519 EXPECT_EQ(0, delegate
->scroll_y());
1521 // Send enough information that a velocity can be calculated for the gesture,
1522 // and we can break the rail
1523 const int kScrollAmount
= 8;
1524 tes
.SendScrollEvents(event_processor(),
1534 tes
.SendScrollEvent(event_processor(), 5, 0, kTouchId
, delegate
.get());
1535 tes
.SendScrollEvent(event_processor(), 10, 5, kTouchId
, delegate
.get());
1537 // The rail should be broken
1538 EXPECT_TRUE(delegate
->scroll_update());
1539 EXPECT_EQ(5, delegate
->scroll_x());
1540 EXPECT_EQ(5, delegate
->scroll_y());
1543 // Check that vertical scroll gestures cause scrolls on vertical rails.
1544 // Also tests that vertical rails can be broken.
1545 TEST_F(GestureRecognizerTest
, GestureEventVerticalRailScroll
) {
1546 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
1547 new GestureEventConsumeDelegate());
1549 const int kTouchId
= 7;
1550 gfx::Rect
bounds(0, 0, 1000, 1000);
1551 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
1552 delegate
.get(), -1234, bounds
, root_window()));
1554 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(0, 0),
1555 kTouchId
, tes
.Now());
1556 DispatchEventUsingWindowDispatcher(&press
);
1558 // Get rid of touch slop.
1559 ui::TouchEvent
move(ui::ET_TOUCH_MOVED
, gfx::Point(0, 5),
1560 kTouchId
, tes
.Now());
1561 DispatchEventUsingWindowDispatcher(&move
);
1564 // Move the touch-point vertically enough that it is considered a
1566 tes
.SendScrollEvent(event_processor(), 0, 25, kTouchId
, delegate
.get());
1567 EXPECT_EQ(0, delegate
->scroll_x());
1568 EXPECT_EQ(20, delegate
->scroll_y());
1570 tes
.SendScrollEvent(event_processor(), 6, 30, kTouchId
, delegate
.get());
1571 EXPECT_TRUE(delegate
->scroll_update());
1572 EXPECT_EQ(5, delegate
->scroll_y());
1573 // x shouldn't change, as we're on a vertical rail.
1574 EXPECT_EQ(0, delegate
->scroll_x());
1575 EXPECT_EQ(0, delegate
->scroll_velocity_x());
1577 // Send enough information that a velocity can be calculated for the gesture,
1578 // and we can break the rail
1579 const int kScrollAmount
= 8;
1580 tes
.SendScrollEvents(event_processor(),
1590 tes
.SendScrollEvent(event_processor(), 0, 5, kTouchId
, delegate
.get());
1591 tes
.SendScrollEvent(event_processor(), 5, 10, kTouchId
, delegate
.get());
1593 // The rail should be broken
1594 EXPECT_TRUE(delegate
->scroll_update());
1595 EXPECT_EQ(5, delegate
->scroll_x());
1596 EXPECT_EQ(5, delegate
->scroll_y());
1599 TEST_F(GestureRecognizerTest
, GestureTapFollowedByScroll
) {
1600 // We'll start by moving the touch point by (5, 5). We want all of that
1601 // distance to be consumed by the slop, so we set the slop radius to
1602 // sqrt(5 * 5 + 5 * 5).
1603 ui::GestureConfiguration::GetInstance()
1604 ->set_max_touch_move_in_pixels_for_click(sqrt(5.f
* 5 + 5 * 5));
1606 // First, tap. Then, do a scroll using the same touch-id.
1607 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
1608 new GestureEventConsumeDelegate());
1610 const int kWindowWidth
= 123;
1611 const int kWindowHeight
= 45;
1612 const int kTouchId
= 3;
1613 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
1614 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
1615 delegate
.get(), -1234, bounds
, root_window()));
1618 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
1619 kTouchId
, tes
.Now());
1620 DispatchEventUsingWindowDispatcher(&press
);
1621 EXPECT_FALSE(delegate
->tap());
1622 EXPECT_TRUE(delegate
->tap_down());
1623 EXPECT_FALSE(delegate
->tap_cancel());
1624 EXPECT_FALSE(delegate
->scroll_begin());
1625 EXPECT_FALSE(delegate
->scroll_update());
1626 EXPECT_FALSE(delegate
->scroll_end());
1628 // Make sure there is enough delay before the touch is released so that it is
1629 // recognized as a tap.
1631 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
1632 kTouchId
, tes
.LeapForward(50));
1633 DispatchEventUsingWindowDispatcher(&release
);
1634 EXPECT_TRUE(delegate
->tap());
1635 EXPECT_FALSE(delegate
->tap_down());
1636 EXPECT_FALSE(delegate
->tap_cancel());
1637 EXPECT_FALSE(delegate
->scroll_begin());
1638 EXPECT_FALSE(delegate
->scroll_update());
1639 EXPECT_FALSE(delegate
->scroll_end());
1641 // Now, do a scroll gesture. Delay it sufficiently so that it doesn't trigger
1644 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
1645 kTouchId
, tes
.LeapForward(1000));
1646 DispatchEventUsingWindowDispatcher(&press1
);
1647 EXPECT_FALSE(delegate
->tap());
1648 EXPECT_TRUE(delegate
->tap_down());
1649 EXPECT_FALSE(delegate
->tap_cancel());
1650 EXPECT_FALSE(delegate
->scroll_begin());
1651 EXPECT_FALSE(delegate
->scroll_update());
1652 EXPECT_FALSE(delegate
->scroll_end());
1654 // Get rid of touch slop.
1655 ui::TouchEvent
move_remove_slop(ui::ET_TOUCH_MOVED
, gfx::Point(116, 216),
1656 kTouchId
, tes
.Now());
1657 DispatchEventUsingWindowDispatcher(&move_remove_slop
);
1658 EXPECT_TRUE(delegate
->tap_cancel());
1659 EXPECT_TRUE(delegate
->scroll_begin());
1660 EXPECT_TRUE(delegate
->scroll_update());
1661 EXPECT_EQ(15, delegate
->scroll_x_hint());
1662 EXPECT_EQ(15, delegate
->scroll_y_hint());
1666 // Move the touch-point enough so that it is considered as a scroll. This
1667 // should generate both SCROLL_BEGIN and SCROLL_UPDATE gestures.
1668 // The first movement is diagonal, to ensure that we have a free scroll,
1669 // and not a rail scroll.
1671 ui::TouchEvent
move(ui::ET_TOUCH_MOVED
, gfx::Point(135, 235),
1672 kTouchId
, tes
.Now());
1673 DispatchEventUsingWindowDispatcher(&move
);
1674 EXPECT_FALSE(delegate
->tap());
1675 EXPECT_FALSE(delegate
->tap_down());
1676 EXPECT_FALSE(delegate
->tap_cancel());
1677 EXPECT_FALSE(delegate
->scroll_begin());
1678 EXPECT_TRUE(delegate
->scroll_update());
1679 EXPECT_FALSE(delegate
->scroll_end());
1680 EXPECT_EQ(19, delegate
->scroll_x());
1681 EXPECT_EQ(19, delegate
->scroll_y());
1683 // Move some more to generate a few more scroll updates.
1685 ui::TouchEvent
move1(ui::ET_TOUCH_MOVED
, gfx::Point(115, 216),
1686 kTouchId
, tes
.Now());
1687 DispatchEventUsingWindowDispatcher(&move1
);
1688 EXPECT_FALSE(delegate
->tap());
1689 EXPECT_FALSE(delegate
->tap_down());
1690 EXPECT_FALSE(delegate
->tap_cancel());
1691 EXPECT_FALSE(delegate
->scroll_begin());
1692 EXPECT_TRUE(delegate
->scroll_update());
1693 EXPECT_FALSE(delegate
->scroll_end());
1694 EXPECT_EQ(-20, delegate
->scroll_x());
1695 EXPECT_EQ(-19, delegate
->scroll_y());
1696 EXPECT_EQ(0, delegate
->scroll_x_hint());
1697 EXPECT_EQ(0, delegate
->scroll_y_hint());
1700 ui::TouchEvent
move2(ui::ET_TOUCH_MOVED
, gfx::Point(145, 220),
1701 kTouchId
, tes
.Now());
1702 DispatchEventUsingWindowDispatcher(&move2
);
1703 EXPECT_FALSE(delegate
->tap());
1704 EXPECT_FALSE(delegate
->tap_down());
1705 EXPECT_FALSE(delegate
->tap_cancel());
1706 EXPECT_FALSE(delegate
->scroll_begin());
1707 EXPECT_TRUE(delegate
->scroll_update());
1708 EXPECT_FALSE(delegate
->scroll_end());
1709 EXPECT_EQ(30, delegate
->scroll_x());
1710 EXPECT_EQ(4, delegate
->scroll_y());
1712 // Release the touch. This should end the scroll.
1714 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
1715 kTouchId
, tes
.Now());
1716 DispatchEventUsingWindowDispatcher(&release1
);
1717 EXPECT_FALSE(delegate
->tap());
1718 EXPECT_FALSE(delegate
->tap_down());
1719 EXPECT_FALSE(delegate
->tap_cancel());
1720 EXPECT_FALSE(delegate
->scroll_begin());
1721 EXPECT_FALSE(delegate
->scroll_update());
1722 EXPECT_FALSE(delegate
->scroll_end());
1723 EXPECT_TRUE(delegate
->fling());
1726 TEST_F(GestureRecognizerTest
, AsynchronousGestureRecognition
) {
1727 scoped_ptr
<QueueTouchEventDelegate
> queued_delegate(
1728 new QueueTouchEventDelegate(host()->dispatcher()));
1730 const int kWindowWidth
= 123;
1731 const int kWindowHeight
= 45;
1732 const int kTouchId1
= 6;
1733 const int kTouchId2
= 4;
1734 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
1735 scoped_ptr
<aura::Window
> queue(CreateTestWindowWithDelegate(
1736 queued_delegate
.get(), -1234, bounds
, root_window()));
1738 queued_delegate
->set_window(queue
.get());
1740 // Touch down on the window. This should not generate any gesture event.
1741 queued_delegate
->Reset();
1742 ui::TouchEvent
press(
1743 ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201), kTouchId1
, tes
.Now());
1744 DispatchEventUsingWindowDispatcher(&press
);
1745 EXPECT_FALSE(queued_delegate
->tap());
1746 EXPECT_FALSE(queued_delegate
->tap_down());
1747 EXPECT_FALSE(queued_delegate
->tap_cancel());
1748 EXPECT_FALSE(queued_delegate
->begin());
1749 EXPECT_FALSE(queued_delegate
->scroll_begin());
1750 EXPECT_FALSE(queued_delegate
->scroll_update());
1751 EXPECT_FALSE(queued_delegate
->scroll_end());
1753 // Introduce some delay before the touch is released so that it is recognized
1754 // as a tap. However, this still should not create any gesture events.
1755 queued_delegate
->Reset();
1756 ui::TouchEvent
release(
1757 ui::ET_TOUCH_RELEASED
,
1758 gfx::Point(101, 201),
1760 press
.time_stamp() + base::TimeDelta::FromMilliseconds(50));
1761 DispatchEventUsingWindowDispatcher(&release
);
1762 EXPECT_FALSE(queued_delegate
->tap());
1763 EXPECT_FALSE(queued_delegate
->tap_down());
1764 EXPECT_FALSE(queued_delegate
->tap_cancel());
1765 EXPECT_FALSE(queued_delegate
->begin());
1766 EXPECT_FALSE(queued_delegate
->end());
1767 EXPECT_FALSE(queued_delegate
->scroll_begin());
1768 EXPECT_FALSE(queued_delegate
->scroll_update());
1769 EXPECT_FALSE(queued_delegate
->scroll_end());
1771 // Create another window, and place a touch-down on it. This should create a
1772 // tap-down gesture.
1773 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
1774 new GestureEventConsumeDelegate());
1775 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
1776 delegate
.get(), -2345, gfx::Rect(0, 0, 50, 50), root_window()));
1778 ui::TouchEvent
press2(
1779 ui::ET_TOUCH_PRESSED
, gfx::Point(10, 20), kTouchId2
, tes
.Now());
1780 DispatchEventUsingWindowDispatcher(&press2
);
1781 EXPECT_FALSE(delegate
->tap());
1782 EXPECT_TRUE(delegate
->tap_down());
1783 EXPECT_FALSE(delegate
->tap_cancel());
1784 EXPECT_FALSE(queued_delegate
->begin());
1785 EXPECT_FALSE(queued_delegate
->end());
1786 EXPECT_FALSE(delegate
->scroll_begin());
1787 EXPECT_FALSE(delegate
->scroll_update());
1788 EXPECT_FALSE(delegate
->scroll_end());
1790 ui::TouchEvent
release2(
1791 ui::ET_TOUCH_RELEASED
, gfx::Point(10, 20), kTouchId2
, tes
.Now());
1792 DispatchEventUsingWindowDispatcher(&release2
);
1794 // Process the first queued event.
1795 queued_delegate
->Reset();
1796 queued_delegate
->ReceivedAck();
1797 EXPECT_FALSE(queued_delegate
->tap());
1798 EXPECT_TRUE(queued_delegate
->tap_down());
1799 EXPECT_TRUE(queued_delegate
->begin());
1800 EXPECT_FALSE(queued_delegate
->tap_cancel());
1801 EXPECT_FALSE(queued_delegate
->end());
1802 EXPECT_FALSE(queued_delegate
->scroll_begin());
1803 EXPECT_FALSE(queued_delegate
->scroll_update());
1804 EXPECT_FALSE(queued_delegate
->scroll_end());
1806 // Now, process the second queued event.
1807 queued_delegate
->Reset();
1808 queued_delegate
->ReceivedAck();
1809 EXPECT_TRUE(queued_delegate
->tap());
1810 EXPECT_FALSE(queued_delegate
->tap_down());
1811 EXPECT_FALSE(queued_delegate
->tap_cancel());
1812 EXPECT_FALSE(queued_delegate
->begin());
1813 EXPECT_TRUE(queued_delegate
->end());
1814 EXPECT_FALSE(queued_delegate
->scroll_begin());
1815 EXPECT_FALSE(queued_delegate
->scroll_update());
1816 EXPECT_FALSE(queued_delegate
->scroll_end());
1818 // Start all over. Press on the first window, then press again on the second
1819 // window. The second press should still go to the first window.
1820 queued_delegate
->Reset();
1821 ui::TouchEvent
press3(
1822 ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201), kTouchId1
, tes
.Now());
1823 DispatchEventUsingWindowDispatcher(&press3
);
1824 EXPECT_FALSE(queued_delegate
->tap());
1825 EXPECT_FALSE(queued_delegate
->tap_down());
1826 EXPECT_FALSE(queued_delegate
->tap_cancel());
1827 EXPECT_FALSE(queued_delegate
->begin());
1828 EXPECT_FALSE(queued_delegate
->end());
1829 EXPECT_FALSE(queued_delegate
->begin());
1830 EXPECT_FALSE(queued_delegate
->end());
1831 EXPECT_FALSE(queued_delegate
->scroll_begin());
1832 EXPECT_FALSE(queued_delegate
->scroll_update());
1833 EXPECT_FALSE(queued_delegate
->scroll_end());
1835 queued_delegate
->Reset();
1837 ui::TouchEvent
press4(
1838 ui::ET_TOUCH_PRESSED
, gfx::Point(103, 203), kTouchId2
, tes
.Now());
1839 DispatchEventUsingWindowDispatcher(&press4
);
1840 EXPECT_FALSE(delegate
->tap());
1841 EXPECT_FALSE(delegate
->tap_down());
1842 EXPECT_FALSE(delegate
->tap_cancel());
1843 EXPECT_FALSE(delegate
->begin());
1844 EXPECT_FALSE(delegate
->end());
1845 EXPECT_FALSE(delegate
->scroll_begin());
1846 EXPECT_FALSE(delegate
->scroll_update());
1847 EXPECT_FALSE(delegate
->scroll_end());
1848 EXPECT_FALSE(queued_delegate
->tap());
1849 EXPECT_FALSE(queued_delegate
->tap_down());
1850 EXPECT_FALSE(queued_delegate
->tap_cancel());
1851 EXPECT_FALSE(queued_delegate
->begin());
1852 EXPECT_FALSE(queued_delegate
->end());
1853 EXPECT_FALSE(queued_delegate
->scroll_begin());
1854 EXPECT_FALSE(queued_delegate
->scroll_update());
1855 EXPECT_FALSE(queued_delegate
->scroll_end());
1857 // Move the second touch-point enough so that it is considered a pinch. This
1858 // should generate both SCROLL_BEGIN and PINCH_BEGIN gestures.
1859 queued_delegate
->Reset();
1861 ui::TouchEvent
move(
1864 ui::GestureConfiguration::GetInstance()
1865 ->max_touch_move_in_pixels_for_click(),
1869 DispatchEventUsingWindowDispatcher(&move
);
1870 EXPECT_FALSE(delegate
->tap());
1871 EXPECT_FALSE(delegate
->tap_down());
1872 EXPECT_FALSE(delegate
->tap_cancel());
1873 EXPECT_FALSE(delegate
->begin());
1874 EXPECT_FALSE(delegate
->scroll_begin());
1875 EXPECT_FALSE(delegate
->scroll_update());
1876 EXPECT_FALSE(delegate
->scroll_end());
1877 EXPECT_FALSE(queued_delegate
->tap());
1878 EXPECT_FALSE(queued_delegate
->tap_down());
1879 EXPECT_FALSE(queued_delegate
->tap_cancel());
1880 EXPECT_FALSE(queued_delegate
->begin());
1881 EXPECT_FALSE(queued_delegate
->scroll_begin());
1882 EXPECT_FALSE(queued_delegate
->scroll_update());
1883 EXPECT_FALSE(queued_delegate
->scroll_end());
1885 queued_delegate
->Reset();
1886 queued_delegate
->ReceivedAck();
1887 EXPECT_FALSE(queued_delegate
->tap());
1888 EXPECT_TRUE(queued_delegate
->tap_down());
1889 EXPECT_TRUE(queued_delegate
->begin());
1890 EXPECT_FALSE(queued_delegate
->tap_cancel());
1891 EXPECT_FALSE(queued_delegate
->end());
1892 EXPECT_FALSE(queued_delegate
->scroll_begin());
1893 EXPECT_FALSE(queued_delegate
->scroll_update());
1894 EXPECT_FALSE(queued_delegate
->scroll_end());
1896 queued_delegate
->Reset();
1897 queued_delegate
->ReceivedAck();
1898 EXPECT_FALSE(queued_delegate
->tap());
1899 EXPECT_FALSE(queued_delegate
->tap_down()); // no touch down for second tap.
1900 EXPECT_TRUE(queued_delegate
->tap_cancel());
1901 EXPECT_TRUE(queued_delegate
->begin());
1902 EXPECT_FALSE(queued_delegate
->end());
1903 EXPECT_FALSE(queued_delegate
->scroll_begin());
1904 EXPECT_FALSE(queued_delegate
->scroll_update());
1905 EXPECT_FALSE(queued_delegate
->scroll_end());
1906 EXPECT_FALSE(queued_delegate
->pinch_begin());
1907 EXPECT_FALSE(queued_delegate
->pinch_update());
1908 EXPECT_FALSE(queued_delegate
->pinch_end());
1910 queued_delegate
->Reset();
1911 queued_delegate
->ReceivedAck();
1912 EXPECT_FALSE(queued_delegate
->tap());
1913 EXPECT_FALSE(queued_delegate
->tap_down());
1914 EXPECT_FALSE(queued_delegate
->tap_cancel());
1915 EXPECT_FALSE(queued_delegate
->begin());
1916 EXPECT_FALSE(queued_delegate
->end());
1917 EXPECT_TRUE(queued_delegate
->scroll_begin());
1919 EXPECT_TRUE(queued_delegate
->scroll_update());
1920 EXPECT_FALSE(queued_delegate
->scroll_end());
1921 EXPECT_TRUE(queued_delegate
->pinch_begin());
1922 EXPECT_FALSE(queued_delegate
->pinch_update());
1923 EXPECT_FALSE(queued_delegate
->pinch_end());
1926 // Check that appropriate touch events generate pinch gesture events.
1927 TEST_F(GestureRecognizerTest
, GestureEventPinchFromScroll
) {
1928 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
1929 new GestureEventConsumeDelegate());
1931 const int kWindowWidth
= 300;
1932 const int kWindowHeight
= 400;
1933 const int kTouchId1
= 5;
1934 const int kTouchId2
= 3;
1935 gfx::Rect
bounds(5, 5, kWindowWidth
, kWindowHeight
);
1936 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
1937 delegate
.get(), -1234, bounds
, root_window()));
1940 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
1941 kTouchId1
, tes
.Now());
1942 DispatchEventUsingWindowDispatcher(&press
);
1943 EXPECT_2_EVENTS(delegate
->events(),
1944 ui::ET_GESTURE_BEGIN
,
1945 ui::ET_GESTURE_TAP_DOWN
);
1947 // Move the touch-point enough so that it is considered as a scroll. This
1948 // should generate both SCROLL_BEGIN and SCROLL_UPDATE gestures.
1950 ui::TouchEvent
move(ui::ET_TOUCH_MOVED
, gfx::Point(130, 301),
1951 kTouchId1
, tes
.Now());
1952 DispatchEventUsingWindowDispatcher(&move
);
1953 EXPECT_3_EVENTS(delegate
->events(),
1954 ui::ET_GESTURE_TAP_CANCEL
,
1955 ui::ET_GESTURE_SCROLL_BEGIN
,
1956 ui::ET_GESTURE_SCROLL_UPDATE
);
1958 // Press the second finger. It should cause pinch-begin. Note that we will not
1959 // transition to two finger tap here because the touch points are far enough.
1961 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(10, 10),
1962 kTouchId2
, tes
.Now());
1963 DispatchEventUsingWindowDispatcher(&press2
);
1964 EXPECT_1_EVENT(delegate
->events(), ui::ET_GESTURE_BEGIN
);
1965 EXPECT_EQ(gfx::Rect(10, 10, 120, 291).ToString(),
1966 delegate
->bounding_box().ToString());
1968 // Move the first finger.
1970 ui::TouchEvent
move3(ui::ET_TOUCH_MOVED
, gfx::Point(95, 201),
1971 kTouchId1
, tes
.Now());
1972 DispatchEventUsingWindowDispatcher(&move3
);
1973 EXPECT_2_EVENTS(delegate
->events(),
1974 ui::ET_GESTURE_SCROLL_UPDATE
,
1975 ui::ET_GESTURE_PINCH_BEGIN
);
1976 EXPECT_EQ(gfx::Rect(10, 10, 85, 191).ToString(),
1977 delegate
->bounding_box().ToString());
1979 // Now move the second finger.
1981 ui::TouchEvent
move4(ui::ET_TOUCH_MOVED
, gfx::Point(55, 15),
1982 kTouchId2
, tes
.Now());
1983 DispatchEventUsingWindowDispatcher(&move4
);
1984 EXPECT_2_EVENTS(delegate
->events(),
1985 ui::ET_GESTURE_SCROLL_UPDATE
,
1986 ui::ET_GESTURE_PINCH_UPDATE
);
1987 EXPECT_EQ(gfx::Rect(55, 15, 40, 186).ToString(),
1988 delegate
->bounding_box().ToString());
1990 // Release the first finger. This should end pinch.
1992 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
1993 kTouchId1
, tes
.Now());
1994 DispatchEventUsingWindowDispatcher(&release
);
1995 EXPECT_2_EVENTS(delegate
->events(),
1996 ui::ET_GESTURE_PINCH_END
,
1997 ui::ET_GESTURE_END
);
1998 EXPECT_EQ(gfx::Rect(55, 15, 46, 186).ToString(),
1999 delegate
->bounding_box().ToString());
2001 // Move the second finger. This should still generate a scroll.
2003 ui::TouchEvent
move5(ui::ET_TOUCH_MOVED
, gfx::Point(25, 10),
2004 kTouchId2
, tes
.Now());
2005 DispatchEventUsingWindowDispatcher(&move5
);
2006 EXPECT_1_EVENT(delegate
->events(), ui::ET_GESTURE_SCROLL_UPDATE
);
2007 EXPECT_TRUE(delegate
->bounding_box().IsEmpty());
2010 TEST_F(GestureRecognizerTest
, GestureEventPinchFromScrollFromPinch
) {
2011 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
2012 new GestureEventConsumeDelegate());
2014 const int kWindowWidth
= 300;
2015 const int kWindowHeight
= 400;
2016 const int kTouchId1
= 5;
2017 const int kTouchId2
= 3;
2018 gfx::Rect
bounds(5, 5, kWindowWidth
, kWindowHeight
);
2019 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2020 delegate
.get(), -1234, bounds
, root_window()));
2022 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 301),
2023 kTouchId1
, tes
.Now());
2024 DispatchEventUsingWindowDispatcher(&press
);
2026 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(10, 10),
2027 kTouchId2
, tes
.Now());
2028 DispatchEventUsingWindowDispatcher(&press2
);
2029 EXPECT_FALSE(delegate
->pinch_begin());
2031 // Touch move triggers pinch begin.
2032 tes
.SendScrollEvent(event_processor(), 130, 230, kTouchId1
, delegate
.get());
2033 EXPECT_TRUE(delegate
->pinch_begin());
2034 EXPECT_FALSE(delegate
->pinch_update());
2036 // Touch move triggers pinch update.
2037 tes
.SendScrollEvent(event_processor(), 160, 200, kTouchId1
, delegate
.get());
2038 EXPECT_FALSE(delegate
->pinch_begin());
2039 EXPECT_TRUE(delegate
->pinch_update());
2041 // Pinch has started, now release the second finger
2043 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
2044 kTouchId1
, tes
.Now());
2045 DispatchEventUsingWindowDispatcher(&release
);
2046 EXPECT_TRUE(delegate
->pinch_end());
2048 tes
.SendScrollEvent(event_processor(), 130, 230, kTouchId2
, delegate
.get());
2049 EXPECT_TRUE(delegate
->scroll_update());
2053 ui::TouchEvent
press3(ui::ET_TOUCH_PRESSED
, gfx::Point(10, 10),
2054 kTouchId1
, tes
.Now());
2055 DispatchEventUsingWindowDispatcher(&press3
);
2056 // Now the touch points are close. So we will go into two finger tap.
2057 // Move the touch-point enough to break two-finger-tap and enter pinch.
2058 ui::TouchEvent
move2(ui::ET_TOUCH_MOVED
, gfx::Point(101, 50),
2059 kTouchId1
, tes
.Now());
2060 DispatchEventUsingWindowDispatcher(&move2
);
2061 EXPECT_TRUE(delegate
->pinch_begin());
2063 tes
.SendScrollEvent(event_processor(), 350, 350, kTouchId1
, delegate
.get());
2064 EXPECT_TRUE(delegate
->pinch_update());
2067 TEST_F(GestureRecognizerTest
, GestureEventPinchFromTap
) {
2068 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
2069 new GestureEventConsumeDelegate());
2071 const int kWindowWidth
= 300;
2072 const int kWindowHeight
= 400;
2073 const int kTouchId1
= 3;
2074 const int kTouchId2
= 5;
2075 gfx::Rect
bounds(5, 5, kWindowWidth
, kWindowHeight
);
2076 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2077 delegate
.get(), -1234, bounds
, root_window()));
2080 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 301),
2081 kTouchId1
, tes
.Now());
2082 DispatchEventUsingWindowDispatcher(&press
);
2083 EXPECT_2_EVENTS(delegate
->events(),
2084 ui::ET_GESTURE_BEGIN
,
2085 ui::ET_GESTURE_TAP_DOWN
);
2086 EXPECT_TRUE(delegate
->bounding_box().IsEmpty());
2088 // Press the second finger far enough to break two finger tap.
2090 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(10, 10),
2091 kTouchId2
, tes
.Now());
2092 DispatchEventUsingWindowDispatcher(&press2
);
2093 EXPECT_2_EVENTS(delegate
->events(),
2094 ui::ET_GESTURE_TAP_CANCEL
,
2095 ui::ET_GESTURE_BEGIN
);
2096 EXPECT_EQ(gfx::Rect(10, 10, 91, 291).ToString(),
2097 delegate
->bounding_box().ToString());
2099 // Move the first finger.
2101 ui::TouchEvent
move3(ui::ET_TOUCH_MOVED
, gfx::Point(65, 201),
2102 kTouchId1
, tes
.Now());
2103 DispatchEventUsingWindowDispatcher(&move3
);
2104 EXPECT_3_EVENTS(delegate
->events(),
2105 ui::ET_GESTURE_SCROLL_BEGIN
,
2106 ui::ET_GESTURE_SCROLL_UPDATE
,
2107 ui::ET_GESTURE_PINCH_BEGIN
);
2108 EXPECT_EQ(gfx::Rect(10, 10, 55, 191).ToString(),
2109 delegate
->bounding_box().ToString());
2111 // Now move the second finger.
2113 ui::TouchEvent
move4(ui::ET_TOUCH_MOVED
, gfx::Point(55, 15),
2114 kTouchId2
, tes
.Now());
2115 DispatchEventUsingWindowDispatcher(&move4
);
2116 EXPECT_2_EVENTS(delegate
->events(),
2117 ui::ET_GESTURE_SCROLL_UPDATE
,
2118 ui::ET_GESTURE_PINCH_UPDATE
);
2119 EXPECT_EQ(gfx::Rect(55, 15, 10, 186).ToString(),
2120 delegate
->bounding_box().ToString());
2122 // Release the first finger. This should end pinch.
2124 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
2125 kTouchId1
, tes
.LeapForward(10));
2126 DispatchEventUsingWindowDispatcher(&release
);
2127 EXPECT_2_EVENTS(delegate
->events(),
2128 ui::ET_GESTURE_PINCH_END
,
2129 ui::ET_GESTURE_END
);
2130 EXPECT_EQ(gfx::Rect(55, 15, 46, 186).ToString(),
2131 delegate
->bounding_box().ToString());
2133 // Move the second finger. This should still generate a scroll.
2135 ui::TouchEvent
move5(ui::ET_TOUCH_MOVED
, gfx::Point(25, 10),
2136 kTouchId2
, tes
.Now());
2137 DispatchEventUsingWindowDispatcher(&move5
);
2138 EXPECT_1_EVENT(delegate
->events(), ui::ET_GESTURE_SCROLL_UPDATE
);
2139 EXPECT_TRUE(delegate
->bounding_box().IsEmpty());
2142 TEST_F(GestureRecognizerTest
, GestureEventIgnoresDisconnectedEvents
) {
2143 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
2144 new GestureEventConsumeDelegate());
2147 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
2149 DispatchEventUsingWindowDispatcher(&release1
);
2150 EXPECT_FALSE(delegate
->tap());
2151 EXPECT_FALSE(delegate
->tap_down());
2154 // Check that a touch is locked to the window of the closest current touch
2155 // within max_separation_for_gesture_touches_in_pixels
2156 TEST_F(GestureRecognizerTest
, GestureEventTouchLockSelectsCorrectWindow
) {
2157 ui::GestureRecognizer
* gesture_recognizer
= new ui::GestureRecognizerImpl();
2159 ScopedGestureRecognizerSetter
gr_setter(gesture_recognizer
);
2161 ui::GestureConsumer
* target
;
2162 const int kNumWindows
= 4;
2164 scoped_ptr
<GestureEventConsumeDelegate
*[]> delegates(
2165 new GestureEventConsumeDelegate
*[kNumWindows
]);
2167 ui::GestureConfiguration::GetInstance()
2168 ->set_max_separation_for_gesture_touches_in_pixels(499);
2170 scoped_ptr
<gfx::Rect
[]> window_bounds(new gfx::Rect
[kNumWindows
]);
2171 window_bounds
[0] = gfx::Rect(0, 0, 1, 1);
2172 window_bounds
[1] = gfx::Rect(500, 0, 1, 1);
2173 window_bounds
[2] = gfx::Rect(0, 500, 1, 1);
2174 window_bounds
[3] = gfx::Rect(500, 500, 1, 1);
2176 scoped_ptr
<aura::Window
*[]> windows(new aura::Window
*[kNumWindows
]);
2178 // Instantiate windows with |window_bounds| and touch each window at
2180 for (int i
= 0; i
< kNumWindows
; ++i
) {
2181 delegates
[i
] = new GestureEventConsumeDelegate();
2182 windows
[i
] = CreateTestWindowWithDelegate(
2183 delegates
[i
], i
, window_bounds
[i
], root_window());
2184 windows
[i
]->set_id(i
);
2185 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, window_bounds
[i
].origin(),
2187 DispatchEventUsingWindowDispatcher(&press
);
2190 // Touches should now be associated with the closest touch within
2191 // ui::GestureConfiguration::max_separation_for_gesture_touches_in_pixels
2192 target
= gesture_recognizer
->GetTargetForLocation(gfx::Point(11, 11), -1);
2193 EXPECT_EQ("0", WindowIDAsString(target
));
2194 target
= gesture_recognizer
->GetTargetForLocation(gfx::Point(511, 11), -1);
2195 EXPECT_EQ("1", WindowIDAsString(target
));
2196 target
= gesture_recognizer
->GetTargetForLocation(gfx::Point(11, 511), -1);
2197 EXPECT_EQ("2", WindowIDAsString(target
));
2198 target
= gesture_recognizer
->GetTargetForLocation(gfx::Point(511, 511), -1);
2199 EXPECT_EQ("3", WindowIDAsString(target
));
2201 // Add a touch in the middle associated with windows[2]
2202 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(0, 500),
2203 kNumWindows
, tes
.Now());
2204 DispatchEventUsingWindowDispatcher(&press
);
2205 ui::TouchEvent
move(ui::ET_TOUCH_MOVED
, gfx::Point(250, 250),
2206 kNumWindows
, tes
.Now());
2207 DispatchEventUsingWindowDispatcher(&move
);
2209 target
= gesture_recognizer
->GetTargetForLocation(gfx::Point(250, 250), -1);
2210 EXPECT_EQ("2", WindowIDAsString(target
));
2212 // Make sure that ties are broken by distance to a current touch
2213 // Closer to the point in the bottom right.
2214 target
= gesture_recognizer
->GetTargetForLocation(gfx::Point(380, 380), -1);
2215 EXPECT_EQ("3", WindowIDAsString(target
));
2217 // This touch is closer to the point in the middle
2218 target
= gesture_recognizer
->GetTargetForLocation(gfx::Point(300, 300), -1);
2219 EXPECT_EQ("2", WindowIDAsString(target
));
2221 // A touch too far from other touches won't be locked to anything
2222 target
= gesture_recognizer
->GetTargetForLocation(gfx::Point(1000, 1000), -1);
2223 EXPECT_TRUE(target
== NULL
);
2225 // Move a touch associated with windows[2] to 1000, 1000
2226 ui::TouchEvent
move2(ui::ET_TOUCH_MOVED
, gfx::Point(1000, 1000),
2227 kNumWindows
, tes
.Now());
2228 DispatchEventUsingWindowDispatcher(&move2
);
2230 target
= gesture_recognizer
->GetTargetForLocation(gfx::Point(1000, 1000), -1);
2231 EXPECT_EQ("2", WindowIDAsString(target
));
2233 for (int i
= 0; i
< kNumWindows
; ++i
) {
2234 // Delete windows before deleting delegates.
2236 delete delegates
[i
];
2240 // Check that a touch's target will not be effected by a touch on a different
2242 TEST_F(GestureRecognizerTest
, GestureEventTouchLockIgnoresOtherScreens
) {
2243 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
2244 new GestureEventConsumeDelegate());
2245 gfx::Rect
bounds(0, 0, 10, 10);
2246 scoped_ptr
<aura::Window
> window(
2247 CreateTestWindowWithDelegate(delegate
.get(), 0, bounds
, root_window()));
2249 const int kTouchId1
= 8;
2250 const int kTouchId2
= 2;
2253 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(5, 5),
2254 kTouchId1
, tes
.Now());
2255 ui::EventTestApi
test_press1(&press1
);
2256 test_press1
.set_source_device_id(1);
2257 DispatchEventUsingWindowDispatcher(&press1
);
2259 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(20, 20),
2260 kTouchId2
, tes
.Now());
2261 ui::EventTestApi
test_press2(&press2
);
2262 test_press2
.set_source_device_id(2);
2263 DispatchEventUsingWindowDispatcher(&press2
);
2265 // The second press should not have been locked to the same target as the
2266 // first, as they occured on different displays.
2268 ui::GestureRecognizer::Get()->GetTouchLockedTarget(press1
),
2269 ui::GestureRecognizer::Get()->GetTouchLockedTarget(press2
));
2272 // Check that touch events outside the root window are still handled
2273 // by the root window's gesture sequence.
2274 TEST_F(GestureRecognizerTest
, GestureEventOutsideRootWindowTap
) {
2276 scoped_ptr
<aura::Window
> window(CreateTestWindowWithBounds(
2277 gfx::Rect(-100, -100, 2000, 2000), root_window()));
2279 gfx::Point
pos1(-10, -10);
2280 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, pos1
, 0, tes
.Now());
2281 DispatchEventUsingWindowDispatcher(&press1
);
2283 gfx::Point
pos2(1000, 1000);
2284 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, pos2
, 1, tes
.Now());
2285 DispatchEventUsingWindowDispatcher(&press2
);
2287 // As these presses were outside the root window, they should be
2288 // associated with the root window.
2289 EXPECT_EQ(root_window(),
2290 static_cast<aura::Window
*>(
2291 ui::GestureRecognizer::Get()->GetTouchLockedTarget(press1
)));
2292 EXPECT_EQ(root_window(),
2293 static_cast<aura::Window
*>(
2294 ui::GestureRecognizer::Get()->GetTouchLockedTarget(press2
)));
2297 TEST_F(GestureRecognizerTest
, NoTapWithPreventDefaultedRelease
) {
2298 scoped_ptr
<QueueTouchEventDelegate
> delegate(
2299 new QueueTouchEventDelegate(host()->dispatcher()));
2301 const int kTouchId
= 2;
2302 gfx::Rect
bounds(100, 200, 100, 100);
2303 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2304 delegate
.get(), -1234, bounds
, root_window()));
2305 delegate
->set_window(window
.get());
2308 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
2309 kTouchId
, tes
.Now());
2310 DispatchEventUsingWindowDispatcher(&press
);
2311 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
2312 kTouchId
, tes
.LeapForward(50));
2313 DispatchEventUsingWindowDispatcher(&release
);
2316 delegate
->ReceivedAck();
2317 EXPECT_TRUE(delegate
->tap_down());
2319 delegate
->ReceivedAckPreventDefaulted();
2320 EXPECT_FALSE(delegate
->tap());
2321 EXPECT_TRUE(delegate
->tap_cancel());
2324 TEST_F(GestureRecognizerTest
, PinchScrollWithPreventDefaultedRelease
) {
2325 scoped_ptr
<QueueTouchEventDelegate
> delegate(
2326 new QueueTouchEventDelegate(host()->dispatcher()));
2328 const int kTouchId1
= 7;
2329 const int kTouchId2
= 5;
2330 gfx::Rect
bounds(10, 20, 100, 100);
2331 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2332 delegate
.get(), -1234, bounds
, root_window()));
2333 delegate
->set_window(window
.get());
2337 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(15, 25), kTouchId1
,
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 DispatchEventUsingWindowDispatcher(&press
);
2344 DispatchEventUsingWindowDispatcher(&move
);
2345 DispatchEventUsingWindowDispatcher(&release
);
2348 // Ack the press event.
2349 delegate
->ReceivedAck();
2351 delegate
->events(), ui::ET_GESTURE_BEGIN
, ui::ET_GESTURE_TAP_DOWN
);
2354 // Ack the move event.
2355 delegate
->ReceivedAck();
2356 EXPECT_3_EVENTS(delegate
->events(),
2357 ui::ET_GESTURE_TAP_CANCEL
,
2358 ui::ET_GESTURE_SCROLL_BEGIN
,
2359 ui::ET_GESTURE_SCROLL_UPDATE
);
2362 // Ack the release event. Although the release event has been processed, it
2363 // should still generate a scroll-end event.
2364 delegate
->ReceivedAckPreventDefaulted();
2366 delegate
->events(), ui::ET_GESTURE_SCROLL_END
, ui::ET_GESTURE_END
);
2369 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(15, 25), kTouchId1
,
2371 ui::TouchEvent
move(ui::ET_TOUCH_MOVED
, gfx::Point(20, 95), kTouchId1
,
2372 tes
.LeapForward(200));
2373 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(15, 25), kTouchId1
,
2374 tes
.LeapForward(50));
2375 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(55, 25), kTouchId2
,
2377 ui::TouchEvent
move2(ui::ET_TOUCH_MOVED
, gfx::Point(145, 85), kTouchId2
,
2378 tes
.LeapForward(1000));
2379 ui::TouchEvent
release2(ui::ET_TOUCH_RELEASED
, gfx::Point(145, 85), kTouchId2
,
2380 tes
.LeapForward(14));
2383 DispatchEventUsingWindowDispatcher(&press
);
2384 DispatchEventUsingWindowDispatcher(&move
);
2385 DispatchEventUsingWindowDispatcher(&press2
);
2386 DispatchEventUsingWindowDispatcher(&move2
);
2387 DispatchEventUsingWindowDispatcher(&release
);
2388 DispatchEventUsingWindowDispatcher(&release2
);
2390 // Ack the press and move events.
2392 delegate
->ReceivedAck();
2394 delegate
->events(), ui::ET_GESTURE_BEGIN
, ui::ET_GESTURE_TAP_DOWN
);
2397 delegate
->ReceivedAck();
2398 EXPECT_3_EVENTS(delegate
->events(),
2399 ui::ET_GESTURE_TAP_CANCEL
,
2400 ui::ET_GESTURE_SCROLL_BEGIN
,
2401 ui::ET_GESTURE_SCROLL_UPDATE
);
2404 delegate
->ReceivedAck();
2405 EXPECT_1_EVENT(delegate
->events(), ui::ET_GESTURE_BEGIN
);
2408 delegate
->ReceivedAck();
2409 EXPECT_2_EVENTS(delegate
->events(),
2410 ui::ET_GESTURE_SCROLL_UPDATE
,
2411 ui::ET_GESTURE_PINCH_BEGIN
);
2413 // Ack the first release. Although the release is processed, it should still
2414 // generate a pinch-end event.
2416 delegate
->ReceivedAckPreventDefaulted();
2418 delegate
->events(), ui::ET_GESTURE_PINCH_END
, ui::ET_GESTURE_END
);
2421 delegate
->ReceivedAckPreventDefaulted();
2423 delegate
->events(), ui::ET_GESTURE_SCROLL_END
, ui::ET_GESTURE_END
);
2426 TEST_F(GestureRecognizerTest
, GestureEndLocation
) {
2427 GestureEventConsumeDelegate delegate
;
2428 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2429 &delegate
, -1234, gfx::Rect(10, 10, 300, 300), root_window()));
2430 ui::test::EventGenerator
generator(root_window(), window
.get());
2431 const gfx::Point
begin(20, 20);
2432 const gfx::Point
end(150, 150);
2433 const gfx::Vector2d window_offset
=
2434 window
->bounds().origin().OffsetFromOrigin();
2435 generator
.GestureScrollSequence(begin
, end
,
2436 base::TimeDelta::FromMilliseconds(20),
2438 EXPECT_EQ((begin
- window_offset
).ToString(),
2439 delegate
.scroll_begin_position().ToString());
2440 EXPECT_EQ((end
- window_offset
).ToString(),
2441 delegate
.gesture_end_location().ToString());
2444 TEST_F(GestureRecognizerTest
, CaptureSendsGestureEnd
) {
2445 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
2446 new GestureEventConsumeDelegate());
2447 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2448 delegate
.get(), -1234, gfx::Rect(10, 10, 300, 300), root_window()));
2449 ui::test::EventGenerator
generator(root_window());
2451 generator
.MoveMouseRelativeTo(window
.get(), gfx::Point(10, 10));
2452 generator
.PressTouch();
2453 RunAllPendingInMessageLoop();
2455 EXPECT_TRUE(delegate
->tap_down());
2457 scoped_ptr
<aura::Window
> capture(CreateTestWindowWithBounds(
2458 gfx::Rect(10, 10, 200, 200), root_window()));
2459 capture
->SetCapture();
2460 RunAllPendingInMessageLoop();
2462 EXPECT_TRUE(delegate
->end());
2463 EXPECT_TRUE(delegate
->tap_cancel());
2466 // Check that previous touch actions that are completely finished (either
2467 // released or cancelled), do not receive extra synthetic cancels upon change of
2469 TEST_F(GestureRecognizerTest
, CaptureDoesNotCancelFinishedTouches
) {
2470 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
2471 new GestureEventConsumeDelegate());
2472 scoped_ptr
<TestEventHandler
> handler(new TestEventHandler
);
2473 root_window()->AddPreTargetHandler(handler
.get());
2475 // Create a window and set it as the capture window.
2476 scoped_ptr
<aura::Window
> window1(CreateTestWindowWithDelegate(delegate
.get(),
2477 -1234, gfx::Rect(10, 10, 300, 300), root_window()));
2478 window1
->SetCapture();
2480 ui::test::EventGenerator
generator(root_window());
2483 // Generate two touch-press events on the window.
2484 scoped_ptr
<ui::TouchEvent
> touch0(new ui::TouchEvent(ui::ET_TOUCH_PRESSED
,
2485 gfx::Point(20, 20), 0,
2487 scoped_ptr
<ui::TouchEvent
> touch1(new ui::TouchEvent(ui::ET_TOUCH_PRESSED
,
2488 gfx::Point(30, 30), 1,
2490 generator
.Dispatch(touch0
.get());
2491 generator
.Dispatch(touch1
.get());
2492 RunAllPendingInMessageLoop();
2493 EXPECT_EQ(2, handler
->touch_pressed_count());
2496 tes
.LeapForward(1000);
2498 // End the two touches, one by a touch-release and one by a touch-cancel; to
2499 // cover both cases.
2500 touch0
.reset(new ui::TouchEvent(ui::ET_TOUCH_RELEASED
, gfx::Point(20, 20), 0,
2502 touch1
.reset(new ui::TouchEvent(ui::ET_TOUCH_CANCELLED
, gfx::Point(30, 30), 1,
2504 generator
.Dispatch(touch0
.get());
2505 generator
.Dispatch(touch1
.get());
2506 RunAllPendingInMessageLoop();
2507 EXPECT_EQ(1, handler
->touch_released_count());
2508 EXPECT_EQ(1, handler
->touch_cancelled_count());
2510 // Create a new window and set it as the new capture window.
2511 scoped_ptr
<aura::Window
> window2(CreateTestWindowWithBounds(
2512 gfx::Rect(100, 100, 300, 300), root_window()));
2513 window2
->SetCapture();
2514 RunAllPendingInMessageLoop();
2515 // Check that setting capture does not generate any synthetic touch-cancels
2516 // for the two previously finished touch actions.
2517 EXPECT_EQ(1, handler
->touch_cancelled_count());
2519 root_window()->RemovePreTargetHandler(handler
.get());
2522 // Tests that a press with the same touch id as an existing touch is ignored.
2523 TEST_F(GestureRecognizerTest
, PressDoesNotCrash
) {
2524 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
2525 new GestureEventConsumeDelegate());
2528 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2529 delegate
.get(), -1234, gfx::Rect(10, 10, 300, 300), root_window()));
2531 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(45, 45), 7, tes
.Now());
2532 press
.set_radius_x(40);
2533 DispatchEventUsingWindowDispatcher(&press
);
2534 EXPECT_TRUE(delegate
->tap_down());
2535 EXPECT_EQ(gfx::Rect(5, 5, 80, 80).ToString(),
2536 delegate
->bounding_box().ToString());
2539 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(55, 45), 7, tes
.Now());
2540 DispatchEventUsingWindowDispatcher(&press2
);
2542 // FIXME(tdresser): this should not generate a tap down; however,
2543 // there is at least one case where we need to allow a touch press
2544 // from a currently used touch id. See crbug.com/373125 for details.
2545 EXPECT_TRUE(delegate
->begin());
2546 EXPECT_TRUE(delegate
->tap_down());
2547 EXPECT_TRUE(delegate
->tap_cancel());
2548 EXPECT_FALSE(delegate
->scroll_begin());
2551 TEST_F(GestureRecognizerTest
, TwoFingerTap
) {
2552 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
2553 new GestureEventConsumeDelegate());
2554 const int kWindowWidth
= 123;
2555 const int kWindowHeight
= 45;
2556 const int kTouchId1
= 2;
2557 const int kTouchId2
= 3;
2558 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
2559 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2560 delegate
.get(), -1234, bounds
, root_window()));
2564 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
2565 kTouchId1
, tes
.Now());
2566 DispatchEventUsingWindowDispatcher(&press1
);
2568 delegate
->events(), ui::ET_GESTURE_BEGIN
, ui::ET_GESTURE_TAP_DOWN
);
2571 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(130, 201),
2572 kTouchId2
, tes
.Now());
2573 DispatchEventUsingWindowDispatcher(&press2
);
2575 delegate
->events(), ui::ET_GESTURE_TAP_CANCEL
, ui::ET_GESTURE_BEGIN
);
2577 // Little bit of touch move should not affect our state.
2579 ui::TouchEvent
move1(ui::ET_TOUCH_MOVED
, gfx::Point(102, 202),
2580 kTouchId1
, tes
.Now());
2581 DispatchEventUsingWindowDispatcher(&move1
);
2582 ui::TouchEvent
move2(ui::ET_TOUCH_MOVED
, gfx::Point(131, 202),
2583 kTouchId2
, tes
.Now());
2584 DispatchEventUsingWindowDispatcher(&move2
);
2585 EXPECT_3_EVENTS(delegate
->events(), ui::ET_GESTURE_SCROLL_BEGIN
,
2586 ui::ET_GESTURE_SCROLL_UPDATE
, ui::ET_GESTURE_SCROLL_UPDATE
);
2588 // Make sure there is enough delay before the touch is released so that it is
2589 // recognized as a tap.
2591 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
2592 kTouchId1
, tes
.LeapForward(50));
2594 DispatchEventUsingWindowDispatcher(&release1
);
2596 delegate
->events(), ui::ET_GESTURE_TWO_FINGER_TAP
, ui::ET_GESTURE_END
);
2598 // Lift second finger.
2599 // Make sure there is enough delay before the touch is released so that it is
2600 // recognized as a tap.
2602 ui::TouchEvent
release2(ui::ET_TOUCH_RELEASED
, gfx::Point(130, 201),
2603 kTouchId2
, tes
.LeapForward(50));
2605 DispatchEventUsingWindowDispatcher(&release2
);
2607 delegate
->events(), ui::ET_GESTURE_SCROLL_END
, ui::ET_GESTURE_END
);
2610 TEST_F(GestureRecognizerTest
, TwoFingerTapExpired
) {
2611 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
2612 new GestureEventConsumeDelegate());
2613 const int kWindowWidth
= 123;
2614 const int kWindowHeight
= 45;
2615 const int kTouchId1
= 2;
2616 const int kTouchId2
= 3;
2617 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
2618 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2619 delegate
.get(), -1234, bounds
, root_window()));
2623 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
2624 kTouchId1
, tes
.Now());
2625 DispatchEventUsingWindowDispatcher(&press1
);
2628 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(130, 201),
2629 kTouchId2
, tes
.Now());
2630 DispatchEventUsingWindowDispatcher(&press2
);
2632 // Send release event after sufficient delay so that two finger time expires.
2634 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
2635 kTouchId1
, tes
.LeapForward(1000));
2637 DispatchEventUsingWindowDispatcher(&release1
);
2638 EXPECT_FALSE(delegate
->two_finger_tap());
2640 // Lift second finger.
2641 // Make sure there is enough delay before the touch is released so that it is
2642 // recognized as a tap.
2644 ui::TouchEvent
release2(ui::ET_TOUCH_RELEASED
, gfx::Point(130, 201),
2645 kTouchId2
, tes
.LeapForward(50));
2647 DispatchEventUsingWindowDispatcher(&release2
);
2648 EXPECT_FALSE(delegate
->two_finger_tap());
2651 TEST_F(GestureRecognizerTest
, TwoFingerTapChangesToPinch
) {
2652 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
2653 new GestureEventConsumeDelegate());
2654 const int kWindowWidth
= 123;
2655 const int kWindowHeight
= 45;
2656 const int kTouchId1
= 2;
2657 const int kTouchId2
= 3;
2660 // Test moving first finger
2662 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
2663 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2664 delegate
.get(), -1234, bounds
, root_window()));
2667 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
2668 kTouchId1
, tes
.Now());
2669 DispatchEventUsingWindowDispatcher(&press1
);
2672 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(130, 201),
2673 kTouchId2
, tes
.Now());
2674 DispatchEventUsingWindowDispatcher(&press2
);
2676 tes
.SendScrollEvent(event_processor(), 230, 330, kTouchId1
, delegate
.get());
2677 EXPECT_FALSE(delegate
->two_finger_tap());
2678 EXPECT_TRUE(delegate
->pinch_begin());
2680 // Make sure there is enough delay before the touch is released so that it
2681 // is recognized as a tap.
2683 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
2684 kTouchId2
, tes
.LeapForward(50));
2686 DispatchEventUsingWindowDispatcher(&release
);
2687 EXPECT_FALSE(delegate
->two_finger_tap());
2688 EXPECT_TRUE(delegate
->pinch_end());
2691 // Test moving second finger
2693 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
2694 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2695 delegate
.get(), -1234, bounds
, root_window()));
2698 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
2699 kTouchId1
, tes
.Now());
2700 DispatchEventUsingWindowDispatcher(&press1
);
2703 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(130, 201),
2704 kTouchId2
, tes
.Now());
2705 DispatchEventUsingWindowDispatcher(&press2
);
2707 tes
.SendScrollEvent(event_processor(), 301, 230, kTouchId2
, delegate
.get());
2708 EXPECT_FALSE(delegate
->two_finger_tap());
2709 EXPECT_TRUE(delegate
->pinch_begin());
2711 // Make sure there is enough delay before the touch is released so that it
2712 // is recognized as a tap.
2714 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
2715 kTouchId1
, tes
.LeapForward(50));
2717 DispatchEventUsingWindowDispatcher(&release
);
2718 EXPECT_FALSE(delegate
->two_finger_tap());
2719 EXPECT_TRUE(delegate
->pinch_end());
2723 TEST_F(GestureRecognizerTest
, NoTwoFingerTapWhenFirstFingerHasScrolled
) {
2724 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
2725 new GestureEventConsumeDelegate());
2726 const int kWindowWidth
= 123;
2727 const int kWindowHeight
= 45;
2728 const int kTouchId1
= 2;
2729 const int kTouchId2
= 3;
2732 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
2733 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2734 delegate
.get(), -1234, bounds
, root_window()));
2737 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
2738 kTouchId1
, tes
.Now());
2739 DispatchEventUsingWindowDispatcher(&press1
);
2740 tes
.SendScrollEvent(event_processor(), 130, 230, kTouchId1
, delegate
.get());
2743 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(130, 201),
2744 kTouchId2
, tes
.Now());
2745 DispatchEventUsingWindowDispatcher(&press2
);
2747 EXPECT_FALSE(delegate
->pinch_begin());
2749 // Make sure there is enough delay before the touch is released so that it
2750 // is recognized as a tap.
2752 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
2753 kTouchId2
, tes
.LeapForward(50));
2755 DispatchEventUsingWindowDispatcher(&release
);
2756 EXPECT_FALSE(delegate
->two_finger_tap());
2757 EXPECT_FALSE(delegate
->pinch_end());
2760 TEST_F(GestureRecognizerTest
, MultiFingerSwipe
) {
2761 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
2762 new GestureEventConsumeDelegate());
2763 const int kWindowWidth
= 123;
2764 const int kWindowHeight
= 45;
2766 gfx::Rect
bounds(5, 10, kWindowWidth
, kWindowHeight
);
2767 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2768 delegate
.get(), -1234, bounds
, root_window()));
2770 const int kSteps
= 15;
2771 const int kTouchPoints
= 4;
2772 gfx::Point points
[kTouchPoints
] = {
2779 ui::test::EventGenerator
generator(root_window(), window
.get());
2781 // The unified gesture recognizer assumes a finger has stopped if it hasn't
2782 // moved for too long. See ui/events/gesture_detection/velocity_tracker.cc's
2783 // kAssumePointerStoppedTimeMs.
2784 for (int count
= 2; count
<= kTouchPoints
; ++count
) {
2785 generator
.GestureMultiFingerScroll(
2786 count
, points
, 10, kSteps
, 0, -11 * kSteps
);
2787 EXPECT_TRUE(delegate
->swipe_up());
2790 generator
.GestureMultiFingerScroll(
2791 count
, points
, 10, kSteps
, 0, 11 * kSteps
);
2792 EXPECT_TRUE(delegate
->swipe_down());
2795 generator
.GestureMultiFingerScroll(
2796 count
, points
, 10, kSteps
, -11 * kSteps
, 0);
2797 EXPECT_TRUE(delegate
->swipe_left());
2800 generator
.GestureMultiFingerScroll(
2801 count
, points
, 10, kSteps
, 11 * kSteps
, 0);
2802 EXPECT_TRUE(delegate
->swipe_right());
2805 generator
.GestureMultiFingerScroll(
2806 count
, points
, 10, kSteps
, 5 * kSteps
, 12 * kSteps
);
2807 EXPECT_FALSE(delegate
->swipe_down());
2810 generator
.GestureMultiFingerScroll(
2811 count
, points
, 10, kSteps
, 4 * kSteps
, 12 * kSteps
);
2812 EXPECT_TRUE(delegate
->swipe_down());
2815 generator
.GestureMultiFingerScroll(
2816 count
, points
, 10, kSteps
, 3 * kSteps
, 12 * kSteps
);
2817 EXPECT_TRUE(delegate
->swipe_down());
2822 TEST_F(GestureRecognizerTest
, TwoFingerTapCancelled
) {
2823 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
2824 new GestureEventConsumeDelegate());
2825 const int kWindowWidth
= 123;
2826 const int kWindowHeight
= 45;
2827 const int kTouchId1
= 2;
2828 const int kTouchId2
= 3;
2831 // Test canceling first finger.
2833 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
2834 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2835 delegate
.get(), -1234, bounds
, root_window()));
2838 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
2839 kTouchId1
, tes
.Now());
2840 DispatchEventUsingWindowDispatcher(&press1
);
2843 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(130, 201),
2844 kTouchId2
, tes
.Now());
2845 DispatchEventUsingWindowDispatcher(&press2
);
2848 ui::TouchEvent
cancel(ui::ET_TOUCH_CANCELLED
, gfx::Point(130, 201),
2849 kTouchId1
, tes
.Now());
2850 DispatchEventUsingWindowDispatcher(&cancel
);
2851 EXPECT_FALSE(delegate
->two_finger_tap());
2853 // Make sure there is enough delay before the touch is released so that it
2854 // is recognized as a tap.
2856 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
2857 kTouchId2
, tes
.LeapForward(50));
2859 DispatchEventUsingWindowDispatcher(&release
);
2860 EXPECT_FALSE(delegate
->two_finger_tap());
2863 // Test canceling second finger
2865 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
2866 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2867 delegate
.get(), -1234, bounds
, root_window()));
2870 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
2871 kTouchId1
, tes
.Now());
2872 DispatchEventUsingWindowDispatcher(&press1
);
2875 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(130, 201),
2876 kTouchId2
, tes
.Now());
2877 DispatchEventUsingWindowDispatcher(&press2
);
2880 ui::TouchEvent
cancel(ui::ET_TOUCH_CANCELLED
, gfx::Point(130, 201),
2881 kTouchId2
, tes
.Now());
2882 DispatchEventUsingWindowDispatcher(&cancel
);
2883 EXPECT_FALSE(delegate
->two_finger_tap());
2885 // Make sure there is enough delay before the touch is released so that it
2886 // is recognized as a tap.
2888 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
2889 kTouchId1
, tes
.LeapForward(50));
2891 DispatchEventUsingWindowDispatcher(&release
);
2892 EXPECT_FALSE(delegate
->two_finger_tap());
2896 TEST_F(GestureRecognizerTest
, VeryWideTwoFingerTouchDownShouldBeAPinch
) {
2897 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
2898 new GestureEventConsumeDelegate());
2899 const int kWindowWidth
= 523;
2900 const int kWindowHeight
= 45;
2901 const int kTouchId1
= 2;
2902 const int kTouchId2
= 3;
2903 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
2904 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2905 delegate
.get(), -1234, bounds
, root_window()));
2909 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
2910 kTouchId1
, tes
.Now());
2911 DispatchEventUsingWindowDispatcher(&press1
);
2912 EXPECT_FALSE(delegate
->tap());
2913 EXPECT_TRUE(delegate
->tap_down());
2914 EXPECT_FALSE(delegate
->tap_cancel());
2915 EXPECT_FALSE(delegate
->scroll_begin());
2916 EXPECT_FALSE(delegate
->scroll_update());
2917 EXPECT_FALSE(delegate
->scroll_end());
2918 EXPECT_FALSE(delegate
->long_press());
2919 EXPECT_FALSE(delegate
->two_finger_tap());
2922 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(430, 201),
2923 kTouchId2
, tes
.Now());
2924 DispatchEventUsingWindowDispatcher(&press2
);
2925 EXPECT_FALSE(delegate
->tap());
2926 EXPECT_FALSE(delegate
->tap_down()); // no touch down for second tap.
2927 EXPECT_TRUE(delegate
->tap_cancel());
2928 EXPECT_FALSE(delegate
->scroll_begin());
2929 EXPECT_FALSE(delegate
->scroll_update());
2930 EXPECT_FALSE(delegate
->scroll_end());
2931 EXPECT_FALSE(delegate
->long_press());
2932 EXPECT_FALSE(delegate
->two_finger_tap());
2933 EXPECT_FALSE(delegate
->pinch_begin());
2936 ui::TouchEvent
move2(ui::ET_TOUCH_MOVED
, gfx::Point(530, 301),
2937 kTouchId2
, tes
.Now());
2938 DispatchEventUsingWindowDispatcher(&move2
);
2939 EXPECT_FALSE(delegate
->tap());
2940 EXPECT_FALSE(delegate
->tap_down());
2941 EXPECT_FALSE(delegate
->tap_cancel());
2942 // Pinch & Scroll only when there is enough movement.
2943 EXPECT_TRUE(delegate
->scroll_begin());
2944 EXPECT_TRUE(delegate
->scroll_update());
2945 EXPECT_FALSE(delegate
->scroll_end());
2946 EXPECT_FALSE(delegate
->long_press());
2947 EXPECT_FALSE(delegate
->two_finger_tap());
2948 EXPECT_TRUE(delegate
->pinch_begin());
2951 // Verifies if a window is the target of multiple touch-ids and we hide the
2952 // window everything is cleaned up correctly.
2953 TEST_F(GestureRecognizerTest
, FlushAllOnHide
) {
2954 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
2955 new GestureEventConsumeDelegate());
2956 gfx::Rect
bounds(0, 0, 200, 200);
2957 scoped_ptr
<aura::Window
> window(
2958 CreateTestWindowWithDelegate(delegate
.get(), 0, bounds
, root_window()));
2959 const int kTouchId1
= 8;
2960 const int kTouchId2
= 2;
2963 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(10, 10),
2964 kTouchId1
, tes
.Now());
2965 DispatchEventUsingWindowDispatcher(&press1
);
2966 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(20, 20),
2967 kTouchId2
, tes
.Now());
2968 DispatchEventUsingWindowDispatcher(&press2
);
2971 ui::GestureRecognizer::Get()->GetTouchLockedTarget(press1
));
2973 ui::GestureRecognizer::Get()->GetTouchLockedTarget(press2
));
2976 TEST_F(GestureRecognizerTest
, LongPressTimerStopsOnPreventDefaultedTouchMoves
) {
2977 scoped_ptr
<QueueTouchEventDelegate
> delegate(
2978 new QueueTouchEventDelegate(host()->dispatcher()));
2979 const int kTouchId
= 2;
2980 gfx::Rect
bounds(100, 200, 100, 100);
2981 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
2982 delegate
.get(), -1234, bounds
, root_window()));
2983 delegate
->set_window(window
.get());
2987 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
2988 kTouchId
, tes
.Now());
2989 DispatchEventUsingWindowDispatcher(&press
);
2990 // Scroll around, to cancel the long press
2991 tes
.SendScrollEvent(event_processor(), 130, 230, kTouchId
, delegate
.get());
2994 delegate
->ReceivedAck();
2995 EXPECT_TRUE(delegate
->tap_down());
2997 // Wait long enough that long press would have fired if the touchmove hadn't
2999 DelayByLongPressTimeout();
3002 delegate
->ReceivedAckPreventDefaulted();
3003 EXPECT_FALSE(delegate
->long_press());
3006 // Same as GestureEventConsumeDelegate, but consumes all the touch-move events.
3007 class ConsumesTouchMovesDelegate
: public GestureEventConsumeDelegate
{
3009 ConsumesTouchMovesDelegate() : consume_touch_move_(true) {}
3010 ~ConsumesTouchMovesDelegate() override
{}
3012 void set_consume_touch_move(bool consume
) { consume_touch_move_
= consume
; }
3015 void OnTouchEvent(ui::TouchEvent
* touch
) override
{
3016 if (consume_touch_move_
&& touch
->type() == ui::ET_TOUCH_MOVED
)
3017 touch
->SetHandled();
3019 GestureEventConsumeDelegate::OnTouchEvent(touch
);
3022 bool consume_touch_move_
;
3024 DISALLOW_COPY_AND_ASSIGN(ConsumesTouchMovesDelegate
);
3027 // Same as GestureEventScroll, but tests that the behavior is the same
3028 // even if all the touch-move events are consumed.
3029 TEST_F(GestureRecognizerTest
, GestureEventScrollTouchMoveConsumed
) {
3030 scoped_ptr
<ConsumesTouchMovesDelegate
> delegate(
3031 new ConsumesTouchMovesDelegate());
3032 const int kWindowWidth
= 123;
3033 const int kWindowHeight
= 45;
3034 const int kTouchId
= 5;
3035 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
3036 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3037 delegate
.get(), -1234, bounds
, root_window()));
3041 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
3042 kTouchId
, tes
.Now());
3043 DispatchEventUsingWindowDispatcher(&press
);
3044 EXPECT_FALSE(delegate
->tap());
3045 EXPECT_TRUE(delegate
->tap_down());
3046 EXPECT_FALSE(delegate
->tap_cancel());
3047 EXPECT_TRUE(delegate
->begin());
3048 EXPECT_FALSE(delegate
->scroll_begin());
3049 EXPECT_FALSE(delegate
->scroll_update());
3050 EXPECT_FALSE(delegate
->scroll_end());
3052 // Move the touch-point enough so that it would normally be considered a
3053 // scroll. But since the touch-moves will be consumed, the scroll should not
3055 tes
.SendScrollEvent(event_processor(), 130, 230, kTouchId
, delegate
.get());
3056 EXPECT_FALSE(delegate
->tap());
3057 EXPECT_FALSE(delegate
->tap_down());
3058 EXPECT_TRUE(delegate
->tap_cancel());
3059 EXPECT_FALSE(delegate
->begin());
3060 EXPECT_FALSE(delegate
->scroll_update());
3061 EXPECT_FALSE(delegate
->scroll_end());
3063 EXPECT_TRUE(delegate
->scroll_begin());
3065 // Release the touch back at the start point. This should end without causing
3068 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(130, 230),
3069 kTouchId
, tes
.LeapForward(50));
3070 DispatchEventUsingWindowDispatcher(&release
);
3071 EXPECT_FALSE(delegate
->tap());
3072 EXPECT_FALSE(delegate
->tap_down());
3073 EXPECT_FALSE(delegate
->tap_cancel());
3074 EXPECT_FALSE(delegate
->begin());
3075 EXPECT_TRUE(delegate
->end());
3076 EXPECT_FALSE(delegate
->scroll_begin());
3077 EXPECT_FALSE(delegate
->scroll_update());
3079 EXPECT_TRUE(delegate
->scroll_end());
3082 // Tests the behavior of 2F scroll when some of the touch-move events are
3084 TEST_F(GestureRecognizerTest
, GestureEventScrollTwoFingerTouchMoveConsumed
) {
3085 scoped_ptr
<ConsumesTouchMovesDelegate
> delegate(
3086 new ConsumesTouchMovesDelegate());
3087 const int kWindowWidth
= 123;
3088 const int kWindowHeight
= 100;
3089 const int kTouchId1
= 2;
3090 const int kTouchId2
= 3;
3093 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
3094 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3095 delegate
.get(), -1234, bounds
, root_window()));
3098 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
3099 kTouchId1
, tes
.Now());
3100 DispatchEventUsingWindowDispatcher(&press1
);
3101 tes
.SendScrollEvent(event_processor(), 131, 231, kTouchId1
, delegate
.get());
3103 EXPECT_2_EVENTS(delegate
->events(),
3104 ui::ET_GESTURE_TAP_CANCEL
,
3105 ui::ET_GESTURE_SCROLL_BEGIN
);
3108 // Second finger touches down and moves.
3109 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(130, 201),
3110 kTouchId2
, tes
.LeapForward(50));
3111 DispatchEventUsingWindowDispatcher(&press2
);
3112 tes
.SendScrollEvent(event_processor(), 161, 231, kTouchId2
, delegate
.get());
3113 EXPECT_0_EVENTS(delegate
->events());
3116 // Move first finger again, no PinchUpdate & ScrollUpdate.
3117 tes
.SendScrollEvent(event_processor(), 161, 261, kTouchId1
, delegate
.get());
3118 EXPECT_0_EVENTS(delegate
->events());
3120 // Stops consuming touch-move.
3121 delegate
->set_consume_touch_move(false);
3124 // Making a pinch gesture.
3125 tes
.SendScrollEvent(event_processor(), 161, 260, kTouchId1
, delegate
.get());
3126 EXPECT_1_EVENT(delegate
->events(), ui::ET_GESTURE_SCROLL_UPDATE
);
3129 tes
.SendScrollEvent(event_processor(), 161, 261, kTouchId2
, delegate
.get());
3130 EXPECT_1_EVENT(delegate
->events(), ui::ET_GESTURE_SCROLL_UPDATE
);
3133 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
3134 kTouchId1
, tes
.Now());
3135 ui::TouchEvent
release2(ui::ET_TOUCH_RELEASED
, gfx::Point(130, 201),
3136 kTouchId2
, tes
.Now());
3137 DispatchEventUsingWindowDispatcher(&release1
);
3138 DispatchEventUsingWindowDispatcher(&release2
);
3140 EXPECT_3_EVENTS(delegate
->events(),
3142 ui::ET_SCROLL_FLING_START
,
3143 ui::ET_GESTURE_END
);
3146 // Like as GestureEventTouchMoveConsumed but tests the different behavior
3147 // depending on whether the events were consumed before or after the scroll
3149 TEST_F(GestureRecognizerTest
, GestureEventScrollTouchMovePartialConsumed
) {
3150 scoped_ptr
<ConsumesTouchMovesDelegate
> delegate(
3151 new ConsumesTouchMovesDelegate());
3152 const int kWindowWidth
= 123;
3153 const int kWindowHeight
= 45;
3154 const int kTouchId
= 5;
3155 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
3156 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3157 delegate
.get(), -1234, bounds
, root_window()));
3161 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
3162 kTouchId
, tes
.Now());
3163 DispatchEventUsingWindowDispatcher(&press
);
3164 EXPECT_FALSE(delegate
->tap());
3165 EXPECT_TRUE(delegate
->tap_down());
3166 EXPECT_FALSE(delegate
->tap_cancel());
3167 EXPECT_TRUE(delegate
->begin());
3168 EXPECT_FALSE(delegate
->scroll_begin());
3169 EXPECT_FALSE(delegate
->scroll_update());
3170 EXPECT_FALSE(delegate
->scroll_end());
3172 // Move the touch-point enough so that it would normally be considered a
3173 // scroll. But since the touch-moves will be consumed, the scroll should not
3175 tes
.SendScrollEvent(event_processor(), 130, 230, kTouchId
, delegate
.get());
3176 EXPECT_FALSE(delegate
->tap());
3177 EXPECT_FALSE(delegate
->tap_down());
3178 EXPECT_TRUE(delegate
->tap_cancel());
3179 EXPECT_FALSE(delegate
->begin());
3180 EXPECT_FALSE(delegate
->scroll_update());
3181 EXPECT_FALSE(delegate
->scroll_end());
3183 // Consuming the first touch move event won't prevent all future scrolling.
3184 EXPECT_TRUE(delegate
->scroll_begin());
3186 // Now, stop consuming touch-move events, and move the touch-point again.
3187 delegate
->set_consume_touch_move(false);
3188 tes
.SendScrollEvent(event_processor(), 159, 259, kTouchId
, delegate
.get());
3189 EXPECT_FALSE(delegate
->tap());
3190 EXPECT_FALSE(delegate
->tap_down());
3191 EXPECT_FALSE(delegate
->tap_cancel());
3192 EXPECT_FALSE(delegate
->begin());
3193 EXPECT_FALSE(delegate
->scroll_begin());
3194 EXPECT_FALSE(delegate
->scroll_end());
3196 // Scroll not prevented by consumed first touch move.
3197 EXPECT_TRUE(delegate
->scroll_update());
3198 EXPECT_EQ(29, delegate
->scroll_x());
3199 EXPECT_EQ(29, delegate
->scroll_y());
3200 EXPECT_EQ(gfx::Point(0, 0).ToString(),
3201 delegate
->scroll_begin_position().ToString());
3203 // Start consuming touch-move events again.
3204 delegate
->set_consume_touch_move(true);
3206 // Move some more to generate a few more scroll updates.
3207 tes
.SendScrollEvent(event_processor(), 110, 211, kTouchId
, delegate
.get());
3208 EXPECT_FALSE(delegate
->tap());
3209 EXPECT_FALSE(delegate
->tap_down());
3210 EXPECT_FALSE(delegate
->tap_cancel());
3211 EXPECT_FALSE(delegate
->begin());
3212 EXPECT_FALSE(delegate
->scroll_begin());
3213 EXPECT_FALSE(delegate
->scroll_update());
3214 EXPECT_FALSE(delegate
->scroll_end());
3215 EXPECT_EQ(0, delegate
->scroll_x());
3216 EXPECT_EQ(0, delegate
->scroll_y());
3218 tes
.SendScrollEvent(event_processor(), 140, 215, kTouchId
, delegate
.get());
3219 EXPECT_FALSE(delegate
->tap());
3220 EXPECT_FALSE(delegate
->tap_down());
3221 EXPECT_FALSE(delegate
->tap_cancel());
3222 EXPECT_FALSE(delegate
->begin());
3223 EXPECT_FALSE(delegate
->scroll_begin());
3224 EXPECT_FALSE(delegate
->scroll_update());
3225 EXPECT_FALSE(delegate
->scroll_end());
3226 EXPECT_EQ(0, delegate
->scroll_x());
3227 EXPECT_EQ(0, delegate
->scroll_y());
3229 // Release the touch.
3231 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
3232 kTouchId
, tes
.LeapForward(50));
3233 DispatchEventUsingWindowDispatcher(&release
);
3234 EXPECT_FALSE(delegate
->tap());
3235 EXPECT_FALSE(delegate
->tap_down());
3236 EXPECT_FALSE(delegate
->tap_cancel());
3237 EXPECT_FALSE(delegate
->begin());
3238 EXPECT_TRUE(delegate
->end());
3239 EXPECT_FALSE(delegate
->scroll_begin());
3240 EXPECT_FALSE(delegate
->scroll_update());
3241 EXPECT_FALSE(delegate
->fling());
3243 EXPECT_TRUE(delegate
->scroll_end());
3246 // Check that appropriate touch events generate double tap gesture events.
3247 TEST_F(GestureRecognizerTest
, GestureEventDoubleTap
) {
3248 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
3249 new GestureEventConsumeDelegate());
3250 const int kWindowWidth
= 123;
3251 const int kWindowHeight
= 45;
3252 const int kTouchId
= 2;
3253 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
3254 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3255 delegate
.get(), -1234, bounds
, root_window()));
3258 // First tap (tested in GestureEventTap)
3259 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(104, 201),
3260 kTouchId
, tes
.Now());
3261 DispatchEventUsingWindowDispatcher(&press1
);
3262 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
, gfx::Point(104, 201),
3263 kTouchId
, tes
.LeapForward(50));
3264 DispatchEventUsingWindowDispatcher(&release1
);
3268 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 203),
3269 kTouchId
, tes
.LeapForward(200));
3270 DispatchEventUsingWindowDispatcher(&press2
);
3271 ui::TouchEvent
release2(ui::ET_TOUCH_RELEASED
, gfx::Point(102, 206),
3272 kTouchId
, tes
.LeapForward(50));
3273 DispatchEventUsingWindowDispatcher(&release2
);
3275 EXPECT_TRUE(delegate
->tap());
3276 EXPECT_TRUE(delegate
->tap_down());
3277 EXPECT_FALSE(delegate
->tap_cancel());
3278 EXPECT_TRUE(delegate
->begin());
3279 EXPECT_TRUE(delegate
->end());
3280 EXPECT_FALSE(delegate
->scroll_begin());
3281 EXPECT_FALSE(delegate
->scroll_update());
3282 EXPECT_FALSE(delegate
->scroll_end());
3284 EXPECT_EQ(2, delegate
->tap_count());
3287 // Check that appropriate touch events generate triple tap gesture events.
3288 TEST_F(GestureRecognizerTest
, GestureEventTripleTap
) {
3289 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
3290 new GestureEventConsumeDelegate());
3291 const int kWindowWidth
= 123;
3292 const int kWindowHeight
= 45;
3293 const int kTouchId
= 2;
3294 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
3295 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3296 delegate
.get(), -1234, bounds
, root_window()));
3299 // First tap (tested in GestureEventTap)
3300 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(104, 201),
3301 kTouchId
, tes
.Now());
3302 DispatchEventUsingWindowDispatcher(&press1
);
3303 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
, gfx::Point(104, 201),
3304 kTouchId
, tes
.LeapForward(50));
3305 DispatchEventUsingWindowDispatcher(&release1
);
3307 EXPECT_EQ(1, delegate
->tap_count());
3310 // Second tap (tested in GestureEventDoubleTap)
3311 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 203),
3312 kTouchId
, tes
.LeapForward(200));
3313 DispatchEventUsingWindowDispatcher(&press2
);
3314 ui::TouchEvent
release2(ui::ET_TOUCH_RELEASED
, gfx::Point(102, 206),
3315 kTouchId
, tes
.LeapForward(50));
3316 DispatchEventUsingWindowDispatcher(&release2
);
3318 EXPECT_EQ(2, delegate
->tap_count());
3322 ui::TouchEvent
press3(ui::ET_TOUCH_PRESSED
, gfx::Point(102, 206),
3323 kTouchId
, tes
.LeapForward(200));
3324 DispatchEventUsingWindowDispatcher(&press3
);
3325 ui::TouchEvent
release3(ui::ET_TOUCH_RELEASED
, gfx::Point(102, 206),
3326 kTouchId
, tes
.LeapForward(50));
3327 DispatchEventUsingWindowDispatcher(&release3
);
3329 // Third, Fourth and Fifth Taps. Taps after the third should have their
3330 // |tap_count| wrap around back to 1.
3331 for (int i
= 3; i
< 5; ++i
) {
3332 ui::TouchEvent
press3(ui::ET_TOUCH_PRESSED
,
3333 gfx::Point(102, 206),
3335 tes
.LeapForward(200));
3336 DispatchEventUsingWindowDispatcher(&press3
);
3337 ui::TouchEvent
release3(ui::ET_TOUCH_RELEASED
,
3338 gfx::Point(102, 206),
3340 tes
.LeapForward(50));
3341 DispatchEventUsingWindowDispatcher(&release3
);
3343 EXPECT_TRUE(delegate
->tap());
3344 EXPECT_TRUE(delegate
->tap_down());
3345 EXPECT_FALSE(delegate
->tap_cancel());
3346 EXPECT_TRUE(delegate
->begin());
3347 EXPECT_TRUE(delegate
->end());
3348 EXPECT_FALSE(delegate
->scroll_begin());
3349 EXPECT_FALSE(delegate
->scroll_update());
3350 EXPECT_FALSE(delegate
->scroll_end());
3351 EXPECT_EQ(1 + (i
% 3), delegate
->tap_count());
3355 // Check that we don't get a double tap when the two taps are far apart.
3356 TEST_F(GestureRecognizerTest
, TwoTapsFarApart
) {
3357 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
3358 new GestureEventConsumeDelegate());
3359 const int kWindowWidth
= 123;
3360 const int kWindowHeight
= 45;
3361 const int kTouchId
= 2;
3362 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
3363 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3364 delegate
.get(), -1234, bounds
, root_window()));
3367 // First tap (tested in GestureEventTap)
3368 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
3369 kTouchId
, tes
.Now());
3370 DispatchEventUsingWindowDispatcher(&press1
);
3371 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
3372 kTouchId
, tes
.LeapForward(50));
3373 DispatchEventUsingWindowDispatcher(&release1
);
3376 // Second tap, close in time but far in distance
3377 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(201, 201),
3378 kTouchId
, tes
.LeapForward(200));
3379 DispatchEventUsingWindowDispatcher(&press2
);
3380 ui::TouchEvent
release2(ui::ET_TOUCH_RELEASED
, gfx::Point(201, 201),
3381 kTouchId
, tes
.LeapForward(50));
3382 DispatchEventUsingWindowDispatcher(&release2
);
3384 EXPECT_TRUE(delegate
->tap());
3385 EXPECT_TRUE(delegate
->tap_down());
3386 EXPECT_FALSE(delegate
->tap_cancel());
3387 EXPECT_TRUE(delegate
->begin());
3388 EXPECT_TRUE(delegate
->end());
3389 EXPECT_FALSE(delegate
->scroll_begin());
3390 EXPECT_FALSE(delegate
->scroll_update());
3391 EXPECT_FALSE(delegate
->scroll_end());
3393 EXPECT_EQ(1, delegate
->tap_count());
3396 // Check that we don't get a double tap when the two taps have a long enough
3397 // delay in between.
3398 TEST_F(GestureRecognizerTest
, TwoTapsWithDelayBetween
) {
3399 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
3400 new GestureEventConsumeDelegate());
3401 const int kWindowWidth
= 123;
3402 const int kWindowHeight
= 45;
3403 const int kTouchId
= 2;
3404 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
3405 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3406 delegate
.get(), -1234, bounds
, root_window()));
3409 // First tap (tested in GestureEventTap)
3410 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
3411 kTouchId
, tes
.Now());
3412 DispatchEventUsingWindowDispatcher(&press1
);
3413 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
3414 kTouchId
, tes
.LeapForward(50));
3415 DispatchEventUsingWindowDispatcher(&release1
);
3418 // Second tap, close in distance but after some delay
3419 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
3420 kTouchId
, tes
.LeapForward(2000));
3421 DispatchEventUsingWindowDispatcher(&press2
);
3422 ui::TouchEvent
release2(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
3423 kTouchId
, tes
.LeapForward(50));
3424 DispatchEventUsingWindowDispatcher(&release2
);
3426 EXPECT_TRUE(delegate
->tap());
3427 EXPECT_TRUE(delegate
->tap_down());
3428 EXPECT_FALSE(delegate
->tap_cancel());
3429 EXPECT_TRUE(delegate
->begin());
3430 EXPECT_TRUE(delegate
->end());
3431 EXPECT_FALSE(delegate
->scroll_begin());
3432 EXPECT_FALSE(delegate
->scroll_update());
3433 EXPECT_FALSE(delegate
->scroll_end());
3435 EXPECT_EQ(1, delegate
->tap_count());
3438 // Checks that if the bounding-box of a gesture changes because of change in
3439 // radius of a touch-point, and not because of change in position, then there
3440 // are not gesture events from that.
3441 TEST_F(GestureRecognizerTest
, BoundingBoxRadiusChange
) {
3442 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
3443 new GestureEventConsumeDelegate());
3444 const int kWindowWidth
= 234;
3445 const int kWindowHeight
= 345;
3446 const int kTouchId
= 5, kTouchId2
= 7;
3447 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
3448 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3449 delegate
.get(), -1234, bounds
, root_window()));
3452 ui::TouchEvent
press1(
3453 ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201), kTouchId
, tes
.Now());
3454 DispatchEventUsingWindowDispatcher(&press1
);
3455 EXPECT_TRUE(delegate
->bounding_box().IsEmpty());
3459 ui::TouchEvent
press2(
3460 ui::ET_TOUCH_PRESSED
, gfx::Point(201, 201), kTouchId2
,
3461 tes
.LeapForward(400));
3462 press2
.set_radius_x(5);
3463 DispatchEventUsingWindowDispatcher(&press2
);
3464 EXPECT_FALSE(delegate
->pinch_begin());
3465 EXPECT_EQ(gfx::Rect(101, 196, 105, 10).ToString(),
3466 delegate
->bounding_box().ToString());
3470 ui::TouchEvent
move1(ui::ET_TOUCH_MOVED
, gfx::Point(50, 50), kTouchId
,
3471 tes
.LeapForward(40));
3472 DispatchEventUsingWindowDispatcher(&move1
);
3473 EXPECT_TRUE(delegate
->pinch_begin());
3474 EXPECT_EQ(gfx::Rect(50, 50, 156, 156).ToString(),
3475 delegate
->bounding_box().ToString());
3479 // The position doesn't move, but the radius changes.
3480 ui::TouchEvent
move2(
3481 ui::ET_TOUCH_MOVED
, gfx::Point(50, 50), kTouchId
, tes
.LeapForward(40));
3482 move2
.set_radius_x(50);
3483 move2
.set_radius_y(60);
3484 DispatchEventUsingWindowDispatcher(&move2
);
3485 EXPECT_FALSE(delegate
->tap());
3486 EXPECT_FALSE(delegate
->tap_cancel());
3487 EXPECT_FALSE(delegate
->scroll_update());
3488 EXPECT_FALSE(delegate
->pinch_update());
3493 // Checks that slow scrolls deliver the correct deltas.
3494 // In particular, fix for http;//crbug.com/150573.
3495 TEST_F(GestureRecognizerTest
, NoDriftInScroll
) {
3496 ui::GestureConfiguration::GetInstance()
3497 ->set_max_touch_move_in_pixels_for_click(3);
3498 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
3499 new GestureEventConsumeDelegate());
3500 const int kWindowWidth
= 234;
3501 const int kWindowHeight
= 345;
3502 const int kTouchId
= 5;
3504 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
3505 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3506 delegate
.get(), -1234, bounds
, root_window()));
3508 ui::TouchEvent
press1(
3509 ui::ET_TOUCH_PRESSED
, gfx::Point(101, 208), kTouchId
, tes
.Now());
3510 DispatchEventUsingWindowDispatcher(&press1
);
3511 EXPECT_TRUE(delegate
->begin());
3515 ui::TouchEvent
move1(ui::ET_TOUCH_MOVED
, gfx::Point(101, 206), kTouchId
,
3516 tes
.LeapForward(40));
3517 DispatchEventUsingWindowDispatcher(&move1
);
3518 EXPECT_FALSE(delegate
->scroll_begin());
3522 ui::TouchEvent
move2(ui::ET_TOUCH_MOVED
, gfx::Point(101, 204), kTouchId
,
3523 tes
.LeapForward(40));
3524 DispatchEventUsingWindowDispatcher(&move2
);
3525 EXPECT_TRUE(delegate
->tap_cancel());
3526 EXPECT_TRUE(delegate
->scroll_begin());
3527 EXPECT_TRUE(delegate
->scroll_update());
3528 // 3 px consumed by touch slop region.
3529 EXPECT_EQ(-1, delegate
->scroll_y());
3530 EXPECT_EQ(-4, delegate
->scroll_y_hint());
3534 ui::TouchEvent
move3(ui::ET_TOUCH_MOVED
, gfx::Point(101, 204), kTouchId
,
3535 tes
.LeapForward(40));
3536 DispatchEventUsingWindowDispatcher(&move3
);
3537 EXPECT_FALSE(delegate
->scroll_update());
3541 ui::TouchEvent
move4(ui::ET_TOUCH_MOVED
, gfx::Point(101, 203), kTouchId
,
3542 tes
.LeapForward(40));
3543 DispatchEventUsingWindowDispatcher(&move4
);
3544 EXPECT_TRUE(delegate
->scroll_update());
3545 EXPECT_EQ(-1, delegate
->scroll_y());
3550 // Ensure that move events which are preventDefaulted will cause a tap
3551 // cancel gesture event to be fired if the move would normally cause a
3552 // scroll. See bug http://crbug.com/146397.
3553 TEST_F(GestureRecognizerTest
, GestureEventConsumedTouchMoveCanFireTapCancel
) {
3554 scoped_ptr
<ConsumesTouchMovesDelegate
> delegate(
3555 new ConsumesTouchMovesDelegate());
3556 const int kTouchId
= 5;
3557 gfx::Rect
bounds(100, 200, 123, 45);
3558 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3559 delegate
.get(), -1234, bounds
, root_window()));
3563 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
3564 kTouchId
, tes
.Now());
3566 delegate
->set_consume_touch_move(false);
3567 DispatchEventUsingWindowDispatcher(&press
);
3568 delegate
->set_consume_touch_move(true);
3570 // Move the touch-point enough so that it would normally be considered a
3571 // scroll. But since the touch-moves will be consumed, no scrolling should
3573 // With the unified gesture detector, we will receive a scroll begin gesture,
3574 // whereas with the aura gesture recognizer we won't.
3575 tes
.SendScrollEvent(event_processor(), 130, 230, kTouchId
, delegate
.get());
3576 EXPECT_FALSE(delegate
->tap());
3577 EXPECT_FALSE(delegate
->tap_down());
3578 EXPECT_TRUE(delegate
->tap_cancel());
3579 EXPECT_FALSE(delegate
->begin());
3580 EXPECT_FALSE(delegate
->scroll_update());
3581 EXPECT_FALSE(delegate
->scroll_end());
3584 TEST_F(GestureRecognizerTest
, CancelAllActiveTouches
) {
3585 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
3586 new GestureEventConsumeDelegate());
3588 const int kWindowWidth
= 800;
3589 const int kWindowHeight
= 600;
3590 const int kTouchId1
= 1;
3591 const int kTouchId2
= 2;
3592 gfx::Rect
bounds(0, 0, kWindowWidth
, kWindowHeight
);
3593 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3594 delegate
.get(), -1234, bounds
, root_window()));
3595 scoped_ptr
<TestEventHandler
> handler(new TestEventHandler());
3596 window
->AddPreTargetHandler(handler
.get());
3598 // Start a gesture sequence on |window|. Then cancel all touches.
3599 // Make sure |window| receives a touch-cancel event.
3601 ui::TouchEvent
press(
3602 ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201), kTouchId1
, tes
.Now());
3603 DispatchEventUsingWindowDispatcher(&press
);
3605 delegate
->events(), ui::ET_GESTURE_BEGIN
, ui::ET_GESTURE_TAP_DOWN
);
3608 ui::ET_TOUCH_PRESSED
, gfx::Point(50, 50), kTouchId2
, tes
.Now());
3609 DispatchEventUsingWindowDispatcher(&p2
);
3611 delegate
->events(), ui::ET_GESTURE_TAP_CANCEL
, ui::ET_GESTURE_BEGIN
);
3613 ui::TouchEvent
move(
3614 ui::ET_TOUCH_MOVED
, gfx::Point(350, 300), kTouchId2
, tes
.Now());
3615 DispatchEventUsingWindowDispatcher(&move
);
3616 EXPECT_3_EVENTS(delegate
->events(),
3617 ui::ET_GESTURE_SCROLL_BEGIN
,
3618 ui::ET_GESTURE_SCROLL_UPDATE
,
3619 ui::ET_GESTURE_PINCH_BEGIN
);
3620 EXPECT_EQ(2, handler
->touch_pressed_count());
3624 ui::GestureRecognizer
* gesture_recognizer
= ui::GestureRecognizer::Get();
3625 EXPECT_EQ(window
.get(),
3626 gesture_recognizer
->GetTouchLockedTarget(press
));
3628 ui::GestureRecognizer::Get()->CancelActiveTouchesExcept(nullptr);
3630 EXPECT_EQ(NULL
, gesture_recognizer
->GetTouchLockedTarget(press
));
3631 EXPECT_4_EVENTS(delegate
->events(),
3632 ui::ET_GESTURE_PINCH_END
,
3633 ui::ET_GESTURE_SCROLL_END
,
3635 ui::ET_GESTURE_END
);
3636 const std::vector
<gfx::PointF
>& points
= handler
->cancelled_touch_points();
3637 EXPECT_EQ(2U, points
.size());
3638 EXPECT_EQ(gfx::Point(101, 201), points
[0]);
3639 EXPECT_EQ(gfx::Point(350, 300), points
[1]);
3642 // Check that appropriate touch events generate show press events
3643 TEST_F(GestureRecognizerTest
, GestureEventShowPress
) {
3644 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
3645 new GestureEventConsumeDelegate());
3647 const int kWindowWidth
= 123;
3648 const int kWindowHeight
= 45;
3649 const int kTouchId
= 2;
3650 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
3651 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3652 delegate
.get(), -1234, bounds
, root_window()));
3656 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
3657 kTouchId
, tes
.Now());
3658 DispatchEventUsingWindowDispatcher(&press1
);
3659 EXPECT_TRUE(delegate
->tap_down());
3660 EXPECT_TRUE(delegate
->begin());
3661 EXPECT_FALSE(delegate
->tap_cancel());
3663 // We haven't pressed long enough for a show press to occur
3664 EXPECT_FALSE(delegate
->show_press());
3666 // Wait until the timer runs out
3667 delegate
->WaitUntilReceivedGesture(ui::ET_GESTURE_SHOW_PRESS
);
3668 EXPECT_TRUE(delegate
->show_press());
3669 EXPECT_FALSE(delegate
->tap_cancel());
3672 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
3673 kTouchId
, tes
.Now());
3674 DispatchEventUsingWindowDispatcher(&release1
);
3675 EXPECT_FALSE(delegate
->long_press());
3677 // Note the tap isn't dispatched until the release
3678 EXPECT_FALSE(delegate
->tap_cancel());
3679 EXPECT_TRUE(delegate
->tap());
3682 // Check that scrolling cancels a show press
3683 TEST_F(GestureRecognizerTest
, GestureEventShowPressCancelledByScroll
) {
3684 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
3685 new GestureEventConsumeDelegate());
3687 const int kWindowWidth
= 123;
3688 const int kWindowHeight
= 45;
3689 const int kTouchId
= 6;
3690 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
3691 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3692 delegate
.get(), -1234, bounds
, root_window()));
3696 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
3697 kTouchId
, tes
.Now());
3698 DispatchEventUsingWindowDispatcher(&press1
);
3699 EXPECT_TRUE(delegate
->tap_down());
3701 // We haven't pressed long enough for a show press to occur
3702 EXPECT_FALSE(delegate
->show_press());
3703 EXPECT_FALSE(delegate
->tap_cancel());
3705 // Scroll around, to cancel the show press
3706 tes
.SendScrollEvent(event_processor(), 130, 230, kTouchId
, delegate
.get());
3707 // Wait until the timer runs out
3708 DelayByShowPressTimeout();
3709 EXPECT_FALSE(delegate
->show_press());
3710 EXPECT_TRUE(delegate
->tap_cancel());
3713 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
3714 kTouchId
, tes
.LeapForward(10));
3715 DispatchEventUsingWindowDispatcher(&release1
);
3716 EXPECT_FALSE(delegate
->show_press());
3717 EXPECT_FALSE(delegate
->tap_cancel());
3720 // Test that show press events are sent immediately on tap
3721 TEST_F(GestureRecognizerTest
, GestureEventShowPressSentOnTap
) {
3722 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
3723 new GestureEventConsumeDelegate());
3725 const int kWindowWidth
= 123;
3726 const int kWindowHeight
= 45;
3727 const int kTouchId
= 6;
3728 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
3729 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3730 delegate
.get(), -1234, bounds
, root_window()));
3734 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
3735 kTouchId
, tes
.Now());
3736 DispatchEventUsingWindowDispatcher(&press1
);
3737 EXPECT_TRUE(delegate
->tap_down());
3739 // We haven't pressed long enough for a show press to occur
3740 EXPECT_FALSE(delegate
->show_press());
3741 EXPECT_FALSE(delegate
->tap_cancel());
3744 ui::TouchEvent
release1(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
3745 kTouchId
, tes
.LeapForward(50));
3746 DispatchEventUsingWindowDispatcher(&release1
);
3747 EXPECT_TRUE(delegate
->show_press());
3748 EXPECT_FALSE(delegate
->tap_cancel());
3749 EXPECT_TRUE(delegate
->tap());
3752 // Test that consuming the first move touch event prevents a scroll.
3753 TEST_F(GestureRecognizerTest
, GestureEventConsumedTouchMoveScrollTest
) {
3754 scoped_ptr
<QueueTouchEventDelegate
> delegate(
3755 new QueueTouchEventDelegate(host()->dispatcher()));
3757 const int kTouchId
= 7;
3758 gfx::Rect
bounds(0, 0, 1000, 1000);
3759 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3760 delegate
.get(), -1234, bounds
, root_window()));
3761 delegate
->set_window(window
.get());
3763 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(0, 0),
3764 kTouchId
, tes
.Now());
3765 DispatchEventUsingWindowDispatcher(&press
);
3766 delegate
->ReceivedAck();
3768 // A touch move within the slop region is never consumed in web contents. The
3769 // unified GR won't prevent scroll if a touch move within the slop region is
3770 // consumed, so make sure this touch move exceeds the slop region.
3771 ui::TouchEvent
move1(ui::ET_TOUCH_MOVED
, gfx::Point(10, 10),
3772 kTouchId
, tes
.Now());
3773 DispatchEventUsingWindowDispatcher(&move1
);
3774 delegate
->ReceivedAckPreventDefaulted();
3776 ui::TouchEvent
move2(ui::ET_TOUCH_MOVED
, gfx::Point(20, 20),
3777 kTouchId
, tes
.Now());
3778 DispatchEventUsingWindowDispatcher(&move2
);
3779 delegate
->ReceivedAck();
3781 // With the unified gesture detector, consuming the first touch move event
3782 // won't prevent all future scrolling.
3783 EXPECT_TRUE(delegate
->scroll_begin());
3784 EXPECT_TRUE(delegate
->scroll_update());
3787 // Test that consuming the first move touch doesn't prevent a tap.
3788 TEST_F(GestureRecognizerTest
, GestureEventConsumedTouchMoveTapTest
) {
3789 scoped_ptr
<QueueTouchEventDelegate
> delegate(
3790 new QueueTouchEventDelegate(host()->dispatcher()));
3792 const int kTouchId
= 7;
3793 gfx::Rect
bounds(0, 0, 1000, 1000);
3794 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3795 delegate
.get(), -1234, bounds
, root_window()));
3796 delegate
->set_window(window
.get());
3798 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(0, 0),
3799 kTouchId
, tes
.Now());
3800 DispatchEventUsingWindowDispatcher(&press
);
3801 delegate
->ReceivedAck();
3803 ui::TouchEvent
move(ui::ET_TOUCH_MOVED
, gfx::Point(2, 2),
3804 kTouchId
, tes
.Now());
3805 DispatchEventUsingWindowDispatcher(&move
);
3806 delegate
->ReceivedAckPreventDefaulted();
3808 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(2, 2),
3809 kTouchId
, tes
.LeapForward(50));
3810 DispatchEventUsingWindowDispatcher(&release
);
3811 delegate
->ReceivedAck();
3813 EXPECT_TRUE(delegate
->tap());
3816 // Test that consuming the first move touch doesn't prevent a long press.
3817 TEST_F(GestureRecognizerTest
, GestureEventConsumedTouchMoveLongPressTest
) {
3818 scoped_ptr
<QueueTouchEventDelegate
> delegate(
3819 new QueueTouchEventDelegate(host()->dispatcher()));
3821 const int kWindowWidth
= 123;
3822 const int kWindowHeight
= 45;
3823 const int kTouchId
= 2;
3824 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
3825 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3826 delegate
.get(), -1234, bounds
, root_window()));
3827 delegate
->set_window(window
.get());
3831 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
3832 kTouchId
, tes
.Now());
3833 DispatchEventUsingWindowDispatcher(&press1
);
3834 delegate
->ReceivedAck();
3836 ui::TouchEvent
move(ui::ET_TOUCH_MOVED
, gfx::Point(103, 203),
3837 kTouchId
, tes
.Now());
3838 DispatchEventUsingWindowDispatcher(&move
);
3839 delegate
->ReceivedAckPreventDefaulted();
3841 // Wait until the timer runs out
3842 delegate
->WaitUntilReceivedGesture(ui::ET_GESTURE_LONG_PRESS
);
3843 EXPECT_TRUE(delegate
->long_press());
3846 // Tests that the deltas are correct when leaving the slop region very slowly.
3847 TEST_F(GestureRecognizerTest
, TestExceedingSlopSlowly
) {
3848 ui::GestureConfiguration::GetInstance()
3849 ->set_max_touch_move_in_pixels_for_click(3);
3850 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
3851 new GestureEventConsumeDelegate());
3852 const int kWindowWidth
= 234;
3853 const int kWindowHeight
= 345;
3854 const int kTouchId
= 5;
3856 gfx::Rect
bounds(0, 0, kWindowWidth
, kWindowHeight
);
3857 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3858 delegate
.get(), -1234, bounds
, root_window()));
3860 ui::TouchEvent
press(
3861 ui::ET_TOUCH_PRESSED
, gfx::Point(10, 10), kTouchId
, tes
.Now());
3862 DispatchEventUsingWindowDispatcher(&press
);
3863 EXPECT_FALSE(delegate
->scroll_begin());
3864 EXPECT_FALSE(delegate
->scroll_update());
3867 ui::TouchEvent
move1(ui::ET_TOUCH_MOVED
, gfx::Point(11, 10), kTouchId
,
3868 tes
.LeapForward(40));
3869 DispatchEventUsingWindowDispatcher(&move1
);
3870 EXPECT_FALSE(delegate
->scroll_begin());
3871 EXPECT_FALSE(delegate
->scroll_update());
3872 EXPECT_EQ(0, delegate
->scroll_x());
3873 EXPECT_EQ(0, delegate
->scroll_x_hint());
3876 ui::TouchEvent
move2(ui::ET_TOUCH_MOVED
, gfx::Point(12, 10), kTouchId
,
3877 tes
.LeapForward(40));
3878 DispatchEventUsingWindowDispatcher(&move2
);
3879 EXPECT_FALSE(delegate
->scroll_begin());
3880 EXPECT_FALSE(delegate
->scroll_update());
3881 EXPECT_EQ(0, delegate
->scroll_x());
3882 EXPECT_EQ(0, delegate
->scroll_x_hint());
3886 ui::TouchEvent
move3(ui::ET_TOUCH_MOVED
, gfx::PointF(13.1f
, 10.f
), kTouchId
,
3887 tes
.LeapForward(40));
3888 DispatchEventUsingWindowDispatcher(&move3
);
3889 EXPECT_TRUE(delegate
->scroll_begin());
3890 EXPECT_TRUE(delegate
->scroll_update());
3891 EXPECT_NEAR(0.1, delegate
->scroll_x(), 0.0001);
3892 EXPECT_FLOAT_EQ(3.1f
, delegate
->scroll_x_hint());
3895 ui::TouchEvent
move4(ui::ET_TOUCH_MOVED
, gfx::Point(14, 10), kTouchId
,
3896 tes
.LeapForward(40));
3897 DispatchEventUsingWindowDispatcher(&move4
);
3898 EXPECT_FALSE(delegate
->scroll_begin());
3899 EXPECT_TRUE(delegate
->scroll_update());
3900 EXPECT_NEAR(0.9, delegate
->scroll_x(), 0.0001);
3901 EXPECT_EQ(0.f
, delegate
->scroll_x_hint());
3905 TEST_F(GestureRecognizerTest
, ScrollAlternatelyConsumedTest
) {
3906 scoped_ptr
<QueueTouchEventDelegate
> delegate(
3907 new QueueTouchEventDelegate(host()->dispatcher()));
3909 const int kWindowWidth
= 3000;
3910 const int kWindowHeight
= 3000;
3911 const int kTouchId
= 2;
3912 gfx::Rect
bounds(0, 0, kWindowWidth
, kWindowHeight
);
3913 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3914 delegate
.get(), -1234, bounds
, root_window()));
3915 delegate
->set_window(window
.get());
3922 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(x
, y
),
3923 kTouchId
, tes
.Now());
3924 DispatchEventUsingWindowDispatcher(&press1
);
3925 delegate
->ReceivedAck();
3926 EXPECT_FALSE(delegate
->scroll_begin());
3927 EXPECT_FALSE(delegate
->scroll_update());
3932 ui::TouchEvent
move1(ui::ET_TOUCH_MOVED
, gfx::Point(x
, y
),
3933 kTouchId
, tes
.Now());
3934 DispatchEventUsingWindowDispatcher(&move1
);
3935 delegate
->ReceivedAck();
3936 EXPECT_TRUE(delegate
->scroll_begin());
3937 EXPECT_TRUE(delegate
->scroll_update());
3940 for (int i
= 0; i
< 3; ++i
) {
3943 ui::TouchEvent
move2(
3944 ui::ET_TOUCH_MOVED
, gfx::Point(x
, y
), kTouchId
, tes
.Now());
3945 DispatchEventUsingWindowDispatcher(&move2
);
3946 delegate
->ReceivedAck();
3947 EXPECT_FALSE(delegate
->scroll_begin());
3948 EXPECT_TRUE(delegate
->scroll_update());
3949 EXPECT_EQ(10, delegate
->scroll_x());
3950 EXPECT_EQ(10, delegate
->scroll_y());
3955 ui::TouchEvent
move3(
3956 ui::ET_TOUCH_MOVED
, gfx::Point(x
, y
), kTouchId
, tes
.Now());
3957 DispatchEventUsingWindowDispatcher(&move3
);
3958 delegate
->ReceivedAckPreventDefaulted();
3959 EXPECT_FALSE(delegate
->scroll_begin());
3960 EXPECT_FALSE(delegate
->scroll_update());
3965 TEST_F(GestureRecognizerTest
, PinchAlternatelyConsumedTest
) {
3966 scoped_ptr
<QueueTouchEventDelegate
> delegate(
3967 new QueueTouchEventDelegate(host()->dispatcher()));
3969 const int kWindowWidth
= 3000;
3970 const int kWindowHeight
= 3000;
3971 const int kTouchId1
= 5;
3972 const int kTouchId2
= 7;
3973 gfx::Rect
bounds(0, 0, kWindowWidth
, kWindowHeight
);
3974 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
3975 delegate
.get(), -1234, bounds
, root_window()));
3976 delegate
->set_window(window
.get());
3979 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(0, 0),
3980 kTouchId1
, tes
.Now());
3981 DispatchEventUsingWindowDispatcher(&press1
);
3982 delegate
->ReceivedAck();
3983 EXPECT_FALSE(delegate
->scroll_begin());
3984 EXPECT_FALSE(delegate
->scroll_update());
3990 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(x
, y
),
3991 kTouchId2
, tes
.Now());
3992 DispatchEventUsingWindowDispatcher(&press2
);
3993 delegate
->ReceivedAck();
3994 EXPECT_FALSE(delegate
->scroll_begin());
3995 EXPECT_FALSE(delegate
->scroll_update());
3996 EXPECT_FALSE(delegate
->pinch_begin());
3997 EXPECT_FALSE(delegate
->pinch_update());
4003 ui::TouchEvent
move1(ui::ET_TOUCH_MOVED
, gfx::Point(x
, y
),
4004 kTouchId2
, tes
.Now());
4005 DispatchEventUsingWindowDispatcher(&move1
);
4006 delegate
->ReceivedAck();
4007 EXPECT_TRUE(delegate
->scroll_begin());
4008 EXPECT_TRUE(delegate
->scroll_update());
4009 EXPECT_TRUE(delegate
->pinch_begin());
4010 EXPECT_FALSE(delegate
->pinch_update());
4013 const float expected_scales
[] = {1.5f
, 1.2f
, 1.125f
};
4015 for (int i
= 0; i
< 3; ++i
) {
4018 ui::TouchEvent
move2(
4019 ui::ET_TOUCH_MOVED
, gfx::Point(x
, y
), kTouchId2
, tes
.Now());
4020 DispatchEventUsingWindowDispatcher(&move2
);
4021 delegate
->ReceivedAck();
4022 EXPECT_FALSE(delegate
->scroll_begin());
4023 EXPECT_TRUE(delegate
->scroll_update());
4024 EXPECT_FALSE(delegate
->scroll_end());
4025 EXPECT_FALSE(delegate
->pinch_begin());
4026 EXPECT_TRUE(delegate
->pinch_update());
4027 EXPECT_FALSE(delegate
->pinch_end());
4028 EXPECT_EQ(25, delegate
->scroll_x());
4029 EXPECT_EQ(25, delegate
->scroll_y());
4030 EXPECT_FLOAT_EQ(expected_scales
[i
], delegate
->scale());
4035 ui::TouchEvent
move3(
4036 ui::ET_TOUCH_MOVED
, gfx::Point(x
, y
), kTouchId2
, tes
.Now());
4037 DispatchEventUsingWindowDispatcher(&move3
);
4038 delegate
->ReceivedAckPreventDefaulted();
4039 EXPECT_FALSE(delegate
->scroll_begin());
4040 EXPECT_FALSE(delegate
->scroll_update());
4041 EXPECT_FALSE(delegate
->scroll_end());
4042 EXPECT_FALSE(delegate
->pinch_begin());
4043 EXPECT_FALSE(delegate
->pinch_update());
4044 EXPECT_FALSE(delegate
->pinch_end());
4049 // Test that touch event flags are passed through to the gesture event.
4050 TEST_F(GestureRecognizerTest
, GestureEventFlagsPassedFromTouchEvent
) {
4051 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
4052 new GestureEventConsumeDelegate());
4054 const int kWindowWidth
= 123;
4055 const int kWindowHeight
= 45;
4056 const int kTouchId
= 6;
4057 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
4058 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
4059 delegate
.get(), -1234, bounds
, root_window()));
4063 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
4064 kTouchId
, tes
.Now());
4065 DispatchEventUsingWindowDispatcher(&press1
);
4066 EXPECT_TRUE(delegate
->tap_down());
4068 int default_flags
= delegate
->flags();
4070 ui::TouchEvent
move1(
4071 ui::ET_TOUCH_MOVED
, gfx::Point(397, 149), kTouchId
, tes
.LeapForward(50));
4072 move1
.set_flags(992);
4074 DispatchEventUsingWindowDispatcher(&move1
);
4075 EXPECT_NE(default_flags
, delegate
->flags());
4078 // A delegate that deletes a window on long press.
4079 class GestureEventDeleteWindowOnLongPress
: public GestureEventConsumeDelegate
{
4081 GestureEventDeleteWindowOnLongPress()
4084 void set_window(aura::Window
** window
) { window_
= window
; }
4086 void OnGestureEvent(ui::GestureEvent
* gesture
) override
{
4087 GestureEventConsumeDelegate::OnGestureEvent(gesture
);
4088 if (gesture
->type() != ui::ET_GESTURE_LONG_PRESS
)
4090 ui::GestureRecognizer::Get()->CleanupStateForConsumer(*window_
);
4096 aura::Window
** window_
;
4097 DISALLOW_COPY_AND_ASSIGN(GestureEventDeleteWindowOnLongPress
);
4100 // Check that deleting the window in response to a long press gesture doesn't
4102 TEST_F(GestureRecognizerTest
, GestureEventLongPressDeletingWindow
) {
4103 GestureEventDeleteWindowOnLongPress delegate
;
4104 const int kWindowWidth
= 123;
4105 const int kWindowHeight
= 45;
4106 const int kTouchId
= 2;
4107 gfx::Rect
bounds(100, 200, kWindowWidth
, kWindowHeight
);
4108 aura::Window
* window(CreateTestWindowWithDelegate(
4109 &delegate
, -1234, bounds
, root_window()));
4110 delegate
.set_window(&window
);
4112 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
,
4113 gfx::Point(101, 201),
4115 ui::EventTimeForNow());
4116 DispatchEventUsingWindowDispatcher(&press1
);
4117 EXPECT_TRUE(window
!= NULL
);
4119 // Wait until the timer runs out.
4120 delegate
.WaitUntilReceivedGesture(ui::ET_GESTURE_LONG_PRESS
);
4121 EXPECT_EQ(NULL
, window
);
4124 TEST_F(GestureRecognizerWithSwitchTest
, GestureEventSmallPinchDisabled
) {
4125 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
4126 new GestureEventConsumeDelegate());
4128 const int kWindowWidth
= 300;
4129 const int kWindowHeight
= 400;
4130 const int kTouchId1
= 3;
4131 const int kTouchId2
= 5;
4132 gfx::Rect
bounds(5, 5, kWindowWidth
, kWindowHeight
);
4133 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
4134 delegate
.get(), -1234, bounds
, root_window()));
4136 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 301),
4137 kTouchId1
, tes
.Now());
4138 DispatchEventUsingWindowDispatcher(&press1
);
4139 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(10, 10),
4140 kTouchId2
, tes
.Now());
4141 DispatchEventUsingWindowDispatcher(&press2
);
4143 // Move the first finger.
4145 ui::TouchEvent
move1(ui::ET_TOUCH_MOVED
, gfx::Point(65, 201),
4146 kTouchId1
, tes
.Now());
4147 DispatchEventUsingWindowDispatcher(&move1
);
4149 EXPECT_3_EVENTS(delegate
->events(),
4150 ui::ET_GESTURE_SCROLL_BEGIN
,
4151 ui::ET_GESTURE_SCROLL_UPDATE
,
4152 ui::ET_GESTURE_PINCH_BEGIN
);
4154 // No pinch update occurs, as kCompensateForUnstablePinchZoom is on and
4155 // |min_pinch_update_span_delta| was nonzero, and this is a very small pinch.
4157 ui::TouchEvent
move2(ui::ET_TOUCH_MOVED
, gfx::Point(65, 202),
4158 kTouchId1
, tes
.Now());
4159 DispatchEventUsingWindowDispatcher(&move2
);
4160 EXPECT_1_EVENT(delegate
->events(), ui::ET_GESTURE_SCROLL_UPDATE
);
4163 TEST_F(GestureRecognizerTest
, GestureEventSmallPinchEnabled
) {
4164 scoped_ptr
<GestureEventConsumeDelegate
> delegate(
4165 new GestureEventConsumeDelegate());
4167 const int kWindowWidth
= 300;
4168 const int kWindowHeight
= 400;
4169 const int kTouchId1
= 3;
4170 const int kTouchId2
= 5;
4171 gfx::Rect
bounds(5, 5, kWindowWidth
, kWindowHeight
);
4172 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
4173 delegate
.get(), -1234, bounds
, root_window()));
4175 ui::TouchEvent
press1(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 301),
4176 kTouchId1
, tes
.Now());
4177 DispatchEventUsingWindowDispatcher(&press1
);
4178 ui::TouchEvent
press2(ui::ET_TOUCH_PRESSED
, gfx::Point(10, 10),
4179 kTouchId2
, tes
.Now());
4180 DispatchEventUsingWindowDispatcher(&press2
);
4182 // Move the first finger.
4184 ui::TouchEvent
move1(ui::ET_TOUCH_MOVED
, gfx::Point(65, 201),
4185 kTouchId1
, tes
.Now());
4186 DispatchEventUsingWindowDispatcher(&move1
);
4188 EXPECT_3_EVENTS(delegate
->events(),
4189 ui::ET_GESTURE_SCROLL_BEGIN
,
4190 ui::ET_GESTURE_SCROLL_UPDATE
,
4191 ui::ET_GESTURE_PINCH_BEGIN
);
4194 ui::TouchEvent
move2(ui::ET_TOUCH_MOVED
, gfx::Point(65, 202),
4195 kTouchId1
, tes
.Now());
4196 DispatchEventUsingWindowDispatcher(&move2
);
4197 EXPECT_2_EVENTS(delegate
->events(),
4198 ui::ET_GESTURE_SCROLL_UPDATE
,
4199 ui::ET_GESTURE_PINCH_UPDATE
);
4202 // Tests that delaying the ack of a touch release doesn't trigger a long press
4204 TEST_F(GestureRecognizerTest
, EagerGestureDetection
) {
4205 scoped_ptr
<QueueTouchEventDelegate
> delegate(
4206 new QueueTouchEventDelegate(host()->dispatcher()));
4208 const int kTouchId
= 2;
4209 gfx::Rect
bounds(100, 200, 100, 100);
4210 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
4211 delegate
.get(), -1234, bounds
, root_window()));
4212 delegate
->set_window(window
.get());
4215 ui::TouchEvent
press(ui::ET_TOUCH_PRESSED
, gfx::Point(101, 201),
4216 kTouchId
, tes
.Now());
4217 DispatchEventUsingWindowDispatcher(&press
);
4218 ui::TouchEvent
release(ui::ET_TOUCH_RELEASED
, gfx::Point(101, 201),
4219 kTouchId
, tes
.LeapForward(50));
4220 DispatchEventUsingWindowDispatcher(&release
);
4223 // Ack the touch press.
4224 delegate
->ReceivedAck();
4225 EXPECT_TRUE(delegate
->tap_down());
4228 // Wait until the long press event would fire (if we weren't eager).
4229 DelayByLongPressTimeout();
4231 // Ack the touch release.
4232 delegate
->ReceivedAck();
4233 EXPECT_TRUE(delegate
->tap());
4234 EXPECT_FALSE(delegate
->long_press());
4237 // This tests crbug.com/405519, in which touch events which the gesture detector
4238 // ignores interfere with gesture recognition.
4239 TEST_F(GestureRecognizerTest
, IgnoredEventsDontBreakGestureRecognition
) {
4240 scoped_ptr
<QueueTouchEventDelegate
> delegate(
4241 new QueueTouchEventDelegate(host()->dispatcher()));
4243 const int kWindowWidth
= 300;
4244 const int kWindowHeight
= 400;
4245 const int kTouchId1
= 3;
4246 gfx::Rect
bounds(5, 5, kWindowWidth
, kWindowHeight
);
4247 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
4248 delegate
.get(), -1234, bounds
, root_window()));
4249 delegate
->set_window(window
.get());
4251 ui::TouchEvent
press1(
4252 ui::ET_TOUCH_PRESSED
, gfx::Point(101, 301), kTouchId1
, tes
.Now());
4253 DispatchEventUsingWindowDispatcher(&press1
);
4254 delegate
->ReceivedAck();
4257 delegate
->events(), ui::ET_GESTURE_BEGIN
, ui::ET_GESTURE_TAP_DOWN
);
4259 // Move the first finger.
4261 ui::TouchEvent
move1(
4262 ui::ET_TOUCH_MOVED
, gfx::Point(65, 201), kTouchId1
, tes
.Now());
4263 DispatchEventUsingWindowDispatcher(&move1
);
4264 delegate
->ReceivedAck();
4266 EXPECT_3_EVENTS(delegate
->events(),
4267 ui::ET_GESTURE_TAP_CANCEL
,
4268 ui::ET_GESTURE_SCROLL_BEGIN
,
4269 ui::ET_GESTURE_SCROLL_UPDATE
);
4273 // Send a valid event, but don't ack it.
4274 ui::TouchEvent
move2(
4275 ui::ET_TOUCH_MOVED
, gfx::Point(65, 202), kTouchId1
, tes
.Now());
4276 DispatchEventUsingWindowDispatcher(&move2
);
4277 EXPECT_0_EVENTS(delegate
->events());
4279 // Send a touchmove event at the same location as the previous touchmove
4280 // event. This shouldn't do anything.
4281 ui::TouchEvent
move3(
4282 ui::ET_TOUCH_MOVED
, gfx::Point(65, 202), kTouchId1
, tes
.Now());
4283 DispatchEventUsingWindowDispatcher(&move3
);
4285 // Ack the previous valid event. The intermediary invalid event shouldn't
4287 delegate
->ReceivedAck();
4288 EXPECT_1_EVENT(delegate
->events(), ui::ET_GESTURE_SCROLL_UPDATE
);
4291 // Tests that an event stream can have a mix of sync and async acks.
4292 TEST_F(GestureRecognizerTest
,
4293 MixedSyncAndAsyncAcksDontCauseOutOfOrderDispatch
) {
4294 scoped_ptr
<QueueTouchEventDelegate
> delegate(
4295 new QueueTouchEventDelegate(host()->dispatcher()));
4297 const int kWindowWidth
= 300;
4298 const int kWindowHeight
= 400;
4299 const int kTouchId1
= 3;
4300 gfx::Rect
bounds(0, 0, kWindowWidth
, kWindowHeight
);
4301 scoped_ptr
<aura::Window
> window(CreateTestWindowWithDelegate(
4302 delegate
.get(), -1234, bounds
, root_window()));
4303 delegate
->set_window(window
.get());
4305 // Start a scroll gesture.
4306 ui::TouchEvent
press1(
4307 ui::ET_TOUCH_PRESSED
, gfx::Point(0, 0), kTouchId1
, tes
.Now());
4308 DispatchEventUsingWindowDispatcher(&press1
);
4309 delegate
->ReceivedAck();
4311 ui::TouchEvent
move1(
4312 ui::ET_TOUCH_MOVED
, gfx::Point(100, 100), kTouchId1
, tes
.Now());
4313 DispatchEventUsingWindowDispatcher(&move1
);
4314 delegate
->ReceivedAck();
4317 // Dispatch a synchronously consumed touch move, which should be ignored.
4318 delegate
->set_synchronous_ack_for_next_event(true);
4319 ui::TouchEvent
move2(ui::ET_TOUCH_MOVED
, gfx::Point(200, 200), kTouchId1
,
4321 DispatchEventUsingWindowDispatcher(&move2
);
4322 EXPECT_0_EVENTS(delegate
->events());
4324 // Dispatch a touch move, but don't ack it.
4325 ui::TouchEvent
move3(ui::ET_TOUCH_MOVED
, gfx::Point(300, 300), kTouchId1
,
4327 DispatchEventUsingWindowDispatcher(&move3
);
4329 // Dispatch two synchronously consumed touch moves, which should be ignored.
4330 delegate
->set_synchronous_ack_for_next_event(true);
4331 ui::TouchEvent
move4(
4332 ui::ET_TOUCH_MOVED
, gfx::Point(400, 400), kTouchId1
, tes
.Now());
4333 DispatchEventUsingWindowDispatcher(&move4
);
4335 delegate
->set_synchronous_ack_for_next_event(true);
4336 ui::TouchEvent
move5(
4337 ui::ET_TOUCH_MOVED
, gfx::Point(500, 500), kTouchId1
, tes
.Now());
4338 DispatchEventUsingWindowDispatcher(&move5
);
4340 EXPECT_0_EVENTS(delegate
->events());
4341 EXPECT_EQ(100, delegate
->bounding_box().x());
4342 // Ack the pending touch move, and ensure the most recent gesture event
4343 // used its co-ordinates.
4344 delegate
->ReceivedAck();
4345 EXPECT_EQ(300, delegate
->bounding_box().x());
4346 EXPECT_1_EVENT(delegate
->events(), ui::ET_GESTURE_SCROLL_UPDATE
);
4348 // Dispatch a touch move, but don't ack it.
4350 ui::TouchEvent
move6(ui::ET_TOUCH_MOVED
, gfx::Point(600, 600), kTouchId1
,
4352 DispatchEventUsingWindowDispatcher(&move6
);
4354 // Dispatch a synchronously unconsumed touch move.
4355 delegate
->set_synchronous_ack_for_next_event(false);
4356 ui::TouchEvent
move7(
4357 ui::ET_TOUCH_MOVED
, gfx::Point(700, 700), kTouchId1
, tes
.Now());
4358 DispatchEventUsingWindowDispatcher(&move7
);
4360 // The synchronous ack is stuck behind the pending touch move.
4361 EXPECT_0_EVENTS(delegate
->events());
4363 delegate
->ReceivedAck();
4364 EXPECT_2_EVENTS(delegate
->events(), ui::ET_GESTURE_SCROLL_UPDATE
,
4365 ui::ET_GESTURE_SCROLL_UPDATE
);