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