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