touch_event_queue_unittest.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
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.
4
5#include "base/basictypes.h"
6#include "base/logging.h"
7#include "base/memory/scoped_ptr.h"
8#include "base/message_loop/message_loop.h"
9#include "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"
14
15using blink::WebGestureEvent;
16using blink::WebInputEvent;
17using blink::WebTouchEvent;
18using blink::WebTouchPoint;
19
20namespace content {
21namespace {
22
23const double kMinSecondsBetweenThrottledTouchmoves = 0.2;
24
25base::TimeDelta DefaultTouchTimeoutDelay() {
26  return base::TimeDelta::FromMilliseconds(1);
27}
28}  // namespace
29
30class TouchEventQueueTest : public testing::Test,
31                            public TouchEventQueueClient {
32 public:
33  TouchEventQueueTest()
34      : sent_event_count_(0),
35        acked_event_count_(0),
36        last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN),
37        slop_length_dips_(0),
38        slop_includes_boundary_(true),
39        touch_scrolling_mode_(TouchEventQueue::TOUCH_SCROLLING_MODE_DEFAULT) {}
40
41  virtual ~TouchEventQueueTest() {}
42
43  // testing::Test
44  virtual void SetUp() OVERRIDE { ResetQueueWithConfig(CreateConfig()); }
45
46  virtual void TearDown() OVERRIDE {
47    queue_.reset();
48  }
49
50  // TouchEventQueueClient
51  virtual void SendTouchEventImmediately(
52      const TouchEventWithLatencyInfo& event) OVERRIDE {
53    ++sent_event_count_;
54    last_sent_event_ = event.event;
55    if (sync_ack_result_)
56      SendTouchEventAck(*sync_ack_result_.Pass());
57  }
58
59  virtual void OnTouchEventAck(
60      const TouchEventWithLatencyInfo& event,
61      InputEventAckState ack_result) OVERRIDE {
62    ++acked_event_count_;
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);
69    }
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,
75                                      ui::LatencyInfo()));
76    }
77  }
78
79 protected:
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_;
86    return config;
87  }
88
89  void SetTouchScrollingMode(TouchEventQueue::TouchScrollingMode mode) {
90    touch_scrolling_mode_ = mode;
91    ResetQueueWithConfig(CreateConfig());
92  }
93
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());
99  }
100
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);
106  }
107
108  void SendTouchEvent(const WebTouchEvent& event) {
109    queue_->QueueEvent(TouchEventWithLatencyInfo(event, ui::LatencyInfo()));
110  }
111
112  void SendGestureEvent(WebInputEvent::Type type) {
113    WebGestureEvent event;
114    event.type = type;
115    queue_->OnGestureScrollEvent(
116        GestureEventWithLatencyInfo(event, ui::LatencyInfo()));
117  }
118
119  void SendTouchEventAck(InputEventAckState ack_result) {
120    queue_->ProcessTouchAck(ack_result, ui::LatencyInfo());
121  }
122
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);
129  }
130
131  void SetFollowupEvent(const WebTouchEvent& event) {
132    followup_touch_event_.reset(new WebTouchEvent(event));
133  }
134
135  void SetFollowupEvent(const WebGestureEvent& event) {
136    followup_gesture_event_.reset(new WebGestureEvent(event));
137  }
138
139  void SetSyncAckResult(InputEventAckState sync_ack_result) {
140    sync_ack_result_.reset(new InputEventAckState(sync_ack_result));
141  }
142
143  void PressTouchPoint(float x, float y) {
144    touch_event_.PressPoint(x, y);
145    SendTouchEvent();
146  }
147
148  void MoveTouchPoint(int index, float x, float y) {
149    touch_event_.MovePoint(index, x, y);
150    SendTouchEvent();
151  }
152
153  void MoveTouchPoints(int index0,
154                       float x0,
155                       float y0,
156                       int index1,
157                       float x1,
158                       float y1) {
159    touch_event_.MovePoint(index0, x0, y0);
160    touch_event_.MovePoint(index1, x1, y1);
161    SendTouchEvent();
162  }
163
164  void ReleaseTouchPoint(int index) {
165    touch_event_.ReleasePoint(index);
166    SendTouchEvent();
167  }
168
169  void CancelTouchPoint(int index) {
170    touch_event_.CancelPoint(index);
171    SendTouchEvent();
172  }
173
174  void AdvanceTouchTime(double seconds) {
175    touch_event_.timeStampSeconds += seconds;
176  }
177
178  void ResetTouchEvent() {
179    touch_event_ = SyntheticWebTouchEvent();
180  }
181
182  size_t GetAndResetAckedEventCount() {
183    size_t count = acked_event_count_;
184    acked_event_count_ = 0;
185    return count;
186  }
187
188  size_t GetAndResetSentEventCount() {
189    size_t count = sent_event_count_;
190    sent_event_count_ = 0;
191    return count;
192  }
193
194  bool IsPendingAckTouchStart() const {
195    return queue_->IsPendingAckTouchStart();
196  }
197
198  void OnHasTouchEventHandlers(bool has_handlers) {
199    queue_->OnHasTouchEventHandlers(has_handlers);
200  }
201
202  void SetAckTimeoutDisabled() { queue_->SetAckTimeoutEnabled(false); }
203
204  bool IsTimeoutEnabled() const { return queue_->ack_timeout_enabled(); }
205
206  bool IsTimeoutRunning() const { return queue_->IsTimeoutRunningForTesting(); }
207
208  bool HasPendingAsyncTouchMove() const {
209    return queue_->HasPendingAsyncTouchMoveForTesting();
210  }
211
212  size_t queued_event_count() const {
213    return queue_->size();
214  }
215
216  const WebTouchEvent& latest_event() const {
217    return queue_->GetLatestEventForTesting().event;
218  }
219
220  const WebTouchEvent& acked_event() const {
221    return last_acked_event_;
222  }
223
224  const WebTouchEvent& sent_event() const {
225    return last_sent_event_;
226  }
227
228  InputEventAckState acked_event_state() const {
229    return last_acked_event_state_;
230  }
231
232  static void RunTasksAndWait(base::TimeDelta delay) {
233    base::MessageLoop::current()->PostDelayedTask(
234        FROM_HERE, base::MessageLoop::QuitClosure(), delay);
235    base::MessageLoop::current()->Run();
236  }
237
238 private:
239  void SendTouchEvent() {
240    SendTouchEvent(touch_event_);
241    touch_event_.ResetPoints();
242  }
243
244  void ResetQueueWithConfig(const TouchEventQueue::Config& config) {
245    queue_.reset(new TouchEventQueue(this, config));
246    queue_->OnHasTouchEventHandlers(true);
247  }
248
249  scoped_ptr<TouchEventQueue> queue_;
250  size_t sent_event_count_;
251  size_t acked_event_count_;
252  WebTouchEvent last_sent_event_;
253  WebTouchEvent last_acked_event_;
254  InputEventAckState last_acked_event_state_;
255  SyntheticWebTouchEvent touch_event_;
256  scoped_ptr<WebTouchEvent> followup_touch_event_;
257  scoped_ptr<WebGestureEvent> followup_gesture_event_;
258  scoped_ptr<InputEventAckState> sync_ack_result_;
259  double slop_length_dips_;
260  bool slop_includes_boundary_;
261  TouchEventQueue::TouchScrollingMode touch_scrolling_mode_;
262  base::MessageLoopForUI message_loop_;
263};
264
265
266// Tests that touch-events are queued properly.
267TEST_F(TouchEventQueueTest, Basic) {
268  PressTouchPoint(1, 1);
269  EXPECT_EQ(1U, queued_event_count());
270  EXPECT_EQ(1U, GetAndResetSentEventCount());
271
272  // The second touch should not be sent since one is already in queue.
273  MoveTouchPoint(0, 5, 5);
274  EXPECT_EQ(2U, queued_event_count());
275  EXPECT_EQ(0U, GetAndResetSentEventCount());
276
277  // Receive an ACK for the first touch-event.
278  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
279  EXPECT_EQ(1U, queued_event_count());
280  EXPECT_EQ(1U, GetAndResetSentEventCount());
281  EXPECT_EQ(1U, GetAndResetAckedEventCount());
282  EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
283  EXPECT_TRUE(acked_event().cancelable);
284
285  // Receive an ACK for the second touch-event.
286  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
287  EXPECT_EQ(0U, queued_event_count());
288  EXPECT_EQ(0U, GetAndResetSentEventCount());
289  EXPECT_EQ(1U, GetAndResetAckedEventCount());
290  EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
291  EXPECT_TRUE(acked_event().cancelable);
292}
293
294// Tests that the touch-queue is emptied if a page stops listening for touch
295// events.
296TEST_F(TouchEventQueueTest, QueueFlushedWhenHandlersRemoved) {
297  OnHasTouchEventHandlers(true);
298  EXPECT_EQ(0U, queued_event_count());
299  EXPECT_EQ(0U, GetAndResetSentEventCount());
300
301  // Send a touch-press event.
302  PressTouchPoint(1, 1);
303  EXPECT_EQ(1U, GetAndResetSentEventCount());
304
305  ReleaseTouchPoint(0);
306
307  // Events will be queued until the first sent event is ack'ed.
308  for (int i = 5; i < 15; ++i) {
309    PressTouchPoint(1, 1);
310    MoveTouchPoint(0, i, i);
311    ReleaseTouchPoint(0);
312  }
313  EXPECT_EQ(32U, queued_event_count());
314  EXPECT_EQ(0U, GetAndResetSentEventCount());
315
316  // Receive an ACK for the first touch-event. One of the queued touch-event
317  // should be forwarded.
318  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
319  EXPECT_EQ(31U, queued_event_count());
320  EXPECT_EQ(1U, GetAndResetSentEventCount());
321  EXPECT_EQ(1U, GetAndResetAckedEventCount());
322  EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
323
324  // Flush the queue. The touch-event queue should now be emptied, but none of
325  // the queued touch-events should be sent to the renderer.
326  OnHasTouchEventHandlers(false);
327  EXPECT_EQ(0U, queued_event_count());
328  EXPECT_EQ(0U, GetAndResetSentEventCount());
329  EXPECT_EQ(31U, GetAndResetAckedEventCount());
330}
331
332// Tests that addition of a touch handler during a touch sequence will not cause
333// the remaining sequence to be forwarded.
334TEST_F(TouchEventQueueTest, ActiveSequenceNotForwardedWhenHandlersAdded) {
335  OnHasTouchEventHandlers(false);
336
337  // Send a touch-press event while there is no handler.
338  PressTouchPoint(1, 1);
339  EXPECT_EQ(1U, GetAndResetAckedEventCount());
340  EXPECT_EQ(0U, GetAndResetSentEventCount());
341  EXPECT_EQ(0U, queued_event_count());
342
343  OnHasTouchEventHandlers(true);
344
345  // The remaining touch sequence should not be forwarded.
346  MoveTouchPoint(0, 5, 5);
347  ReleaseTouchPoint(0);
348  EXPECT_EQ(2U, GetAndResetAckedEventCount());
349  EXPECT_EQ(0U, GetAndResetSentEventCount());
350  EXPECT_EQ(0U, queued_event_count());
351
352  // A new touch sequence should resume forwarding.
353  PressTouchPoint(1, 1);
354  EXPECT_EQ(1U, queued_event_count());
355  EXPECT_EQ(1U, GetAndResetSentEventCount());
356}
357
358// Tests that removal of a touch handler during a touch sequence will prevent
359// the remaining sequence from being forwarded, even if another touch handler is
360// registered during the same touch sequence.
361TEST_F(TouchEventQueueTest, ActiveSequenceDroppedWhenHandlersRemoved) {
362  // Send a touch-press event.
363  PressTouchPoint(1, 1);
364  EXPECT_EQ(1U, GetAndResetSentEventCount());
365  EXPECT_EQ(1U, queued_event_count());
366
367  // Queue a touch-move event.
368  MoveTouchPoint(0, 5, 5);
369  EXPECT_EQ(2U, queued_event_count());
370  EXPECT_EQ(0U, GetAndResetAckedEventCount());
371  EXPECT_EQ(0U, GetAndResetSentEventCount());
372
373  // Touch handle deregistration should flush the queue.
374  OnHasTouchEventHandlers(false);
375  EXPECT_EQ(2U, GetAndResetAckedEventCount());
376  EXPECT_EQ(0U, queued_event_count());
377
378  // The ack should be ignored as the touch queue is now empty.
379  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
380  EXPECT_EQ(0U, GetAndResetAckedEventCount());
381  EXPECT_EQ(0U, queued_event_count());
382
383  // Events should be dropped while there is no touch handler.
384  MoveTouchPoint(0, 10, 10);
385  EXPECT_EQ(0U, queued_event_count());
386  EXPECT_EQ(1U, GetAndResetAckedEventCount());
387  EXPECT_EQ(0U, GetAndResetSentEventCount());
388
389  // Simulate touch handler registration in the middle of a touch sequence.
390  OnHasTouchEventHandlers(true);
391
392  // The touch end for the interrupted sequence should be dropped.
393  ReleaseTouchPoint(0);
394  EXPECT_EQ(0U, queued_event_count());
395  EXPECT_EQ(1U, GetAndResetAckedEventCount());
396  EXPECT_EQ(0U, GetAndResetSentEventCount());
397
398  // A new touch sequence should be forwarded properly.
399  PressTouchPoint(1, 1);
400  EXPECT_EQ(1U, queued_event_count());
401  EXPECT_EQ(1U, GetAndResetSentEventCount());
402}
403
404// Tests that touch-events are coalesced properly in the queue.
405TEST_F(TouchEventQueueTest, Coalesce) {
406  // Send a touch-press event.
407  PressTouchPoint(1, 1);
408  EXPECT_EQ(1U, GetAndResetSentEventCount());
409
410  // Send a few touch-move events, followed by a touch-release event. All the
411  // touch-move events should be coalesced into a single event.
412  for (int i = 5; i < 15; ++i)
413    MoveTouchPoint(0, i, i);
414
415  EXPECT_EQ(0U, GetAndResetSentEventCount());
416  ReleaseTouchPoint(0);
417  EXPECT_EQ(0U, GetAndResetSentEventCount());
418  EXPECT_EQ(3U, queued_event_count());
419
420  // ACK the press.  Coalesced touch-move events should be sent.
421  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
422  EXPECT_EQ(2U, queued_event_count());
423  EXPECT_EQ(1U, GetAndResetSentEventCount());
424  EXPECT_EQ(1U, GetAndResetAckedEventCount());
425  EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
426  EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, acked_event_state());
427
428  // ACK the moves.
429  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
430  EXPECT_EQ(1U, queued_event_count());
431  EXPECT_EQ(1U, GetAndResetSentEventCount());
432  EXPECT_EQ(10U, GetAndResetAckedEventCount());
433  EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
434
435  // ACK the release.
436  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
437  EXPECT_EQ(0U, queued_event_count());
438  EXPECT_EQ(0U, GetAndResetSentEventCount());
439  EXPECT_EQ(1U, GetAndResetAckedEventCount());
440  EXPECT_EQ(WebInputEvent::TouchEnd, acked_event().type);
441}
442
443// Tests that an event that has already been sent but hasn't been ack'ed yet
444// doesn't get coalesced with newer events.
445TEST_F(TouchEventQueueTest, SentTouchEventDoesNotCoalesce) {
446  // Send a touch-press event.
447  PressTouchPoint(1, 1);
448  EXPECT_EQ(1U, GetAndResetSentEventCount());
449
450  // Send a few touch-move events, followed by a touch-release event. All the
451  // touch-move events should be coalesced into a single event.
452  for (int i = 5; i < 15; ++i)
453    MoveTouchPoint(0, i, i);
454
455  EXPECT_EQ(0U, GetAndResetSentEventCount());
456  EXPECT_EQ(2U, queued_event_count());
457
458  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
459  EXPECT_EQ(1U, GetAndResetSentEventCount());
460  EXPECT_EQ(1U, queued_event_count());
461
462  // The coalesced touch-move event has been sent to the renderer. Any new
463  // touch-move event should not be coalesced with the sent event.
464  MoveTouchPoint(0, 5, 5);
465  EXPECT_EQ(2U, queued_event_count());
466
467  MoveTouchPoint(0, 7, 7);
468  EXPECT_EQ(2U, queued_event_count());
469}
470
471// Tests that coalescing works correctly for multi-touch events.
472TEST_F(TouchEventQueueTest, MultiTouch) {
473  // Press the first finger.
474  PressTouchPoint(1, 1);
475  EXPECT_EQ(1U, GetAndResetSentEventCount());
476
477  // Move the finger.
478  MoveTouchPoint(0, 5, 5);
479  EXPECT_EQ(2U, queued_event_count());
480
481  // Now press a second finger.
482  PressTouchPoint(2, 2);
483  EXPECT_EQ(3U, queued_event_count());
484
485  // Move both fingers.
486  MoveTouchPoints(0, 10, 10, 1, 20, 20);
487  MoveTouchPoint(1, 20, 20);
488  EXPECT_EQ(4U, queued_event_count());
489
490  // Move only one finger now.
491  MoveTouchPoint(0, 15, 15);
492  EXPECT_EQ(4U, queued_event_count());
493
494  // Move the other finger.
495  MoveTouchPoint(1, 25, 25);
496  EXPECT_EQ(4U, queued_event_count());
497
498  // Make sure both fingers are marked as having been moved in the coalesced
499  // event.
500  const WebTouchEvent& event = latest_event();
501  EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[0].state);
502  EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[1].state);
503}
504
505// Tests that if a touch-event queue is destroyed in response to a touch-event
506// in the renderer, then there is no crash when the ACK for that touch-event
507// comes back.
508TEST_F(TouchEventQueueTest, AckAfterQueueFlushed) {
509  // Send some touch-events to the renderer.
510  PressTouchPoint(1, 1);
511  EXPECT_EQ(1U, GetAndResetSentEventCount());
512  EXPECT_EQ(1U, queued_event_count());
513
514  MoveTouchPoint(0, 10, 10);
515  EXPECT_EQ(0U, GetAndResetSentEventCount());
516  EXPECT_EQ(2U, queued_event_count());
517
518  // Receive an ACK for the press. This should cause the queued touch-move to
519  // be sent to the renderer.
520  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
521  EXPECT_EQ(1U, GetAndResetSentEventCount());
522  EXPECT_EQ(1U, queued_event_count());
523
524  OnHasTouchEventHandlers(false);
525  EXPECT_EQ(0U, GetAndResetSentEventCount());
526  EXPECT_EQ(0U, queued_event_count());
527
528  // Now receive an ACK for the move.
529  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
530  EXPECT_EQ(0U, GetAndResetSentEventCount());
531  EXPECT_EQ(0U, queued_event_count());
532}
533
534// Tests that touch-move events are not sent to the renderer if the preceding
535// touch-press event did not have a consumer (and consequently, did not hit the
536// main thread in the renderer). Also tests that all queued/coalesced touch
537// events are flushed immediately when the ACK for the touch-press comes back
538// with NO_CONSUMER status.
539TEST_F(TouchEventQueueTest, NoConsumer) {
540  // The first touch-press should reach the renderer.
541  PressTouchPoint(1, 1);
542  EXPECT_EQ(1U, GetAndResetSentEventCount());
543
544  // The second touch should not be sent since one is already in queue.
545  MoveTouchPoint(0, 5, 5);
546  EXPECT_EQ(0U, GetAndResetSentEventCount());
547  EXPECT_EQ(2U, queued_event_count());
548
549  // Receive an ACK for the first touch-event. This should release the queued
550  // touch-event, but it should not be sent to the renderer.
551  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
552  EXPECT_EQ(0U, queued_event_count());
553  EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
554  EXPECT_EQ(2U, GetAndResetAckedEventCount());
555  EXPECT_EQ(0U, GetAndResetSentEventCount());
556
557  // Send a release event. This should not reach the renderer.
558  ReleaseTouchPoint(0);
559  EXPECT_EQ(0U, GetAndResetSentEventCount());
560  EXPECT_EQ(WebInputEvent::TouchEnd, acked_event().type);
561  EXPECT_EQ(1U, GetAndResetAckedEventCount());
562
563  // Send a press-event, followed by move and release events, and another press
564  // event, before the ACK for the first press event comes back. All of the
565  // events should be queued first. After the NO_CONSUMER ack for the first
566  // touch-press, all events upto the second touch-press should be flushed.
567  PressTouchPoint(10, 10);
568  EXPECT_EQ(1U, GetAndResetSentEventCount());
569
570  MoveTouchPoint(0, 5, 5);
571  MoveTouchPoint(0, 6, 5);
572  ReleaseTouchPoint(0);
573
574  PressTouchPoint(6, 5);
575  EXPECT_EQ(0U, GetAndResetSentEventCount());
576  // The queue should hold the first sent touch-press event, the coalesced
577  // touch-move event, the touch-end event and the second touch-press event.
578  EXPECT_EQ(4U, queued_event_count());
579
580  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
581  EXPECT_EQ(1U, GetAndResetSentEventCount());
582  EXPECT_EQ(WebInputEvent::TouchEnd, acked_event().type);
583  EXPECT_EQ(4U, GetAndResetAckedEventCount());
584  EXPECT_EQ(1U, queued_event_count());
585
586  // ACK the second press event as NO_CONSUMER too.
587  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
588  EXPECT_EQ(0U, GetAndResetSentEventCount());
589  EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
590  EXPECT_EQ(1U, GetAndResetAckedEventCount());
591  EXPECT_EQ(0U, queued_event_count());
592
593  // Send a second press event. Even though the first touch press had
594  // NO_CONSUMER, this press event should reach the renderer.
595  PressTouchPoint(1, 1);
596  EXPECT_EQ(1U, GetAndResetSentEventCount());
597  EXPECT_EQ(1U, queued_event_count());
598  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
599  EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
600  EXPECT_EQ(1U, GetAndResetAckedEventCount());
601}
602
603TEST_F(TouchEventQueueTest, ConsumerIgnoreMultiFinger) {
604  // Press two touch points and move them around a bit. The renderer consumes
605  // the events for the first touch point, but returns NO_CONSUMER_EXISTS for
606  // the second touch point.
607
608  PressTouchPoint(1, 1);
609  EXPECT_EQ(1U, GetAndResetSentEventCount());
610
611  MoveTouchPoint(0, 5, 5);
612
613  PressTouchPoint(10, 10);
614
615  MoveTouchPoint(0, 2, 2);
616
617  MoveTouchPoint(1, 4, 10);
618
619  MoveTouchPoints(0, 10, 10, 1, 20, 20);
620
621  // Since the first touch-press is still pending ACK, no other event should
622  // have been sent to the renderer.
623  EXPECT_EQ(0U, GetAndResetSentEventCount());
624  // The queue includes the two presses, the first touch-move of the first
625  // point, and a coalesced touch-move of both points.
626  EXPECT_EQ(4U, queued_event_count());
627
628  // ACK the first press as CONSUMED. This should cause the first touch-move of
629  // the first touch-point to be dispatched.
630  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
631  EXPECT_EQ(1U, GetAndResetSentEventCount());
632  EXPECT_EQ(3U, queued_event_count());
633
634  // ACK the first move as CONSUMED.
635  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
636  EXPECT_EQ(1U, GetAndResetSentEventCount());
637  EXPECT_EQ(2U, queued_event_count());
638
639  // ACK the second press as NO_CONSUMER_EXISTS. This will dequeue the coalesced
640  // touch-move event (which contains both touch points). Although the second
641  // touch-point does not need to be sent to the renderer, the first touch-point
642  // did move, and so the coalesced touch-event will be sent to the renderer.
643  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
644  EXPECT_EQ(1U, GetAndResetSentEventCount());
645  EXPECT_EQ(1U, queued_event_count());
646
647  // ACK the coalesced move as NOT_CONSUMED.
648  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
649  EXPECT_EQ(0U, GetAndResetSentEventCount());
650  EXPECT_EQ(0U, queued_event_count());
651
652  // Move just the second touch point. Because the first touch point did not
653  // move, this event should not reach the renderer.
654  MoveTouchPoint(1, 30, 30);
655  EXPECT_EQ(0U, GetAndResetSentEventCount());
656  EXPECT_EQ(0U, queued_event_count());
657
658  // Move just the first touch point. This should reach the renderer.
659  MoveTouchPoint(0, 10, 10);
660  EXPECT_EQ(1U, GetAndResetSentEventCount());
661  EXPECT_EQ(1U, queued_event_count());
662
663  // Move both fingers. This event should reach the renderer (after the ACK of
664  // the previous move event is received), because the first touch point did
665  // move.
666  MoveTouchPoints(0, 15, 15, 1, 25, 25);
667  EXPECT_EQ(0U, GetAndResetSentEventCount());
668
669  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
670  EXPECT_EQ(1U, GetAndResetSentEventCount());
671  EXPECT_EQ(1U, queued_event_count());
672
673  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
674  EXPECT_EQ(0U, GetAndResetSentEventCount());
675  EXPECT_EQ(0U, queued_event_count());
676
677  // Release the first finger. Then move the second finger around some, then
678  // press another finger. Once the release event is ACKed, the move events of
679  // the second finger should be immediately released to the view, and the
680  // touch-press event should be dispatched to the renderer.
681  ReleaseTouchPoint(0);
682  EXPECT_EQ(1U, GetAndResetSentEventCount());
683  EXPECT_EQ(1U, queued_event_count());
684
685  MoveTouchPoint(1, 40, 40);
686
687  MoveTouchPoint(1, 50, 50);
688
689  PressTouchPoint(1, 1);
690
691  MoveTouchPoint(1, 30, 30);
692  EXPECT_EQ(0U, GetAndResetSentEventCount());
693  EXPECT_EQ(4U, queued_event_count());
694
695  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
696  EXPECT_EQ(1U, GetAndResetSentEventCount());
697  EXPECT_EQ(2U, queued_event_count());
698  EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
699
700  // ACK the press with NO_CONSUMED_EXISTS. This should release the queued
701  // touch-move events to the view.
702  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
703  EXPECT_EQ(0U, GetAndResetSentEventCount());
704  EXPECT_EQ(0U, queued_event_count());
705  EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
706
707  ReleaseTouchPoint(2);
708  ReleaseTouchPoint(1);
709  EXPECT_EQ(0U, GetAndResetSentEventCount());
710  EXPECT_EQ(0U, queued_event_count());
711}
712
713// Tests that touch-event's enqueued via a touch ack are properly handled.
714TEST_F(TouchEventQueueTest, AckWithFollowupEvents) {
715  // Queue a touch down.
716  PressTouchPoint(1, 1);
717  EXPECT_EQ(1U, queued_event_count());
718  EXPECT_EQ(1U, GetAndResetSentEventCount());
719  EXPECT_EQ(0U, GetAndResetAckedEventCount());
720
721  // Create a touch event that will be queued synchronously by a touch ack.
722  // Note, this will be triggered by all subsequent touch acks.
723  WebTouchEvent followup_event;
724  followup_event.type = WebInputEvent::TouchStart;
725  followup_event.touchesLength = 1;
726  followup_event.touches[0].id = 1;
727  followup_event.touches[0].state = WebTouchPoint::StatePressed;
728  SetFollowupEvent(followup_event);
729
730  // Receive an ACK for the press. This should cause the followup touch-move to
731  // be sent to the renderer.
732  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
733  EXPECT_EQ(1U, queued_event_count());
734  EXPECT_EQ(1U, GetAndResetSentEventCount());
735  EXPECT_EQ(1U, GetAndResetAckedEventCount());
736  EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, acked_event_state());
737  EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
738
739  // Queue another event.
740  MoveTouchPoint(0, 2, 2);
741  EXPECT_EQ(2U, queued_event_count());
742
743  // Receive an ACK for the touch-move followup event. This should cause the
744  // subsequent touch move event be sent to the renderer.
745  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
746  EXPECT_EQ(1U, queued_event_count());
747  EXPECT_EQ(1U, GetAndResetSentEventCount());
748  EXPECT_EQ(1U, GetAndResetAckedEventCount());
749}
750
751// Tests that touch-events can be synchronously ack'ed.
752TEST_F(TouchEventQueueTest, SynchronousAcks) {
753  // TouchStart
754  SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
755  PressTouchPoint(1, 1);
756  EXPECT_EQ(0U, queued_event_count());
757  EXPECT_EQ(1U, GetAndResetSentEventCount());
758  EXPECT_EQ(1U, GetAndResetAckedEventCount());
759
760  // TouchMove
761  SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
762  MoveTouchPoint(0, 2, 2);
763  EXPECT_EQ(0U, queued_event_count());
764  EXPECT_EQ(1U, GetAndResetSentEventCount());
765  EXPECT_EQ(1U, GetAndResetAckedEventCount());
766
767  // TouchEnd
768  SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
769  ReleaseTouchPoint(0);
770  EXPECT_EQ(0U, queued_event_count());
771  EXPECT_EQ(1U, GetAndResetSentEventCount());
772  EXPECT_EQ(1U, GetAndResetAckedEventCount());
773
774  // TouchCancel (first inserting a TouchStart so the TouchCancel will be sent)
775  PressTouchPoint(1, 1);
776  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
777  EXPECT_EQ(0U, queued_event_count());
778  EXPECT_EQ(1U, GetAndResetSentEventCount());
779  EXPECT_EQ(1U, GetAndResetAckedEventCount());
780
781  SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
782  CancelTouchPoint(0);
783  EXPECT_EQ(0U, queued_event_count());
784  EXPECT_EQ(1U, GetAndResetSentEventCount());
785  EXPECT_EQ(1U, GetAndResetAckedEventCount());
786}
787
788// Tests that followup events triggered by an immediate ack from
789// TouchEventQueue::QueueEvent() are properly handled.
790TEST_F(TouchEventQueueTest, ImmediateAckWithFollowupEvents) {
791  // Create a touch event that will be queued synchronously by a touch ack.
792  WebTouchEvent followup_event;
793  followup_event.type = WebInputEvent::TouchStart;
794  followup_event.touchesLength = 1;
795  followup_event.touches[0].id = 1;
796  followup_event.touches[0].state = WebTouchPoint::StatePressed;
797  SetFollowupEvent(followup_event);
798
799  // Now, enqueue a stationary touch that will not be forwarded.  This should be
800  // immediately ack'ed with "NO_CONSUMER_EXISTS".  The followup event should
801  // then be enqueued and immediately sent to the renderer.
802  WebTouchEvent stationary_event;
803  stationary_event.touchesLength = 1;
804  stationary_event.type = WebInputEvent::TouchMove;
805  stationary_event.touches[0].id = 1;
806  stationary_event.touches[0].state = WebTouchPoint::StateStationary;
807  SendTouchEvent(stationary_event);
808
809  EXPECT_EQ(1U, queued_event_count());
810  EXPECT_EQ(1U, GetAndResetSentEventCount());
811  EXPECT_EQ(1U, GetAndResetAckedEventCount());
812  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
813  EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
814}
815
816// Tests basic TouchEvent forwarding suppression.
817TEST_F(TouchEventQueueTest, NoTouchBasic) {
818  // Disable TouchEvent forwarding.
819  OnHasTouchEventHandlers(false);
820  PressTouchPoint(30, 5);
821  EXPECT_EQ(0U, GetAndResetSentEventCount());
822  EXPECT_EQ(1U, GetAndResetAckedEventCount());
823
824  // TouchMove should not be sent to renderer.
825  MoveTouchPoint(0, 65, 10);
826  EXPECT_EQ(0U, GetAndResetSentEventCount());
827  EXPECT_EQ(1U, GetAndResetAckedEventCount());
828
829  // TouchEnd should not be sent to renderer.
830  ReleaseTouchPoint(0);
831  EXPECT_EQ(0U, GetAndResetSentEventCount());
832  EXPECT_EQ(1U, GetAndResetAckedEventCount());
833
834  // Enable TouchEvent forwarding.
835  OnHasTouchEventHandlers(true);
836
837  PressTouchPoint(80, 10);
838  EXPECT_EQ(1U, GetAndResetSentEventCount());
839  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
840  EXPECT_EQ(1U, GetAndResetAckedEventCount());
841
842  MoveTouchPoint(0, 80, 20);
843  EXPECT_EQ(1U, GetAndResetSentEventCount());
844  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
845  EXPECT_EQ(1U, GetAndResetAckedEventCount());
846
847  ReleaseTouchPoint(0);
848  EXPECT_EQ(1U, GetAndResetSentEventCount());
849  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
850  EXPECT_EQ(1U, GetAndResetAckedEventCount());
851}
852
853// Tests that no TouchEvents are sent to renderer during scrolling.
854TEST_F(TouchEventQueueTest, TouchCancelOnScroll) {
855  SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_TOUCHCANCEL);
856  // Queue a TouchStart.
857  PressTouchPoint(0, 1);
858  EXPECT_EQ(1U, GetAndResetSentEventCount());
859  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
860  EXPECT_EQ(1U, GetAndResetAckedEventCount());
861
862  MoveTouchPoint(0, 20, 5);
863  EXPECT_EQ(1U, queued_event_count());
864  EXPECT_EQ(1U, GetAndResetSentEventCount());
865
866  MoveTouchPoint(0, 30, 15);
867  EXPECT_EQ(2U, queued_event_count());
868  EXPECT_EQ(0U, GetAndResetSentEventCount());
869
870  // Queue another TouchStart.
871  PressTouchPoint(20, 20);
872  EXPECT_EQ(3U, queued_event_count());
873  EXPECT_EQ(0U, GetAndResetSentEventCount());
874  EXPECT_EQ(WebInputEvent::TouchStart, latest_event().type);
875
876  WebGestureEvent followup_scroll;
877  followup_scroll.type = WebInputEvent::GestureScrollBegin;
878  SetFollowupEvent(followup_scroll);
879  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
880  EXPECT_EQ(1U, GetAndResetSentEventCount());
881  EXPECT_EQ(1U, GetAndResetAckedEventCount());
882  EXPECT_EQ(2U, queued_event_count());
883  EXPECT_TRUE(sent_event().cancelable);
884  EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
885
886  // GestureScrollUpdate inserts a synthetic TouchCancel before the TouchStart.
887  followup_scroll.type = WebInputEvent::GestureScrollUpdate;
888  SetFollowupEvent(followup_scroll);
889  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
890  EXPECT_EQ(1U, GetAndResetSentEventCount());
891  EXPECT_EQ(1U, GetAndResetAckedEventCount());
892  EXPECT_EQ(2U, queued_event_count());
893  EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type);
894  EXPECT_FALSE(sent_event().cancelable);
895  EXPECT_EQ(WebInputEvent::TouchStart, latest_event().type);
896
897  // Acking the TouchCancel will result in dispatch of the next TouchStart.
898  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
899  // The synthetic TouchCancel should not reach client, only the TouchStart.
900  EXPECT_EQ(1U, GetAndResetAckedEventCount());
901  EXPECT_EQ(0U, GetAndResetSentEventCount());
902  EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
903
904  // TouchMove should not be sent to the renderer.
905  MoveTouchPoint(0, 30, 5);
906  EXPECT_EQ(1U, GetAndResetAckedEventCount());
907  EXPECT_EQ(0U, GetAndResetSentEventCount());
908  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
909
910  // GestureScrollUpdates should not change affect touch forwarding.
911  SendGestureEvent(WebInputEvent::GestureScrollUpdate);
912
913  // TouchEnd should not be sent to the renderer.
914  ReleaseTouchPoint(0);
915  EXPECT_EQ(1U, GetAndResetAckedEventCount());
916  EXPECT_EQ(0U, GetAndResetSentEventCount());
917  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
918
919  ReleaseTouchPoint(0);
920  EXPECT_EQ(1U, GetAndResetAckedEventCount());
921  EXPECT_EQ(0U, GetAndResetSentEventCount());
922  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
923
924  // Touch events from a new gesture sequence should be forwarded normally.
925  PressTouchPoint(80, 10);
926  EXPECT_EQ(1U, GetAndResetSentEventCount());
927  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
928  EXPECT_EQ(1U, GetAndResetAckedEventCount());
929
930  MoveTouchPoint(0, 80, 20);
931  EXPECT_EQ(1U, GetAndResetSentEventCount());
932  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
933  EXPECT_EQ(1U, GetAndResetAckedEventCount());
934
935  ReleaseTouchPoint(0);
936  EXPECT_EQ(1U, GetAndResetSentEventCount());
937  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
938  EXPECT_EQ(1U, GetAndResetAckedEventCount());
939}
940
941// Tests that a scroll event will not insert a synthetic TouchCancel if there
942// was no consumer for the current touch sequence.
943TEST_F(TouchEventQueueTest, NoTouchCancelOnScrollIfNoConsumer) {
944  SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_TOUCHCANCEL);
945
946  // Queue a TouchStart.
947  PressTouchPoint(0, 1);
948  EXPECT_EQ(1U, GetAndResetSentEventCount());
949  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
950  EXPECT_EQ(1U, GetAndResetAckedEventCount());
951  EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type);
952
953  // Queue a TouchMove that turns into a GestureScrollBegin.
954  WebGestureEvent followup_scroll;
955  followup_scroll.type = WebInputEvent::GestureScrollBegin;
956  SetFollowupEvent(followup_scroll);
957  MoveTouchPoint(0, 20, 5);
958
959  // The TouchMove has no consumer, and should be ack'ed immediately. However,
960  // *no* synthetic TouchCancel should be inserted as the touch sequence
961  // had no consumer.
962  EXPECT_EQ(0U, queued_event_count());
963  EXPECT_EQ(0U, GetAndResetSentEventCount());
964  EXPECT_EQ(1U, GetAndResetAckedEventCount());
965  EXPECT_EQ(0U, queued_event_count());
966  EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type);
967
968  // Subsequent TouchMove's should not be sent to the renderer.
969  MoveTouchPoint(0, 30, 5);
970  EXPECT_EQ(1U, GetAndResetAckedEventCount());
971  EXPECT_EQ(0U, GetAndResetSentEventCount());
972  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
973
974  // TouchEnd should not be sent to the renderer.
975  ReleaseTouchPoint(0);
976  EXPECT_EQ(1U, GetAndResetAckedEventCount());
977  EXPECT_EQ(0U, GetAndResetSentEventCount());
978  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
979
980  // Touch events from a new gesture sequence should be forwarded normally.
981  PressTouchPoint(80, 10);
982  EXPECT_EQ(1U, GetAndResetSentEventCount());
983  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
984  EXPECT_EQ(1U, GetAndResetAckedEventCount());
985}
986
987// Tests that IsTouchStartPendingAck works correctly.
988TEST_F(TouchEventQueueTest, PendingStart) {
989
990  EXPECT_FALSE(IsPendingAckTouchStart());
991
992  // Send the touchstart for one point (#1).
993  PressTouchPoint(1, 1);
994  EXPECT_EQ(1U, queued_event_count());
995  EXPECT_TRUE(IsPendingAckTouchStart());
996
997  // Send a touchmove for that point (#2).
998  MoveTouchPoint(0, 5, 5);
999  EXPECT_EQ(2U, queued_event_count());
1000  EXPECT_TRUE(IsPendingAckTouchStart());
1001
1002  // Ack the touchstart (#1).
1003  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1004  EXPECT_EQ(1U, queued_event_count());
1005  EXPECT_FALSE(IsPendingAckTouchStart());
1006
1007  // Send a touchstart for another point (#3).
1008  PressTouchPoint(10, 10);
1009  EXPECT_EQ(2U, queued_event_count());
1010  EXPECT_FALSE(IsPendingAckTouchStart());
1011
1012  // Ack the touchmove (#2).
1013  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1014  EXPECT_EQ(1U, queued_event_count());
1015  EXPECT_TRUE(IsPendingAckTouchStart());
1016
1017  // Send a touchstart for a third point (#4).
1018  PressTouchPoint(15, 15);
1019  EXPECT_EQ(2U, queued_event_count());
1020  EXPECT_TRUE(IsPendingAckTouchStart());
1021
1022  // Ack the touchstart for the second point (#3).
1023  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1024  EXPECT_EQ(1U, queued_event_count());
1025  EXPECT_TRUE(IsPendingAckTouchStart());
1026
1027  // Ack the touchstart for the third point (#4).
1028  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1029  EXPECT_EQ(0U, queued_event_count());
1030  EXPECT_FALSE(IsPendingAckTouchStart());
1031}
1032
1033// Tests that the touch timeout is started when sending certain touch types.
1034TEST_F(TouchEventQueueTest, TouchTimeoutTypes) {
1035  SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1036
1037  // Sending a TouchStart will start the timeout.
1038  PressTouchPoint(0, 1);
1039  EXPECT_TRUE(IsTimeoutRunning());
1040  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1041  EXPECT_FALSE(IsTimeoutRunning());
1042
1043  // A TouchMove should start the timeout.
1044  MoveTouchPoint(0, 5, 5);
1045  EXPECT_TRUE(IsTimeoutRunning());
1046  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1047  EXPECT_FALSE(IsTimeoutRunning());
1048
1049  // A TouchEnd should not start the timeout.
1050  ReleaseTouchPoint(0);
1051  EXPECT_FALSE(IsTimeoutRunning());
1052  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1053  EXPECT_FALSE(IsTimeoutRunning());
1054
1055  // A TouchCancel should not start the timeout.
1056  PressTouchPoint(0, 1);
1057  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1058  ASSERT_FALSE(IsTimeoutRunning());
1059  CancelTouchPoint(0);
1060  EXPECT_FALSE(IsTimeoutRunning());
1061  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1062  EXPECT_FALSE(IsTimeoutRunning());
1063}
1064
1065// Tests that a delayed TouchEvent ack will trigger a TouchCancel timeout,
1066// disabling touch forwarding until the next TouchStart is received after
1067// the timeout events are ack'ed.
1068TEST_F(TouchEventQueueTest, TouchTimeoutBasic) {
1069  SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1070
1071  // Queue a TouchStart.
1072  GetAndResetSentEventCount();
1073  GetAndResetAckedEventCount();
1074  PressTouchPoint(0, 1);
1075  ASSERT_EQ(1U, GetAndResetSentEventCount());
1076  ASSERT_EQ(0U, GetAndResetAckedEventCount());
1077  EXPECT_TRUE(IsTimeoutRunning());
1078
1079  // Delay the ack.
1080  RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
1081
1082  // The timeout should have fired, synthetically ack'ing the timed-out event.
1083  // TouchEvent forwarding is disabled until the ack is received for the
1084  // timed-out event and the future cancel event.
1085  EXPECT_FALSE(IsTimeoutRunning());
1086  EXPECT_EQ(0U, GetAndResetSentEventCount());
1087  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1088
1089  // Ack'ing the original event should trigger a cancel event.
1090  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1091  EXPECT_FALSE(IsTimeoutRunning());
1092  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1093  EXPECT_EQ(1U, GetAndResetSentEventCount());
1094  EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type);
1095  EXPECT_FALSE(sent_event().cancelable);
1096
1097  // Touch events should not be forwarded until we receive the cancel acks.
1098  MoveTouchPoint(0, 1, 1);
1099  ASSERT_EQ(0U, GetAndResetSentEventCount());
1100  ASSERT_EQ(1U, GetAndResetAckedEventCount());
1101
1102  ReleaseTouchPoint(0);
1103  ASSERT_EQ(0U, GetAndResetSentEventCount());
1104  ASSERT_EQ(1U, GetAndResetAckedEventCount());
1105
1106  // The synthetic TouchCancel ack should not reach the client, but should
1107  // resume touch forwarding.
1108  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1109  EXPECT_EQ(0U, GetAndResetSentEventCount());
1110  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1111
1112  // Subsequent events should be handled normally.
1113  PressTouchPoint(0, 1);
1114  EXPECT_EQ(1U, GetAndResetSentEventCount());
1115  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1116  EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type);
1117  EXPECT_TRUE(sent_event().cancelable);
1118}
1119
1120// Tests that the timeout is never started if the renderer consumes
1121// a TouchEvent from the current touch sequence.
1122TEST_F(TouchEventQueueTest, NoTouchTimeoutIfRendererIsConsumingGesture) {
1123  SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1124
1125  // Queue a TouchStart.
1126  PressTouchPoint(0, 1);
1127  ASSERT_TRUE(IsTimeoutRunning());
1128
1129  // Mark the event as consumed. This should prevent the timeout from
1130  // being activated on subsequent TouchEvents in this gesture.
1131  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
1132  EXPECT_FALSE(IsTimeoutRunning());
1133
1134  // A TouchMove should not start the timeout.
1135  MoveTouchPoint(0, 5, 5);
1136  EXPECT_FALSE(IsTimeoutRunning());
1137  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1138
1139  // A secondary TouchStart should not start the timeout.
1140  PressTouchPoint(1, 0);
1141  EXPECT_FALSE(IsTimeoutRunning());
1142  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1143
1144  // A TouchEnd should not start the timeout.
1145  ReleaseTouchPoint(1);
1146  EXPECT_FALSE(IsTimeoutRunning());
1147  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1148
1149  // A TouchCancel should not start the timeout.
1150  CancelTouchPoint(0);
1151  EXPECT_FALSE(IsTimeoutRunning());
1152}
1153
1154// Tests that the timeout is never started if the renderer consumes
1155// a TouchEvent from the current touch sequence.
1156TEST_F(TouchEventQueueTest, NoTouchTimeoutIfDisabledAfterTouchStart) {
1157  SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1158
1159  // Queue a TouchStart.
1160  PressTouchPoint(0, 1);
1161  ASSERT_TRUE(IsTimeoutRunning());
1162
1163  // Send the ack immediately. The timeout should not have fired.
1164  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1165  EXPECT_FALSE(IsTimeoutRunning());
1166  EXPECT_TRUE(IsTimeoutEnabled());
1167  EXPECT_EQ(1U, GetAndResetSentEventCount());
1168  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1169
1170  // Now explicitly disable the timeout.
1171  SetAckTimeoutDisabled();
1172  EXPECT_FALSE(IsTimeoutRunning());
1173  EXPECT_FALSE(IsTimeoutEnabled());
1174
1175  // A TouchMove should not start or trigger the timeout.
1176  MoveTouchPoint(0, 5, 5);
1177  EXPECT_FALSE(IsTimeoutRunning());
1178  EXPECT_EQ(1U, GetAndResetSentEventCount());
1179  RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
1180  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1181}
1182
1183// Tests that the timeout is never started if the ack is synchronous.
1184TEST_F(TouchEventQueueTest, NoTouchTimeoutIfAckIsSynchronous) {
1185  SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1186
1187  // Queue a TouchStart.
1188  SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
1189  ASSERT_FALSE(IsTimeoutRunning());
1190  PressTouchPoint(0, 1);
1191  EXPECT_FALSE(IsTimeoutRunning());
1192}
1193
1194// Tests that the timeout is disabled if the touch handler disappears.
1195TEST_F(TouchEventQueueTest, NoTouchTimeoutIfTouchHandlerRemoved) {
1196  SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1197
1198  // Queue a TouchStart.
1199  PressTouchPoint(0, 1);
1200  ASSERT_TRUE(IsTimeoutRunning());
1201
1202  // Unload the touch handler.
1203  OnHasTouchEventHandlers(false);
1204  EXPECT_FALSE(IsTimeoutRunning());
1205}
1206
1207// Tests that the timeout does not fire if explicitly disabled while an event
1208// is in-flight.
1209TEST_F(TouchEventQueueTest, NoTouchTimeoutIfDisabledWhileTimerIsActive) {
1210  SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1211
1212  // Queue a TouchStart.
1213  PressTouchPoint(0, 1);
1214  ASSERT_TRUE(IsTimeoutRunning());
1215
1216  // Verify that disabling the timeout also turns off the timer.
1217  SetAckTimeoutDisabled();
1218  EXPECT_FALSE(IsTimeoutRunning());
1219  RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
1220  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1221}
1222
1223// Tests that a TouchCancel timeout plays nice when the timed out touch stream
1224// turns into a scroll gesture sequence.
1225TEST_F(TouchEventQueueTest, TouchTimeoutWithFollowupGesture) {
1226  SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1227
1228  // Queue a TouchStart.
1229  PressTouchPoint(0, 1);
1230  EXPECT_TRUE(IsTimeoutRunning());
1231  EXPECT_EQ(1U, GetAndResetSentEventCount());
1232
1233  // The cancelled sequence may turn into a scroll gesture.
1234  WebGestureEvent followup_scroll;
1235  followup_scroll.type = WebInputEvent::GestureScrollBegin;
1236  SetFollowupEvent(followup_scroll);
1237
1238  // Delay the ack.
1239  RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
1240
1241  // The timeout should have fired, disabling touch forwarding until both acks
1242  // are received, acking the timed out event.
1243  EXPECT_FALSE(IsTimeoutRunning());
1244  EXPECT_EQ(0U, GetAndResetSentEventCount());
1245  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1246
1247  // Ack the original event, triggering a TouchCancel.
1248  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
1249  EXPECT_FALSE(IsTimeoutRunning());
1250  EXPECT_EQ(1U, GetAndResetSentEventCount());
1251  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1252
1253  // Ack the cancel event.  Normally, this would resume touch forwarding,
1254  // but we're still within a scroll gesture so it remains disabled.
1255  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
1256  EXPECT_FALSE(IsTimeoutRunning());
1257  EXPECT_EQ(0U, GetAndResetSentEventCount());
1258  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1259
1260  // Try to forward touch events for the current sequence.
1261  GetAndResetSentEventCount();
1262  GetAndResetAckedEventCount();
1263  MoveTouchPoint(0, 1, 1);
1264  ReleaseTouchPoint(0);
1265  EXPECT_FALSE(IsTimeoutRunning());
1266  EXPECT_EQ(0U, GetAndResetSentEventCount());
1267  EXPECT_EQ(2U, GetAndResetAckedEventCount());
1268
1269  // Now end the scroll sequence, resuming touch handling.
1270  SendGestureEvent(blink::WebInputEvent::GestureScrollEnd);
1271  PressTouchPoint(0, 1);
1272  EXPECT_TRUE(IsTimeoutRunning());
1273  EXPECT_EQ(1U, GetAndResetSentEventCount());
1274  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1275}
1276
1277// Tests that a TouchCancel timeout plays nice when the timed out touch stream
1278// turns into a scroll gesture sequence, but the original event acks are
1279// significantly delayed.
1280TEST_F(TouchEventQueueTest, TouchTimeoutWithFollowupGestureAndDelayedAck) {
1281  SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1282
1283  // Queue a TouchStart.
1284  PressTouchPoint(0, 1);
1285  EXPECT_TRUE(IsTimeoutRunning());
1286  EXPECT_EQ(1U, GetAndResetSentEventCount());
1287
1288  // The cancelled sequence may turn into a scroll gesture.
1289  WebGestureEvent followup_scroll;
1290  followup_scroll.type = WebInputEvent::GestureScrollBegin;
1291  SetFollowupEvent(followup_scroll);
1292
1293  // Delay the ack.
1294  RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
1295
1296  // The timeout should have fired, disabling touch forwarding until both acks
1297  // are received and acking the timed out event.
1298  EXPECT_FALSE(IsTimeoutRunning());
1299  EXPECT_EQ(0U, GetAndResetSentEventCount());
1300  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1301
1302  // Try to forward a touch event.
1303  GetAndResetSentEventCount();
1304  GetAndResetAckedEventCount();
1305  MoveTouchPoint(0, 1, 1);
1306  EXPECT_FALSE(IsTimeoutRunning());
1307  EXPECT_EQ(0U, GetAndResetSentEventCount());
1308  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1309
1310  // Now end the scroll sequence.  Events will not be forwarded until the two
1311  // outstanding touch acks are received.
1312  SendGestureEvent(blink::WebInputEvent::GestureScrollEnd);
1313  MoveTouchPoint(0, 2, 2);
1314  ReleaseTouchPoint(0);
1315  EXPECT_FALSE(IsTimeoutRunning());
1316  EXPECT_EQ(0U, GetAndResetSentEventCount());
1317  EXPECT_EQ(2U, GetAndResetAckedEventCount());
1318
1319  // Ack the original event, triggering a cancel.
1320  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
1321  EXPECT_EQ(1U, GetAndResetSentEventCount());
1322  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1323
1324  // Ack the cancel event, resuming touch forwarding.
1325  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
1326  EXPECT_EQ(0U, GetAndResetSentEventCount());
1327  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1328
1329  PressTouchPoint(0, 1);
1330  EXPECT_TRUE(IsTimeoutRunning());
1331  EXPECT_EQ(1U, GetAndResetSentEventCount());
1332}
1333
1334// Tests that a delayed TouchEvent ack will not trigger a TouchCancel timeout if
1335// the timed-out event had no consumer.
1336TEST_F(TouchEventQueueTest, NoCancelOnTouchTimeoutWithoutConsumer) {
1337  SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1338
1339  // Queue a TouchStart.
1340  PressTouchPoint(0, 1);
1341  ASSERT_EQ(1U, GetAndResetSentEventCount());
1342  ASSERT_EQ(0U, GetAndResetAckedEventCount());
1343  EXPECT_TRUE(IsTimeoutRunning());
1344
1345  // Delay the ack.
1346  RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
1347
1348  // The timeout should have fired, synthetically ack'ing the timed out event.
1349  // TouchEvent forwarding is disabled until the original ack is received.
1350  EXPECT_FALSE(IsTimeoutRunning());
1351  EXPECT_EQ(0U, GetAndResetSentEventCount());
1352  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1353
1354  // Touch events should not be forwarded until we receive the original ack.
1355  MoveTouchPoint(0, 1, 1);
1356  ReleaseTouchPoint(0);
1357  ASSERT_EQ(0U, GetAndResetSentEventCount());
1358  ASSERT_EQ(2U, GetAndResetAckedEventCount());
1359
1360  // Ack'ing the original event should not trigger a cancel event, as the
1361  // TouchStart had no consumer.  However, it should re-enable touch forwarding.
1362  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
1363  EXPECT_FALSE(IsTimeoutRunning());
1364  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1365  EXPECT_EQ(0U, GetAndResetSentEventCount());
1366
1367  // Subsequent events should be handled normally.
1368  PressTouchPoint(0, 1);
1369  EXPECT_EQ(1U, GetAndResetSentEventCount());
1370  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1371}
1372
1373// Tests that TouchMove's are dropped if within the boundary-inclusive slop
1374// suppression region for an unconsumed TouchStart.
1375TEST_F(TouchEventQueueTest, TouchMoveSuppressionIncludingSlopBoundary) {
1376  const double kSlopLengthDips = 10.;
1377  const double kHalfSlopLengthDips = kSlopLengthDips / 2;
1378  const bool slop_includes_boundary = true;
1379  SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary);
1380
1381  // Queue a TouchStart.
1382  PressTouchPoint(0, 0);
1383  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1384  ASSERT_EQ(1U, GetAndResetSentEventCount());
1385  ASSERT_EQ(1U, GetAndResetAckedEventCount());
1386
1387  // TouchMove's within the region should be suppressed.
1388  MoveTouchPoint(0, 0, kHalfSlopLengthDips);
1389  EXPECT_EQ(0U, queued_event_count());
1390  EXPECT_EQ(0U, GetAndResetSentEventCount());
1391  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1392  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
1393
1394  MoveTouchPoint(0, kHalfSlopLengthDips, 0);
1395  EXPECT_EQ(0U, queued_event_count());
1396  EXPECT_EQ(0U, GetAndResetSentEventCount());
1397  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1398  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
1399
1400  MoveTouchPoint(0, -kHalfSlopLengthDips, 0);
1401  EXPECT_EQ(0U, queued_event_count());
1402  EXPECT_EQ(0U, GetAndResetSentEventCount());
1403  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1404  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
1405
1406  MoveTouchPoint(0, -kSlopLengthDips, 0);
1407  EXPECT_EQ(0U, queued_event_count());
1408  EXPECT_EQ(0U, GetAndResetSentEventCount());
1409  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1410  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
1411
1412  MoveTouchPoint(0, 0, kSlopLengthDips);
1413  EXPECT_EQ(0U, queued_event_count());
1414  EXPECT_EQ(0U, GetAndResetSentEventCount());
1415  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1416  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
1417
1418  // As soon as a TouchMove exceeds the (Euclidean) distance, no more
1419  // TouchMove's should be suppressed.
1420  const double kFortyFiveDegreeSlopLengthXY =
1421      kSlopLengthDips * std::sqrt(2.) / 2.;
1422  MoveTouchPoint(0, kFortyFiveDegreeSlopLengthXY + .2,
1423                    kFortyFiveDegreeSlopLengthXY + .2);
1424  EXPECT_EQ(1U, queued_event_count());
1425  EXPECT_EQ(1U, GetAndResetSentEventCount());
1426  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1427  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1428  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1429
1430  // Even TouchMove's within the original slop region should now be forwarded.
1431  MoveTouchPoint(0, 0, 0);
1432  EXPECT_EQ(1U, queued_event_count());
1433  EXPECT_EQ(1U, GetAndResetSentEventCount());
1434  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1435  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1436  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1437
1438  // A new touch sequence should reset suppression.
1439  ReleaseTouchPoint(0);
1440  PressTouchPoint(0, 0);
1441  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1442  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1443  ASSERT_EQ(2U, GetAndResetSentEventCount());
1444  ASSERT_EQ(2U, GetAndResetAckedEventCount());
1445  ASSERT_EQ(0U, queued_event_count());
1446
1447  // The slop region is boundary-inclusive.
1448  MoveTouchPoint(0, kSlopLengthDips - 1., 0);
1449  EXPECT_EQ(0U, queued_event_count());
1450  EXPECT_EQ(0U, GetAndResetSentEventCount());
1451  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1452
1453  MoveTouchPoint(0, kSlopLengthDips, 0);
1454  EXPECT_EQ(0U, queued_event_count());
1455  EXPECT_EQ(0U, GetAndResetSentEventCount());
1456  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1457}
1458
1459// Tests that TouchMove's are dropped if within the boundary-exclusive slop
1460// suppression region for an unconsumed TouchStart.
1461TEST_F(TouchEventQueueTest, TouchMoveSuppressionExcludingSlopBoundary) {
1462  const double kSlopLengthDips = 10.;
1463  const double kHalfSlopLengthDips = kSlopLengthDips / 2;
1464  const bool slop_includes_boundary = false;
1465  SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary);
1466
1467  // Queue a TouchStart.
1468  PressTouchPoint(0, 0);
1469  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1470  ASSERT_EQ(1U, GetAndResetSentEventCount());
1471  ASSERT_EQ(1U, GetAndResetAckedEventCount());
1472
1473  // TouchMove's within the region should be suppressed.
1474  MoveTouchPoint(0, 0, kHalfSlopLengthDips);
1475  EXPECT_EQ(0U, queued_event_count());
1476  EXPECT_EQ(0U, GetAndResetSentEventCount());
1477  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1478  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
1479
1480  MoveTouchPoint(0, kSlopLengthDips - 0.2f, 0);
1481  EXPECT_EQ(0U, queued_event_count());
1482  EXPECT_EQ(0U, GetAndResetSentEventCount());
1483  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1484  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
1485
1486  // As soon as a TouchMove reaches the (Euclidean) slop distance, no more
1487  // TouchMove's should be suppressed.
1488  MoveTouchPoint(0, kSlopLengthDips, 0);
1489  EXPECT_EQ(1U, queued_event_count());
1490  EXPECT_EQ(1U, GetAndResetSentEventCount());
1491  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1492  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1493  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1494
1495  MoveTouchPoint(0, kHalfSlopLengthDips, 0);
1496  EXPECT_EQ(1U, queued_event_count());
1497  EXPECT_EQ(1U, GetAndResetSentEventCount());
1498  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1499  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1500  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1501}
1502
1503// Tests that TouchMove's are not dropped within the slop suppression region if
1504// the touchstart was consumed.
1505TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionAfterTouchConsumed) {
1506  const double kSlopLengthDips = 10.;
1507  const double kHalfSlopLengthDips = kSlopLengthDips / 2;
1508  const bool slop_includes_boundary = true;
1509  SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary);
1510
1511  // Queue a TouchStart.
1512  PressTouchPoint(0, 0);
1513  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
1514  ASSERT_EQ(1U, GetAndResetSentEventCount());
1515  ASSERT_EQ(1U, GetAndResetAckedEventCount());
1516
1517  // TouchMove's within the region should not be suppressed, as a touch was
1518  // consumed.
1519  MoveTouchPoint(0, 0, kHalfSlopLengthDips);
1520  EXPECT_EQ(1U, queued_event_count());
1521  EXPECT_EQ(1U, GetAndResetSentEventCount());
1522  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1523}
1524
1525// Tests that even very small TouchMove's are not suppressed when suppression is
1526// disabled.
1527TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionIfDisabled) {
1528  // Queue a TouchStart.
1529  PressTouchPoint(0, 0);
1530  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1531  ASSERT_EQ(1U, GetAndResetSentEventCount());
1532  ASSERT_EQ(1U, GetAndResetAckedEventCount());
1533
1534  // Small TouchMove's should not be suppressed.
1535  MoveTouchPoint(0, 0.001f, 0.001f);
1536  EXPECT_EQ(1U, queued_event_count());
1537  EXPECT_EQ(1U, GetAndResetSentEventCount());
1538  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1539}
1540
1541// Tests that TouchMove's are not dropped due to incorrect handling of DPI
1542// scaling.
1543TEST_F(TouchEventQueueTest, TouchMoveSuppressionWithDIPScaling) {
1544  const float kSlopLengthPixels = 7.f;
1545  const float kDPIScale = 3.f;
1546  const bool slop_includes_boundary = true;
1547  SetUpForTouchMoveSlopTesting(kSlopLengthPixels / kDPIScale,
1548                               slop_includes_boundary);
1549
1550  // Queue a TouchStart.
1551  PressTouchPoint(0, 0);
1552  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1553  ASSERT_EQ(1U, GetAndResetSentEventCount());
1554  ASSERT_EQ(1U, GetAndResetAckedEventCount());
1555
1556  // TouchMove's along the slop boundary should be suppresed.
1557  MoveTouchPoint(0, 0, kSlopLengthPixels / kDPIScale);
1558  EXPECT_EQ(0U, queued_event_count());
1559  EXPECT_EQ(0U, GetAndResetSentEventCount());
1560  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1561
1562  // Reset the touch sequence.
1563  ReleaseTouchPoint(0);
1564  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1565  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1566  GetAndResetSentEventCount();
1567  GetAndResetAckedEventCount();
1568
1569  // Queue a TouchStart.
1570  PressTouchPoint(0, 0);
1571  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1572  ASSERT_EQ(1U, GetAndResetSentEventCount());
1573  ASSERT_EQ(1U, GetAndResetAckedEventCount());
1574
1575  // TouchMove's outside the region should not be suppressed.
1576  const float kPixelCoordOutsideSlopRegion = kSlopLengthPixels + 0.5f;
1577  MoveTouchPoint(0, 0, kPixelCoordOutsideSlopRegion / kDPIScale);
1578  EXPECT_EQ(1U, queued_event_count());
1579  EXPECT_EQ(1U, GetAndResetSentEventCount());
1580  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1581}
1582
1583// Tests that TouchMove's are not dropped if a secondary pointer is present
1584// during any movement.
1585TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionAfterMultiTouch) {
1586  const double kSlopLengthDips = 10.;
1587  const double kHalfSlopLengthDips = kSlopLengthDips / 2;
1588  const bool slop_includes_boundary = true;
1589  SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary);
1590
1591  // Queue a TouchStart.
1592  PressTouchPoint(0, 0);
1593  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1594  ASSERT_EQ(1U, GetAndResetSentEventCount());
1595  ASSERT_EQ(1U, GetAndResetAckedEventCount());
1596
1597  // TouchMove's within the region should be suppressed.
1598  MoveTouchPoint(0, 0, kHalfSlopLengthDips);
1599  EXPECT_EQ(0U, queued_event_count());
1600  EXPECT_EQ(0U, GetAndResetSentEventCount());
1601  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1602
1603  // Simulate a secondary pointer press.
1604  PressTouchPoint(kSlopLengthDips, 0);
1605  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1606  EXPECT_EQ(1U, GetAndResetSentEventCount());
1607  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1608
1609  // TouchMove with a secondary pointer should not be suppressed.
1610  MoveTouchPoint(1, kSlopLengthDips, 0);
1611  EXPECT_EQ(1U, queued_event_count());
1612  EXPECT_EQ(1U, GetAndResetSentEventCount());
1613  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1614  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1615
1616  // Release the secondary pointer.
1617  ReleaseTouchPoint(0);
1618  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1619  EXPECT_EQ(1U, GetAndResetSentEventCount());
1620  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1621
1622  // TouchMove's should not should be suppressed, even with the original
1623  // unmoved pointer.
1624  MoveTouchPoint(0, 0, 0);
1625  EXPECT_EQ(1U, queued_event_count());
1626  EXPECT_EQ(1U, GetAndResetSentEventCount());
1627  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1628}
1629
1630// Tests that secondary touch points can be forwarded even if the primary touch
1631// point had no consumer.
1632TEST_F(TouchEventQueueTest, SecondaryTouchForwardedAfterPrimaryHadNoConsumer) {
1633  // Queue a TouchStart.
1634  PressTouchPoint(0, 0);
1635  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
1636  ASSERT_EQ(1U, GetAndResetSentEventCount());
1637  ASSERT_EQ(1U, GetAndResetAckedEventCount());
1638
1639  // Events should not be forwarded, as the point had no consumer.
1640  MoveTouchPoint(0, 0, 15);
1641  EXPECT_EQ(0U, queued_event_count());
1642  EXPECT_EQ(0U, GetAndResetSentEventCount());
1643  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1644
1645  // Simulate a secondary pointer press.
1646  PressTouchPoint(20, 0);
1647  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1648  EXPECT_EQ(1U, GetAndResetSentEventCount());
1649  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1650
1651  // TouchMove with a secondary pointer should not be suppressed.
1652  MoveTouchPoint(1, 25, 0);
1653  EXPECT_EQ(1U, queued_event_count());
1654  EXPECT_EQ(1U, GetAndResetSentEventCount());
1655  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1656  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1657}
1658
1659// Tests that no touch points will be forwarded after scrolling begins while no
1660// touch points have a consumer.
1661TEST_F(TouchEventQueueTest, NoForwardingAfterScrollWithNoTouchConsumers) {
1662  // Queue a TouchStart.
1663  PressTouchPoint(0, 0);
1664  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
1665  ASSERT_EQ(1U, GetAndResetSentEventCount());
1666  ASSERT_EQ(1U, GetAndResetAckedEventCount());
1667
1668  WebGestureEvent followup_scroll;
1669  followup_scroll.type = WebInputEvent::GestureScrollBegin;
1670  SetFollowupEvent(followup_scroll);
1671  MoveTouchPoint(0, 20, 5);
1672  EXPECT_EQ(0U, GetAndResetSentEventCount());
1673  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1674  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
1675
1676  // The secondary pointer press should not be forwarded.
1677  PressTouchPoint(20, 0);
1678  EXPECT_EQ(0U, GetAndResetSentEventCount());
1679  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1680  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
1681
1682  // Neither should any further touchmoves be forwarded.
1683  MoveTouchPoint(1, 25, 0);
1684  EXPECT_EQ(0U, GetAndResetSentEventCount());
1685  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1686  EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
1687}
1688
1689TEST_F(TouchEventQueueTest, SyncTouchMoveDoesntCancelTouchOnScroll) {
1690 SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_SYNC_TOUCHMOVE);
1691 // Queue a TouchStart.
1692 PressTouchPoint(0, 1);
1693 EXPECT_EQ(1U, GetAndResetSentEventCount());
1694 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1695 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1696
1697 MoveTouchPoint(0, 20, 5);
1698 EXPECT_EQ(1U, queued_event_count());
1699 EXPECT_EQ(1U, GetAndResetSentEventCount());
1700
1701 // GestureScrollBegin doesn't insert a synthetic TouchCancel.
1702 WebGestureEvent followup_scroll;
1703 followup_scroll.type = WebInputEvent::GestureScrollBegin;
1704 SetFollowupEvent(followup_scroll);
1705 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1706 EXPECT_EQ(0U, GetAndResetSentEventCount());
1707 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1708 EXPECT_EQ(0U, queued_event_count());
1709}
1710
1711TEST_F(TouchEventQueueTest, AsyncTouch) {
1712  SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE);
1713
1714  // Queue a TouchStart.
1715  PressTouchPoint(0, 1);
1716  EXPECT_EQ(1U, GetAndResetSentEventCount());
1717  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1718  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1719
1720  for (int i = 0; i < 3; ++i) {
1721   SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1722                       INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1723
1724   MoveTouchPoint(0, 10, 5);
1725   SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1726   EXPECT_FALSE(HasPendingAsyncTouchMove());
1727   EXPECT_TRUE(sent_event().cancelable);
1728   EXPECT_EQ(0U, queued_event_count());
1729   EXPECT_EQ(1U, GetAndResetSentEventCount());
1730
1731   // Consuming a scroll event will throttle subsequent touchmoves.
1732   SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1733                       INPUT_EVENT_ACK_STATE_CONSUMED);
1734   MoveTouchPoint(0, 10, 5);
1735   SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1736   EXPECT_TRUE(HasPendingAsyncTouchMove());
1737   EXPECT_EQ(0U, queued_event_count());
1738   EXPECT_EQ(0U, GetAndResetSentEventCount());
1739  }
1740}
1741
1742// Ensure that touchmove's are appropriately throttled during a typical
1743// scroll sequences that transitions between scrolls consumed and unconsumed.
1744TEST_F(TouchEventQueueTest, AsyncTouchThrottledAfterScroll) {
1745  SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE);
1746
1747  // Process a TouchStart
1748  PressTouchPoint(0, 1);
1749  EXPECT_EQ(1U, GetAndResetSentEventCount());
1750  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1751  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1752
1753  // Now send the first touch move and associated GestureScrollBegin.
1754  MoveTouchPoint(0, 0, 5);
1755  WebGestureEvent followup_scroll;
1756  followup_scroll.type = WebInputEvent::GestureScrollBegin;
1757  SetFollowupEvent(followup_scroll);
1758  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1759  EXPECT_EQ(1U, GetAndResetSentEventCount());
1760  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1761  SendGestureEventAck(WebInputEvent::GestureScrollBegin,
1762                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1763
1764  // Send the second touch move and associated GestureScrollUpdate, but don't
1765  // ACK the gesture event yet.
1766  MoveTouchPoint(0, 0, 50);
1767  followup_scroll.type = WebInputEvent::GestureScrollUpdate;
1768  SetFollowupEvent(followup_scroll);
1769  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1770  EXPECT_EQ(1U, GetAndResetSentEventCount());
1771  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1772
1773  // Now queue a second touchmove and verify it's not (yet) dispatched.
1774  MoveTouchPoint(0, 0, 100);
1775  SetFollowupEvent(followup_scroll);
1776  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1777  EXPECT_TRUE(HasPendingAsyncTouchMove());
1778  EXPECT_EQ(0U, queued_event_count());
1779  EXPECT_EQ(0U, GetAndResetSentEventCount());
1780  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1781
1782  // Queuing the final touchend should flush the pending, async touchmove.
1783  ReleaseTouchPoint(0);
1784  followup_scroll.type = WebInputEvent::GestureScrollEnd;
1785  SetFollowupEvent(followup_scroll);
1786  EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
1787  EXPECT_FALSE(HasPendingAsyncTouchMove());
1788  EXPECT_FALSE(sent_event().cancelable);
1789  EXPECT_EQ(1U, GetAndResetSentEventCount());
1790  EXPECT_EQ(2U, queued_event_count());
1791
1792  // Ack the flushed, async touchmove. The ack should not reach the client, but
1793  // it should trigger sending of the (now non-cancelable) touchend.
1794  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1795  EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type);
1796  EXPECT_FALSE(sent_event().cancelable);
1797  EXPECT_EQ(1U, GetAndResetSentEventCount());
1798  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1799  EXPECT_EQ(1U, queued_event_count());
1800
1801  // Ack the touchend.
1802  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1803  EXPECT_EQ(0U, queued_event_count());
1804  EXPECT_EQ(0U, GetAndResetSentEventCount());
1805  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1806
1807  // Now mark the scrolls as not consumed (which would cause future touchmoves
1808  // in the active sequence to be sent if there was one).
1809  SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1810                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1811  SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1812                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1813
1814  // Start a new touch sequence and verify that throttling has been reset.
1815  // Touch moves after the start of scrolling will again be throttled.
1816  PressTouchPoint(0, 0);
1817  EXPECT_EQ(1U, GetAndResetSentEventCount());
1818  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1819  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1820  MoveTouchPoint(0, 0, 5);
1821  followup_scroll.type = WebInputEvent::GestureScrollBegin;
1822  SetFollowupEvent(followup_scroll);
1823  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1824  EXPECT_EQ(1U, GetAndResetSentEventCount());
1825  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1826
1827  MoveTouchPoint(0, 0, 5);
1828  followup_scroll.type = WebInputEvent::GestureScrollUpdate;
1829  SetFollowupEvent(followup_scroll);
1830  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1831  EXPECT_FALSE(HasPendingAsyncTouchMove());
1832  EXPECT_EQ(1U, GetAndResetSentEventCount());
1833  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1834
1835  MoveTouchPoint(0, 0, 10);
1836  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1837  EXPECT_TRUE(HasPendingAsyncTouchMove());
1838  EXPECT_EQ(0U, queued_event_count());
1839  EXPECT_EQ(0U, GetAndResetSentEventCount());
1840  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1841
1842  // As soon as a touchmove exceeds the outer slop region it will be forwarded
1843  // immediately.
1844  MoveTouchPoint(0, 0, 20);
1845  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1846  EXPECT_FALSE(HasPendingAsyncTouchMove());
1847  EXPECT_FALSE(sent_event().cancelable);
1848  EXPECT_EQ(0U, queued_event_count());
1849  EXPECT_EQ(1U, GetAndResetSentEventCount());
1850  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1851
1852  // Subsequent touchmove's should be deferred.
1853  MoveTouchPoint(0, 0, 25);
1854  EXPECT_TRUE(HasPendingAsyncTouchMove());
1855  EXPECT_EQ(0U, queued_event_count());
1856  EXPECT_EQ(0U, GetAndResetSentEventCount());
1857  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1858
1859  // The pending touchmove should be flushed with the the new touchmove if
1860  // sufficient time has passed.
1861  AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1);
1862  MoveTouchPoint(0, 0, 15);
1863  EXPECT_FALSE(HasPendingAsyncTouchMove());
1864  EXPECT_FALSE(sent_event().cancelable);
1865  EXPECT_EQ(1U, queued_event_count());
1866  EXPECT_EQ(1U, GetAndResetSentEventCount());
1867  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1868  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1869  EXPECT_EQ(0U, queued_event_count());
1870  EXPECT_EQ(0U, GetAndResetSentEventCount());
1871  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1872
1873  // Non-touchmove events should always flush any pending touchmove events.
1874  MoveTouchPoint(0, 0, 25);
1875  EXPECT_TRUE(HasPendingAsyncTouchMove());
1876  EXPECT_EQ(0U, queued_event_count());
1877  EXPECT_EQ(0U, GetAndResetSentEventCount());
1878  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1879  PressTouchPoint(30, 30);
1880  EXPECT_FALSE(HasPendingAsyncTouchMove());
1881  EXPECT_FALSE(sent_event().cancelable);
1882  EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
1883  EXPECT_EQ(1U, GetAndResetSentEventCount());
1884  EXPECT_EQ(2U, queued_event_count());
1885
1886  // Ack'ing the flushed, async touchmove will dispatch the touchstart. Note
1887  // that the flushed touchmove's ack will not reach the client (its
1888  // constituent events have already been ack'ed).
1889  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1890  EXPECT_FALSE(sent_event().cancelable);
1891  EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type);
1892  EXPECT_EQ(1U, queued_event_count());
1893  EXPECT_EQ(1U, GetAndResetSentEventCount());
1894  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1895
1896  // Ack the touchstart.
1897  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1898  EXPECT_EQ(0U, queued_event_count());
1899  EXPECT_EQ(0U, GetAndResetSentEventCount());
1900  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1901
1902  // Send a secondary touchmove.
1903  MoveTouchPoint(1, 0, 25);
1904  EXPECT_TRUE(HasPendingAsyncTouchMove());
1905  EXPECT_EQ(0U, queued_event_count());
1906  EXPECT_EQ(0U, GetAndResetSentEventCount());
1907  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1908
1909  // An unconsumed scroll should resume synchronous touch handling.
1910  SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1911                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1912
1913  // The pending touchmove should be coalesced with the next (now synchronous)
1914  // touchmove.
1915  MoveTouchPoint(0, 0, 25);
1916  EXPECT_TRUE(sent_event().cancelable);
1917  EXPECT_FALSE(HasPendingAsyncTouchMove());
1918  EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
1919  EXPECT_EQ(WebTouchPoint::StateMoved, sent_event().touches[0].state);
1920  EXPECT_EQ(WebTouchPoint::StateMoved, sent_event().touches[1].state);
1921  EXPECT_EQ(1U, queued_event_count());
1922  EXPECT_EQ(1U, GetAndResetSentEventCount());
1923  EXPECT_EQ(0U, GetAndResetAckedEventCount());
1924
1925  // Subsequent touches will queue until the preceding, synchronous touches are
1926  // ack'ed.
1927  ReleaseTouchPoint(1);
1928  EXPECT_EQ(2U, queued_event_count());
1929  ReleaseTouchPoint(0);
1930  EXPECT_EQ(3U, queued_event_count());
1931  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1932  EXPECT_TRUE(sent_event().cancelable);
1933  EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type);
1934  EXPECT_EQ(2U, queued_event_count());
1935  EXPECT_EQ(1U, GetAndResetSentEventCount());
1936  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1937
1938  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1939  EXPECT_TRUE(sent_event().cancelable);
1940  EXPECT_EQ(WebInputEvent::TouchEnd, sent_event().type);
1941  EXPECT_EQ(1U, queued_event_count());
1942  EXPECT_EQ(1U, GetAndResetSentEventCount());
1943  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1944
1945  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1946  EXPECT_EQ(0U, queued_event_count());
1947  EXPECT_EQ(0U, GetAndResetSentEventCount());
1948  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1949}
1950
1951// Ensure that async touch dispatch and touch ack timeout interactions work
1952// appropriately.
1953TEST_F(TouchEventQueueTest, AsyncTouchWithAckTimeout) {
1954  SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE);
1955  SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
1956
1957  // The touchstart should start the timeout.
1958  PressTouchPoint(0, 0);
1959  EXPECT_EQ(1U, GetAndResetSentEventCount());
1960  EXPECT_TRUE(IsTimeoutRunning());
1961  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1962  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1963  EXPECT_FALSE(IsTimeoutRunning());
1964
1965  // The start of a scroll gesture should trigger async touch event dispatch.
1966  MoveTouchPoint(0, 1, 1);
1967  EXPECT_EQ(1U, GetAndResetSentEventCount());
1968  EXPECT_TRUE(IsTimeoutRunning());
1969  WebGestureEvent followup_scroll;
1970  followup_scroll.type = WebInputEvent::GestureScrollBegin;
1971  SetFollowupEvent(followup_scroll);
1972  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1973  EXPECT_FALSE(IsTimeoutRunning());
1974  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1975
1976  SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1977                      INPUT_EVENT_ACK_STATE_CONSUMED);
1978
1979  // An async touch should fire after the throttling interval has expired, but
1980  // it should not start the touch ack timeout.
1981  MoveTouchPoint(0, 5, 5);
1982  EXPECT_TRUE(HasPendingAsyncTouchMove());
1983  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1984
1985  AdvanceTouchTime(kMinSecondsBetweenThrottledTouchmoves + 0.1);
1986  MoveTouchPoint(0, 5, 5);
1987  EXPECT_FALSE(IsTimeoutRunning());
1988  EXPECT_FALSE(HasPendingAsyncTouchMove());
1989  EXPECT_FALSE(sent_event().cancelable);
1990  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1991  EXPECT_EQ(1U, GetAndResetAckedEventCount());
1992  EXPECT_EQ(1U, GetAndResetSentEventCount());
1993
1994  // An unconsumed scroll event will resume synchronous touchmoves, which are
1995  // subject to the ack timeout.
1996  SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
1997                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
1998  MoveTouchPoint(0, 20, 5);
1999  EXPECT_TRUE(IsTimeoutRunning());
2000  EXPECT_TRUE(sent_event().cancelable);
2001  EXPECT_EQ(1U, GetAndResetSentEventCount());
2002
2003  // The timeout should fire, disabling touch forwarding until both acks are
2004  // received and acking the timed out event.
2005  RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
2006  EXPECT_FALSE(IsTimeoutRunning());
2007  EXPECT_EQ(1U, GetAndResetAckedEventCount());
2008  EXPECT_EQ(0U, GetAndResetSentEventCount());
2009
2010  // Ack'ing the original event should trigger a cancel event.
2011  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2012  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2013  EXPECT_FALSE(sent_event().cancelable);
2014  EXPECT_EQ(0U, GetAndResetAckedEventCount());
2015  EXPECT_EQ(1U, GetAndResetSentEventCount());
2016
2017  // Subsequent touchmove's should not be forwarded, even as the scroll gesture
2018  // goes from unconsumed to consumed.
2019  SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
2020                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2021  MoveTouchPoint(0, 20, 5);
2022  EXPECT_FALSE(HasPendingAsyncTouchMove());
2023  EXPECT_EQ(1U, GetAndResetAckedEventCount());
2024  EXPECT_EQ(0U, GetAndResetSentEventCount());
2025
2026  SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
2027                      INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2028  MoveTouchPoint(0, 25, 5);
2029  EXPECT_FALSE(HasPendingAsyncTouchMove());
2030  EXPECT_EQ(1U, GetAndResetAckedEventCount());
2031  EXPECT_EQ(0U, GetAndResetSentEventCount());
2032}
2033
2034// Ensure that if the touch ack for an async touchmove triggers a follow-up
2035// touch event, that follow-up touch will be forwarded appropriately.
2036TEST_F(TouchEventQueueTest, AsyncTouchWithTouchCancelAfterAck) {
2037  SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE);
2038
2039  PressTouchPoint(0, 0);
2040  EXPECT_EQ(1U, GetAndResetSentEventCount());
2041  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2042  EXPECT_EQ(1U, GetAndResetAckedEventCount());
2043
2044  // The start of a scroll gesture should trigger async touch event dispatch.
2045  MoveTouchPoint(0, 1, 1);
2046  EXPECT_EQ(1U, GetAndResetSentEventCount());
2047  WebGestureEvent followup_scroll;
2048  followup_scroll.type = WebInputEvent::GestureScrollBegin;
2049  SetFollowupEvent(followup_scroll);
2050  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2051  EXPECT_EQ(1U, GetAndResetAckedEventCount());
2052  EXPECT_EQ(0U, queued_event_count());
2053
2054  SendGestureEvent(WebInputEvent::GestureScrollUpdate);
2055
2056  // The async touchmove should be ack'ed immediately, but not forwarded.
2057  // However, because the ack triggers a touchcancel, both the pending touch and
2058  // the queued touchcancel should be flushed.
2059  WebTouchEvent followup_cancel;
2060  followup_cancel.type = WebInputEvent::TouchCancel;
2061  followup_cancel.touchesLength = 1;
2062  followup_cancel.touches[0].state = WebTouchPoint::StateCancelled;
2063  SetFollowupEvent(followup_cancel);
2064  MoveTouchPoint(0, 5, 5);
2065  EXPECT_EQ(2U, queued_event_count());
2066  EXPECT_FALSE(sent_event().cancelable);
2067  EXPECT_FALSE(HasPendingAsyncTouchMove());
2068  EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
2069  EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
2070  EXPECT_EQ(1U, GetAndResetAckedEventCount());
2071  EXPECT_EQ(1U, GetAndResetSentEventCount());
2072
2073  // The ack for the async touchmove should not reach the client, as it has
2074  // already been ack'ed.
2075  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2076  EXPECT_FALSE(sent_event().cancelable);
2077  EXPECT_EQ(1U, queued_event_count());
2078  EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type);
2079  EXPECT_EQ(0U, GetAndResetAckedEventCount());
2080  EXPECT_EQ(1U, GetAndResetSentEventCount());
2081
2082  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2083  EXPECT_EQ(0U, queued_event_count());
2084  EXPECT_EQ(WebInputEvent::TouchCancel, acked_event().type);
2085  EXPECT_EQ(1U, GetAndResetAckedEventCount());
2086  EXPECT_EQ(0U, GetAndResetSentEventCount());
2087}
2088
2089// Ensure that the async touch is fully reset if the touch sequence restarts
2090// without properly terminating.
2091TEST_F(TouchEventQueueTest, AsyncTouchWithHardTouchStartReset) {
2092  SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE);
2093
2094  PressTouchPoint(0, 0);
2095  EXPECT_EQ(1U, GetAndResetSentEventCount());
2096  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2097  EXPECT_EQ(1U, GetAndResetAckedEventCount());
2098
2099  // Trigger async touchmove dispatch.
2100  MoveTouchPoint(0, 1, 1);
2101  EXPECT_EQ(1U, GetAndResetSentEventCount());
2102  WebGestureEvent followup_scroll;
2103  followup_scroll.type = WebInputEvent::GestureScrollBegin;
2104  SetFollowupEvent(followup_scroll);
2105  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2106  EXPECT_EQ(1U, GetAndResetAckedEventCount());
2107  EXPECT_EQ(0U, queued_event_count());
2108  SendGestureEvent(WebInputEvent::GestureScrollUpdate);
2109
2110  // The async touchmove should be immediately ack'ed but delivery is deferred.
2111  MoveTouchPoint(0, 2, 2);
2112  EXPECT_EQ(0U, GetAndResetSentEventCount());
2113  EXPECT_EQ(1U, GetAndResetAckedEventCount());
2114  EXPECT_EQ(0U, queued_event_count());
2115  EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
2116
2117  // The queue should be robust to hard touch restarts with a new touch
2118  // sequence. In this case, the deferred async touch should not be flushed
2119  // by the new touch sequence.
2120  SendGestureEvent(WebInputEvent::GestureScrollEnd);
2121  ResetTouchEvent();
2122
2123  PressTouchPoint(0, 0);
2124  EXPECT_EQ(1U, GetAndResetSentEventCount());
2125  EXPECT_EQ(WebInputEvent::TouchStart, sent_event().type);
2126  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2127  EXPECT_EQ(1U, GetAndResetAckedEventCount());
2128}
2129
2130TEST_F(TouchEventQueueTest, TouchAbsorptionWithConsumedFirstMove) {
2131  SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE);
2132
2133  // Queue a TouchStart.
2134  PressTouchPoint(0, 1);
2135  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2136  EXPECT_EQ(0U, queued_event_count());
2137  EXPECT_EQ(1U, GetAndResetAckedEventCount());
2138
2139  MoveTouchPoint(0, 20, 5);
2140  SendGestureEvent(blink::WebInputEvent::GestureScrollBegin);
2141  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2142  EXPECT_EQ(0U, queued_event_count());
2143  EXPECT_EQ(2U, GetAndResetSentEventCount());
2144
2145  // Even if the first touchmove event was consumed, subsequent unconsumed
2146  // touchmove events should trigger scrolling.
2147  MoveTouchPoint(0, 60, 5);
2148  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2149  EXPECT_EQ(0U, queued_event_count());
2150  EXPECT_TRUE(sent_event().cancelable);
2151  EXPECT_EQ(1U, GetAndResetSentEventCount());
2152
2153  MoveTouchPoint(0, 20, 5);
2154  WebGestureEvent followup_scroll;
2155  followup_scroll.type = WebInputEvent::GestureScrollUpdate;
2156  SetFollowupEvent(followup_scroll);
2157  SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
2158  SendGestureEventAck(WebInputEvent::GestureScrollUpdate,
2159                      INPUT_EVENT_ACK_STATE_CONSUMED);
2160  EXPECT_EQ(0U, queued_event_count());
2161  EXPECT_TRUE(sent_event().cancelable);
2162  EXPECT_EQ(1U, GetAndResetSentEventCount());
2163
2164  // Touch move event is throttled.
2165  MoveTouchPoint(0, 60, 5);
2166  SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
2167  EXPECT_EQ(0U, queued_event_count());
2168  EXPECT_EQ(0U, GetAndResetSentEventCount());
2169}
2170
2171}  // namespace content
2172