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