1 // Copyright 2013 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.
5 #include "base/basictypes.h"
6 #include "base/logging.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/message_loop/message_loop.h"
9 #include "content/browser/renderer_host/input/timeout_monitor.h"
10 #include "content/browser/renderer_host/input/touch_event_queue.h"
11 #include "content/common/input/synthetic_web_input_event_builders.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 #include "third_party/WebKit/public/web/WebInputEvent.h"
15 using blink::WebGestureEvent;
16 using blink::WebInputEvent;
17 using blink::WebTouchEvent;
18 using blink::WebTouchPoint;
23 const double kMinSecondsBetweenThrottledTouchmoves = 0.2;
25 base::TimeDelta DefaultTouchTimeoutDelay() {
26 return base::TimeDelta::FromMilliseconds(1);
30 class TouchEventQueueTest : public testing::Test,
31 public TouchEventQueueClient {
34 : sent_event_count_(0),
35 acked_event_count_(0),
36 last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN),
38 slop_includes_boundary_(true),
39 touch_scrolling_mode_(TouchEventQueue::TOUCH_SCROLLING_MODE_DEFAULT) {}
41 virtual ~TouchEventQueueTest() {}
44 virtual void SetUp() OVERRIDE { ResetQueueWithConfig(CreateConfig()); }
46 virtual void TearDown() OVERRIDE {
50 // TouchEventQueueClient
51 virtual void SendTouchEventImmediately(
52 const TouchEventWithLatencyInfo& event) OVERRIDE {
54 last_sent_event_ = event.event;
56 SendTouchEventAck(*sync_ack_result_.Pass());
59 virtual void OnTouchEventAck(
60 const TouchEventWithLatencyInfo& event,
61 InputEventAckState ack_result) OVERRIDE {
63 last_acked_event_ = event.event;
64 last_acked_event_state_ = ack_result;
65 if (followup_touch_event_) {
66 scoped_ptr<WebTouchEvent> followup_touch_event =
67 followup_touch_event_.Pass();
68 SendTouchEvent(*followup_touch_event);
70 if (followup_gesture_event_) {
71 scoped_ptr<WebGestureEvent> followup_gesture_event =
72 followup_gesture_event_.Pass();
73 queue_->OnGestureScrollEvent(
74 GestureEventWithLatencyInfo(*followup_gesture_event,
80 TouchEventQueue::Config CreateConfig() {
81 TouchEventQueue::Config config;
82 config.touch_scrolling_mode = touch_scrolling_mode_;
83 config.touchmove_slop_suppression_length_dips = slop_length_dips_;
84 config.touchmove_slop_suppression_region_includes_boundary =
85 slop_includes_boundary_;
89 void SetTouchScrollingMode(TouchEventQueue::TouchScrollingMode mode) {
90 touch_scrolling_mode_ = mode;
91 ResetQueueWithConfig(CreateConfig());
94 void SetUpForTouchMoveSlopTesting(double slop_length_dips,
95 bool slop_includes_boundary) {
96 slop_length_dips_ = slop_length_dips;
97 slop_includes_boundary_ = slop_includes_boundary;
98 ResetQueueWithConfig(CreateConfig());
101 void SetUpForTimeoutTesting(base::TimeDelta timeout_delay) {
102 TouchEventQueue::Config config = CreateConfig();
103 config.touch_ack_timeout_delay = timeout_delay;
104 config.touch_ack_timeout_supported = true;
105 ResetQueueWithConfig(config);
108 void SendTouchEvent(const WebTouchEvent& event) {
109 queue_->QueueEvent(TouchEventWithLatencyInfo(event, ui::LatencyInfo()));
112 void SendGestureEvent(WebInputEvent::Type type) {
113 WebGestureEvent event;
115 queue_->OnGestureScrollEvent(
116 GestureEventWithLatencyInfo(event, ui::LatencyInfo()));
119 void SendTouchEventAck(InputEventAckState ack_result) {
120 queue_->ProcessTouchAck(ack_result, ui::LatencyInfo());
123 void SendGestureEventAck(WebInputEvent::Type type,
124 InputEventAckState ack_result) {
125 blink::WebGestureEvent gesture_event;
126 gesture_event.type = type;
127 GestureEventWithLatencyInfo event(gesture_event, ui::LatencyInfo());
128 queue_->OnGestureEventAck(event, ack_result);
131 void SetFollowupEvent(const WebTouchEvent& event) {
132 followup_touch_event_.reset(new WebTouchEvent(event));
135 void SetFollowupEvent(const WebGestureEvent& event) {
136 followup_gesture_event_.reset(new WebGestureEvent(event));
139 void SetSyncAckResult(InputEventAckState sync_ack_result) {
140 sync_ack_result_.reset(new InputEventAckState(sync_ack_result));
143 void PressTouchPoint(float x, float y) {
144 touch_event_.PressPoint(x, y);
148 void MoveTouchPoint(int index, float x, float y) {
149 touch_event_.MovePoint(index, x, y);
153 void MoveTouchPoints(int index0,
159 touch_event_.MovePoint(index0, x0, y0);
160 touch_event_.MovePoint(index1, x1, y1);
164 void ReleaseTouchPoint(int index) {
165 touch_event_.ReleasePoint(index);
169 void CancelTouchPoint(int index) {
170 touch_event_.CancelPoint(index);
174 void AdvanceTouchTime(double seconds) {
175 touch_event_.timeStampSeconds += seconds;
178 size_t GetAndResetAckedEventCount() {
179 size_t count = acked_event_count_;
180 acked_event_count_ = 0;
184 size_t GetAndResetSentEventCount() {
185 size_t count = sent_event_count_;
186 sent_event_count_ = 0;
190 bool IsPendingAckTouchStart() const {
191 return queue_->IsPendingAckTouchStart();
194 void OnHasTouchEventHandlers(bool has_handlers) {
195 queue_->OnHasTouchEventHandlers(has_handlers);
198 void SetAckTimeoutDisabled() { queue_->SetAckTimeoutEnabled(false); }
200 bool IsTimeoutEnabled() const { return queue_->ack_timeout_enabled(); }
202 bool IsTimeoutRunning() const { return queue_->IsTimeoutRunningForTesting(); }
204 bool HasPendingAsyncTouchMove() const {
205 return queue_->HasPendingAsyncTouchMoveForTesting();
208 size_t queued_event_count() const {
209 return queue_->size();
212 const WebTouchEvent& latest_event() const {
213 return queue_->GetLatestEventForTesting().event;
216 const WebTouchEvent& acked_event() const {
217 return last_acked_event_;
220 const WebTouchEvent& sent_event() const {
221 return last_sent_event_;
224 InputEventAckState acked_event_state() const {
225 return last_acked_event_state_;
228 static void RunTasksAndWait(base::TimeDelta delay) {
229 base::MessageLoop::current()->PostDelayedTask(
230 FROM_HERE, base::MessageLoop::QuitClosure(), delay);
231 base::MessageLoop::current()->Run();
235 void SendTouchEvent() {
236 SendTouchEvent(touch_event_);
237 touch_event_.ResetPoints();
240 void ResetQueueWithConfig(const TouchEventQueue::Config& config) {
241 queue_.reset(new TouchEventQueue(this, config));
242 queue_->OnHasTouchEventHandlers(true);
245 scoped_ptr<TouchEventQueue> queue_;
246 size_t sent_event_count_;
247 size_t acked_event_count_;
248 WebTouchEvent last_sent_event_;
249 WebTouchEvent last_acked_event_;
250 InputEventAckState last_acked_event_state_;
251 SyntheticWebTouchEvent touch_event_;
252 scoped_ptr<WebTouchEvent> followup_touch_event_;
253 scoped_ptr<WebGestureEvent> followup_gesture_event_;
254 scoped_ptr<InputEventAckState> sync_ack_result_;
255 double slop_length_dips_;
256 bool slop_includes_boundary_;
257 TouchEventQueue::TouchScrollingMode touch_scrolling_mode_;
258 base::MessageLoopForUI message_loop_;
262 // Tests that touch-events are queued properly.
263 TEST_F(TouchEventQueueTest, Basic) {
264 PressTouchPoint(1, 1);
265 EXPECT_EQ(1U, queued_event_count());
266 EXPECT_EQ(1U, GetAndResetSentEventCount());
268 // The second touch should not be sent since one is already in queue.
269 MoveTouchPoint(0, 5, 5);
270 EXPECT_EQ(2U, queued_event_count());
271 EXPECT_EQ(0U, GetAndResetSentEventCount());
273 // Receive an ACK for the first touch-event.
274 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
275 EXPECT_EQ(1U, queued_event_count());
276 EXPECT_EQ(1U, GetAndResetSentEventCount());
277 EXPECT_EQ(1U, GetAndResetAckedEventCount());
278 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
279 EXPECT_TRUE(acked_event().cancelable);
281 // Receive an ACK for the second touch-event.
282 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
283 EXPECT_EQ(0U, queued_event_count());
284 EXPECT_EQ(0U, GetAndResetSentEventCount());
285 EXPECT_EQ(1U, GetAndResetAckedEventCount());
286 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
287 EXPECT_TRUE(acked_event().cancelable);
290 // Tests that the touch-queue is emptied if a page stops listening for touch
292 TEST_F(TouchEventQueueTest, QueueFlushedWhenHandlersRemoved) {
293 OnHasTouchEventHandlers(true);
294 EXPECT_EQ(0U, queued_event_count());
295 EXPECT_EQ(0U, GetAndResetSentEventCount());
297 // Send a touch-press event.
298 PressTouchPoint(1, 1);
299 EXPECT_EQ(1U, GetAndResetSentEventCount());
301 ReleaseTouchPoint(0);
303 // Events will be queued until the first sent event is ack'ed.
304 for (int i = 5; i < 15; ++i) {
305 PressTouchPoint(1, 1);
306 MoveTouchPoint(0, i, i);
307 ReleaseTouchPoint(0);
309 EXPECT_EQ(32U, queued_event_count());
310 EXPECT_EQ(0U, GetAndResetSentEventCount());
312 // Receive an ACK for the first touch-event. One of the queued touch-event
313 // should be forwarded.
314 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
315 EXPECT_EQ(31U, queued_event_count());
316 EXPECT_EQ(1U, GetAndResetSentEventCount());
317 EXPECT_EQ(1U, GetAndResetAckedEventCount());
318 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
320 // Flush the queue. The touch-event queue should now be emptied, but none of
321 // the queued touch-events should be sent to the renderer.
322 OnHasTouchEventHandlers(false);
323 EXPECT_EQ(0U, queued_event_count());
324 EXPECT_EQ(0U, GetAndResetSentEventCount());
325 EXPECT_EQ(31U, GetAndResetAckedEventCount());
328 // Tests that addition of a touch handler during a touch sequence will not cause
329 // the remaining sequence to be forwarded.
330 TEST_F(TouchEventQueueTest, ActiveSequenceNotForwardedWhenHandlersAdded) {
331 OnHasTouchEventHandlers(false);
333 // Send a touch-press event while there is no handler.
334 PressTouchPoint(1, 1);
335 EXPECT_EQ(1U, GetAndResetAckedEventCount());
336 EXPECT_EQ(0U, GetAndResetSentEventCount());
337 EXPECT_EQ(0U, queued_event_count());
339 OnHasTouchEventHandlers(true);
341 // The remaining touch sequence should not be forwarded.
342 MoveTouchPoint(0, 5, 5);
343 ReleaseTouchPoint(0);
344 EXPECT_EQ(2U, GetAndResetAckedEventCount());
345 EXPECT_EQ(0U, GetAndResetSentEventCount());
346 EXPECT_EQ(0U, queued_event_count());
348 // A new touch sequence should resume forwarding.
349 PressTouchPoint(1, 1);
350 EXPECT_EQ(1U, queued_event_count());
351 EXPECT_EQ(1U, GetAndResetSentEventCount());
354 // Tests that removal of a touch handler during a touch sequence will prevent
355 // the remaining sequence from being forwarded, even if another touch handler is
356 // registered during the same touch sequence.
357 TEST_F(TouchEventQueueTest, ActiveSequenceDroppedWhenHandlersRemoved) {
358 // Send a touch-press event.
359 PressTouchPoint(1, 1);
360 EXPECT_EQ(1U, GetAndResetSentEventCount());
361 EXPECT_EQ(1U, queued_event_count());
363 // Queue a touch-move event.
364 MoveTouchPoint(0, 5, 5);
365 EXPECT_EQ(2U, queued_event_count());
366 EXPECT_EQ(0U, GetAndResetAckedEventCount());
367 EXPECT_EQ(0U, GetAndResetSentEventCount());
369 // Touch handle deregistration should flush the queue.
370 OnHasTouchEventHandlers(false);
371 EXPECT_EQ(2U, GetAndResetAckedEventCount());
372 EXPECT_EQ(0U, queued_event_count());
374 // The ack should be ignored as the touch queue is now empty.
375 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
376 EXPECT_EQ(0U, GetAndResetAckedEventCount());
377 EXPECT_EQ(0U, queued_event_count());
379 // Events should be dropped while there is no touch handler.
380 MoveTouchPoint(0, 10, 10);
381 EXPECT_EQ(0U, queued_event_count());
382 EXPECT_EQ(1U, GetAndResetAckedEventCount());
383 EXPECT_EQ(0U, GetAndResetSentEventCount());
385 // Simulate touch handler registration in the middle of a touch sequence.
386 OnHasTouchEventHandlers(true);
388 // The touch end for the interrupted sequence should be dropped.
389 ReleaseTouchPoint(0);
390 EXPECT_EQ(0U, queued_event_count());
391 EXPECT_EQ(1U, GetAndResetAckedEventCount());
392 EXPECT_EQ(0U, GetAndResetSentEventCount());
394 // A new touch sequence should be forwarded properly.
395 PressTouchPoint(1, 1);
396 EXPECT_EQ(1U, queued_event_count());
397 EXPECT_EQ(1U, GetAndResetSentEventCount());
400 // Tests that touch-events are coalesced properly in the queue.
401 TEST_F(TouchEventQueueTest, Coalesce) {
402 // Send a touch-press event.
403 PressTouchPoint(1, 1);
404 EXPECT_EQ(1U, GetAndResetSentEventCount());
406 // Send a few touch-move events, followed by a touch-release event. All the
407 // touch-move events should be coalesced into a single event.
408 for (int i = 5; i < 15; ++i)
409 MoveTouchPoint(0, i, i);
411 EXPECT_EQ(0U, GetAndResetSentEventCount());
412 ReleaseTouchPoint(0);
413 EXPECT_EQ(0U, GetAndResetSentEventCount());
414 EXPECT_EQ(3U, queued_event_count());
416 // ACK the press. Coalesced touch-move events should be sent.
417 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
418 EXPECT_EQ(2U, queued_event_count());
419 EXPECT_EQ(1U, GetAndResetSentEventCount());
420 EXPECT_EQ(1U, GetAndResetAckedEventCount());
421 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
422 EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, acked_event_state());
425 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
426 EXPECT_EQ(1U, queued_event_count());
427 EXPECT_EQ(1U, GetAndResetSentEventCount());
428 EXPECT_EQ(10U, GetAndResetAckedEventCount());
429 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
432 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
433 EXPECT_EQ(0U, queued_event_count());
434 EXPECT_EQ(0U, GetAndResetSentEventCount());
435 EXPECT_EQ(1U, GetAndResetAckedEventCount());
436 EXPECT_EQ(WebInputEvent::TouchEnd, acked_event().type);
439 // Tests that an event that has already been sent but hasn't been ack'ed yet
440 // doesn't get coalesced with newer events.
441 TEST_F(TouchEventQueueTest, SentTouchEventDoesNotCoalesce) {
442 // Send a touch-press event.
443 PressTouchPoint(1, 1);
444 EXPECT_EQ(1U, GetAndResetSentEventCount());
446 // Send a few touch-move events, followed by a touch-release event. All the
447 // touch-move events should be coalesced into a single event.
448 for (int i = 5; i < 15; ++i)
449 MoveTouchPoint(0, i, i);
451 EXPECT_EQ(0U, GetAndResetSentEventCount());
452 EXPECT_EQ(2U, queued_event_count());
454 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
455 EXPECT_EQ(1U, GetAndResetSentEventCount());
456 EXPECT_EQ(1U, queued_event_count());
458 // The coalesced touch-move event has been sent to the renderer. Any new
459 // touch-move event should not be coalesced with the sent event.
460 MoveTouchPoint(0, 5, 5);
461 EXPECT_EQ(2U, queued_event_count());
463 MoveTouchPoint(0, 7, 7);
464 EXPECT_EQ(2U, queued_event_count());
467 // Tests that coalescing works correctly for multi-touch events.
468 TEST_F(TouchEventQueueTest, MultiTouch) {
469 // Press the first finger.
470 PressTouchPoint(1, 1);
471 EXPECT_EQ(1U, GetAndResetSentEventCount());
474 MoveTouchPoint(0, 5, 5);
475 EXPECT_EQ(2U, queued_event_count());
477 // Now press a second finger.
478 PressTouchPoint(2, 2);
479 EXPECT_EQ(3U, queued_event_count());
481 // Move both fingers.
482 MoveTouchPoints(0, 10, 10, 1, 20, 20);
483 MoveTouchPoint(1, 20, 20);
484 EXPECT_EQ(4U, queued_event_count());
486 // Move only one finger now.
487 MoveTouchPoint(0, 15, 15);
488 EXPECT_EQ(4U, queued_event_count());
490 // Move the other finger.
491 MoveTouchPoint(1, 25, 25);
492 EXPECT_EQ(4U, queued_event_count());
494 // Make sure both fingers are marked as having been moved in the coalesced
496 const WebTouchEvent& event = latest_event();
497 EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[0].state);
498 EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[1].state);
501 // Tests that if a touch-event queue is destroyed in response to a touch-event
502 // in the renderer, then there is no crash when the ACK for that touch-event
504 TEST_F(TouchEventQueueTest, AckAfterQueueFlushed) {
505 // Send some touch-events to the renderer.
506 PressTouchPoint(1, 1);
507 EXPECT_EQ(1U, GetAndResetSentEventCount());
508 EXPECT_EQ(1U, queued_event_count());
510 MoveTouchPoint(0, 10, 10);
511 EXPECT_EQ(0U, GetAndResetSentEventCount());
512 EXPECT_EQ(2U, queued_event_count());
514 // Receive an ACK for the press. This should cause the queued touch-move to
515 // be sent to the renderer.
516 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
517 EXPECT_EQ(1U, GetAndResetSentEventCount());
518 EXPECT_EQ(1U, queued_event_count());
520 OnHasTouchEventHandlers(false);
521 EXPECT_EQ(0U, GetAndResetSentEventCount());
522 EXPECT_EQ(0U, queued_event_count());
524 // Now receive an ACK for the move.
525 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
526 EXPECT_EQ(0U, GetAndResetSentEventCount());
527 EXPECT_EQ(0U, queued_event_count());
530 // Tests that touch-move events are not sent to the renderer if the preceding
531 // touch-press event did not have a consumer (and consequently, did not hit the
532 // main thread in the renderer). Also tests that all queued/coalesced touch
533 // events are flushed immediately when the ACK for the touch-press comes back
534 // with NO_CONSUMER status.
535 TEST_F(TouchEventQueueTest, NoConsumer) {
536 // The first touch-press should reach the renderer.
537 PressTouchPoint(1, 1);
538 EXPECT_EQ(1U, GetAndResetSentEventCount());
540 // The second touch should not be sent since one is already in queue.
541 MoveTouchPoint(0, 5, 5);
542 EXPECT_EQ(0U, GetAndResetSentEventCount());
543 EXPECT_EQ(2U, queued_event_count());
545 // Receive an ACK for the first touch-event. This should release the queued
546 // touch-event, but it should not be sent to the renderer.
547 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
548 EXPECT_EQ(0U, queued_event_count());
549 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
550 EXPECT_EQ(2U, GetAndResetAckedEventCount());
551 EXPECT_EQ(0U, GetAndResetSentEventCount());
553 // Send a release event. This should not reach the renderer.
554 ReleaseTouchPoint(0);
555 EXPECT_EQ(0U, GetAndResetSentEventCount());
556 EXPECT_EQ(WebInputEvent::TouchEnd, acked_event().type);
557 EXPECT_EQ(1U, GetAndResetAckedEventCount());
559 // Send a press-event, followed by move and release events, and another press
560 // event, before the ACK for the first press event comes back. All of the
561 // events should be queued first. After the NO_CONSUMER ack for the first
562 // touch-press, all events upto the second touch-press should be flushed.
563 PressTouchPoint(10, 10);
564 EXPECT_EQ(1U, GetAndResetSentEventCount());
566 MoveTouchPoint(0, 5, 5);
567 MoveTouchPoint(0, 6, 5);
568 ReleaseTouchPoint(0);
570 PressTouchPoint(6, 5);
571 EXPECT_EQ(0U, GetAndResetSentEventCount());
572 // The queue should hold the first sent touch-press event, the coalesced
573 // touch-move event, the touch-end event and the second touch-press event.
574 EXPECT_EQ(4U, queued_event_count());
576 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
577 EXPECT_EQ(1U, GetAndResetSentEventCount());
578 EXPECT_EQ(WebInputEvent::TouchEnd, acked_event().type);
579 EXPECT_EQ(4U, GetAndResetAckedEventCount());
580 EXPECT_EQ(1U, queued_event_count());
582 // ACK the second press event as NO_CONSUMER too.
583 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
584 EXPECT_EQ(0U, GetAndResetSentEventCount());
585 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
586 EXPECT_EQ(1U, GetAndResetAckedEventCount());
587 EXPECT_EQ(0U, queued_event_count());
589 // Send a second press event. Even though the first touch press had
590 // NO_CONSUMER, this press event should reach the renderer.
591 PressTouchPoint(1, 1);
592 EXPECT_EQ(1U, GetAndResetSentEventCount());
593 EXPECT_EQ(1U, queued_event_count());
594 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
595 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
596 EXPECT_EQ(1U, GetAndResetAckedEventCount());
599 TEST_F(TouchEventQueueTest, ConsumerIgnoreMultiFinger) {
600 // Press two touch points and move them around a bit. The renderer consumes
601 // the events for the first touch point, but returns NO_CONSUMER_EXISTS for
602 // the second touch point.
604 PressTouchPoint(1, 1);
605 EXPECT_EQ(1U, GetAndResetSentEventCount());
607 MoveTouchPoint(0, 5, 5);
609 PressTouchPoint(10, 10);
611 MoveTouchPoint(0, 2, 2);
613 MoveTouchPoint(1, 4, 10);
615 MoveTouchPoints(0, 10, 10, 1, 20, 20);
617 // Since the first touch-press is still pending ACK, no other event should
618 // have been sent to the renderer.
619 EXPECT_EQ(0U, GetAndResetSentEventCount());
620 // The queue includes the two presses, the first touch-move of the first
621 // point, and a coalesced touch-move of both points.
622 EXPECT_EQ(4U, queued_event_count());
624 // ACK the first press as CONSUMED. This should cause the first touch-move of
625 // the first touch-point to be dispatched.
626 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
627 EXPECT_EQ(1U, GetAndResetSentEventCount());
628 EXPECT_EQ(3U, queued_event_count());
630 // ACK the first move as CONSUMED.
631 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
632 EXPECT_EQ(1U, GetAndResetSentEventCount());
633 EXPECT_EQ(2U, queued_event_count());
635 // ACK the second press as NO_CONSUMER_EXISTS. This will dequeue the coalesced
636 // touch-move event (which contains both touch points). Although the second
637 // touch-point does not need to be sent to the renderer, the first touch-point
638 // did move, and so the coalesced touch-event will be sent to the renderer.
639 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
640 EXPECT_EQ(1U, GetAndResetSentEventCount());
641 EXPECT_EQ(1U, queued_event_count());
643 // ACK the coalesced move as NOT_CONSUMED.
644 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
645 EXPECT_EQ(0U, GetAndResetSentEventCount());
646 EXPECT_EQ(0U, queued_event_count());
648 // Move just the second touch point. Because the first touch point did not
649 // move, this event should not reach the renderer.
650 MoveTouchPoint(1, 30, 30);
651 EXPECT_EQ(0U, GetAndResetSentEventCount());
652 EXPECT_EQ(0U, queued_event_count());
654 // Move just the first touch point. This should reach the renderer.
655 MoveTouchPoint(0, 10, 10);
656 EXPECT_EQ(1U, GetAndResetSentEventCount());
657 EXPECT_EQ(1U, queued_event_count());
659 // Move both fingers. This event should reach the renderer (after the ACK of
660 // the previous move event is received), because the first touch point did
662 MoveTouchPoints(0, 15, 15, 1, 25, 25);
663 EXPECT_EQ(0U, GetAndResetSentEventCount());
665 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
666 EXPECT_EQ(1U, GetAndResetSentEventCount());
667 EXPECT_EQ(1U, queued_event_count());
669 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
670 EXPECT_EQ(0U, GetAndResetSentEventCount());
671 EXPECT_EQ(0U, queued_event_count());
673 // Release the first finger. Then move the second finger around some, then
674 // press another finger. Once the release event is ACKed, the move events of
675 // the second finger should be immediately released to the view, and the
676 // touch-press event should be dispatched to the renderer.
677 ReleaseTouchPoint(0);
678 EXPECT_EQ(1U, GetAndResetSentEventCount());
679 EXPECT_EQ(1U, queued_event_count());
681 MoveTouchPoint(1, 40, 40);
683 MoveTouchPoint(1, 50, 50);
685 PressTouchPoint(1, 1);
687 MoveTouchPoint(1, 30, 30);
688 EXPECT_EQ(0U, GetAndResetSentEventCount());
689 EXPECT_EQ(4U, queued_event_count());
691 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
692 EXPECT_EQ(1U, GetAndResetSentEventCount());
693 EXPECT_EQ(2U, queued_event_count());
694 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
696 // ACK the press with NO_CONSUMED_EXISTS. This should release the queued
697 // touch-move events to the view.
698 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
699 EXPECT_EQ(0U, GetAndResetSentEventCount());
700 EXPECT_EQ(0U, queued_event_count());
701 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
703 ReleaseTouchPoint(2);
704 ReleaseTouchPoint(1);
705 EXPECT_EQ(0U, GetAndResetSentEventCount());
706 EXPECT_EQ(0U, queued_event_count());
709 // Tests that touch-event's enqueued via a touch ack are properly handled.
710 TEST_F(TouchEventQueueTest, AckWithFollowupEvents) {
711 // Queue a touch down.
712 PressTouchPoint(1, 1);
713 EXPECT_EQ(1U, queued_event_count());
714 EXPECT_EQ(1U, GetAndResetSentEventCount());
715 EXPECT_EQ(0U, GetAndResetAckedEventCount());
717 // Create a touch event that will be queued synchronously by a touch ack.
718 // Note, this will be triggered by all subsequent touch acks.
719 WebTouchEvent followup_event;
720 followup_event.type = WebInputEvent::TouchStart;
721 followup_event.touchesLength = 1;
722 followup_event.touches[0].id = 1;
723 followup_event.touches[0].state = WebTouchPoint::StatePressed;
724 SetFollowupEvent(followup_event);
726 // Receive an ACK for the press. This should cause the followup touch-move to
727 // be sent to the renderer.
728 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
729 EXPECT_EQ(1U, queued_event_count());
730 EXPECT_EQ(1U, GetAndResetSentEventCount());
731 EXPECT_EQ(1U, GetAndResetAckedEventCount());
732 EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, acked_event_state());
733 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
735 // Queue another event.
736 MoveTouchPoint(0, 2, 2);
737 EXPECT_EQ(2U, queued_event_count());
739 // Receive an ACK for the touch-move followup event. This should cause the
740 // subsequent touch move event be sent to the renderer.
741 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
742 EXPECT_EQ(1U, queued_event_count());
743 EXPECT_EQ(1U, GetAndResetSentEventCount());
744 EXPECT_EQ(1U, GetAndResetAckedEventCount());
747 // Tests that touch-events can be synchronously ack'ed.
748 TEST_F(TouchEventQueueTest, SynchronousAcks) {
750 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
751 PressTouchPoint(1, 1);
752 EXPECT_EQ(0U, queued_event_count());
753 EXPECT_EQ(1U, GetAndResetSentEventCount());
754 EXPECT_EQ(1U, GetAndResetAckedEventCount());
757 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
758 MoveTouchPoint(0, 2, 2);
759 EXPECT_EQ(0U, queued_event_count());
760 EXPECT_EQ(1U, GetAndResetSentEventCount());
761 EXPECT_EQ(1U, GetAndResetAckedEventCount());
764 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
765 ReleaseTouchPoint(0);
766 EXPECT_EQ(0U, queued_event_count());
767 EXPECT_EQ(1U, GetAndResetSentEventCount());
768 EXPECT_EQ(1U, GetAndResetAckedEventCount());
770 // TouchCancel (first inserting a TouchStart so the TouchCancel will be sent)
771 PressTouchPoint(1, 1);
772 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
773 EXPECT_EQ(0U, queued_event_count());
774 EXPECT_EQ(1U, GetAndResetSentEventCount());
775 EXPECT_EQ(1U, GetAndResetAckedEventCount());
777 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
779 EXPECT_EQ(0U, queued_event_count());
780 EXPECT_EQ(1U, GetAndResetSentEventCount());
781 EXPECT_EQ(1U, GetAndResetAckedEventCount());
784 // Tests that followup events triggered by an immediate ack from
785 // TouchEventQueue::QueueEvent() are properly handled.
786 TEST_F(TouchEventQueueTest, ImmediateAckWithFollowupEvents) {
787 // Create a touch event that will be queued synchronously by a touch ack.
788 WebTouchEvent followup_event;
789 followup_event.type = WebInputEvent::TouchStart;
790 followup_event.touchesLength = 1;
791 followup_event.touches[0].id = 1;
792 followup_event.touches[0].state = WebTouchPoint::StatePressed;
793 SetFollowupEvent(followup_event);
795 // Now, enqueue a stationary touch that will not be forwarded. This should be
796 // immediately ack'ed with "NO_CONSUMER_EXISTS". The followup event should
797 // then be enqueued and immediately sent to the renderer.
798 WebTouchEvent stationary_event;
799 stationary_event.touchesLength = 1;
800 stationary_event.type = WebInputEvent::TouchMove;
801 stationary_event.touches[0].id = 1;
802 stationary_event.touches[0].state = WebTouchPoint::StateStationary;
803 SendTouchEvent(stationary_event);
805 EXPECT_EQ(1U, queued_event_count());
806 EXPECT_EQ(1U, GetAndResetSentEventCount());
807 EXPECT_EQ(1U, GetAndResetAckedEventCount());
808 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
809 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
812 // Tests basic TouchEvent forwarding suppression.
813 TEST_F(TouchEventQueueTest, NoTouchBasic) {
814 // Disable TouchEvent forwarding.
815 OnHasTouchEventHandlers(false);
816 PressTouchPoint(30, 5);
817 EXPECT_EQ(0U, GetAndResetSentEventCount());
818 EXPECT_EQ(1U, GetAndResetAckedEventCount());
820 // TouchMove should not be sent to renderer.
821 MoveTouchPoint(0, 65, 10);
822 EXPECT_EQ(0U, GetAndResetSentEventCount());
823 EXPECT_EQ(1U, GetAndResetAckedEventCount());
825 // TouchEnd should not be sent to renderer.
826 ReleaseTouchPoint(0);
827 EXPECT_EQ(0U, GetAndResetSentEventCount());
828 EXPECT_EQ(1U, GetAndResetAckedEventCount());
830 // Enable TouchEvent forwarding.
831 OnHasTouchEventHandlers(true);
833 PressTouchPoint(80, 10);
834 EXPECT_EQ(1U, GetAndResetSentEventCount());
835 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
836 EXPECT_EQ(1U, GetAndResetAckedEventCount());
838 MoveTouchPoint(0, 80, 20);
839 EXPECT_EQ(1U, GetAndResetSentEventCount());
840 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
841 EXPECT_EQ(1U, GetAndResetAckedEventCount());
843 ReleaseTouchPoint(0);
844 EXPECT_EQ(1U, GetAndResetSentEventCount());
845 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
846 EXPECT_EQ(1U, GetAndResetAckedEventCount());
849 // Tests that no TouchEvents are sent to renderer during scrolling.
850 TEST_F(TouchEventQueueTest, TouchCancelOnScroll) {
851 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_TOUCHCANCEL);
852 // Queue a TouchStart.
853 PressTouchPoint(0, 1);
854 EXPECT_EQ(1U, GetAndResetSentEventCount());
855 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
856 EXPECT_EQ(1U, GetAndResetAckedEventCount());
858 MoveTouchPoint(0, 20, 5);
859 EXPECT_EQ(1U, queued_event_count());
860 EXPECT_EQ(1U, GetAndResetSentEventCount());
862 MoveTouchPoint(0, 30, 15);
863 EXPECT_EQ(2U, queued_event_count());
864 EXPECT_EQ(0U, GetAndResetSentEventCount());
866 // Queue another TouchStart.
867 PressTouchPoint(20, 20);
868 EXPECT_EQ(3U, queued_event_count());
869 EXPECT_EQ(0U, GetAndResetSentEventCount());
870 EXPECT_EQ(WebInputEvent::TouchStart, latest_event().type);
872 WebGestureEvent followup_scroll;
873 followup_scroll.type = WebInputEvent::GestureScrollBegin;
874 SetFollowupEvent(followup_scroll);
875 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
876 EXPECT_EQ(1U, GetAndResetSentEventCount());
877 EXPECT_EQ(1U, GetAndResetAckedEventCount());
878 EXPECT_EQ(2U, queued_event_count());
879 EXPECT_TRUE(sent_event().cancelable);
880 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
882 // GestureScrollUpdate inserts a synthetic TouchCancel before the TouchStart.
883 followup_scroll.type = WebInputEvent::GestureScrollUpdate;
884 SetFollowupEvent(followup_scroll);
885 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
886 EXPECT_EQ(1U, GetAndResetSentEventCount());
887 EXPECT_EQ(1U, GetAndResetAckedEventCount());
888 EXPECT_EQ(2U, queued_event_count());
889 EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type);
890 EXPECT_FALSE(sent_event().cancelable);
891 EXPECT_EQ(WebInputEvent::TouchStart, latest_event().type);
893 // Acking the TouchCancel will result in dispatch of the next TouchStart.
894 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
895 // The synthetic TouchCancel should not reach client, only the TouchStart.
896 EXPECT_EQ(1U, GetAndResetAckedEventCount());
897 EXPECT_EQ(0U, GetAndResetSentEventCount());
898 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
900 // TouchMove should not be sent to the renderer.
901 MoveTouchPoint(0, 30, 5);
902 EXPECT_EQ(1U, GetAndResetAckedEventCount());
903 EXPECT_EQ(0U, GetAndResetSentEventCount());
904 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
906 // GestureScrollUpdates should not change affect touch forwarding.
907 SendGestureEvent(WebInputEvent::GestureScrollUpdate);
909 // TouchEnd should not be sent to the renderer.
910 ReleaseTouchPoint(0);
911 EXPECT_EQ(1U, GetAndResetAckedEventCount());
912 EXPECT_EQ(0U, GetAndResetSentEventCount());
913 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
915 ReleaseTouchPoint(0);
916 EXPECT_EQ(1U, GetAndResetAckedEventCount());
917 EXPECT_EQ(0U, GetAndResetSentEventCount());
918 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
920 // Touch events from a new gesture sequence should be forwarded normally.
921 PressTouchPoint(80, 10);
922 EXPECT_EQ(1U, GetAndResetSentEventCount());
923 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
924 EXPECT_EQ(1U, GetAndResetAckedEventCount());
926 MoveTouchPoint(0, 80, 20);
927 EXPECT_EQ(1U, GetAndResetSentEventCount());
928 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
929 EXPECT_EQ(1U, GetAndResetAckedEventCount());
931 ReleaseTouchPoint(0);
932 EXPECT_EQ(1U, GetAndResetSentEventCount());
933 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
934 EXPECT_EQ(1U, GetAndResetAckedEventCount());
937 // Tests that a scroll event will not insert a synthetic TouchCancel if there
938 // was no consumer for the current touch sequence.
939 TEST_F(TouchEventQueueTest, NoTouchCancelOnScrollIfNoConsumer) {
940 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_TOUCHCANCEL);
942 // Queue a TouchStart.
943 PressTouchPoint(0, 1);
944 EXPECT_EQ(1U, GetAndResetSentEventCount());
945 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
946 EXPECT_EQ(1U, GetAndResetAckedEventCount());
947 EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type);
949 // Queue a TouchMove that turns into a GestureScrollBegin.
950 WebGestureEvent followup_scroll;
951 followup_scroll.type = WebInputEvent::GestureScrollBegin;
952 SetFollowupEvent(followup_scroll);
953 MoveTouchPoint(0, 20, 5);
955 // The TouchMove has no consumer, and should be ack'ed immediately. However,
956 // *no* synthetic TouchCancel should be inserted as the touch sequence
958 EXPECT_EQ(0U, queued_event_count());
959 EXPECT_EQ(0U, GetAndResetSentEventCount());
960 EXPECT_EQ(1U, GetAndResetAckedEventCount());
961 EXPECT_EQ(0U, queued_event_count());
962 EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type);
964 // Subsequent TouchMove's should not be sent to the renderer.
965 MoveTouchPoint(0, 30, 5);
966 EXPECT_EQ(1U, GetAndResetAckedEventCount());
967 EXPECT_EQ(0U, GetAndResetSentEventCount());
968 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
970 // TouchEnd should not be sent to the renderer.
971 ReleaseTouchPoint(0);
972 EXPECT_EQ(1U, GetAndResetAckedEventCount());
973 EXPECT_EQ(0U, GetAndResetSentEventCount());
974 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
976 // Touch events from a new gesture sequence should be forwarded normally.
977 PressTouchPoint(80, 10);
978 EXPECT_EQ(1U, GetAndResetSentEventCount());
979 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
980 EXPECT_EQ(1U, GetAndResetAckedEventCount());
983 // Tests that IsTouchStartPendingAck works correctly.
984 TEST_F(TouchEventQueueTest, PendingStart) {
986 EXPECT_FALSE(IsPendingAckTouchStart());
988 // Send the touchstart for one point (#1).
989 PressTouchPoint(1, 1);
990 EXPECT_EQ(1U, queued_event_count());
991 EXPECT_TRUE(IsPendingAckTouchStart());
993 // Send a touchmove for that point (#2).
994 MoveTouchPoint(0, 5, 5);
995 EXPECT_EQ(2U, queued_event_count());
996 EXPECT_TRUE(IsPendingAckTouchStart());
998 // Ack the touchstart (#1).
999 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1000 EXPECT_EQ(1U, queued_event_count());
1001 EXPECT_FALSE(IsPendingAckTouchStart());
1003 // Send a touchstart for another point (#3).
1004 PressTouchPoint(10, 10);
1005 EXPECT_EQ(2U, queued_event_count());
1006 EXPECT_FALSE(IsPendingAckTouchStart());
1008 // Ack the touchmove (#2).
1009 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1010 EXPECT_EQ(1U, queued_event_count());
1011 EXPECT_TRUE(IsPendingAckTouchStart());
1013 // Send a touchstart for a third point (#4).
1014 PressTouchPoint(15, 15);
1015 EXPECT_EQ(2U, queued_event_count());
1016 EXPECT_TRUE(IsPendingAckTouchStart());
1018 // Ack the touchstart for the second point (#3).
1019 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1020 EXPECT_EQ(1U, queued_event_count());
1021 EXPECT_TRUE(IsPendingAckTouchStart());
1023 // Ack the touchstart for the third point (#4).
1024 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1025 EXPECT_EQ(0U, queued_event_count());
1026 EXPECT_FALSE(IsPendingAckTouchStart());
1029 // Tests that the touch timeout is started when sending certain touch types.
1030 TEST_F(TouchEventQueueTest, TouchTimeoutTypes) {
1031 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1033 // Sending a TouchStart will start the timeout.
1034 PressTouchPoint(0, 1);
1035 EXPECT_TRUE(IsTimeoutRunning());
1036 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1037 EXPECT_FALSE(IsTimeoutRunning());
1039 // A TouchMove should start the timeout.
1040 MoveTouchPoint(0, 5, 5);
1041 EXPECT_TRUE(IsTimeoutRunning());
1042 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1043 EXPECT_FALSE(IsTimeoutRunning());
1045 // A TouchEnd should not start the timeout.
1046 ReleaseTouchPoint(0);
1047 EXPECT_FALSE(IsTimeoutRunning());
1048 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1049 EXPECT_FALSE(IsTimeoutRunning());
1051 // A TouchCancel should not start the timeout.
1052 PressTouchPoint(0, 1);
1053 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1054 ASSERT_FALSE(IsTimeoutRunning());
1055 CancelTouchPoint(0);
1056 EXPECT_FALSE(IsTimeoutRunning());
1057 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1058 EXPECT_FALSE(IsTimeoutRunning());
1061 // Tests that a delayed TouchEvent ack will trigger a TouchCancel timeout,
1062 // disabling touch forwarding until the next TouchStart is received after
1063 // the timeout events are ack'ed.
1064 TEST_F(TouchEventQueueTest, TouchTimeoutBasic) {
1065 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1067 // Queue a TouchStart.
1068 GetAndResetSentEventCount();
1069 GetAndResetAckedEventCount();
1070 PressTouchPoint(0, 1);
1071 ASSERT_EQ(1U, GetAndResetSentEventCount());
1072 ASSERT_EQ(0U, GetAndResetAckedEventCount());
1073 EXPECT_TRUE(IsTimeoutRunning());
1076 RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
1078 // The timeout should have fired, synthetically ack'ing the timed-out event.
1079 // TouchEvent forwarding is disabled until the ack is received for the
1080 // timed-out event and the future cancel event.
1081 EXPECT_FALSE(IsTimeoutRunning());
1082 EXPECT_EQ(0U, GetAndResetSentEventCount());
1083 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1085 // Ack'ing the original event should trigger a cancel event.
1086 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1087 EXPECT_FALSE(IsTimeoutRunning());
1088 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1089 EXPECT_EQ(1U, GetAndResetSentEventCount());
1090 EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type);
1091 EXPECT_FALSE(sent_event().cancelable);
1093 // Touch events should not be forwarded until we receive the cancel acks.
1094 MoveTouchPoint(0, 1, 1);
1095 ASSERT_EQ(0U, GetAndResetSentEventCount());
1096 ASSERT_EQ(1U, GetAndResetAckedEventCount());
1098 ReleaseTouchPoint(0);
1099 ASSERT_EQ(0U, GetAndResetSentEventCount());
1100 ASSERT_EQ(1U, GetAndResetAckedEventCount());
1102 // The synthetic TouchCancel ack should not reach the client, but should
1103 // resume touch forwarding.
1104 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1105 EXPECT_EQ(0U, GetAndResetSentEventCount());
1106 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1108 // Subsequent events should be handled normally.
1109 PressTouchPoint(0, 1);
1110 EXPECT_EQ(1U, GetAndResetSentEventCount());
1111 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1112 EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type);
1113 EXPECT_TRUE(sent_event().cancelable);
1116 // Tests that the timeout is never started if the renderer consumes
1117 // a TouchEvent from the current touch sequence.
1118 TEST_F(TouchEventQueueTest, NoTouchTimeoutIfRendererIsConsumingGesture) {
1119 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1121 // Queue a TouchStart.
1122 PressTouchPoint(0, 1);
1123 ASSERT_TRUE(IsTimeoutRunning());
1125 // Mark the event as consumed. This should prevent the timeout from
1126 // being activated on subsequent TouchEvents in this gesture.
1127 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
1128 EXPECT_FALSE(IsTimeoutRunning());
1130 // A TouchMove should not start the timeout.
1131 MoveTouchPoint(0, 5, 5);
1132 EXPECT_FALSE(IsTimeoutRunning());
1133 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1135 // A secondary TouchStart should not start the timeout.
1136 PressTouchPoint(1, 0);
1137 EXPECT_FALSE(IsTimeoutRunning());
1138 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1140 // A TouchEnd should not start the timeout.
1141 ReleaseTouchPoint(1);
1142 EXPECT_FALSE(IsTimeoutRunning());
1143 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1145 // A TouchCancel should not start the timeout.
1146 CancelTouchPoint(0);
1147 EXPECT_FALSE(IsTimeoutRunning());
1150 // Tests that the timeout is never started if the renderer consumes
1151 // a TouchEvent from the current touch sequence.
1152 TEST_F(TouchEventQueueTest, NoTouchTimeoutIfDisabledAfterTouchStart) {
1153 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1155 // Queue a TouchStart.
1156 PressTouchPoint(0, 1);
1157 ASSERT_TRUE(IsTimeoutRunning());
1159 // Send the ack immediately. The timeout should not have fired.
1160 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1161 EXPECT_FALSE(IsTimeoutRunning());
1162 EXPECT_TRUE(IsTimeoutEnabled());
1163 EXPECT_EQ(1U, GetAndResetSentEventCount());
1164 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1166 // Now explicitly disable the timeout.
1167 SetAckTimeoutDisabled();
1168 EXPECT_FALSE(IsTimeoutRunning());
1169 EXPECT_FALSE(IsTimeoutEnabled());
1171 // A TouchMove should not start or trigger the timeout.
1172 MoveTouchPoint(0, 5, 5);
1173 EXPECT_FALSE(IsTimeoutRunning());
1174 EXPECT_EQ(1U, GetAndResetSentEventCount());
1175 RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
1176 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1179 // Tests that the timeout is never started if the ack is synchronous.
1180 TEST_F(TouchEventQueueTest, NoTouchTimeoutIfAckIsSynchronous) {
1181 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1183 // Queue a TouchStart.
1184 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
1185 ASSERT_FALSE(IsTimeoutRunning());
1186 PressTouchPoint(0, 1);
1187 EXPECT_FALSE(IsTimeoutRunning());
1190 // Tests that the timeout is disabled if the touch handler disappears.
1191 TEST_F(TouchEventQueueTest, NoTouchTimeoutIfTouchHandlerRemoved) {
1192 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1194 // Queue a TouchStart.
1195 PressTouchPoint(0, 1);
1196 ASSERT_TRUE(IsTimeoutRunning());
1198 // Unload the touch handler.
1199 OnHasTouchEventHandlers(false);
1200 EXPECT_FALSE(IsTimeoutRunning());
1203 // Tests that the timeout does not fire if explicitly disabled while an event
1205 TEST_F(TouchEventQueueTest, NoTouchTimeoutIfDisabledWhileTimerIsActive) {
1206 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1208 // Queue a TouchStart.
1209 PressTouchPoint(0, 1);
1210 ASSERT_TRUE(IsTimeoutRunning());
1212 // Verify that disabling the timeout also turns off the timer.
1213 SetAckTimeoutDisabled();
1214 EXPECT_FALSE(IsTimeoutRunning());
1215 RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
1216 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1219 // Tests that a TouchCancel timeout plays nice when the timed out touch stream
1220 // turns into a scroll gesture sequence.
1221 TEST_F(TouchEventQueueTest, TouchTimeoutWithFollowupGesture) {
1222 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1224 // Queue a TouchStart.
1225 PressTouchPoint(0, 1);
1226 EXPECT_TRUE(IsTimeoutRunning());
1227 EXPECT_EQ(1U, GetAndResetSentEventCount());
1229 // The cancelled sequence may turn into a scroll gesture.
1230 WebGestureEvent followup_scroll;
1231 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1232 SetFollowupEvent(followup_scroll);
1235 RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
1237 // The timeout should have fired, disabling touch forwarding until both acks
1238 // are received, acking the timed out event.
1239 EXPECT_FALSE(IsTimeoutRunning());
1240 EXPECT_EQ(0U, GetAndResetSentEventCount());
1241 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1243 // Ack the original event, triggering a TouchCancel.
1244 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
1245 EXPECT_FALSE(IsTimeoutRunning());
1246 EXPECT_EQ(1U, GetAndResetSentEventCount());
1247 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1249 // Ack the cancel event. Normally, this would resume touch forwarding,
1250 // but we're still within a scroll gesture so it remains disabled.
1251 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
1252 EXPECT_FALSE(IsTimeoutRunning());
1253 EXPECT_EQ(0U, GetAndResetSentEventCount());
1254 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1256 // Try to forward touch events for the current sequence.
1257 GetAndResetSentEventCount();
1258 GetAndResetAckedEventCount();
1259 MoveTouchPoint(0, 1, 1);
1260 ReleaseTouchPoint(0);
1261 EXPECT_FALSE(IsTimeoutRunning());
1262 EXPECT_EQ(0U, GetAndResetSentEventCount());
1263 EXPECT_EQ(2U, GetAndResetAckedEventCount());
1265 // Now end the scroll sequence, resuming touch handling.
1266 SendGestureEvent(blink::WebInputEvent::GestureScrollEnd);
1267 PressTouchPoint(0, 1);
1268 EXPECT_TRUE(IsTimeoutRunning());
1269 EXPECT_EQ(1U, GetAndResetSentEventCount());
1270 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1273 // Tests that a TouchCancel timeout plays nice when the timed out touch stream
1274 // turns into a scroll gesture sequence, but the original event acks are
1275 // significantly delayed.
1276 TEST_F(TouchEventQueueTest, TouchTimeoutWithFollowupGestureAndDelayedAck) {
1277 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1279 // Queue a TouchStart.
1280 PressTouchPoint(0, 1);
1281 EXPECT_TRUE(IsTimeoutRunning());
1282 EXPECT_EQ(1U, GetAndResetSentEventCount());
1284 // The cancelled sequence may turn into a scroll gesture.
1285 WebGestureEvent followup_scroll;
1286 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1287 SetFollowupEvent(followup_scroll);
1290 RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
1292 // The timeout should have fired, disabling touch forwarding until both acks
1293 // are received and acking the timed out event.
1294 EXPECT_FALSE(IsTimeoutRunning());
1295 EXPECT_EQ(0U, GetAndResetSentEventCount());
1296 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1298 // Try to forward a touch event.
1299 GetAndResetSentEventCount();
1300 GetAndResetAckedEventCount();
1301 MoveTouchPoint(0, 1, 1);
1302 EXPECT_FALSE(IsTimeoutRunning());
1303 EXPECT_EQ(0U, GetAndResetSentEventCount());
1304 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1306 // Now end the scroll sequence. Events will not be forwarded until the two
1307 // outstanding touch acks are received.
1308 SendGestureEvent(blink::WebInputEvent::GestureScrollEnd);
1309 MoveTouchPoint(0, 2, 2);
1310 ReleaseTouchPoint(0);
1311 EXPECT_FALSE(IsTimeoutRunning());
1312 EXPECT_EQ(0U, GetAndResetSentEventCount());
1313 EXPECT_EQ(2U, GetAndResetAckedEventCount());
1315 // Ack the original event, triggering a cancel.
1316 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
1317 EXPECT_EQ(1U, GetAndResetSentEventCount());
1318 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1320 // Ack the cancel event, resuming touch forwarding.
1321 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
1322 EXPECT_EQ(0U, GetAndResetSentEventCount());
1323 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1325 PressTouchPoint(0, 1);
1326 EXPECT_TRUE(IsTimeoutRunning());
1327 EXPECT_EQ(1U, GetAndResetSentEventCount());
1330 // Tests that a delayed TouchEvent ack will not trigger a TouchCancel timeout if
1331 // the timed-out event had no consumer.
1332 TEST_F(TouchEventQueueTest, NoCancelOnTouchTimeoutWithoutConsumer) {
1333 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1335 // Queue a TouchStart.
1336 PressTouchPoint(0, 1);
1337 ASSERT_EQ(1U, GetAndResetSentEventCount());
1338 ASSERT_EQ(0U, GetAndResetAckedEventCount());
1339 EXPECT_TRUE(IsTimeoutRunning());
1342 RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
1344 // The timeout should have fired, synthetically ack'ing the timed out event.
1345 // TouchEvent forwarding is disabled until the original ack is received.
1346 EXPECT_FALSE(IsTimeoutRunning());
1347 EXPECT_EQ(0U, GetAndResetSentEventCount());
1348 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1350 // Touch events should not be forwarded until we receive the original ack.
1351 MoveTouchPoint(0, 1, 1);
1352 ReleaseTouchPoint(0);
1353 ASSERT_EQ(0U, GetAndResetSentEventCount());
1354 ASSERT_EQ(2U, GetAndResetAckedEventCount());
1356 // Ack'ing the original event should not trigger a cancel event, as the
1357 // TouchStart had no consumer. However, it should re-enable touch forwarding.
1358 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
1359 EXPECT_FALSE(IsTimeoutRunning());
1360 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1361 EXPECT_EQ(0U, GetAndResetSentEventCount());
1363 // Subsequent events should be handled normally.
1364 PressTouchPoint(0, 1);
1365 EXPECT_EQ(1U, GetAndResetSentEventCount());
1366 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1369 // Tests that TouchMove's are dropped if within the boundary-inclusive slop
1370 // suppression region for an unconsumed TouchStart.
1371 TEST_F(TouchEventQueueTest, TouchMoveSuppressionIncludingSlopBoundary) {
1372 const double kSlopLengthDips = 10.;
1373 const double kHalfSlopLengthDips = kSlopLengthDips / 2;
1374 const bool slop_includes_boundary = true;
1375 SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary);
1377 // Queue a TouchStart.
1378 PressTouchPoint(0, 0);
1379 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1380 ASSERT_EQ(1U, GetAndResetSentEventCount());
1381 ASSERT_EQ(1U, GetAndResetAckedEventCount());
1383 // TouchMove's within the region should be suppressed.
1384 MoveTouchPoint(0, 0, kHalfSlopLengthDips);
1385 EXPECT_EQ(0U, queued_event_count());
1386 EXPECT_EQ(0U, GetAndResetSentEventCount());
1387 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1388 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
1390 MoveTouchPoint(0, kHalfSlopLengthDips, 0);
1391 EXPECT_EQ(0U, queued_event_count());
1392 EXPECT_EQ(0U, GetAndResetSentEventCount());
1393 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1394 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
1396 MoveTouchPoint(0, -kHalfSlopLengthDips, 0);
1397 EXPECT_EQ(0U, queued_event_count());
1398 EXPECT_EQ(0U, GetAndResetSentEventCount());
1399 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1400 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
1402 MoveTouchPoint(0, -kSlopLengthDips, 0);
1403 EXPECT_EQ(0U, queued_event_count());
1404 EXPECT_EQ(0U, GetAndResetSentEventCount());
1405 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1406 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
1408 MoveTouchPoint(0, 0, kSlopLengthDips);
1409 EXPECT_EQ(0U, queued_event_count());
1410 EXPECT_EQ(0U, GetAndResetSentEventCount());
1411 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1412 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
1414 // As soon as a TouchMove exceeds the (Euclidean) distance, no more
1415 // TouchMove's should be suppressed.
1416 const double kFortyFiveDegreeSlopLengthXY =
1417 kSlopLengthDips * std::sqrt(2.) / 2.;
1418 MoveTouchPoint(0, kFortyFiveDegreeSlopLengthXY + .2,
1419 kFortyFiveDegreeSlopLengthXY + .2);
1420 EXPECT_EQ(1U, queued_event_count());
1421 EXPECT_EQ(1U, GetAndResetSentEventCount());
1422 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1423 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1424 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1426 // Even TouchMove's within the original slop region should now be forwarded.
1427 MoveTouchPoint(0, 0, 0);
1428 EXPECT_EQ(1U, queued_event_count());
1429 EXPECT_EQ(1U, GetAndResetSentEventCount());
1430 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1431 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1432 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1434 // A new touch sequence should reset suppression.
1435 ReleaseTouchPoint(0);
1436 PressTouchPoint(0, 0);
1437 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1438 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1439 ASSERT_EQ(2U, GetAndResetSentEventCount());
1440 ASSERT_EQ(2U, GetAndResetAckedEventCount());
1441 ASSERT_EQ(0U, queued_event_count());
1443 // The slop region is boundary-inclusive.
1444 MoveTouchPoint(0, kSlopLengthDips - 1., 0);
1445 EXPECT_EQ(0U, queued_event_count());
1446 EXPECT_EQ(0U, GetAndResetSentEventCount());
1447 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1449 MoveTouchPoint(0, kSlopLengthDips, 0);
1450 EXPECT_EQ(0U, queued_event_count());
1451 EXPECT_EQ(0U, GetAndResetSentEventCount());
1452 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1455 // Tests that TouchMove's are dropped if within the boundary-exclusive slop
1456 // suppression region for an unconsumed TouchStart.
1457 TEST_F(TouchEventQueueTest, TouchMoveSuppressionExcludingSlopBoundary) {
1458 const double kSlopLengthDips = 10.;
1459 const double kHalfSlopLengthDips = kSlopLengthDips / 2;
1460 const bool slop_includes_boundary = false;
1461 SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary);
1463 // Queue a TouchStart.
1464 PressTouchPoint(0, 0);
1465 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1466 ASSERT_EQ(1U, GetAndResetSentEventCount());
1467 ASSERT_EQ(1U, GetAndResetAckedEventCount());
1469 // TouchMove's within the region should be suppressed.
1470 MoveTouchPoint(0, 0, kHalfSlopLengthDips);
1471 EXPECT_EQ(0U, queued_event_count());
1472 EXPECT_EQ(0U, GetAndResetSentEventCount());
1473 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1474 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
1476 MoveTouchPoint(0, kSlopLengthDips - 0.2f, 0);
1477 EXPECT_EQ(0U, queued_event_count());
1478 EXPECT_EQ(0U, GetAndResetSentEventCount());
1479 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1480 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
1482 // As soon as a TouchMove reaches the (Euclidean) slop distance, no more
1483 // TouchMove's should be suppressed.
1484 MoveTouchPoint(0, kSlopLengthDips, 0);
1485 EXPECT_EQ(1U, queued_event_count());
1486 EXPECT_EQ(1U, GetAndResetSentEventCount());
1487 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1488 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1489 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1491 MoveTouchPoint(0, kHalfSlopLengthDips, 0);
1492 EXPECT_EQ(1U, queued_event_count());
1493 EXPECT_EQ(1U, GetAndResetSentEventCount());
1494 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1495 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1496 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1499 // Tests that TouchMove's are not dropped within the slop suppression region if
1500 // the touchstart was consumed.
1501 TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionAfterTouchConsumed) {
1502 const double kSlopLengthDips = 10.;
1503 const double kHalfSlopLengthDips = kSlopLengthDips / 2;
1504 const bool slop_includes_boundary = true;
1505 SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary);
1507 // Queue a TouchStart.
1508 PressTouchPoint(0, 0);
1509 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
1510 ASSERT_EQ(1U, GetAndResetSentEventCount());
1511 ASSERT_EQ(1U, GetAndResetAckedEventCount());
1513 // TouchMove's within the region should not be suppressed, as a touch was
1515 MoveTouchPoint(0, 0, kHalfSlopLengthDips);
1516 EXPECT_EQ(1U, queued_event_count());
1517 EXPECT_EQ(1U, GetAndResetSentEventCount());
1518 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1521 // Tests that TouchMove's are not dropped due to incorrect handling of DPI
1523 TEST_F(TouchEventQueueTest, TouchMoveSuppressionWithDIPScaling) {
1524 const float kSlopLengthPixels = 7.f;
1525 const float kDPIScale = 3.f;
1526 const bool slop_includes_boundary = true;
1527 SetUpForTouchMoveSlopTesting(kSlopLengthPixels / kDPIScale,
1528 slop_includes_boundary);
1530 // Queue a TouchStart.
1531 PressTouchPoint(0, 0);
1532 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1533 ASSERT_EQ(1U, GetAndResetSentEventCount());
1534 ASSERT_EQ(1U, GetAndResetAckedEventCount());
1536 // TouchMove's along the slop boundary should be suppresed.
1537 MoveTouchPoint(0, 0, kSlopLengthPixels / kDPIScale);
1538 EXPECT_EQ(0U, queued_event_count());
1539 EXPECT_EQ(0U, GetAndResetSentEventCount());
1540 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1542 // Reset the touch sequence.
1543 ReleaseTouchPoint(0);
1544 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1545 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1546 GetAndResetSentEventCount();
1547 GetAndResetAckedEventCount();
1549 // Queue a TouchStart.
1550 PressTouchPoint(0, 0);
1551 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1552 ASSERT_EQ(1U, GetAndResetSentEventCount());
1553 ASSERT_EQ(1U, GetAndResetAckedEventCount());
1555 // TouchMove's outside the region should not be suppressed.
1556 const float kPixelCoordOutsideSlopRegion = kSlopLengthPixels + 0.5f;
1557 MoveTouchPoint(0, 0, kPixelCoordOutsideSlopRegion / kDPIScale);
1558 EXPECT_EQ(1U, queued_event_count());
1559 EXPECT_EQ(1U, GetAndResetSentEventCount());
1560 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1563 // Tests that TouchMove's are not dropped if a secondary pointer is present
1564 // during any movement.
1565 TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionAfterMultiTouch) {
1566 const double kSlopLengthDips = 10.;
1567 const double kHalfSlopLengthDips = kSlopLengthDips / 2;
1568 const bool slop_includes_boundary = true;
1569 SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary);
1571 // Queue a TouchStart.
1572 PressTouchPoint(0, 0);
1573 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1574 ASSERT_EQ(1U, GetAndResetSentEventCount());
1575 ASSERT_EQ(1U, GetAndResetAckedEventCount());
1577 // TouchMove's within the region should be suppressed.
1578 MoveTouchPoint(0, 0, kHalfSlopLengthDips);
1579 EXPECT_EQ(0U, queued_event_count());
1580 EXPECT_EQ(0U, GetAndResetSentEventCount());
1581 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1583 // Simulate a secondary pointer press.
1584 PressTouchPoint(kSlopLengthDips, 0);
1585 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1586 EXPECT_EQ(1U, GetAndResetSentEventCount());
1587 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1589 // TouchMove with a secondary pointer should not be suppressed.
1590 MoveTouchPoint(1, kSlopLengthDips, 0);
1591 EXPECT_EQ(1U, queued_event_count());
1592 EXPECT_EQ(1U, GetAndResetSentEventCount());
1593 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1594 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1596 // Release the secondary pointer.
1597 ReleaseTouchPoint(0);
1598 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1599 EXPECT_EQ(1U, GetAndResetSentEventCount());
1600 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1602 // TouchMove's should not should be suppressed, even with the original
1604 MoveTouchPoint(0, 0, 0);
1605 EXPECT_EQ(1U, queued_event_count());
1606 EXPECT_EQ(1U, GetAndResetSentEventCount());
1607 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1610 // Tests that secondary touch points can be forwarded even if the primary touch
1611 // point had no consumer.
1612 TEST_F(TouchEventQueueTest, SecondaryTouchForwardedAfterPrimaryHadNoConsumer) {
1613 // Queue a TouchStart.
1614 PressTouchPoint(0, 0);
1615 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
1616 ASSERT_EQ(1U, GetAndResetSentEventCount());
1617 ASSERT_EQ(1U, GetAndResetAckedEventCount());
1619 // Events should not be forwarded, as the point had no consumer.
1620 MoveTouchPoint(0, 0, 15);
1621 EXPECT_EQ(0U, queued_event_count());
1622 EXPECT_EQ(0U, GetAndResetSentEventCount());
1623 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1625 // Simulate a secondary pointer press.
1626 PressTouchPoint(20, 0);
1627 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1628 EXPECT_EQ(1U, GetAndResetSentEventCount());
1629 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1631 // TouchMove with a secondary pointer should not be suppressed.
1632 MoveTouchPoint(1, 25, 0);
1633 EXPECT_EQ(1U, queued_event_count());
1634 EXPECT_EQ(1U, GetAndResetSentEventCount());
1635 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1636 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1639 // Tests that no touch points will be forwarded after scrolling begins while no
1640 // touch points have a consumer.
1641 TEST_F(TouchEventQueueTest, NoForwardingAfterScrollWithNoTouchConsumers) {
1642 // Queue a TouchStart.
1643 PressTouchPoint(0, 0);
1644 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
1645 ASSERT_EQ(1U, GetAndResetSentEventCount());
1646 ASSERT_EQ(1U, GetAndResetAckedEventCount());
1648 WebGestureEvent followup_scroll;
1649 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1650 SetFollowupEvent(followup_scroll);
1651 MoveTouchPoint(0, 20, 5);
1652 EXPECT_EQ(0U, GetAndResetSentEventCount());
1653 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1654 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
1656 // The secondary pointer press should not be forwarded.
1657 PressTouchPoint(20, 0);
1658 EXPECT_EQ(0U, GetAndResetSentEventCount());
1659 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1660 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
1662 // Neither should any further touchmoves be forwarded.
1663 MoveTouchPoint(1, 25, 0);
1664 EXPECT_EQ(0U, GetAndResetSentEventCount());
1665 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1666 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
1669 TEST_F(TouchEventQueueTest, SyncTouchMoveDoesntCancelTouchOnScroll) {
1670 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_SYNC_TOUCHMOVE);
1671 // Queue a TouchStart.
1672 PressTouchPoint(0, 1);
1673 EXPECT_EQ(1U, GetAndResetSentEventCount());
1674 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1675 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1677 MoveTouchPoint(0, 20, 5);
1678 EXPECT_EQ(1U, queued_event_count());
1679 EXPECT_EQ(1U, GetAndResetSentEventCount());
1681 // GestureScrollBegin doesn't insert a synthetic TouchCancel.
1682 WebGestureEvent followup_scroll;
1683 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1684 SetFollowupEvent(followup_scroll);
1685 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1686 EXPECT_EQ(0U, GetAndResetSentEventCount());
1687 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1688 EXPECT_EQ(0U, queued_event_count());
1691 TEST_F(TouchEventQueueTest, AsyncTouch) {
1692 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE);
1694 // Queue a TouchStart.
1695 PressTouchPoint(0, 1);
1696 EXPECT_EQ(1U, GetAndResetSentEventCount());
1697 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1698 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1700 for (int i = 0; i < 3; ++i) {
1701 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1702 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1704 MoveTouchPoint(0, 10, 5);
1705 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1706 EXPECT_FALSE(HasPendingAsyncTouchMove());
1707 EXPECT_TRUE(sent_event().cancelable);
1708 EXPECT_EQ(0U, queued_event_count());
1709 EXPECT_EQ(1U, GetAndResetSentEventCount());
1711 // Consuming a scroll event will throttle subsequent touchmoves.
1712 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1713 INPUT_EVENT_ACK_STATE_CONSUMED);
1714 MoveTouchPoint(0, 10, 5);
1715 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1716 EXPECT_TRUE(HasPendingAsyncTouchMove());
1717 EXPECT_EQ(0U, queued_event_count());
1718 EXPECT_EQ(0U, GetAndResetSentEventCount());
1722 // Ensure that touchmove's are appropriately throttled during a typical
1723 // scroll sequences that transitions between scrolls consumed and unconsumed.
1724 TEST_F(TouchEventQueueTest, AsyncTouchThrottledAfterScroll) {
1725 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE);
1727 // Process a TouchStart
1728 PressTouchPoint(0, 1);
1729 EXPECT_EQ(1U, GetAndResetSentEventCount());
1730 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1731 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1733 // Now send the first touch move and associated GestureScrollBegin.
1734 MoveTouchPoint(0, 0, 5);
1735 WebGestureEvent followup_scroll;
1736 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1737 SetFollowupEvent(followup_scroll);
1738 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1739 EXPECT_EQ(1U, GetAndResetSentEventCount());
1740 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1741 SendGestureEventAck(WebInputEvent::GestureScrollBegin,
1742 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1744 // Send the second touch move and associated GestureScrollUpdate, but don't
1745 // ACK the gesture event yet.
1746 MoveTouchPoint(0, 0, 50);
1747 followup_scroll.type = WebInputEvent::GestureScrollUpdate;
1748 SetFollowupEvent(followup_scroll);
1749 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1750 EXPECT_EQ(1U, GetAndResetSentEventCount());
1751 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1753 // Now queue a second touchmove and verify it's not (yet) dispatched.
1754 MoveTouchPoint(0, 0, 100);
1755 SetFollowupEvent(followup_scroll);
1756 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1757 EXPECT_TRUE(HasPendingAsyncTouchMove());
1758 EXPECT_EQ(0U, queued_event_count());
1759 EXPECT_EQ(0U, GetAndResetSentEventCount());
1760 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1762 // Queuing the final touchend should flush the pending, async touchmove.
1763 ReleaseTouchPoint(0);
1764 followup_scroll.type = WebInputEvent::GestureScrollEnd;
1765 SetFollowupEvent(followup_scroll);
1766 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
1767 EXPECT_FALSE(HasPendingAsyncTouchMove());
1768 EXPECT_FALSE(sent_event().cancelable);
1769 EXPECT_EQ(1U, GetAndResetSentEventCount());
1770 EXPECT_EQ(2U, queued_event_count());
1772 // Ack the flushed, async touchmove. The ack should not reach the client, but
1773 // it should trigger sending of the (now non-cancelable) touchend.
1774 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1775 EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type);
1776 EXPECT_FALSE(sent_event().cancelable);
1777 EXPECT_EQ(1U, GetAndResetSentEventCount());
1778 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1779 EXPECT_EQ(1U, queued_event_count());
1781 // Ack the touchend.
1782 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1783 EXPECT_EQ(0U, queued_event_count());
1784 EXPECT_EQ(0U, GetAndResetSentEventCount());
1785 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1787 // Now mark the scrolls as not consumed (which would cause future touchmoves
1788 // in the active sequence to be sent if there was one).
1789 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1790 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1791 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1792 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1794 // Start a new touch sequence and verify that throttling has been reset.
1795 // Touch moves after the start of scrolling will again be throttled.
1796 PressTouchPoint(0, 0);
1797 EXPECT_EQ(1U, GetAndResetSentEventCount());
1798 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1799 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1800 MoveTouchPoint(0, 0, 5);
1801 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1802 SetFollowupEvent(followup_scroll);
1803 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1804 EXPECT_EQ(1U, GetAndResetSentEventCount());
1805 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1807 MoveTouchPoint(0, 0, 5);
1808 followup_scroll.type = WebInputEvent::GestureScrollUpdate;
1809 SetFollowupEvent(followup_scroll);
1810 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1811 EXPECT_FALSE(HasPendingAsyncTouchMove());
1812 EXPECT_EQ(1U, GetAndResetSentEventCount());
1813 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1815 MoveTouchPoint(0, 0, 10);
1816 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1817 EXPECT_TRUE(HasPendingAsyncTouchMove());
1818 EXPECT_EQ(0U, queued_event_count());
1819 EXPECT_EQ(0U, GetAndResetSentEventCount());
1820 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1822 // As soon as a touchmove exceeds the outer slop region it will be forwarded
1824 MoveTouchPoint(0, 0, 20);
1825 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1826 EXPECT_FALSE(HasPendingAsyncTouchMove());
1827 EXPECT_FALSE(sent_event().cancelable);
1828 EXPECT_EQ(0U, queued_event_count());
1829 EXPECT_EQ(1U, GetAndResetSentEventCount());
1830 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1832 // Subsequent touchmove's should be deferred.
1833 MoveTouchPoint(0, 0, 25);
1834 EXPECT_TRUE(HasPendingAsyncTouchMove());
1835 EXPECT_EQ(0U, queued_event_count());
1836 EXPECT_EQ(0U, GetAndResetSentEventCount());
1837 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1839 // The pending touchmove should be flushed with the the new touchmove if
1840 // sufficient time has passed.
1841 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1);
1842 MoveTouchPoint(0, 0, 15);
1843 EXPECT_FALSE(HasPendingAsyncTouchMove());
1844 EXPECT_FALSE(sent_event().cancelable);
1845 EXPECT_EQ(1U, queued_event_count());
1846 EXPECT_EQ(1U, GetAndResetSentEventCount());
1847 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1848 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1849 EXPECT_EQ(0U, queued_event_count());
1850 EXPECT_EQ(0U, GetAndResetSentEventCount());
1851 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1853 // Non-touchmove events should always flush any pending touchmove events.
1854 MoveTouchPoint(0, 0, 25);
1855 EXPECT_TRUE(HasPendingAsyncTouchMove());
1856 EXPECT_EQ(0U, queued_event_count());
1857 EXPECT_EQ(0U, GetAndResetSentEventCount());
1858 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1859 PressTouchPoint(30, 30);
1860 EXPECT_FALSE(HasPendingAsyncTouchMove());
1861 EXPECT_FALSE(sent_event().cancelable);
1862 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
1863 EXPECT_EQ(1U, GetAndResetSentEventCount());
1864 EXPECT_EQ(2U, queued_event_count());
1866 // Ack'ing the flushed, async touchmove will dispatch the touchstart. Note
1867 // that the flushed touchmove's ack will not reach the client (its
1868 // constituent events have already been ack'ed).
1869 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1870 EXPECT_FALSE(sent_event().cancelable);
1871 EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type);
1872 EXPECT_EQ(1U, queued_event_count());
1873 EXPECT_EQ(1U, GetAndResetSentEventCount());
1874 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1876 // Ack the touchstart.
1877 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1878 EXPECT_EQ(0U, queued_event_count());
1879 EXPECT_EQ(0U, GetAndResetSentEventCount());
1880 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1882 // Send a secondary touchmove.
1883 MoveTouchPoint(1, 0, 25);
1884 EXPECT_TRUE(HasPendingAsyncTouchMove());
1885 EXPECT_EQ(0U, queued_event_count());
1886 EXPECT_EQ(0U, GetAndResetSentEventCount());
1887 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1889 // An unconsumed scroll should resume synchronous touch handling.
1890 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1891 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1893 // The pending touchmove should be coalesced with the next (now synchronous)
1895 MoveTouchPoint(0, 0, 25);
1896 EXPECT_TRUE(sent_event().cancelable);
1897 EXPECT_FALSE(HasPendingAsyncTouchMove());
1898 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
1899 EXPECT_EQ(WebTouchPoint::StateMoved, sent_event().touches[0].state);
1900 EXPECT_EQ(WebTouchPoint::StateMoved, sent_event().touches[1].state);
1901 EXPECT_EQ(1U, queued_event_count());
1902 EXPECT_EQ(1U, GetAndResetSentEventCount());
1903 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1905 // Subsequent touches will queue until the preceding, synchronous touches are
1907 ReleaseTouchPoint(1);
1908 EXPECT_EQ(2U, queued_event_count());
1909 ReleaseTouchPoint(0);
1910 EXPECT_EQ(3U, queued_event_count());
1911 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1912 EXPECT_TRUE(sent_event().cancelable);
1913 EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type);
1914 EXPECT_EQ(2U, queued_event_count());
1915 EXPECT_EQ(1U, GetAndResetSentEventCount());
1916 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1918 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1919 EXPECT_TRUE(sent_event().cancelable);
1920 EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type);
1921 EXPECT_EQ(1U, queued_event_count());
1922 EXPECT_EQ(1U, GetAndResetSentEventCount());
1923 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1925 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1926 EXPECT_EQ(0U, queued_event_count());
1927 EXPECT_EQ(0U, GetAndResetSentEventCount());
1928 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1931 // Ensure that async touch dispatch and touch ack timeout interactions work
1933 TEST_F(TouchEventQueueTest, AsyncTouchWithAckTimeout) {
1934 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE);
1935 SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1937 // The touchstart should start the timeout.
1938 PressTouchPoint(0, 0);
1939 EXPECT_EQ(1U, GetAndResetSentEventCount());
1940 EXPECT_TRUE(IsTimeoutRunning());
1941 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1942 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1943 EXPECT_FALSE(IsTimeoutRunning());
1945 // The start of a scroll gesture should trigger async touch event dispatch.
1946 MoveTouchPoint(0, 1, 1);
1947 EXPECT_EQ(1U, GetAndResetSentEventCount());
1948 EXPECT_TRUE(IsTimeoutRunning());
1949 WebGestureEvent followup_scroll;
1950 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1951 SetFollowupEvent(followup_scroll);
1952 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1953 EXPECT_FALSE(IsTimeoutRunning());
1954 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1956 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1957 INPUT_EVENT_ACK_STATE_CONSUMED);
1959 // An async touch should fire after the throttling interval has expired, but
1960 // it should not start the touch ack timeout.
1961 MoveTouchPoint(0, 5, 5);
1962 EXPECT_TRUE(HasPendingAsyncTouchMove());
1963 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1965 AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1);
1966 MoveTouchPoint(0, 5, 5);
1967 EXPECT_FALSE(IsTimeoutRunning());
1968 EXPECT_FALSE(HasPendingAsyncTouchMove());
1969 EXPECT_FALSE(sent_event().cancelable);
1970 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1971 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1972 EXPECT_EQ(1U, GetAndResetSentEventCount());
1974 // An unconsumed scroll event will resume synchronous touchmoves, which are
1975 // subject to the ack timeout.
1976 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1977 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1978 MoveTouchPoint(0, 20, 5);
1979 EXPECT_TRUE(IsTimeoutRunning());
1980 EXPECT_TRUE(sent_event().cancelable);
1981 EXPECT_EQ(1U, GetAndResetSentEventCount());
1983 // The timeout should fire, disabling touch forwarding until both acks are
1984 // received and acking the timed out event.
1985 RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
1986 EXPECT_FALSE(IsTimeoutRunning());
1987 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1988 EXPECT_EQ(0U, GetAndResetSentEventCount());
1990 // Ack'ing the original event should trigger a cancel event.
1991 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1992 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1993 EXPECT_FALSE(sent_event().cancelable);
1994 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1995 EXPECT_EQ(1U, GetAndResetSentEventCount());
1997 // Subsequent touchmove's should not be forwarded, even as the scroll gesture
1998 // goes from unconsumed to consumed.
1999 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
2000 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2001 MoveTouchPoint(0, 20, 5);
2002 EXPECT_FALSE(HasPendingAsyncTouchMove());
2003 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2004 EXPECT_EQ(0U, GetAndResetSentEventCount());
2006 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
2007 INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2008 MoveTouchPoint(0, 25, 5);
2009 EXPECT_FALSE(HasPendingAsyncTouchMove());
2010 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2011 EXPECT_EQ(0U, GetAndResetSentEventCount());
2014 // Ensure that if the touch ack for an async touchmove triggers a follow-up
2015 // touch event, that follow-up touch will be forwarded appropriately.
2016 TEST_F(TouchEventQueueTest, AsyncTouchWithTouchCancelAfterAck) {
2017 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE);
2019 PressTouchPoint(0, 0);
2020 EXPECT_EQ(1U, GetAndResetSentEventCount());
2021 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2022 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2024 // The start of a scroll gesture should trigger async touch event dispatch.
2025 MoveTouchPoint(0, 1, 1);
2026 EXPECT_EQ(1U, GetAndResetSentEventCount());
2027 WebGestureEvent followup_scroll;
2028 followup_scroll.type = WebInputEvent::GestureScrollBegin;
2029 SetFollowupEvent(followup_scroll);
2030 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2031 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2032 EXPECT_EQ(0U, queued_event_count());
2034 SendGestureEvent(WebInputEvent::GestureScrollUpdate);
2036 // The async touchmove should be ack'ed immediately, but not forwarded.
2037 // However, because the ack triggers a touchcancel, both the pending touch and
2038 // the queued touchcancel should be flushed.
2039 WebTouchEvent followup_cancel;
2040 followup_cancel.type = WebInputEvent::TouchCancel;
2041 followup_cancel.touchesLength = 1;
2042 followup_cancel.touches[0].state = WebTouchPoint::StateCancelled;
2043 SetFollowupEvent(followup_cancel);
2044 MoveTouchPoint(0, 5, 5);
2045 EXPECT_EQ(2U, queued_event_count());
2046 EXPECT_FALSE(sent_event().cancelable);
2047 EXPECT_FALSE(HasPendingAsyncTouchMove());
2048 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
2049 EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
2050 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2051 EXPECT_EQ(1U, GetAndResetSentEventCount());
2053 // The ack for the async touchmove should not reach the client, as it has
2054 // already been ack'ed.
2055 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2056 EXPECT_FALSE(sent_event().cancelable);
2057 EXPECT_EQ(1U, queued_event_count());
2058 EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type);
2059 EXPECT_EQ(0U, GetAndResetAckedEventCount());
2060 EXPECT_EQ(1U, GetAndResetSentEventCount());
2062 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2063 EXPECT_EQ(0U, queued_event_count());
2064 EXPECT_EQ(WebInputEvent::TouchCancel, acked_event().type);
2065 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2066 EXPECT_EQ(0U, GetAndResetSentEventCount());
2069 TEST_F(TouchEventQueueTest, TouchAbsorptionWithConsumedFirstMove) {
2070 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE);
2072 // Queue a TouchStart.
2073 PressTouchPoint(0, 1);
2074 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2075 EXPECT_EQ(0U, queued_event_count());
2076 EXPECT_EQ(1U, GetAndResetAckedEventCount());
2078 MoveTouchPoint(0, 20, 5);
2079 SendGestureEvent(blink::WebInputEvent::GestureScrollBegin);
2080 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2081 EXPECT_EQ(0U, queued_event_count());
2082 EXPECT_EQ(2U, GetAndResetSentEventCount());
2084 // Even if the first touchmove event was consumed, subsequent unconsumed
2085 // touchmove events should trigger scrolling.
2086 MoveTouchPoint(0, 60, 5);
2087 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2088 EXPECT_EQ(0U, queued_event_count());
2089 EXPECT_TRUE(sent_event().cancelable);
2090 EXPECT_EQ(1U, GetAndResetSentEventCount());
2092 MoveTouchPoint(0, 20, 5);
2093 WebGestureEvent followup_scroll;
2094 followup_scroll.type = WebInputEvent::GestureScrollUpdate;
2095 SetFollowupEvent(followup_scroll);
2096 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2097 SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
2098 INPUT_EVENT_ACK_STATE_CONSUMED);
2099 EXPECT_EQ(0U, queued_event_count());
2100 EXPECT_TRUE(sent_event().cancelable);
2101 EXPECT_EQ(1U, GetAndResetSentEventCount());
2103 // Touch move event is throttled.
2104 MoveTouchPoint(0, 60, 5);
2105 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2106 EXPECT_EQ(0U, queued_event_count());
2107 EXPECT_EQ(0U, GetAndResetSentEventCount());
2110 } // namespace content