touch_disposition_gesture_filter_unittest.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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/memory/scoped_ptr.h" 7#include "testing/gtest/include/gtest/gtest.h" 8#include "ui/events/gesture_detection/mock_motion_event.h" 9#include "ui/events/gesture_detection/touch_disposition_gesture_filter.h" 10 11namespace ui { 12 13class TouchDispositionGestureFilterTest 14 : public testing::Test, 15 public TouchDispositionGestureFilterClient { 16 public: 17 TouchDispositionGestureFilterTest() 18 : cancel_after_next_gesture_(false), sent_gesture_count_(0) {} 19 virtual ~TouchDispositionGestureFilterTest() {} 20 21 // testing::Test 22 virtual void SetUp() OVERRIDE { 23 queue_.reset(new TouchDispositionGestureFilter(this)); 24 } 25 26 virtual void TearDown() OVERRIDE { 27 queue_.reset(); 28 } 29 30 // TouchDispositionGestureFilterClient 31 virtual void ForwardGestureEvent(const GestureEventData& event) OVERRIDE { 32 ++sent_gesture_count_; 33 last_sent_gesture_time_ = event.time; 34 sent_gestures_.push_back(event.type); 35 last_sent_gesture_location_ = gfx::PointF(event.x, event.y); 36 if (cancel_after_next_gesture_) { 37 CancelTouchPoint(); 38 SendTouchNotConsumedAck(); 39 cancel_after_next_gesture_ = false; 40 } 41 } 42 43 protected: 44 typedef std::vector<EventType> GestureList; 45 46 ::testing::AssertionResult GesturesMatch(const GestureList& expected, 47 const GestureList& actual) { 48 if (expected.size() != actual.size()) { 49 return ::testing::AssertionFailure() 50 << "actual.size(" << actual.size() 51 << ") != expected.size(" << expected.size() << ")"; 52 } 53 54 for (size_t i = 0; i < expected.size(); ++i) { 55 if (expected[i] != actual[i]) { 56 return ::testing::AssertionFailure() 57 << "actual[" << i << "] (" 58 << actual[i] 59 << ") != expected[" << i << "] (" 60 << expected[i] << ")"; 61 } 62 } 63 64 return ::testing::AssertionSuccess(); 65 } 66 67 GestureList Gestures(EventType type) { 68 return GestureList(1, type); 69 } 70 71 GestureList Gestures(EventType type0, EventType type1) { 72 GestureList gestures(2); 73 gestures[0] = type0; 74 gestures[1] = type1; 75 return gestures; 76 } 77 78 GestureList Gestures(EventType type0, 79 EventType type1, 80 EventType type2) { 81 GestureList gestures(3); 82 gestures[0] = type0; 83 gestures[1] = type1; 84 gestures[2] = type2; 85 return gestures; 86 } 87 88 GestureList Gestures(EventType type0, 89 EventType type1, 90 EventType type2, 91 EventType type3) { 92 GestureList gestures(4); 93 gestures[0] = type0; 94 gestures[1] = type1; 95 gestures[2] = type2; 96 gestures[3] = type3; 97 return gestures; 98 } 99 100 void SendTouchGestures() { 101 touch_event_.SetTime(base::TimeTicks::Now()); 102 EXPECT_EQ(TouchDispositionGestureFilter::SUCCESS, 103 SendTouchGestures(touch_event_, pending_gesture_packet_)); 104 GestureEventDataPacket gesture_packet; 105 std::swap(gesture_packet, pending_gesture_packet_); 106 } 107 108 TouchDispositionGestureFilter::PacketResult 109 SendTouchGestures(const MotionEvent& touch, 110 const GestureEventDataPacket& packet) { 111 GestureEventDataPacket touch_packet = 112 GestureEventDataPacket::FromTouch(touch); 113 for (size_t i = 0; i < packet.gesture_count(); ++i) 114 touch_packet.Push(packet.gesture(i)); 115 return queue_->OnGesturePacket(touch_packet); 116 } 117 118 TouchDispositionGestureFilter::PacketResult 119 SendTimeoutGesture(EventType type) { 120 return queue_->OnGesturePacket( 121 GestureEventDataPacket::FromTouchTimeout(CreateGesture(type))); 122 } 123 124 TouchDispositionGestureFilter::PacketResult 125 SendGesturePacket(const GestureEventDataPacket& packet) { 126 return queue_->OnGesturePacket(packet); 127 } 128 129 void SendTouchEventAck(bool event_consumed) { 130 queue_->OnTouchEventAck(event_consumed); 131 } 132 133 void SendTouchConsumedAck() { SendTouchEventAck(true); } 134 135 void SendTouchNotConsumedAck() { SendTouchEventAck(false); } 136 137 void PushGesture(EventType type) { 138 pending_gesture_packet_.Push(CreateGesture(type)); 139 } 140 141 void PressTouchPoint(int x, int y) { 142 touch_event_.PressPoint(x, y); 143 SendTouchGestures(); 144 } 145 146 void MoveTouchPoint(size_t index, int x, int y) { 147 touch_event_.MovePoint(index, x, y); 148 SendTouchGestures(); 149 } 150 151 void ReleaseTouchPoint() { 152 touch_event_.ReleasePoint(); 153 SendTouchGestures(); 154 } 155 156 void CancelTouchPoint() { 157 touch_event_.CancelPoint(); 158 SendTouchGestures(); 159 } 160 161 void ResetTouchPoints() { touch_event_ = MockMotionEvent(); } 162 163 bool GesturesSent() const { return !sent_gestures_.empty(); } 164 165 base::TimeTicks LastSentGestureTime() const { 166 return last_sent_gesture_time_; 167 } 168 169 base::TimeTicks CurrentTouchTime() const { 170 return touch_event_.GetEventTime(); 171 } 172 173 bool IsEmpty() const { return queue_->IsEmpty(); } 174 175 GestureList GetAndResetSentGestures() { 176 GestureList sent_gestures; 177 sent_gestures.swap(sent_gestures_); 178 return sent_gestures; 179 } 180 181 gfx::PointF LastSentGestureLocation() { 182 return last_sent_gesture_location_; 183 } 184 185 void SetCancelAfterNextGesture(bool cancel_after_next_gesture) { 186 cancel_after_next_gesture_ = cancel_after_next_gesture; 187 } 188 189 GestureEventData CreateGesture(EventType type) { 190 return GestureEventData(type, 191 0, 192 base::TimeTicks(), 193 touch_event_.GetX(0), 194 touch_event_.GetY(0), 195 1, 196 gfx::RectF(0, 0, 0, 0)); 197 } 198 199 private: 200 scoped_ptr<TouchDispositionGestureFilter> queue_; 201 bool cancel_after_next_gesture_; 202 MockMotionEvent touch_event_; 203 GestureEventDataPacket pending_gesture_packet_; 204 size_t sent_gesture_count_; 205 base::TimeTicks last_sent_gesture_time_; 206 GestureList sent_gestures_; 207 gfx::PointF last_sent_gesture_location_; 208}; 209 210TEST_F(TouchDispositionGestureFilterTest, BasicNoGestures) { 211 PressTouchPoint(1, 1); 212 EXPECT_FALSE(GesturesSent()); 213 214 MoveTouchPoint(0, 2, 2); 215 EXPECT_FALSE(GesturesSent()); 216 217 // No gestures should be dispatched by the ack, as the queued packets 218 // contained no gestures. 219 SendTouchConsumedAck(); 220 EXPECT_FALSE(GesturesSent()); 221 222 // Release the touch gesture. 223 ReleaseTouchPoint(); 224 SendTouchConsumedAck(); 225 SendTouchConsumedAck(); 226 EXPECT_FALSE(GesturesSent()); 227} 228 229TEST_F(TouchDispositionGestureFilterTest, BasicGestures) { 230 // An unconsumed touch's gesture should be sent. 231 PushGesture(ET_GESTURE_BEGIN); 232 PushGesture(ET_GESTURE_SCROLL_BEGIN); 233 PressTouchPoint(1, 1); 234 EXPECT_FALSE(GesturesSent()); 235 SendTouchNotConsumedAck(); 236 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_BEGIN, ET_GESTURE_SCROLL_BEGIN), 237 GetAndResetSentGestures())); 238 239 // Multiple gestures can be queued for a single event. 240 PushGesture(ET_SCROLL_FLING_START); 241 PushGesture(ET_SCROLL_FLING_CANCEL); 242 PushGesture(ET_GESTURE_END); 243 ReleaseTouchPoint(); 244 EXPECT_FALSE(GesturesSent()); 245 SendTouchNotConsumedAck(); 246 EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START, 247 ET_SCROLL_FLING_CANCEL, 248 ET_GESTURE_END), 249 GetAndResetSentGestures())); 250} 251 252TEST_F(TouchDispositionGestureFilterTest, BasicGesturesConsumed) { 253 // A consumed touch's gesture should not be sent. 254 PushGesture(ET_GESTURE_BEGIN); 255 PushGesture(ET_GESTURE_SCROLL_BEGIN); 256 PressTouchPoint(1, 1); 257 SendTouchConsumedAck(); 258 EXPECT_FALSE(GesturesSent()); 259 260 PushGesture(ET_GESTURE_SCROLL_UPDATE); 261 MoveTouchPoint(0, 2, 2); 262 SendTouchConsumedAck(); 263 EXPECT_FALSE(GesturesSent()); 264 265 PushGesture(ET_SCROLL_FLING_START); 266 PushGesture(ET_SCROLL_FLING_CANCEL); 267 PushGesture(ET_GESTURE_END); 268 ReleaseTouchPoint(); 269 SendTouchConsumedAck(); 270 EXPECT_FALSE(GesturesSent()); 271} 272 273TEST_F(TouchDispositionGestureFilterTest, ConsumedThenNotConsumed) { 274 // A consumed touch's gesture should not be sent. 275 PushGesture(ET_GESTURE_SCROLL_BEGIN); 276 PressTouchPoint(1, 1); 277 SendTouchConsumedAck(); 278 EXPECT_FALSE(GesturesSent()); 279 280 // Even if the subsequent touch is not consumed, continue dropping gestures. 281 PushGesture(ET_GESTURE_SCROLL_UPDATE); 282 MoveTouchPoint(0, 2, 2); 283 SendTouchNotConsumedAck(); 284 EXPECT_FALSE(GesturesSent()); 285 286 // Even if the subsequent touch had no consumer, continue dropping gestures. 287 PushGesture(ET_SCROLL_FLING_START); 288 ReleaseTouchPoint(); 289 SendTouchNotConsumedAck(); 290 EXPECT_FALSE(GesturesSent()); 291} 292 293TEST_F(TouchDispositionGestureFilterTest, NotConsumedThenConsumed) { 294 // A not consumed touch's gesture should be sent. 295 PushGesture(ET_GESTURE_SCROLL_BEGIN); 296 PressTouchPoint(1, 1); 297 SendTouchNotConsumedAck(); 298 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN), 299 GetAndResetSentGestures())); 300 301 // A newly consumed gesture should not be sent. 302 PushGesture(ET_GESTURE_PINCH_BEGIN); 303 PressTouchPoint(10, 10); 304 SendTouchConsumedAck(); 305 EXPECT_FALSE(GesturesSent()); 306 307 // And subsequent non-consumed pinch updates should not be sent. 308 PushGesture(ET_GESTURE_SCROLL_UPDATE); 309 PushGesture(ET_GESTURE_PINCH_UPDATE); 310 MoveTouchPoint(0, 2, 2); 311 SendTouchNotConsumedAck(); 312 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE), 313 GetAndResetSentGestures())); 314 315 // End events dispatched only when their start events were. 316 PushGesture(ET_GESTURE_PINCH_END); 317 ReleaseTouchPoint(); 318 SendTouchNotConsumedAck(); 319 EXPECT_FALSE(GesturesSent()); 320 321 PushGesture(ET_GESTURE_SCROLL_END); 322 ReleaseTouchPoint(); 323 SendTouchConsumedAck(); 324 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END), 325 GetAndResetSentGestures())); 326} 327 328TEST_F(TouchDispositionGestureFilterTest, ScrollAlternatelyConsumed) { 329 // A consumed touch's gesture should not be sent. 330 PushGesture(ET_GESTURE_SCROLL_BEGIN); 331 PressTouchPoint(1, 1); 332 SendTouchNotConsumedAck(); 333 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN), 334 GetAndResetSentGestures())); 335 336 for (size_t i = 0; i < 3; ++i) { 337 PushGesture(ET_GESTURE_SCROLL_UPDATE); 338 MoveTouchPoint(0, 2, 2); 339 SendTouchConsumedAck(); 340 EXPECT_FALSE(GesturesSent()); 341 342 PushGesture(ET_GESTURE_SCROLL_UPDATE); 343 MoveTouchPoint(0, 3, 3); 344 SendTouchNotConsumedAck(); 345 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE), 346 GetAndResetSentGestures())); 347 } 348 349 PushGesture(ET_GESTURE_SCROLL_END); 350 ReleaseTouchPoint(); 351 SendTouchConsumedAck(); 352 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END), 353 GetAndResetSentGestures())); 354} 355 356TEST_F(TouchDispositionGestureFilterTest, NotConsumedThenNoConsumer) { 357 // An unconsumed touch's gesture should be sent. 358 PushGesture(ET_GESTURE_SCROLL_BEGIN); 359 PressTouchPoint(1, 1); 360 SendTouchNotConsumedAck(); 361 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN), 362 GetAndResetSentGestures())); 363 364 // If the subsequent touch has no consumer (e.g., a secondary pointer is 365 // pressed but not on a touch handling rect), send the gesture. 366 PushGesture(ET_GESTURE_PINCH_BEGIN); 367 PressTouchPoint(2, 2); 368 SendTouchNotConsumedAck(); 369 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN), 370 GetAndResetSentGestures())); 371 372 // End events should be dispatched when their start events were, independent 373 // of the ack state. 374 PushGesture(ET_GESTURE_PINCH_END); 375 ReleaseTouchPoint(); 376 SendTouchConsumedAck(); 377 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END), 378 GetAndResetSentGestures())); 379 380 PushGesture(ET_GESTURE_SCROLL_END); 381 ReleaseTouchPoint(); 382 SendTouchConsumedAck(); 383 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END), 384 GetAndResetSentGestures())); 385} 386 387TEST_F(TouchDispositionGestureFilterTest, EndingEventsSent) { 388 PushGesture(ET_GESTURE_SCROLL_BEGIN); 389 PressTouchPoint(1, 1); 390 SendTouchNotConsumedAck(); 391 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN), 392 GetAndResetSentGestures())); 393 394 PushGesture(ET_GESTURE_PINCH_BEGIN); 395 PressTouchPoint(2, 2); 396 SendTouchNotConsumedAck(); 397 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN), 398 GetAndResetSentGestures())); 399 400 // Consuming the touchend event can't suppress the match end gesture. 401 PushGesture(ET_GESTURE_PINCH_END); 402 ReleaseTouchPoint(); 403 SendTouchConsumedAck(); 404 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END), 405 GetAndResetSentGestures())); 406 407 // But other events in the same packet are still suppressed. 408 PushGesture(ET_GESTURE_SCROLL_UPDATE); 409 PushGesture(ET_GESTURE_SCROLL_END); 410 ReleaseTouchPoint(); 411 SendTouchConsumedAck(); 412 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END), 413 GetAndResetSentGestures())); 414 415 // ET_GESTURE_SCROLL_END and ET_SCROLL_FLING_START behave the same in this 416 // regard. 417 PushGesture(ET_GESTURE_SCROLL_BEGIN); 418 PressTouchPoint(1, 1); 419 SendTouchNotConsumedAck(); 420 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN), 421 GetAndResetSentGestures())); 422 423 PushGesture(ET_SCROLL_FLING_START); 424 ReleaseTouchPoint(); 425 SendTouchConsumedAck(); 426 EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START), 427 GetAndResetSentGestures())); 428} 429 430TEST_F(TouchDispositionGestureFilterTest, EndingEventsNotSent) { 431 // Consuming a begin event ensures no end events are sent. 432 PushGesture(ET_GESTURE_SCROLL_BEGIN); 433 PressTouchPoint(1, 1); 434 SendTouchConsumedAck(); 435 EXPECT_FALSE(GesturesSent()); 436 437 PushGesture(ET_GESTURE_PINCH_BEGIN); 438 PressTouchPoint(2, 2); 439 SendTouchNotConsumedAck(); 440 EXPECT_FALSE(GesturesSent()); 441 442 PushGesture(ET_GESTURE_PINCH_END); 443 ReleaseTouchPoint(); 444 SendTouchNotConsumedAck(); 445 EXPECT_FALSE(GesturesSent()); 446 447 PushGesture(ET_GESTURE_SCROLL_END); 448 ReleaseTouchPoint(); 449 SendTouchNotConsumedAck(); 450 EXPECT_FALSE(GesturesSent()); 451} 452 453TEST_F(TouchDispositionGestureFilterTest, UpdateEventsSuppressedPerEvent) { 454 PushGesture(ET_GESTURE_SCROLL_BEGIN); 455 PressTouchPoint(1, 1); 456 SendTouchNotConsumedAck(); 457 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN), 458 GetAndResetSentGestures())); 459 460 // Consuming a single scroll or pinch update should suppress only that event. 461 PushGesture(ET_GESTURE_SCROLL_UPDATE); 462 MoveTouchPoint(0, 2, 2); 463 SendTouchConsumedAck(); 464 EXPECT_FALSE(GesturesSent()); 465 466 PushGesture(ET_GESTURE_PINCH_BEGIN); 467 PressTouchPoint(2, 2); 468 SendTouchNotConsumedAck(); 469 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN), 470 GetAndResetSentGestures())); 471 472 PushGesture(ET_GESTURE_PINCH_UPDATE); 473 MoveTouchPoint(1, 2, 3); 474 SendTouchConsumedAck(); 475 EXPECT_FALSE(GesturesSent()); 476 477 // Subsequent updates should not be affected. 478 PushGesture(ET_GESTURE_SCROLL_UPDATE); 479 MoveTouchPoint(0, 4, 4); 480 SendTouchNotConsumedAck(); 481 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE), 482 GetAndResetSentGestures())); 483 484 PushGesture(ET_GESTURE_PINCH_UPDATE); 485 MoveTouchPoint(0, 4, 5); 486 SendTouchNotConsumedAck(); 487 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_UPDATE), 488 GetAndResetSentGestures())); 489 490 PushGesture(ET_GESTURE_PINCH_END); 491 ReleaseTouchPoint(); 492 SendTouchConsumedAck(); 493 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END), 494 GetAndResetSentGestures())); 495 496 PushGesture(ET_GESTURE_SCROLL_END); 497 ReleaseTouchPoint(); 498 SendTouchConsumedAck(); 499 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END), 500 GetAndResetSentGestures())); 501} 502 503TEST_F(TouchDispositionGestureFilterTest, UpdateEventsDependOnBeginEvents) { 504 PushGesture(ET_GESTURE_SCROLL_BEGIN); 505 PressTouchPoint(1, 1); 506 SendTouchConsumedAck(); 507 EXPECT_FALSE(GesturesSent()); 508 509 // Scroll and pinch gestures depend on the scroll begin gesture being 510 // dispatched. 511 PushGesture(ET_GESTURE_SCROLL_UPDATE); 512 MoveTouchPoint(0, 2, 2); 513 SendTouchNotConsumedAck(); 514 EXPECT_FALSE(GesturesSent()); 515 516 PushGesture(ET_GESTURE_PINCH_BEGIN); 517 PressTouchPoint(2, 2); 518 SendTouchNotConsumedAck(); 519 EXPECT_FALSE(GesturesSent()); 520 521 PushGesture(ET_GESTURE_PINCH_UPDATE); 522 MoveTouchPoint(1, 2, 3); 523 SendTouchConsumedAck(); 524 EXPECT_FALSE(GesturesSent()); 525 526 PushGesture(ET_GESTURE_PINCH_END); 527 ReleaseTouchPoint(); 528 SendTouchNotConsumedAck(); 529 EXPECT_FALSE(GesturesSent()); 530 531 PushGesture(ET_GESTURE_SCROLL_END); 532 ReleaseTouchPoint(); 533 SendTouchNotConsumedAck(); 534 EXPECT_FALSE(GesturesSent()); 535} 536 537TEST_F(TouchDispositionGestureFilterTest, MultipleTouchSequences) { 538 // Queue two touch-to-gestures sequences. 539 PushGesture(ET_GESTURE_TAP_DOWN); 540 PressTouchPoint(1, 1); 541 PushGesture(ET_GESTURE_TAP); 542 ReleaseTouchPoint(); 543 PushGesture(ET_GESTURE_SCROLL_BEGIN); 544 PressTouchPoint(1, 1); 545 PushGesture(ET_GESTURE_SCROLL_END); 546 ReleaseTouchPoint(); 547 548 // The first gesture sequence should not be allowed. 549 SendTouchConsumedAck(); 550 SendTouchNotConsumedAck(); 551 EXPECT_FALSE(GesturesSent()); 552 553 // The subsequent sequence should "reset" allowance. 554 SendTouchNotConsumedAck(); 555 SendTouchNotConsumedAck(); 556 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN, 557 ET_GESTURE_SCROLL_END), 558 GetAndResetSentGestures())); 559} 560 561TEST_F(TouchDispositionGestureFilterTest, FlingCancelledOnNewTouchSequence) { 562 // Simulate a fling. 563 PushGesture(ET_GESTURE_TAP_DOWN); 564 PushGesture(ET_GESTURE_SCROLL_BEGIN); 565 PressTouchPoint(1, 1); 566 SendTouchNotConsumedAck(); 567 EXPECT_TRUE(GesturesMatch( 568 Gestures( 569 ET_GESTURE_TAP_DOWN, ET_GESTURE_TAP_CANCEL, ET_GESTURE_SCROLL_BEGIN), 570 GetAndResetSentGestures())); 571 PushGesture(ET_SCROLL_FLING_START); 572 ReleaseTouchPoint(); 573 SendTouchNotConsumedAck(); 574 EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START), 575 GetAndResetSentGestures())); 576 577 // A new touch sequence should cancel the outstanding fling. 578 PressTouchPoint(1, 1); 579 SendTouchNotConsumedAck(); 580 EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_CANCEL), 581 GetAndResetSentGestures())); 582 EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime()); 583 EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1)); 584 ReleaseTouchPoint(); 585 SendTouchNotConsumedAck(); 586 EXPECT_FALSE(GesturesSent()); 587} 588 589TEST_F(TouchDispositionGestureFilterTest, ScrollEndedOnTouchReleaseIfNoFling) { 590 // Simulate a scroll. 591 PushGesture(ET_GESTURE_TAP_DOWN); 592 PushGesture(ET_GESTURE_SCROLL_BEGIN); 593 PressTouchPoint(1, 1); 594 SendTouchNotConsumedAck(); 595 EXPECT_TRUE(GesturesMatch( 596 Gestures( 597 ET_GESTURE_TAP_DOWN, ET_GESTURE_TAP_CANCEL, ET_GESTURE_SCROLL_BEGIN), 598 GetAndResetSentGestures())); 599 ReleaseTouchPoint(); 600 SendTouchNotConsumedAck(); 601 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END), 602 GetAndResetSentGestures())); 603 EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime()); 604 EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1)); 605} 606 607TEST_F(TouchDispositionGestureFilterTest, ScrollEndedOnNewTouchSequence) { 608 // Simulate a scroll. 609 PushGesture(ET_GESTURE_TAP_DOWN); 610 PushGesture(ET_GESTURE_SCROLL_BEGIN); 611 PressTouchPoint(1, 1); 612 SendTouchNotConsumedAck(); 613 EXPECT_TRUE(GesturesMatch( 614 Gestures( 615 ET_GESTURE_TAP_DOWN, ET_GESTURE_TAP_CANCEL, ET_GESTURE_SCROLL_BEGIN), 616 GetAndResetSentGestures())); 617 618 // A new touch sequence should end the outstanding scroll. 619 ResetTouchPoints(); 620 PressTouchPoint(2, 3); 621 SendTouchConsumedAck(); 622 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END), 623 GetAndResetSentGestures())); 624 EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime()); 625 EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(2, 3)); 626} 627 628TEST_F(TouchDispositionGestureFilterTest, FlingCancelledOnScrollBegin) { 629 // Simulate a fling sequence. 630 PushGesture(ET_GESTURE_TAP_DOWN); 631 PushGesture(ET_GESTURE_SCROLL_BEGIN); 632 PushGesture(ET_SCROLL_FLING_START); 633 PressTouchPoint(1, 1); 634 SendTouchNotConsumedAck(); 635 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN, 636 ET_GESTURE_TAP_CANCEL, 637 ET_GESTURE_SCROLL_BEGIN, 638 ET_SCROLL_FLING_START), 639 GetAndResetSentGestures())); 640 641 // The new fling should cancel the preceding one. 642 PushGesture(ET_GESTURE_SCROLL_BEGIN); 643 PushGesture(ET_SCROLL_FLING_START); 644 ReleaseTouchPoint(); 645 SendTouchNotConsumedAck(); 646 EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_CANCEL, 647 ET_GESTURE_SCROLL_BEGIN, 648 ET_SCROLL_FLING_START), 649 GetAndResetSentGestures())); 650} 651 652TEST_F(TouchDispositionGestureFilterTest, FlingNotCancelledIfGFCEventReceived) { 653 // Simulate a fling that is started then cancelled. 654 PushGesture(ET_GESTURE_SCROLL_BEGIN); 655 PressTouchPoint(1, 1); 656 SendTouchNotConsumedAck(); 657 PushGesture(ET_SCROLL_FLING_START); 658 MoveTouchPoint(0, 2, 3); 659 SendTouchNotConsumedAck(); 660 PushGesture(ET_SCROLL_FLING_CANCEL); 661 ReleaseTouchPoint(); 662 SendTouchNotConsumedAck(); 663 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN, 664 ET_SCROLL_FLING_START, 665 ET_SCROLL_FLING_CANCEL), 666 GetAndResetSentGestures())); 667 EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(2, 3)); 668 669 // A new touch sequence will not inject a ET_SCROLL_FLING_CANCEL, as the fling 670 // has already been cancelled. 671 PressTouchPoint(1, 1); 672 SendTouchNotConsumedAck(); 673 ReleaseTouchPoint(); 674 SendTouchNotConsumedAck(); 675 EXPECT_FALSE(GesturesSent()); 676} 677 678TEST_F(TouchDispositionGestureFilterTest, TapCancelledWhenScrollBegins) { 679 PushGesture(ET_GESTURE_TAP_DOWN); 680 PressTouchPoint(1, 1); 681 SendTouchNotConsumedAck(); 682 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN), 683 GetAndResetSentGestures())); 684 685 // If the subsequent touch turns into a scroll, the tap should be cancelled. 686 PushGesture(ET_GESTURE_SCROLL_BEGIN); 687 MoveTouchPoint(0, 2, 2); 688 SendTouchNotConsumedAck(); 689 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL, 690 ET_GESTURE_SCROLL_BEGIN), 691 GetAndResetSentGestures())); 692} 693 694TEST_F(TouchDispositionGestureFilterTest, TapCancelledWhenTouchConsumed) { 695 PushGesture(ET_GESTURE_TAP_DOWN); 696 PressTouchPoint(1, 1); 697 SendTouchNotConsumedAck(); 698 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN), 699 GetAndResetSentGestures())); 700 701 // If the subsequent touch is consumed, the tap should be cancelled. 702 PushGesture(ET_GESTURE_SCROLL_BEGIN); 703 MoveTouchPoint(0, 2, 2); 704 SendTouchConsumedAck(); 705 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL), 706 GetAndResetSentGestures())); 707 EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(2, 2)); 708} 709 710TEST_F(TouchDispositionGestureFilterTest, 711 TapNotCancelledIfTapEndingEventReceived) { 712 PushGesture(ET_GESTURE_TAP_DOWN); 713 PressTouchPoint(1, 1); 714 SendTouchNotConsumedAck(); 715 EXPECT_TRUE( 716 GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN), GetAndResetSentGestures())); 717 718 PushGesture(ET_GESTURE_TAP); 719 ReleaseTouchPoint(); 720 SendTouchNotConsumedAck(); 721 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS, ET_GESTURE_TAP), 722 GetAndResetSentGestures())); 723 724 // The tap should not be cancelled as it was terminated by a |ET_GESTURE_TAP|. 725 PressTouchPoint(2, 2); 726 SendTouchConsumedAck(); 727 EXPECT_FALSE(GesturesSent()); 728} 729 730TEST_F(TouchDispositionGestureFilterTest, TimeoutGestures) { 731 // If the sequence is allowed, and there are no preceding gestures, the 732 // timeout gestures should be forwarded immediately. 733 PushGesture(ET_GESTURE_TAP_DOWN); 734 PressTouchPoint(1, 1); 735 SendTouchNotConsumedAck(); 736 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN), 737 GetAndResetSentGestures())); 738 739 SendTimeoutGesture(ET_GESTURE_SHOW_PRESS); 740 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS), 741 GetAndResetSentGestures())); 742 743 SendTimeoutGesture(ET_GESTURE_LONG_PRESS); 744 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_LONG_PRESS), 745 GetAndResetSentGestures())); 746 747 PushGesture(ET_GESTURE_LONG_TAP); 748 ReleaseTouchPoint(); 749 SendTouchNotConsumedAck(); 750 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL, 751 ET_GESTURE_LONG_TAP), 752 GetAndResetSentGestures())); 753 754 // If the sequence is disallowed, and there are no preceding gestures, the 755 // timeout gestures should be dropped immediately. 756 PushGesture(ET_GESTURE_TAP_DOWN); 757 PressTouchPoint(1, 1); 758 SendTouchConsumedAck(); 759 EXPECT_FALSE(GesturesSent()); 760 761 SendTimeoutGesture(ET_GESTURE_SHOW_PRESS); 762 EXPECT_FALSE(GesturesSent()); 763 ReleaseTouchPoint(); 764 SendTouchNotConsumedAck(); 765 766 // If the sequence has a pending ack, the timeout gestures should 767 // remain queued until the ack is received. 768 PushGesture(ET_GESTURE_TAP_DOWN); 769 PressTouchPoint(1, 1); 770 EXPECT_FALSE(GesturesSent()); 771 772 SendTimeoutGesture(ET_GESTURE_LONG_PRESS); 773 EXPECT_FALSE(GesturesSent()); 774 775 SendTouchNotConsumedAck(); 776 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN, 777 ET_GESTURE_LONG_PRESS), 778 GetAndResetSentGestures())); 779} 780 781TEST_F(TouchDispositionGestureFilterTest, SpuriousAcksIgnored) { 782 // Acks received when the queue is empty will be safely ignored. 783 ASSERT_TRUE(IsEmpty()); 784 SendTouchConsumedAck(); 785 EXPECT_FALSE(GesturesSent()); 786 787 PushGesture(ET_GESTURE_SCROLL_BEGIN); 788 PressTouchPoint(1, 1); 789 PushGesture(ET_GESTURE_SCROLL_UPDATE); 790 MoveTouchPoint(0, 3,3); 791 SendTouchNotConsumedAck(); 792 SendTouchNotConsumedAck(); 793 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN, 794 ET_GESTURE_SCROLL_UPDATE), 795 GetAndResetSentGestures())); 796 797 // Even if all packets have been dispatched, the filter may not be empty as 798 // there could be follow-up timeout events. Spurious acks in such cases 799 // should also be safely ignored. 800 ASSERT_FALSE(IsEmpty()); 801 SendTouchConsumedAck(); 802 EXPECT_FALSE(GesturesSent()); 803} 804 805TEST_F(TouchDispositionGestureFilterTest, PacketWithInvalidTypeIgnored) { 806 GestureEventDataPacket packet; 807 EXPECT_EQ(TouchDispositionGestureFilter::INVALID_PACKET_TYPE, 808 SendGesturePacket(packet)); 809 EXPECT_TRUE(IsEmpty()); 810} 811 812TEST_F(TouchDispositionGestureFilterTest, PacketsWithInvalidOrderIgnored) { 813 EXPECT_EQ(TouchDispositionGestureFilter::INVALID_PACKET_ORDER, 814 SendTimeoutGesture(ET_GESTURE_SHOW_PRESS)); 815 EXPECT_TRUE(IsEmpty()); 816} 817 818TEST_F(TouchDispositionGestureFilterTest, ConsumedTouchCancel) { 819 // An unconsumed touch's gesture should be sent. 820 PushGesture(ET_GESTURE_TAP_DOWN); 821 PressTouchPoint(1, 1); 822 EXPECT_FALSE(GesturesSent()); 823 SendTouchNotConsumedAck(); 824 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN), 825 GetAndResetSentGestures())); 826 827 PushGesture(ET_GESTURE_TAP_CANCEL); 828 PushGesture(ET_GESTURE_SCROLL_END); 829 CancelTouchPoint(); 830 EXPECT_FALSE(GesturesSent()); 831 SendTouchConsumedAck(); 832 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL, 833 ET_GESTURE_SCROLL_END), 834 GetAndResetSentGestures())); 835} 836 837TEST_F(TouchDispositionGestureFilterTest, TimeoutEventAfterRelease) { 838 PressTouchPoint(1, 1); 839 SendTouchNotConsumedAck(); 840 EXPECT_FALSE(GesturesSent()); 841 PushGesture(ET_GESTURE_TAP_DOWN); 842 PushGesture(ET_GESTURE_TAP_UNCONFIRMED); 843 ReleaseTouchPoint(); 844 SendTouchNotConsumedAck(); 845 EXPECT_TRUE( 846 GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN, ET_GESTURE_TAP_UNCONFIRMED), 847 GetAndResetSentGestures())); 848 849 SendTimeoutGesture(ET_GESTURE_TAP); 850 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS, ET_GESTURE_TAP), 851 GetAndResetSentGestures())); 852} 853 854TEST_F(TouchDispositionGestureFilterTest, ShowPressInsertedBeforeTap) { 855 PushGesture(ET_GESTURE_TAP_DOWN); 856 PressTouchPoint(1, 1); 857 SendTouchNotConsumedAck(); 858 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN), 859 GetAndResetSentGestures())); 860 861 SendTimeoutGesture(ET_GESTURE_TAP_UNCONFIRMED); 862 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_UNCONFIRMED), 863 GetAndResetSentGestures())); 864 865 PushGesture(ET_GESTURE_TAP); 866 ReleaseTouchPoint(); 867 SendTouchNotConsumedAck(); 868 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS, 869 ET_GESTURE_TAP), 870 GetAndResetSentGestures())); 871} 872 873TEST_F(TouchDispositionGestureFilterTest, ShowPressNotInsertedIfAlreadySent) { 874 PushGesture(ET_GESTURE_TAP_DOWN); 875 PressTouchPoint(1, 1); 876 SendTouchNotConsumedAck(); 877 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN), 878 GetAndResetSentGestures())); 879 880 SendTimeoutGesture(ET_GESTURE_SHOW_PRESS); 881 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS), 882 GetAndResetSentGestures())); 883 884 PushGesture(ET_GESTURE_TAP); 885 ReleaseTouchPoint(); 886 SendTouchNotConsumedAck(); 887 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP), 888 GetAndResetSentGestures())); 889} 890 891TEST_F(TouchDispositionGestureFilterTest, TapAndScrollCancelledOnTouchCancel) { 892 PushGesture(ET_GESTURE_TAP_DOWN); 893 PressTouchPoint(1, 1); 894 SendTouchNotConsumedAck(); 895 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN), 896 GetAndResetSentGestures())); 897 898 // A cancellation motion event should cancel the tap. 899 CancelTouchPoint(); 900 SendTouchNotConsumedAck(); 901 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL), 902 GetAndResetSentGestures())); 903 EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime()); 904 EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1)); 905 906 PushGesture(ET_GESTURE_SCROLL_BEGIN); 907 PressTouchPoint(1, 1); 908 SendTouchNotConsumedAck(); 909 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN), 910 GetAndResetSentGestures())); 911 912 // A cancellation motion event should end the scroll, even if the touch was 913 // consumed. 914 CancelTouchPoint(); 915 SendTouchConsumedAck(); 916 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END), 917 GetAndResetSentGestures())); 918 EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime()); 919 EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1)); 920} 921 922TEST_F(TouchDispositionGestureFilterTest, 923 ConsumedScrollUpdateMakesFlingScrollEnd) { 924 // A consumed touch's gesture should not be sent. 925 PushGesture(ET_GESTURE_BEGIN); 926 PushGesture(ET_GESTURE_SCROLL_BEGIN); 927 PressTouchPoint(1, 1); 928 SendTouchNotConsumedAck(); 929 930 EXPECT_TRUE( 931 GesturesMatch(Gestures(ET_GESTURE_BEGIN, ET_GESTURE_SCROLL_BEGIN), 932 GetAndResetSentGestures())); 933 934 PushGesture(ET_GESTURE_SCROLL_UPDATE); 935 MoveTouchPoint(0, 2, 2); 936 SendTouchConsumedAck(); 937 EXPECT_FALSE(GesturesSent()); 938 939 PushGesture(ET_SCROLL_FLING_START); 940 PushGesture(ET_SCROLL_FLING_CANCEL); 941 PushGesture(ET_GESTURE_END); 942 ReleaseTouchPoint(); 943 SendTouchNotConsumedAck(); 944 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_END, ET_GESTURE_SCROLL_END), 945 GetAndResetSentGestures())); 946 EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(2, 2)); 947 948 PushGesture(ET_GESTURE_BEGIN); 949 PushGesture(ET_GESTURE_SCROLL_BEGIN); 950 PressTouchPoint(1, 1); 951 SendTouchNotConsumedAck(); 952 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_BEGIN, ET_GESTURE_SCROLL_BEGIN), 953 GetAndResetSentGestures())); 954} 955 956TEST_F(TouchDispositionGestureFilterTest, TapCancelledOnTouchCancel) { 957 PushGesture(ET_GESTURE_TAP_DOWN); 958 PressTouchPoint(1, 1); 959 SendTouchNotConsumedAck(); 960 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN), 961 GetAndResetSentGestures())); 962 963 // A cancellation motion event should cancel the tap. 964 CancelTouchPoint(); 965 SendTouchNotConsumedAck(); 966 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL), 967 GetAndResetSentGestures())); 968 EXPECT_EQ(CurrentTouchTime(), LastSentGestureTime()); 969 EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1)); 970} 971 972// Test that a GestureEvent whose dispatch causes a cancel event to be fired 973// won't cause a crash. 974TEST_F(TouchDispositionGestureFilterTest, TestCancelMidGesture) { 975 SetCancelAfterNextGesture(true); 976 PushGesture(ET_GESTURE_TAP_DOWN); 977 PressTouchPoint(1, 1); 978 SendTouchNotConsumedAck(); 979 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN, 980 ET_GESTURE_TAP_CANCEL), 981 GetAndResetSentGestures())); 982 EXPECT_EQ(LastSentGestureLocation(), gfx::PointF(1, 1)); 983} 984 985// Test that a MultiFingerSwipe event is dispatched when appropriate. 986TEST_F(TouchDispositionGestureFilterTest, TestAllowedMultiFingerSwipe) { 987 PushGesture(ET_GESTURE_SCROLL_BEGIN); 988 PressTouchPoint(1, 1); 989 SendTouchNotConsumedAck(); 990 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN), 991 GetAndResetSentGestures())); 992 993 PushGesture(ET_GESTURE_PINCH_BEGIN); 994 PressTouchPoint(1, 1); 995 SendTouchNotConsumedAck(); 996 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN), 997 GetAndResetSentGestures())); 998 999 PushGesture(ET_GESTURE_SWIPE); 1000 PressTouchPoint(1, 1); 1001 SendTouchNotConsumedAck(); 1002 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SWIPE), 1003 GetAndResetSentGestures())); 1004} 1005 1006 // Test that a MultiFingerSwipe event is dispatched when appropriate. 1007TEST_F(TouchDispositionGestureFilterTest, TestDisallowedMultiFingerSwipe) { 1008 PressTouchPoint(1, 1); 1009 SendTouchNotConsumedAck(); 1010 1011 PushGesture(ET_GESTURE_SCROLL_BEGIN); 1012 MoveTouchPoint(0, 0, 0); 1013 SendTouchConsumedAck(); 1014 EXPECT_FALSE(GesturesSent()); 1015 1016 PushGesture(ET_GESTURE_PINCH_BEGIN); 1017 PressTouchPoint(1, 1); 1018 SendTouchNotConsumedAck(); 1019 EXPECT_FALSE(GesturesSent()); 1020 1021 PushGesture(ET_GESTURE_SWIPE); 1022 PressTouchPoint(1, 1); 1023 SendTouchNotConsumedAck(); 1024 EXPECT_FALSE(GesturesSent()); 1025} 1026 1027TEST_F(TouchDispositionGestureFilterTest, TapCancelOnSecondFingerDown) { 1028 PushGesture(ET_GESTURE_TAP_DOWN); 1029 PressTouchPoint(1, 1); 1030 SendTouchNotConsumedAck(); 1031 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN), 1032 GetAndResetSentGestures())); 1033 1034 PressTouchPoint(1, 1); 1035 SendTouchNotConsumedAck(); 1036 EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL), 1037 GetAndResetSentGestures())); 1038} 1039 1040} // namespace ui 1041