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