1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 #include "base/basictypes.h"
8 #include "base/logging.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/time/time.h"
12 #include "content/browser/renderer_host/input/gesture_event_queue.h"
13 #include "content/browser/renderer_host/input/touchpad_tap_suppression_controller.h"
14 #include "content/common/input/input_event_ack_state.h"
15 #include "content/common/input/synthetic_web_input_event_builders.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "third_party/WebKit/public/web/WebInputEvent.h"
19 using base::TimeDelta;
20 using blink::WebGestureEvent;
21 using blink::WebInputEvent;
25 class GestureEventQueueTest : public testing::Test,
26 public GestureEventQueueClient,
27 public TouchpadTapSuppressionControllerClient {
29 GestureEventQueueTest()
30 : acked_gesture_event_count_(0),
31 sent_gesture_event_count_(0) {}
33 virtual ~GestureEventQueueTest() {}
36 virtual void SetUp() OVERRIDE {
37 queue_.reset(new GestureEventQueue(this, this, DefaultConfig()));
40 virtual void TearDown() OVERRIDE {
41 // Process all pending tasks to avoid leaks.
46 // GestureEventQueueClient
47 virtual void SendGestureEventImmediately(
48 const GestureEventWithLatencyInfo& event) OVERRIDE {
49 ++sent_gesture_event_count_;
50 if (sync_ack_result_) {
51 scoped_ptr<InputEventAckState> ack_result = sync_ack_result_.Pass();
52 SendInputEventACK(event.event.type, *ack_result);
56 virtual void OnGestureEventAck(
57 const GestureEventWithLatencyInfo& event,
58 InputEventAckState ack_result) OVERRIDE {
59 ++acked_gesture_event_count_;
60 last_acked_event_ = event.event;
61 if (sync_followup_event_)
62 SimulateGestureEvent(*sync_followup_event_.Pass());
65 // TouchpadTapSuppressionControllerClient
66 virtual void SendMouseEventImmediately(
67 const MouseEventWithLatencyInfo& event) OVERRIDE {
71 static GestureEventQueue::Config DefaultConfig() {
72 return GestureEventQueue::Config();
75 void SetUpForDebounce(int interval_ms) {
76 queue()->set_debounce_interval_time_ms_for_testing(interval_ms);
79 // Returns the result of |GestureEventQueue::ShouldForward()|.
80 bool SimulateGestureEvent(const WebGestureEvent& gesture) {
81 GestureEventWithLatencyInfo gesture_with_latency(gesture,
83 if (queue()->ShouldForward(gesture_with_latency)) {
84 SendGestureEventImmediately(gesture_with_latency);
90 void SimulateGestureEvent(WebInputEvent::Type type,
91 WebGestureEvent::SourceDevice sourceDevice) {
93 SyntheticWebGestureEventBuilder::Build(type, sourceDevice));
96 void SimulateGestureScrollUpdateEvent(float dX, float dY, int modifiers) {
98 SyntheticWebGestureEventBuilder::BuildScrollUpdate(dX, dY, modifiers));
101 void SimulateGesturePinchUpdateEvent(float scale,
105 SimulateGestureEvent(SyntheticWebGestureEventBuilder::BuildPinchUpdate(
106 scale, anchorX, anchorY, modifiers, WebGestureEvent::Touchscreen));
109 void SimulateGestureFlingStartEvent(
112 WebGestureEvent::SourceDevice sourceDevice) {
113 SimulateGestureEvent(
114 SyntheticWebGestureEventBuilder::BuildFling(velocityX,
119 void SendInputEventACK(WebInputEvent::Type type,
120 InputEventAckState ack) {
121 queue()->ProcessGestureAck(ack, type, ui::LatencyInfo());
124 void RunUntilIdle() {
125 base::MessageLoop::current()->RunUntilIdle();
128 size_t GetAndResetSentGestureEventCount() {
129 size_t count = sent_gesture_event_count_;
130 sent_gesture_event_count_ = 0;
134 size_t GetAndResetAckedGestureEventCount() {
135 size_t count = acked_gesture_event_count_;
136 acked_gesture_event_count_ = 0;
140 const WebGestureEvent& last_acked_event() const {
141 return last_acked_event_;
144 void set_synchronous_ack(InputEventAckState ack_result) {
145 sync_ack_result_.reset(new InputEventAckState(ack_result));
148 void set_sync_followup_event(WebInputEvent::Type type,
149 WebGestureEvent::SourceDevice sourceDevice) {
150 sync_followup_event_.reset(new WebGestureEvent(
151 SyntheticWebGestureEventBuilder::Build(type, sourceDevice)));
154 unsigned GestureEventQueueSize() {
155 return queue()->coalesced_gesture_events_.size();
158 WebGestureEvent GestureEventSecondFromLastQueueEvent() {
159 return queue()->coalesced_gesture_events_.at(
160 GestureEventQueueSize() - 2).event;
163 WebGestureEvent GestureEventLastQueueEvent() {
164 return queue()->coalesced_gesture_events_.back().event;
167 unsigned GestureEventDebouncingQueueSize() {
168 return queue()->debouncing_deferral_queue_.size();
171 WebGestureEvent GestureEventQueueEventAt(int i) {
172 return queue()->coalesced_gesture_events_.at(i).event;
175 bool ScrollingInProgress() {
176 return queue()->scrolling_in_progress_;
179 bool FlingInProgress() {
180 return queue()->fling_in_progress_;
183 bool WillIgnoreNextACK() {
184 return queue()->ignore_next_ack_;
187 GestureEventQueue* queue() const {
192 scoped_ptr<GestureEventQueue> queue_;
193 size_t acked_gesture_event_count_;
194 size_t sent_gesture_event_count_;
195 WebGestureEvent last_acked_event_;
196 scoped_ptr<InputEventAckState> sync_ack_result_;
197 scoped_ptr<WebGestureEvent> sync_followup_event_;
198 base::MessageLoopForUI message_loop_;
201 #if GTEST_HAS_PARAM_TEST
202 // This is for tests that are to be run for all source devices.
203 class GestureEventQueueWithSourceTest
204 : public GestureEventQueueTest,
205 public testing::WithParamInterface<WebGestureEvent::SourceDevice> {
207 #endif // GTEST_HAS_PARAM_TEST
209 TEST_F(GestureEventQueueTest, CoalescesScrollGestureEvents) {
210 // Test coalescing of only GestureScrollUpdate events.
211 // Simulate gesture events.
214 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
215 WebGestureEvent::Touchscreen);
216 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
219 SimulateGestureScrollUpdateEvent(8, -5, 0);
221 // Make sure that the queue contains what we think it should.
222 WebGestureEvent merged_event = GestureEventLastQueueEvent();
223 EXPECT_EQ(2U, GestureEventQueueSize());
224 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
225 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
228 SimulateGestureScrollUpdateEvent(8, -6, 0);
230 // Check that coalescing updated the correct values.
231 merged_event = GestureEventLastQueueEvent();
232 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
233 EXPECT_EQ(0, merged_event.modifiers);
234 EXPECT_EQ(16, merged_event.data.scrollUpdate.deltaX);
235 EXPECT_EQ(-11, merged_event.data.scrollUpdate.deltaY);
236 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
239 SimulateGestureScrollUpdateEvent(8, -7, 1);
241 // Check that we didn't wrongly coalesce.
242 merged_event = GestureEventLastQueueEvent();
243 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
244 EXPECT_EQ(1, merged_event.modifiers);
245 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
248 SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
249 WebGestureEvent::Touchscreen);
251 // Check that only the first event was sent.
252 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
254 // Check that the ACK sends the second message.
255 SendInputEventACK(WebInputEvent::GestureScrollBegin,
256 INPUT_EVENT_ACK_STATE_CONSUMED);
258 EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
259 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
261 // Ack for queued coalesced event.
262 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
263 INPUT_EVENT_ACK_STATE_CONSUMED);
265 EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
266 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
268 // Ack for queued uncoalesced event.
269 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
270 INPUT_EVENT_ACK_STATE_CONSUMED);
272 EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
273 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
275 // After the final ack, the queue should be empty.
276 SendInputEventACK(WebInputEvent::GestureScrollEnd,
277 INPUT_EVENT_ACK_STATE_CONSUMED);
279 EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
280 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
283 TEST_F(GestureEventQueueTest,
284 DoesNotCoalesceScrollGestureEventsFromDifferentDevices) {
285 // Test that GestureScrollUpdate events from Touchscreen and Touchpad do not
289 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
290 WebGestureEvent::Touchscreen);
291 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
294 SimulateGestureScrollUpdateEvent(8, -5, 0);
296 // Make sure that the queue contains what we think it should.
297 EXPECT_EQ(2U, GestureEventQueueSize());
298 EXPECT_EQ(WebGestureEvent::Touchscreen,
299 GestureEventLastQueueEvent().sourceDevice);
302 SimulateGestureScrollUpdateEvent(8, -6, 0);
303 EXPECT_EQ(2U, GestureEventQueueSize());
304 EXPECT_EQ(WebGestureEvent::Touchscreen,
305 GestureEventLastQueueEvent().sourceDevice);
308 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
309 WebGestureEvent::Touchpad);
310 EXPECT_EQ(3U, GestureEventQueueSize());
311 EXPECT_EQ(WebGestureEvent::Touchpad,
312 GestureEventLastQueueEvent().sourceDevice);
315 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
316 WebGestureEvent::Touchpad);
317 EXPECT_EQ(3U, GestureEventQueueSize());
318 EXPECT_EQ(WebGestureEvent::Touchpad,
319 GestureEventLastQueueEvent().sourceDevice);
322 SimulateGestureScrollUpdateEvent(8, -7, 0);
323 EXPECT_EQ(4U, GestureEventQueueSize());
324 EXPECT_EQ(WebGestureEvent::Touchscreen,
325 GestureEventLastQueueEvent().sourceDevice);
328 TEST_F(GestureEventQueueTest, CoalescesScrollAndPinchEvents) {
329 // Test coalescing of only GestureScrollUpdate events.
330 // Simulate gesture events.
333 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
334 WebGestureEvent::Touchscreen);
337 SimulateGestureEvent(WebInputEvent::GesturePinchBegin,
338 WebGestureEvent::Touchscreen);
341 SimulateGestureScrollUpdateEvent(8, -4, 1);
343 // Make sure that the queue contains what we think it should.
344 WebGestureEvent merged_event = GestureEventLastQueueEvent();
345 EXPECT_EQ(3U, GestureEventQueueSize());
346 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
348 // Coalesced without changing event order. Note anchor at (60, 60). Anchoring
349 // from a point that is not the origin should still give us the right scroll.
350 SimulateGesturePinchUpdateEvent(1.5, 60, 60, 1);
351 EXPECT_EQ(4U, GestureEventQueueSize());
352 merged_event = GestureEventLastQueueEvent();
353 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
354 EXPECT_EQ(1.5, merged_event.data.pinchUpdate.scale);
355 EXPECT_EQ(1, merged_event.modifiers);
356 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
357 merged_event = GestureEventSecondFromLastQueueEvent();
358 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
359 EXPECT_EQ(8, merged_event.data.scrollUpdate.deltaX);
360 EXPECT_EQ(-4, merged_event.data.scrollUpdate.deltaY);
361 EXPECT_EQ(1, merged_event.modifiers);
362 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
365 SimulateGestureScrollUpdateEvent(6, -3, 1);
367 // Check whether coalesced correctly.
368 EXPECT_EQ(4U, GestureEventQueueSize());
369 merged_event = GestureEventLastQueueEvent();
370 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
371 EXPECT_EQ(1.5, merged_event.data.pinchUpdate.scale);
372 EXPECT_EQ(1, merged_event.modifiers);
373 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
374 merged_event = GestureEventSecondFromLastQueueEvent();
375 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
376 EXPECT_EQ(12, merged_event.data.scrollUpdate.deltaX);
377 EXPECT_EQ(-6, merged_event.data.scrollUpdate.deltaY);
378 EXPECT_EQ(1, merged_event.modifiers);
379 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
382 SimulateGesturePinchUpdateEvent(2, 60, 60, 1);
384 // Check whether coalesced correctly.
385 EXPECT_EQ(4U, GestureEventQueueSize());
386 merged_event = GestureEventLastQueueEvent();
387 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
388 EXPECT_EQ(3, merged_event.data.pinchUpdate.scale);
389 EXPECT_EQ(1, merged_event.modifiers);
390 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
391 merged_event = GestureEventSecondFromLastQueueEvent();
392 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
393 EXPECT_EQ(12, merged_event.data.scrollUpdate.deltaX);
394 EXPECT_EQ(-6, merged_event.data.scrollUpdate.deltaY);
395 EXPECT_EQ(1, merged_event.modifiers);
396 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
399 SimulateGesturePinchUpdateEvent(2, 60, 60, 1);
401 // Check whether coalesced correctly.
402 EXPECT_EQ(4U, GestureEventQueueSize());
403 merged_event = GestureEventLastQueueEvent();
404 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
405 EXPECT_EQ(6, merged_event.data.pinchUpdate.scale);
406 EXPECT_EQ(1, merged_event.modifiers);
407 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
408 merged_event = GestureEventSecondFromLastQueueEvent();
409 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
410 EXPECT_EQ(12, merged_event.data.scrollUpdate.deltaX);
411 EXPECT_EQ(-6, merged_event.data.scrollUpdate.deltaY);
412 EXPECT_EQ(1, merged_event.modifiers);
413 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
415 // Check that only the first event was sent.
416 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
418 // Check that the ACK sends the second message.
419 SendInputEventACK(WebInputEvent::GestureScrollBegin,
420 INPUT_EVENT_ACK_STATE_CONSUMED);
422 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
425 SimulateGestureScrollUpdateEvent(6, -6, 1);
427 // Check whether coalesced correctly.
428 EXPECT_EQ(3U, GestureEventQueueSize());
429 merged_event = GestureEventLastQueueEvent();
430 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
431 EXPECT_EQ(6, merged_event.data.pinchUpdate.scale);
432 EXPECT_EQ(1, merged_event.modifiers);
433 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
434 merged_event = GestureEventSecondFromLastQueueEvent();
435 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
436 EXPECT_EQ(13, merged_event.data.scrollUpdate.deltaX);
437 EXPECT_EQ(-7, merged_event.data.scrollUpdate.deltaY);
438 EXPECT_EQ(1, merged_event.modifiers);
439 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
441 // At this point ACKs shouldn't be getting ignored.
442 EXPECT_FALSE(WillIgnoreNextACK());
444 // Check that the ACK sends both scroll and pinch updates.
445 SendInputEventACK(WebInputEvent::GesturePinchBegin,
446 INPUT_EVENT_ACK_STATE_CONSUMED);
448 EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
450 // The next ACK should be getting ignored.
451 EXPECT_TRUE(WillIgnoreNextACK());
454 SimulateGestureScrollUpdateEvent(1, -1, 1);
456 // Check whether coalesced correctly.
457 EXPECT_EQ(3U, GestureEventQueueSize());
458 merged_event = GestureEventLastQueueEvent();
459 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
460 EXPECT_EQ(1, merged_event.data.scrollUpdate.deltaX);
461 EXPECT_EQ(-1, merged_event.data.scrollUpdate.deltaY);
462 EXPECT_EQ(1, merged_event.modifiers);
463 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
464 merged_event = GestureEventSecondFromLastQueueEvent();
465 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
466 EXPECT_EQ(6, merged_event.data.pinchUpdate.scale);
467 EXPECT_EQ(1, merged_event.modifiers);
468 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
471 SimulateGestureScrollUpdateEvent(2, -2, 1);
473 // Coalescing scrolls should still work.
474 EXPECT_EQ(3U, GestureEventQueueSize());
475 merged_event = GestureEventLastQueueEvent();
476 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
477 EXPECT_EQ(3, merged_event.data.scrollUpdate.deltaX);
478 EXPECT_EQ(-3, merged_event.data.scrollUpdate.deltaY);
479 EXPECT_EQ(1, merged_event.modifiers);
480 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
481 merged_event = GestureEventSecondFromLastQueueEvent();
482 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
483 EXPECT_EQ(6, merged_event.data.pinchUpdate.scale);
484 EXPECT_EQ(1, merged_event.modifiers);
485 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
488 SimulateGesturePinchUpdateEvent(0.5, 60, 60, 1);
490 // Check whether coalesced correctly.
491 EXPECT_EQ(4U, GestureEventQueueSize());
492 merged_event = GestureEventLastQueueEvent();
493 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
494 EXPECT_EQ(0.5, merged_event.data.pinchUpdate.scale);
495 EXPECT_EQ(1, merged_event.modifiers);
496 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
497 merged_event = GestureEventSecondFromLastQueueEvent();
498 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
499 EXPECT_EQ(3, merged_event.data.scrollUpdate.deltaX);
500 EXPECT_EQ(-3, merged_event.data.scrollUpdate.deltaY);
501 EXPECT_EQ(1, merged_event.modifiers);
502 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
504 // Check that the ACK gets ignored.
505 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
506 INPUT_EVENT_ACK_STATE_CONSUMED);
507 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
509 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
510 // The flag should have been flipped back to false.
511 EXPECT_FALSE(WillIgnoreNextACK());
514 SimulateGestureScrollUpdateEvent(2, -2, 2);
516 // Shouldn't coalesce with different modifiers.
517 EXPECT_EQ(4U, GestureEventQueueSize());
518 merged_event = GestureEventLastQueueEvent();
519 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
520 EXPECT_EQ(2, merged_event.data.scrollUpdate.deltaX);
521 EXPECT_EQ(-2, merged_event.data.scrollUpdate.deltaY);
522 EXPECT_EQ(2, merged_event.modifiers);
523 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
524 merged_event = GestureEventSecondFromLastQueueEvent();
525 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
526 EXPECT_EQ(0.5, merged_event.data.pinchUpdate.scale);
527 EXPECT_EQ(1, merged_event.modifiers);
528 EXPECT_EQ(WebGestureEvent::Touchscreen, merged_event.sourceDevice);
530 // Check that the ACK sends the next scroll pinch pair.
531 SendInputEventACK(WebInputEvent::GesturePinchUpdate,
532 INPUT_EVENT_ACK_STATE_CONSUMED);
533 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
535 EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
537 // Check that the ACK sends the second message.
538 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
539 INPUT_EVENT_ACK_STATE_CONSUMED);
540 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
542 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
544 // Check that the ACK sends the second event.
545 SendInputEventACK(WebInputEvent::GesturePinchUpdate,
546 INPUT_EVENT_ACK_STATE_CONSUMED);
547 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
549 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
551 // Check that the queue is empty after ACK and no events get sent.
552 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
553 INPUT_EVENT_ACK_STATE_CONSUMED);
554 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
556 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
557 EXPECT_EQ(0U, GestureEventQueueSize());
560 TEST_F(GestureEventQueueTest, CoalescesMultiplePinchEventSequences) {
561 // Simulate a pinch sequence.
562 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
563 WebGestureEvent::Touchscreen);
564 SimulateGestureEvent(WebInputEvent::GesturePinchBegin,
565 WebGestureEvent::Touchscreen);
567 SimulateGestureScrollUpdateEvent(8, -4, 1);
568 // Make sure that the queue contains what we think it should.
569 WebGestureEvent merged_event = GestureEventLastQueueEvent();
570 size_t expected_events_in_queue = 3;
571 EXPECT_EQ(expected_events_in_queue, GestureEventQueueSize());
572 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
574 // Coalesced without changing event order. Note anchor at (60, 60). Anchoring
575 // from a point that is not the origin should still give us the right scroll.
576 SimulateGesturePinchUpdateEvent(1.5, 60, 60, 1);
577 EXPECT_EQ(++expected_events_in_queue, GestureEventQueueSize());
578 merged_event = GestureEventLastQueueEvent();
579 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
580 EXPECT_EQ(1.5, merged_event.data.pinchUpdate.scale);
581 EXPECT_EQ(1, merged_event.modifiers);
582 merged_event = GestureEventSecondFromLastQueueEvent();
583 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
584 EXPECT_EQ(8, merged_event.data.scrollUpdate.deltaX);
585 EXPECT_EQ(-4, merged_event.data.scrollUpdate.deltaY);
586 EXPECT_EQ(1, merged_event.modifiers);
589 SimulateGestureScrollUpdateEvent(6, -3, 1);
591 // Check whether coalesced correctly.
592 EXPECT_EQ(expected_events_in_queue, GestureEventQueueSize());
593 merged_event = GestureEventLastQueueEvent();
594 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
595 EXPECT_EQ(1.5, merged_event.data.pinchUpdate.scale);
596 EXPECT_EQ(1, merged_event.modifiers);
597 merged_event = GestureEventSecondFromLastQueueEvent();
598 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
599 EXPECT_EQ(12, merged_event.data.scrollUpdate.deltaX);
600 EXPECT_EQ(-6, merged_event.data.scrollUpdate.deltaY);
601 EXPECT_EQ(1, merged_event.modifiers);
603 // Now start another sequence before the previous sequence has been ack'ed.
604 SimulateGestureEvent(WebInputEvent::GesturePinchEnd,
605 WebGestureEvent::Touchscreen);
606 SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
607 WebGestureEvent::Touchscreen);
608 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
609 WebGestureEvent::Touchscreen);
610 SimulateGestureEvent(WebInputEvent::GesturePinchBegin,
611 WebGestureEvent::Touchscreen);
613 SimulateGestureScrollUpdateEvent(8, -4, 1);
614 // Make sure that the queue contains what we think it should.
615 expected_events_in_queue += 5;
616 merged_event = GestureEventLastQueueEvent();
617 EXPECT_EQ(expected_events_in_queue, GestureEventQueueSize());
618 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
620 // Coalesced without changing event order. Note anchor at (60, 60). Anchoring
621 // from a point that is not the origin should still give us the right scroll.
622 SimulateGesturePinchUpdateEvent(1.5, 30, 30, 1);
623 EXPECT_EQ(++expected_events_in_queue, GestureEventQueueSize());
624 merged_event = GestureEventLastQueueEvent();
625 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
626 EXPECT_EQ(1.5, merged_event.data.pinchUpdate.scale);
627 EXPECT_EQ(1, merged_event.modifiers);
628 merged_event = GestureEventSecondFromLastQueueEvent();
629 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
630 EXPECT_EQ(8, merged_event.data.scrollUpdate.deltaX);
631 EXPECT_EQ(-4, merged_event.data.scrollUpdate.deltaY);
632 EXPECT_EQ(1, merged_event.modifiers);
635 SimulateGestureScrollUpdateEvent(6, -3, 1);
637 // Check whether coalesced correctly.
638 EXPECT_EQ(expected_events_in_queue, GestureEventQueueSize());
639 merged_event = GestureEventLastQueueEvent();
640 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
641 EXPECT_EQ(1.5, merged_event.data.pinchUpdate.scale);
642 EXPECT_EQ(1, merged_event.modifiers);
643 merged_event = GestureEventSecondFromLastQueueEvent();
644 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
645 EXPECT_EQ(12, merged_event.data.scrollUpdate.deltaX);
646 EXPECT_EQ(-6, merged_event.data.scrollUpdate.deltaY);
647 EXPECT_EQ(1, merged_event.modifiers);
650 TEST_F(GestureEventQueueTest, CoalescesPinchSequencesWithEarlyAck) {
651 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
652 WebGestureEvent::Touchscreen);
653 SendInputEventACK(WebInputEvent::GestureScrollBegin,
654 INPUT_EVENT_ACK_STATE_CONSUMED);
656 SimulateGestureEvent(WebInputEvent::GesturePinchBegin,
657 WebGestureEvent::Touchscreen);
658 SendInputEventACK(WebInputEvent::GesturePinchBegin,
659 INPUT_EVENT_ACK_STATE_CONSUMED);
660 // ScrollBegin and PinchBegin have been sent
661 EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
662 EXPECT_EQ(0U, GestureEventQueueSize());
664 SimulateGestureScrollUpdateEvent(5, 5, 1);
665 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
666 EXPECT_EQ(WebInputEvent::GestureScrollUpdate,
667 GestureEventLastQueueEvent().type);
668 EXPECT_EQ(1U, GestureEventQueueSize());
671 SimulateGesturePinchUpdateEvent(2, 60, 60, 1);
672 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
673 EXPECT_EQ(WebInputEvent::GesturePinchUpdate,
674 GestureEventLastQueueEvent().type);
675 EXPECT_EQ(2U, GestureEventQueueSize());
677 SimulateGesturePinchUpdateEvent(3, 60, 60, 1);
678 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
679 EXPECT_EQ(WebInputEvent::GesturePinchUpdate,
680 GestureEventLastQueueEvent().type);
681 EXPECT_EQ(2U, GestureEventQueueSize());
683 SimulateGestureScrollUpdateEvent(5, 5, 1);
684 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
685 // The coalesced pinch/scroll pair will have been re-arranged, with the
686 // pinch following the scroll.
687 EXPECT_EQ(WebInputEvent::GesturePinchUpdate,
688 GestureEventLastQueueEvent().type);
689 EXPECT_EQ(3U, GestureEventQueueSize());
691 SimulateGesturePinchUpdateEvent(4, 60, 60, 1);
692 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
693 EXPECT_EQ(3U, GestureEventQueueSize());
695 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
696 INPUT_EVENT_ACK_STATE_CONSUMED);
697 EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
698 EXPECT_EQ(2U, GestureEventQueueSize());
700 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
701 INPUT_EVENT_ACK_STATE_CONSUMED);
702 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
704 SendInputEventACK(WebInputEvent::GesturePinchUpdate,
705 INPUT_EVENT_ACK_STATE_CONSUMED);
706 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
707 EXPECT_EQ(2.f * 3.f * 4.f, last_acked_event().data.pinchUpdate.scale);
709 EXPECT_EQ(0U, GestureEventQueueSize());
712 TEST_F(GestureEventQueueTest,
713 DoesNotCoalescePinchGestureEventsWithDifferentModifiers) {
714 // Insert an event to force queueing of gestures.
715 SimulateGestureEvent(WebInputEvent::GestureTapCancel,
716 WebGestureEvent::Touchscreen);
717 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
718 EXPECT_EQ(1U, GestureEventQueueSize());
720 SimulateGestureScrollUpdateEvent(5, 5, 1);
721 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
722 EXPECT_EQ(2U, GestureEventQueueSize());
724 SimulateGesturePinchUpdateEvent(3, 60, 60, 1);
725 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
726 EXPECT_EQ(3U, GestureEventQueueSize());
728 SimulateGestureScrollUpdateEvent(10, 15, 1);
729 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
730 EXPECT_EQ(3U, GestureEventQueueSize());
732 SimulateGesturePinchUpdateEvent(4, 60, 60, 1);
733 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
734 EXPECT_EQ(3U, GestureEventQueueSize());
736 // Using different modifiers should prevent coalescing.
737 SimulateGesturePinchUpdateEvent(5, 60, 60, 2);
738 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
739 EXPECT_EQ(4U, GestureEventQueueSize());
741 SimulateGesturePinchUpdateEvent(6, 60, 60, 3);
742 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
743 EXPECT_EQ(5U, GestureEventQueueSize());
745 SendInputEventACK(WebInputEvent::GestureTapCancel,
746 INPUT_EVENT_ACK_STATE_CONSUMED);
747 EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
748 EXPECT_EQ(4U, GestureEventQueueSize());
750 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
751 INPUT_EVENT_ACK_STATE_CONSUMED);
752 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
753 EXPECT_EQ(3U, GestureEventQueueSize());
755 SendInputEventACK(WebInputEvent::GesturePinchUpdate,
756 INPUT_EVENT_ACK_STATE_CONSUMED);
757 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
758 EXPECT_EQ(3.f * 4.f, last_acked_event().data.pinchUpdate.scale);
759 EXPECT_EQ(2U, GestureEventQueueSize());
760 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
762 SendInputEventACK(WebInputEvent::GesturePinchUpdate,
763 INPUT_EVENT_ACK_STATE_CONSUMED);
764 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
765 EXPECT_EQ(5.f, last_acked_event().data.pinchUpdate.scale);
766 EXPECT_EQ(1U, GestureEventQueueSize());
767 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
769 SendInputEventACK(WebInputEvent::GesturePinchUpdate,
770 INPUT_EVENT_ACK_STATE_CONSUMED);
771 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
772 EXPECT_EQ(6.f, last_acked_event().data.pinchUpdate.scale);
773 EXPECT_EQ(0U, GestureEventQueueSize());
776 TEST_F(GestureEventQueueTest, CoalescesScrollAndPinchEventsIdentity) {
777 // Insert an event to force queueing of gestures.
778 SimulateGestureEvent(WebInputEvent::GestureTapCancel,
779 WebGestureEvent::Touchscreen);
780 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
781 EXPECT_EQ(1U, GestureEventQueueSize());
783 // Ensure that coalescing yields an identity transform for any pinch/scroll
784 // pair combined with its inverse.
785 SimulateGestureScrollUpdateEvent(5, 5, 1);
786 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
787 EXPECT_EQ(2U, GestureEventQueueSize());
789 SimulateGesturePinchUpdateEvent(5, 10, 10, 1);
790 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
791 EXPECT_EQ(3U, GestureEventQueueSize());
793 SimulateGesturePinchUpdateEvent(.2f, 10, 10, 1);
794 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
795 EXPECT_EQ(3U, GestureEventQueueSize());
797 SimulateGestureScrollUpdateEvent(-5, -5, 1);
798 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
799 EXPECT_EQ(3U, GestureEventQueueSize());
801 SendInputEventACK(WebInputEvent::GestureTapCancel,
802 INPUT_EVENT_ACK_STATE_CONSUMED);
803 EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
804 EXPECT_EQ(2U, GestureEventQueueSize());
806 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
807 INPUT_EVENT_ACK_STATE_CONSUMED);
808 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
809 EXPECT_EQ(0.f, last_acked_event().data.scrollUpdate.deltaX);
810 EXPECT_EQ(0.f, last_acked_event().data.scrollUpdate.deltaY);
812 SendInputEventACK(WebInputEvent::GesturePinchUpdate,
813 INPUT_EVENT_ACK_STATE_CONSUMED);
814 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
815 EXPECT_EQ(1.f, last_acked_event().data.pinchUpdate.scale);
816 EXPECT_EQ(0U, GestureEventQueueSize());
818 // Insert an event to force queueing of gestures.
819 SimulateGestureEvent(WebInputEvent::GestureTapCancel,
820 WebGestureEvent::Touchscreen);
821 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
822 EXPECT_EQ(1U, GestureEventQueueSize());
824 // Ensure that coalescing yields an identity transform for any pinch/scroll
825 // pair combined with its inverse.
826 SimulateGesturePinchUpdateEvent(2, 10, 10, 1);
827 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
828 EXPECT_EQ(2U, GestureEventQueueSize());
830 SimulateGestureScrollUpdateEvent(20, 20, 1);
831 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
832 EXPECT_EQ(3U, GestureEventQueueSize());
834 SimulateGesturePinchUpdateEvent(0.5f, 20, 20, 1);
835 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
836 EXPECT_EQ(3U, GestureEventQueueSize());
838 SimulateGestureScrollUpdateEvent(-5, -5, 1);
839 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
840 EXPECT_EQ(3U, GestureEventQueueSize());
842 SendInputEventACK(WebInputEvent::GestureTapCancel,
843 INPUT_EVENT_ACK_STATE_CONSUMED);
844 EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
845 EXPECT_EQ(2U, GestureEventQueueSize());
847 SendInputEventACK(WebInputEvent::GestureScrollUpdate,
848 INPUT_EVENT_ACK_STATE_CONSUMED);
849 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
850 EXPECT_EQ(0.f, last_acked_event().data.scrollUpdate.deltaX);
851 EXPECT_EQ(0.f, last_acked_event().data.scrollUpdate.deltaY);
853 SendInputEventACK(WebInputEvent::GesturePinchUpdate,
854 INPUT_EVENT_ACK_STATE_CONSUMED);
855 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
856 EXPECT_EQ(1.f, last_acked_event().data.pinchUpdate.scale);
859 // Tests a single event with an synchronous ack.
860 TEST_F(GestureEventQueueTest, SimpleSyncAck) {
861 set_synchronous_ack(INPUT_EVENT_ACK_STATE_CONSUMED);
862 SimulateGestureEvent(WebInputEvent::GestureTapDown,
863 WebGestureEvent::Touchscreen);
864 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
865 EXPECT_EQ(0U, GestureEventQueueSize());
866 EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
869 // Tests an event with an synchronous ack which enqueues an additional event.
870 TEST_F(GestureEventQueueTest, SyncAckQueuesEvent) {
871 scoped_ptr<WebGestureEvent> queued_event;
872 set_synchronous_ack(INPUT_EVENT_ACK_STATE_CONSUMED);
873 set_sync_followup_event(WebInputEvent::GestureShowPress,
874 WebGestureEvent::Touchscreen);
875 // This event enqueues the show press event.
876 SimulateGestureEvent(WebInputEvent::GestureTapDown,
877 WebGestureEvent::Touchscreen);
878 EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
879 EXPECT_EQ(1U, GestureEventQueueSize());
880 EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
882 SendInputEventACK(WebInputEvent::GestureShowPress,
883 INPUT_EVENT_ACK_STATE_CONSUMED);
884 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
885 EXPECT_EQ(0U, GestureEventQueueSize());
886 EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
889 // Tests an event with an async ack followed by an event with a sync ack.
890 TEST_F(GestureEventQueueTest, AsyncThenSyncAck) {
891 SimulateGestureEvent(WebInputEvent::GestureTapDown,
892 WebGestureEvent::Touchscreen);
894 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
895 EXPECT_EQ(1U, GestureEventQueueSize());
896 EXPECT_EQ(0U, GetAndResetAckedGestureEventCount());
898 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
899 WebGestureEvent::Touchscreen);
900 set_synchronous_ack(INPUT_EVENT_ACK_STATE_CONSUMED);
901 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
902 EXPECT_EQ(2U, GestureEventQueueSize());
903 EXPECT_EQ(0U, GetAndResetAckedGestureEventCount());
905 SendInputEventACK(WebInputEvent::GestureTapDown,
906 INPUT_EVENT_ACK_STATE_CONSUMED);
907 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
908 EXPECT_EQ(0U, GestureEventQueueSize());
909 EXPECT_EQ(2U, GetAndResetAckedGestureEventCount());
912 TEST_F(GestureEventQueueTest, CoalescesScrollAndPinchEventWithSyncAck) {
913 // Simulate a pinch sequence.
914 SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
915 WebGestureEvent::Touchscreen);
916 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
917 SimulateGestureEvent(WebInputEvent::GesturePinchBegin,
918 WebGestureEvent::Touchscreen);
919 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
921 SimulateGestureScrollUpdateEvent(8, -4, 1);
922 // Make sure that the queue contains what we think it should.
923 WebGestureEvent merged_event = GestureEventLastQueueEvent();
924 EXPECT_EQ(3U, GestureEventQueueSize());
925 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
927 // Coalesced without changing event order. Note anchor at (60, 60). Anchoring
928 // from a point that is not the origin should still give us the right scroll.
929 SimulateGesturePinchUpdateEvent(1.5, 60, 60, 1);
930 EXPECT_EQ(4U, GestureEventQueueSize());
932 SendInputEventACK(WebInputEvent::GestureScrollBegin,
933 INPUT_EVENT_ACK_STATE_CONSUMED);
934 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
935 EXPECT_EQ(3U, GestureEventQueueSize());
937 // Ack the PinchBegin, and schedule a synchronous ack for GestureScrollUpdate.
938 set_synchronous_ack(INPUT_EVENT_ACK_STATE_CONSUMED);
939 SendInputEventACK(WebInputEvent::GesturePinchBegin,
940 INPUT_EVENT_ACK_STATE_CONSUMED);
942 // Both GestureScrollUpdate and GesturePinchUpdate should have been sent.
943 EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
944 EXPECT_EQ(1U, GestureEventQueueSize());
945 EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
947 // Ack the final GesturePinchUpdate.
948 SendInputEventACK(WebInputEvent::GesturePinchUpdate,
949 INPUT_EVENT_ACK_STATE_CONSUMED);
950 EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
951 EXPECT_EQ(0U, GestureEventQueueSize());
952 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
955 #if GTEST_HAS_PARAM_TEST
956 TEST_P(GestureEventQueueWithSourceTest, GestureFlingCancelsFiltered) {
957 WebGestureEvent::SourceDevice source_device = GetParam();
959 // GFC without previous GFS is dropped.
960 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device);
961 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
962 EXPECT_EQ(0U, GestureEventQueueSize());
964 // GFC after previous GFS is dispatched and acked.
965 SimulateGestureFlingStartEvent(0, -10, source_device);
966 EXPECT_TRUE(FlingInProgress());
967 SendInputEventACK(WebInputEvent::GestureFlingStart,
968 INPUT_EVENT_ACK_STATE_CONSUMED);
970 EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
971 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device);
972 EXPECT_FALSE(FlingInProgress());
973 EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
974 SendInputEventACK(WebInputEvent::GestureFlingCancel,
975 INPUT_EVENT_ACK_STATE_CONSUMED);
977 EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
978 EXPECT_EQ(0U, GestureEventQueueSize());
980 // GFC before previous GFS is acked.
981 SimulateGestureFlingStartEvent(0, -10, source_device);
982 EXPECT_TRUE(FlingInProgress());
983 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device);
984 EXPECT_FALSE(FlingInProgress());
985 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
986 EXPECT_EQ(2U, GestureEventQueueSize());
988 // Advance state realistically.
989 SendInputEventACK(WebInputEvent::GestureFlingStart,
990 INPUT_EVENT_ACK_STATE_CONSUMED);
992 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
993 SendInputEventACK(WebInputEvent::GestureFlingCancel,
994 INPUT_EVENT_ACK_STATE_CONSUMED);
996 EXPECT_EQ(2U, GetAndResetAckedGestureEventCount());
997 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
998 EXPECT_EQ(0U, GestureEventQueueSize());
1000 // GFS is added to the queue if another event is pending
1001 SimulateGestureScrollUpdateEvent(8, -7, 0);
1002 SimulateGestureFlingStartEvent(0, -10, source_device);
1003 EXPECT_EQ(2U, GestureEventQueueSize());
1004 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
1005 WebGestureEvent merged_event = GestureEventLastQueueEvent();
1006 EXPECT_EQ(WebInputEvent::GestureFlingStart, merged_event.type);
1007 EXPECT_TRUE(FlingInProgress());
1008 EXPECT_EQ(2U, GestureEventQueueSize());
1010 // GFS in queue means that a GFC is added to the queue
1011 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device);
1012 merged_event =GestureEventLastQueueEvent();
1013 EXPECT_EQ(WebInputEvent::GestureFlingCancel, merged_event.type);
1014 EXPECT_FALSE(FlingInProgress());
1015 EXPECT_EQ(3U, GestureEventQueueSize());
1017 // Adding a second GFC is dropped.
1018 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device);
1019 EXPECT_FALSE(FlingInProgress());
1020 EXPECT_EQ(3U, GestureEventQueueSize());
1022 // Adding another GFS will add it to the queue.
1023 SimulateGestureFlingStartEvent(0, -10, source_device);
1024 merged_event = GestureEventLastQueueEvent();
1025 EXPECT_EQ(WebInputEvent::GestureFlingStart, merged_event.type);
1026 EXPECT_TRUE(FlingInProgress());
1027 EXPECT_EQ(4U, GestureEventQueueSize());
1029 // GFS in queue means that a GFC is added to the queue
1030 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device);
1031 merged_event = GestureEventLastQueueEvent();
1032 EXPECT_EQ(WebInputEvent::GestureFlingCancel, merged_event.type);
1033 EXPECT_FALSE(FlingInProgress());
1034 EXPECT_EQ(5U, GestureEventQueueSize());
1036 // Adding another GFC with a GFC already there is dropped.
1037 SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device);
1038 merged_event = GestureEventLastQueueEvent();
1039 EXPECT_EQ(WebInputEvent::GestureFlingCancel, merged_event.type);
1040 EXPECT_FALSE(FlingInProgress());
1041 EXPECT_EQ(5U, GestureEventQueueSize());
1044 INSTANTIATE_TEST_CASE_P(AllSources,
1045 GestureEventQueueWithSourceTest,
1046 testing::Values(WebGestureEvent::Touchscreen,
1047 WebGestureEvent::Touchpad));
1048 #endif // GTEST_HAS_PARAM_TEST
1050 // Test that a GestureScrollEnd | GestureFlingStart are deferred during the
1051 // debounce interval, that Scrolls are not and that the deferred events are
1052 // sent after that timer fires.
1053 TEST_F(GestureEventQueueTest, DebounceDefersFollowingGestureEvents) {
1054 SetUpForDebounce(3);
1056 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
1057 WebGestureEvent::Touchscreen);
1058 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
1059 EXPECT_EQ(1U, GestureEventQueueSize());
1060 EXPECT_EQ(0U, GestureEventDebouncingQueueSize());
1061 EXPECT_TRUE(ScrollingInProgress());
1063 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
1064 WebGestureEvent::Touchscreen);
1065 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1066 EXPECT_EQ(2U, GestureEventQueueSize());
1067 EXPECT_EQ(0U, GestureEventDebouncingQueueSize());
1068 EXPECT_TRUE(ScrollingInProgress());
1070 SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
1071 WebGestureEvent::Touchscreen);
1072 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1073 EXPECT_EQ(2U, GestureEventQueueSize());
1074 EXPECT_EQ(1U, GestureEventDebouncingQueueSize());
1076 SimulateGestureFlingStartEvent(0, 10, WebGestureEvent::Touchscreen);
1077 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1078 EXPECT_EQ(2U, GestureEventQueueSize());
1079 EXPECT_EQ(2U, GestureEventDebouncingQueueSize());
1081 SimulateGestureEvent(WebInputEvent::GestureTapDown,
1082 WebGestureEvent::Touchscreen);
1083 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1084 EXPECT_EQ(2U, GestureEventQueueSize());
1085 EXPECT_EQ(3U, GestureEventDebouncingQueueSize());
1087 base::MessageLoop::current()->PostDelayedTask(
1089 base::MessageLoop::QuitClosure(),
1090 TimeDelta::FromMilliseconds(5));
1091 base::MessageLoop::current()->Run();
1093 // The deferred events are correctly queued in coalescing queue.
1094 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1095 EXPECT_EQ(5U, GestureEventQueueSize());
1096 EXPECT_EQ(0U, GestureEventDebouncingQueueSize());
1097 EXPECT_FALSE(ScrollingInProgress());
1099 // Verify that the coalescing queue contains the correct events.
1100 WebInputEvent::Type expected[] = {
1101 WebInputEvent::GestureScrollUpdate,
1102 WebInputEvent::GestureScrollUpdate,
1103 WebInputEvent::GestureScrollEnd,
1104 WebInputEvent::GestureFlingStart};
1106 for (unsigned i = 0; i < sizeof(expected) / sizeof(WebInputEvent::Type);
1108 WebGestureEvent merged_event = GestureEventQueueEventAt(i);
1109 EXPECT_EQ(expected[i], merged_event.type);
1113 // Test that non-scroll events are deferred while scrolling during the debounce
1114 // interval and are discarded if a GestureScrollUpdate event arrives before the
1116 TEST_F(GestureEventQueueTest, DebounceDropsDeferredEvents) {
1117 SetUpForDebounce(3);
1119 EXPECT_FALSE(ScrollingInProgress());
1121 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
1122 WebGestureEvent::Touchscreen);
1123 EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
1124 EXPECT_EQ(1U, GestureEventQueueSize());
1125 EXPECT_EQ(0U, GestureEventDebouncingQueueSize());
1126 EXPECT_TRUE(ScrollingInProgress());
1128 // This event should get discarded.
1129 SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
1130 WebGestureEvent::Touchscreen);
1131 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1132 EXPECT_EQ(1U, GestureEventQueueSize());
1133 EXPECT_EQ(1U, GestureEventDebouncingQueueSize());
1135 SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
1136 WebGestureEvent::Touchscreen);
1137 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1138 EXPECT_EQ(2U, GestureEventQueueSize());
1139 EXPECT_EQ(0U, GestureEventDebouncingQueueSize());
1140 EXPECT_TRUE(ScrollingInProgress());
1142 // Verify that the coalescing queue contains the correct events.
1143 WebInputEvent::Type expected[] = {
1144 WebInputEvent::GestureScrollUpdate,
1145 WebInputEvent::GestureScrollUpdate};
1147 for (unsigned i = 0; i < sizeof(expected) / sizeof(WebInputEvent::Type);
1149 WebGestureEvent merged_event = GestureEventQueueEventAt(i);
1150 EXPECT_EQ(expected[i], merged_event.type);
1154 TEST_F(GestureEventQueueTest, DropZeroVelocityFlings) {
1155 WebGestureEvent gesture_event;
1156 gesture_event.type = WebInputEvent::GestureFlingStart;
1157 gesture_event.sourceDevice = WebGestureEvent::Touchpad;
1158 gesture_event.data.flingStart.velocityX = 0.f;
1159 gesture_event.data.flingStart.velocityY = 0.f;
1160 ASSERT_EQ(0U, GetAndResetSentGestureEventCount());
1161 ASSERT_EQ(0U, GestureEventQueueSize());
1162 EXPECT_FALSE(SimulateGestureEvent(gesture_event));
1163 EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1164 EXPECT_EQ(0U, GestureEventQueueSize());
1167 } // namespace content