Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / content / browser / renderer_host / input / gesture_event_queue_unittest.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <vector>
6
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"
18
19 using base::TimeDelta;
20 using blink::WebGestureDevice;
21 using blink::WebGestureEvent;
22 using blink::WebInputEvent;
23
24 namespace content {
25
26 class GestureEventQueueTest : public testing::Test,
27                               public GestureEventQueueClient,
28                               public TouchpadTapSuppressionControllerClient {
29  public:
30   GestureEventQueueTest()
31       : acked_gesture_event_count_(0),
32         sent_gesture_event_count_(0) {}
33
34   ~GestureEventQueueTest() override {}
35
36   // testing::Test
37   void SetUp() override {
38     queue_.reset(new GestureEventQueue(this, this, DefaultConfig()));
39   }
40
41   void TearDown() override {
42     // Process all pending tasks to avoid leaks.
43     RunUntilIdle();
44     queue_.reset();
45   }
46
47   // GestureEventQueueClient
48   void SendGestureEventImmediately(
49       const GestureEventWithLatencyInfo& event) override {
50     ++sent_gesture_event_count_;
51     if (sync_ack_result_) {
52       scoped_ptr<InputEventAckState> ack_result = sync_ack_result_.Pass();
53       SendInputEventACK(event.event.type, *ack_result);
54     }
55   }
56
57   void OnGestureEventAck(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       auto sync_followup_event = sync_followup_event_.Pass();
63       SimulateGestureEvent(*sync_followup_event);
64     }
65   }
66
67   // TouchpadTapSuppressionControllerClient
68   void SendMouseEventImmediately(
69       const MouseEventWithLatencyInfo& event) override {}
70
71  protected:
72   static GestureEventQueue::Config DefaultConfig() {
73     return GestureEventQueue::Config();
74   }
75
76   void SetUpForDebounce(int interval_ms) {
77     queue()->set_debounce_interval_time_ms_for_testing(interval_ms);
78   }
79
80   // Returns the result of |GestureEventQueue::ShouldForward()|.
81   bool SimulateGestureEvent(const WebGestureEvent& gesture) {
82     GestureEventWithLatencyInfo gesture_with_latency(gesture,
83                                                      ui::LatencyInfo());
84     if (queue()->ShouldForward(gesture_with_latency)) {
85       SendGestureEventImmediately(gesture_with_latency);
86       return true;
87     }
88     return false;
89   }
90
91   void SimulateGestureEvent(WebInputEvent::Type type,
92                             WebGestureDevice sourceDevice) {
93     SimulateGestureEvent(
94         SyntheticWebGestureEventBuilder::Build(type, sourceDevice));
95   }
96
97   void SimulateGestureScrollUpdateEvent(float dX, float dY, int modifiers) {
98     SimulateGestureEvent(
99         SyntheticWebGestureEventBuilder::BuildScrollUpdate(dX, dY, modifiers));
100   }
101
102   void SimulateGesturePinchUpdateEvent(float scale,
103                                        float anchorX,
104                                        float anchorY,
105                                        int modifiers) {
106     SimulateGestureEvent(SyntheticWebGestureEventBuilder::BuildPinchUpdate(
107         scale,
108         anchorX,
109         anchorY,
110         modifiers,
111         blink::WebGestureDeviceTouchscreen));
112   }
113
114   void SimulateGestureFlingStartEvent(float velocityX,
115                                       float velocityY,
116                                       WebGestureDevice sourceDevice) {
117     SimulateGestureEvent(
118         SyntheticWebGestureEventBuilder::BuildFling(velocityX,
119                                                     velocityY,
120                                                     sourceDevice));
121   }
122
123   void SendInputEventACK(WebInputEvent::Type type,
124                          InputEventAckState ack) {
125     queue()->ProcessGestureAck(ack, type, ui::LatencyInfo());
126   }
127
128   void RunUntilIdle() {
129     base::MessageLoop::current()->RunUntilIdle();
130   }
131
132   size_t GetAndResetSentGestureEventCount() {
133     size_t count = sent_gesture_event_count_;
134     sent_gesture_event_count_ = 0;
135     return count;
136   }
137
138   size_t GetAndResetAckedGestureEventCount() {
139     size_t count = acked_gesture_event_count_;
140     acked_gesture_event_count_ = 0;
141     return count;
142   }
143
144   const WebGestureEvent& last_acked_event() const {
145     return last_acked_event_;
146   }
147
148   void set_synchronous_ack(InputEventAckState ack_result) {
149     sync_ack_result_.reset(new InputEventAckState(ack_result));
150   }
151
152   void set_sync_followup_event(WebInputEvent::Type type,
153                                WebGestureDevice sourceDevice) {
154     sync_followup_event_.reset(new WebGestureEvent(
155         SyntheticWebGestureEventBuilder::Build(type, sourceDevice)));
156   }
157
158   unsigned GestureEventQueueSize() {
159     return queue()->coalesced_gesture_events_.size();
160   }
161
162   WebGestureEvent GestureEventSecondFromLastQueueEvent() {
163     return queue()->coalesced_gesture_events_.at(
164         GestureEventQueueSize() - 2).event;
165   }
166
167   WebGestureEvent GestureEventLastQueueEvent() {
168     return queue()->coalesced_gesture_events_.back().event;
169   }
170
171   unsigned GestureEventDebouncingQueueSize() {
172     return queue()->debouncing_deferral_queue_.size();
173   }
174
175   WebGestureEvent GestureEventQueueEventAt(int i) {
176     return queue()->coalesced_gesture_events_.at(i).event;
177   }
178
179   bool ScrollingInProgress() {
180     return queue()->scrolling_in_progress_;
181   }
182
183   bool FlingInProgress() {
184     return queue()->fling_in_progress_;
185   }
186
187   bool WillIgnoreNextACK() {
188     return queue()->ignore_next_ack_;
189   }
190
191   GestureEventQueue* queue() const {
192     return queue_.get();
193   }
194
195  private:
196   scoped_ptr<GestureEventQueue> queue_;
197   size_t acked_gesture_event_count_;
198   size_t sent_gesture_event_count_;
199   WebGestureEvent last_acked_event_;
200   scoped_ptr<InputEventAckState> sync_ack_result_;
201   scoped_ptr<WebGestureEvent> sync_followup_event_;
202   base::MessageLoopForUI message_loop_;
203 };
204
205 #if GTEST_HAS_PARAM_TEST
206 // This is for tests that are to be run for all source devices.
207 class GestureEventQueueWithSourceTest
208     : public GestureEventQueueTest,
209       public testing::WithParamInterface<WebGestureDevice> {};
210 #endif  // GTEST_HAS_PARAM_TEST
211
212 TEST_F(GestureEventQueueTest, CoalescesScrollGestureEvents) {
213   // Test coalescing of only GestureScrollUpdate events.
214   // Simulate gesture events.
215
216   // Sent.
217   SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
218                        blink::WebGestureDeviceTouchscreen);
219   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
220
221   // Enqueued.
222   SimulateGestureScrollUpdateEvent(8, -5, 0);
223
224   // Make sure that the queue contains what we think it should.
225   WebGestureEvent merged_event = GestureEventLastQueueEvent();
226   EXPECT_EQ(2U, GestureEventQueueSize());
227   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
228   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
229
230   // Coalesced.
231   SimulateGestureScrollUpdateEvent(8, -6, 0);
232
233   // Check that coalescing updated the correct values.
234   merged_event = GestureEventLastQueueEvent();
235   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
236   EXPECT_EQ(0, merged_event.modifiers);
237   EXPECT_EQ(16, merged_event.data.scrollUpdate.deltaX);
238   EXPECT_EQ(-11, merged_event.data.scrollUpdate.deltaY);
239   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
240
241   // Enqueued.
242   SimulateGestureScrollUpdateEvent(8, -7, 1);
243
244   // Check that we didn't wrongly coalesce.
245   merged_event = GestureEventLastQueueEvent();
246   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
247   EXPECT_EQ(1, merged_event.modifiers);
248   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
249
250   // Different.
251   SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
252                        blink::WebGestureDeviceTouchscreen);
253
254   // Check that only the first event was sent.
255   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
256
257   // Check that the ACK sends the second message.
258   SendInputEventACK(WebInputEvent::GestureScrollBegin,
259                     INPUT_EVENT_ACK_STATE_CONSUMED);
260   RunUntilIdle();
261   EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
262   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
263
264   // Ack for queued coalesced event.
265   SendInputEventACK(WebInputEvent::GestureScrollUpdate,
266                     INPUT_EVENT_ACK_STATE_CONSUMED);
267   RunUntilIdle();
268   EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
269   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
270
271   // Ack for queued uncoalesced event.
272   SendInputEventACK(WebInputEvent::GestureScrollUpdate,
273                     INPUT_EVENT_ACK_STATE_CONSUMED);
274   RunUntilIdle();
275   EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
276   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
277
278   // After the final ack, the queue should be empty.
279   SendInputEventACK(WebInputEvent::GestureScrollEnd,
280                     INPUT_EVENT_ACK_STATE_CONSUMED);
281   RunUntilIdle();
282   EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
283   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
284 }
285
286 TEST_F(GestureEventQueueTest,
287        DoesNotCoalesceScrollGestureEventsFromDifferentDevices) {
288   // Test that GestureScrollUpdate events from Touchscreen and Touchpad do not
289   // coalesce.
290
291   // Sent.
292   SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
293                        blink::WebGestureDeviceTouchscreen);
294   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
295
296   // Enqueued.
297   SimulateGestureScrollUpdateEvent(8, -5, 0);
298
299   // Make sure that the queue contains what we think it should.
300   EXPECT_EQ(2U, GestureEventQueueSize());
301   EXPECT_EQ(blink::WebGestureDeviceTouchscreen,
302             GestureEventLastQueueEvent().sourceDevice);
303
304   // Coalesced.
305   SimulateGestureScrollUpdateEvent(8, -6, 0);
306   EXPECT_EQ(2U, GestureEventQueueSize());
307   EXPECT_EQ(blink::WebGestureDeviceTouchscreen,
308             GestureEventLastQueueEvent().sourceDevice);
309
310   // Enqueued.
311   SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
312                        blink::WebGestureDeviceTouchpad);
313   EXPECT_EQ(3U, GestureEventQueueSize());
314   EXPECT_EQ(blink::WebGestureDeviceTouchpad,
315             GestureEventLastQueueEvent().sourceDevice);
316
317   // Coalesced.
318   SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
319                        blink::WebGestureDeviceTouchpad);
320   EXPECT_EQ(3U, GestureEventQueueSize());
321   EXPECT_EQ(blink::WebGestureDeviceTouchpad,
322             GestureEventLastQueueEvent().sourceDevice);
323
324   // Enqueued.
325   SimulateGestureScrollUpdateEvent(8, -7, 0);
326   EXPECT_EQ(4U, GestureEventQueueSize());
327   EXPECT_EQ(blink::WebGestureDeviceTouchscreen,
328             GestureEventLastQueueEvent().sourceDevice);
329 }
330
331 TEST_F(GestureEventQueueTest, CoalescesScrollAndPinchEvents) {
332   // Test coalescing of only GestureScrollUpdate events.
333   // Simulate gesture events.
334
335   // Sent.
336   SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
337                        blink::WebGestureDeviceTouchscreen);
338
339   // Sent.
340   SimulateGestureEvent(WebInputEvent::GesturePinchBegin,
341                        blink::WebGestureDeviceTouchscreen);
342
343   // Enqueued.
344   SimulateGestureScrollUpdateEvent(8, -4, 1);
345
346   // Make sure that the queue contains what we think it should.
347   WebGestureEvent merged_event = GestureEventLastQueueEvent();
348   EXPECT_EQ(3U, GestureEventQueueSize());
349   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
350
351   // Coalesced without changing event order. Note anchor at (60, 60). Anchoring
352   // from a point that is not the origin should still give us the right scroll.
353   SimulateGesturePinchUpdateEvent(1.5, 60, 60, 1);
354   EXPECT_EQ(4U, GestureEventQueueSize());
355   merged_event = GestureEventLastQueueEvent();
356   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
357   EXPECT_EQ(1.5, merged_event.data.pinchUpdate.scale);
358   EXPECT_EQ(1, merged_event.modifiers);
359   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
360   merged_event = GestureEventSecondFromLastQueueEvent();
361   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
362   EXPECT_EQ(8, merged_event.data.scrollUpdate.deltaX);
363   EXPECT_EQ(-4, merged_event.data.scrollUpdate.deltaY);
364   EXPECT_EQ(1, merged_event.modifiers);
365   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
366
367   // Enqueued.
368   SimulateGestureScrollUpdateEvent(6, -3, 1);
369
370   // Check whether coalesced correctly.
371   EXPECT_EQ(4U, GestureEventQueueSize());
372   merged_event = GestureEventLastQueueEvent();
373   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
374   EXPECT_EQ(1.5, merged_event.data.pinchUpdate.scale);
375   EXPECT_EQ(1, merged_event.modifiers);
376   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
377   merged_event = GestureEventSecondFromLastQueueEvent();
378   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
379   EXPECT_EQ(12, merged_event.data.scrollUpdate.deltaX);
380   EXPECT_EQ(-6, merged_event.data.scrollUpdate.deltaY);
381   EXPECT_EQ(1, merged_event.modifiers);
382   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
383
384   // Enqueued.
385   SimulateGesturePinchUpdateEvent(2, 60, 60, 1);
386
387   // Check whether coalesced correctly.
388   EXPECT_EQ(4U, GestureEventQueueSize());
389   merged_event = GestureEventLastQueueEvent();
390   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
391   EXPECT_EQ(3, merged_event.data.pinchUpdate.scale);
392   EXPECT_EQ(1, merged_event.modifiers);
393   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
394   merged_event = GestureEventSecondFromLastQueueEvent();
395   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
396   EXPECT_EQ(12, merged_event.data.scrollUpdate.deltaX);
397   EXPECT_EQ(-6, merged_event.data.scrollUpdate.deltaY);
398   EXPECT_EQ(1, merged_event.modifiers);
399   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
400
401   // Enqueued.
402   SimulateGesturePinchUpdateEvent(2, 60, 60, 1);
403
404   // Check whether coalesced correctly.
405   EXPECT_EQ(4U, GestureEventQueueSize());
406   merged_event = GestureEventLastQueueEvent();
407   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
408   EXPECT_EQ(6, merged_event.data.pinchUpdate.scale);
409   EXPECT_EQ(1, merged_event.modifiers);
410   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
411   merged_event = GestureEventSecondFromLastQueueEvent();
412   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
413   EXPECT_EQ(12, merged_event.data.scrollUpdate.deltaX);
414   EXPECT_EQ(-6, merged_event.data.scrollUpdate.deltaY);
415   EXPECT_EQ(1, merged_event.modifiers);
416   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
417
418   // Check that only the first event was sent.
419   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
420
421   // Check that the ACK sends the second message.
422   SendInputEventACK(WebInputEvent::GestureScrollBegin,
423                     INPUT_EVENT_ACK_STATE_CONSUMED);
424   RunUntilIdle();
425   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
426
427   // Enqueued.
428   SimulateGestureScrollUpdateEvent(6, -6, 1);
429
430   // Check whether coalesced correctly.
431   EXPECT_EQ(3U, GestureEventQueueSize());
432   merged_event = GestureEventLastQueueEvent();
433   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
434   EXPECT_EQ(6, merged_event.data.pinchUpdate.scale);
435   EXPECT_EQ(1, merged_event.modifiers);
436   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
437   merged_event = GestureEventSecondFromLastQueueEvent();
438   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
439   EXPECT_EQ(13, merged_event.data.scrollUpdate.deltaX);
440   EXPECT_EQ(-7, merged_event.data.scrollUpdate.deltaY);
441   EXPECT_EQ(1, merged_event.modifiers);
442   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
443
444   // At this point ACKs shouldn't be getting ignored.
445   EXPECT_FALSE(WillIgnoreNextACK());
446
447   // Check that the ACK sends both scroll and pinch updates.
448   SendInputEventACK(WebInputEvent::GesturePinchBegin,
449                     INPUT_EVENT_ACK_STATE_CONSUMED);
450   RunUntilIdle();
451   EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
452
453   // The next ACK should be getting ignored.
454   EXPECT_TRUE(WillIgnoreNextACK());
455
456   // Enqueued.
457   SimulateGestureScrollUpdateEvent(1, -1, 1);
458
459   // Check whether coalesced correctly.
460   EXPECT_EQ(3U, GestureEventQueueSize());
461   merged_event = GestureEventLastQueueEvent();
462   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
463   EXPECT_EQ(1, merged_event.data.scrollUpdate.deltaX);
464   EXPECT_EQ(-1, merged_event.data.scrollUpdate.deltaY);
465   EXPECT_EQ(1, merged_event.modifiers);
466   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
467   merged_event = GestureEventSecondFromLastQueueEvent();
468   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
469   EXPECT_EQ(6, merged_event.data.pinchUpdate.scale);
470   EXPECT_EQ(1, merged_event.modifiers);
471   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
472
473   // Enqueued.
474   SimulateGestureScrollUpdateEvent(2, -2, 1);
475
476   // Coalescing scrolls should still work.
477   EXPECT_EQ(3U, GestureEventQueueSize());
478   merged_event = GestureEventLastQueueEvent();
479   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
480   EXPECT_EQ(3, merged_event.data.scrollUpdate.deltaX);
481   EXPECT_EQ(-3, merged_event.data.scrollUpdate.deltaY);
482   EXPECT_EQ(1, merged_event.modifiers);
483   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
484   merged_event = GestureEventSecondFromLastQueueEvent();
485   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
486   EXPECT_EQ(6, merged_event.data.pinchUpdate.scale);
487   EXPECT_EQ(1, merged_event.modifiers);
488   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
489
490   // Enqueued.
491   SimulateGesturePinchUpdateEvent(0.5, 60, 60, 1);
492
493   // Check whether coalesced correctly.
494   EXPECT_EQ(4U, GestureEventQueueSize());
495   merged_event = GestureEventLastQueueEvent();
496   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
497   EXPECT_EQ(0.5, merged_event.data.pinchUpdate.scale);
498   EXPECT_EQ(1, merged_event.modifiers);
499   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
500   merged_event = GestureEventSecondFromLastQueueEvent();
501   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
502   EXPECT_EQ(3, merged_event.data.scrollUpdate.deltaX);
503   EXPECT_EQ(-3, merged_event.data.scrollUpdate.deltaY);
504   EXPECT_EQ(1, merged_event.modifiers);
505   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
506
507   // Check that the ACK gets ignored.
508   SendInputEventACK(WebInputEvent::GestureScrollUpdate,
509                     INPUT_EVENT_ACK_STATE_CONSUMED);
510   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
511   RunUntilIdle();
512   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
513   // The flag should have been flipped back to false.
514   EXPECT_FALSE(WillIgnoreNextACK());
515
516   // Enqueued.
517   SimulateGestureScrollUpdateEvent(2, -2, 2);
518
519   // Shouldn't coalesce with different modifiers.
520   EXPECT_EQ(4U, GestureEventQueueSize());
521   merged_event = GestureEventLastQueueEvent();
522   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
523   EXPECT_EQ(2, merged_event.data.scrollUpdate.deltaX);
524   EXPECT_EQ(-2, merged_event.data.scrollUpdate.deltaY);
525   EXPECT_EQ(2, merged_event.modifiers);
526   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
527   merged_event = GestureEventSecondFromLastQueueEvent();
528   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
529   EXPECT_EQ(0.5, merged_event.data.pinchUpdate.scale);
530   EXPECT_EQ(1, merged_event.modifiers);
531   EXPECT_EQ(blink::WebGestureDeviceTouchscreen, merged_event.sourceDevice);
532
533   // Check that the ACK sends the next scroll pinch pair.
534   SendInputEventACK(WebInputEvent::GesturePinchUpdate,
535                     INPUT_EVENT_ACK_STATE_CONSUMED);
536   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
537   RunUntilIdle();
538   EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
539
540   // Check that the ACK sends the second message.
541   SendInputEventACK(WebInputEvent::GestureScrollUpdate,
542                     INPUT_EVENT_ACK_STATE_CONSUMED);
543   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
544   RunUntilIdle();
545   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
546
547   // Check that the ACK sends the second event.
548   SendInputEventACK(WebInputEvent::GesturePinchUpdate,
549                     INPUT_EVENT_ACK_STATE_CONSUMED);
550   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
551   RunUntilIdle();
552   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
553
554   // Check that the queue is empty after ACK and no events get sent.
555   SendInputEventACK(WebInputEvent::GestureScrollUpdate,
556                     INPUT_EVENT_ACK_STATE_CONSUMED);
557   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
558   RunUntilIdle();
559   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
560   EXPECT_EQ(0U, GestureEventQueueSize());
561 }
562
563 TEST_F(GestureEventQueueTest, CoalescesMultiplePinchEventSequences) {
564   // Simulate a pinch sequence.
565   SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
566                        blink::WebGestureDeviceTouchscreen);
567   SimulateGestureEvent(WebInputEvent::GesturePinchBegin,
568                        blink::WebGestureDeviceTouchscreen);
569
570   SimulateGestureScrollUpdateEvent(8, -4, 1);
571   // Make sure that the queue contains what we think it should.
572   WebGestureEvent merged_event = GestureEventLastQueueEvent();
573   size_t expected_events_in_queue = 3;
574   EXPECT_EQ(expected_events_in_queue, GestureEventQueueSize());
575   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
576
577   // Coalesced without changing event order. Note anchor at (60, 60). Anchoring
578   // from a point that is not the origin should still give us the right scroll.
579   SimulateGesturePinchUpdateEvent(1.5, 60, 60, 1);
580   EXPECT_EQ(++expected_events_in_queue, GestureEventQueueSize());
581   merged_event = GestureEventLastQueueEvent();
582   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
583   EXPECT_EQ(1.5, merged_event.data.pinchUpdate.scale);
584   EXPECT_EQ(1, merged_event.modifiers);
585   merged_event = GestureEventSecondFromLastQueueEvent();
586   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
587   EXPECT_EQ(8, merged_event.data.scrollUpdate.deltaX);
588   EXPECT_EQ(-4, merged_event.data.scrollUpdate.deltaY);
589   EXPECT_EQ(1, merged_event.modifiers);
590
591   // Enqueued.
592   SimulateGestureScrollUpdateEvent(6, -3, 1);
593
594   // Check whether coalesced correctly.
595   EXPECT_EQ(expected_events_in_queue, GestureEventQueueSize());
596   merged_event = GestureEventLastQueueEvent();
597   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
598   EXPECT_EQ(1.5, merged_event.data.pinchUpdate.scale);
599   EXPECT_EQ(1, merged_event.modifiers);
600   merged_event = GestureEventSecondFromLastQueueEvent();
601   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
602   EXPECT_EQ(12, merged_event.data.scrollUpdate.deltaX);
603   EXPECT_EQ(-6, merged_event.data.scrollUpdate.deltaY);
604   EXPECT_EQ(1, merged_event.modifiers);
605
606   // Now start another sequence before the previous sequence has been ack'ed.
607   SimulateGestureEvent(WebInputEvent::GesturePinchEnd,
608                        blink::WebGestureDeviceTouchscreen);
609   SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
610                        blink::WebGestureDeviceTouchscreen);
611   SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
612                        blink::WebGestureDeviceTouchscreen);
613   SimulateGestureEvent(WebInputEvent::GesturePinchBegin,
614                        blink::WebGestureDeviceTouchscreen);
615
616   SimulateGestureScrollUpdateEvent(8, -4, 1);
617   // Make sure that the queue contains what we think it should.
618   expected_events_in_queue += 5;
619   merged_event = GestureEventLastQueueEvent();
620   EXPECT_EQ(expected_events_in_queue, GestureEventQueueSize());
621   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
622
623   // Coalesced without changing event order. Note anchor at (60, 60). Anchoring
624   // from a point that is not the origin should still give us the right scroll.
625   SimulateGesturePinchUpdateEvent(1.5, 30, 30, 1);
626   EXPECT_EQ(++expected_events_in_queue, GestureEventQueueSize());
627   merged_event = GestureEventLastQueueEvent();
628   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
629   EXPECT_EQ(1.5, merged_event.data.pinchUpdate.scale);
630   EXPECT_EQ(1, merged_event.modifiers);
631   merged_event = GestureEventSecondFromLastQueueEvent();
632   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
633   EXPECT_EQ(8, merged_event.data.scrollUpdate.deltaX);
634   EXPECT_EQ(-4, merged_event.data.scrollUpdate.deltaY);
635   EXPECT_EQ(1, merged_event.modifiers);
636
637   // Enqueued.
638   SimulateGestureScrollUpdateEvent(6, -3, 1);
639
640   // Check whether coalesced correctly.
641   EXPECT_EQ(expected_events_in_queue, GestureEventQueueSize());
642   merged_event = GestureEventLastQueueEvent();
643   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, merged_event.type);
644   EXPECT_EQ(1.5, merged_event.data.pinchUpdate.scale);
645   EXPECT_EQ(1, merged_event.modifiers);
646   merged_event = GestureEventSecondFromLastQueueEvent();
647   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
648   EXPECT_EQ(12, merged_event.data.scrollUpdate.deltaX);
649   EXPECT_EQ(-6, merged_event.data.scrollUpdate.deltaY);
650   EXPECT_EQ(1, merged_event.modifiers);
651 }
652
653 TEST_F(GestureEventQueueTest, CoalescesPinchSequencesWithEarlyAck) {
654   SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
655                        blink::WebGestureDeviceTouchscreen);
656   SendInputEventACK(WebInputEvent::GestureScrollBegin,
657                     INPUT_EVENT_ACK_STATE_CONSUMED);
658
659   SimulateGestureEvent(WebInputEvent::GesturePinchBegin,
660                        blink::WebGestureDeviceTouchscreen);
661   SendInputEventACK(WebInputEvent::GesturePinchBegin,
662                     INPUT_EVENT_ACK_STATE_CONSUMED);
663   // ScrollBegin and PinchBegin have been sent
664   EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
665   EXPECT_EQ(0U, GestureEventQueueSize());
666
667   SimulateGestureScrollUpdateEvent(5, 5, 1);
668   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
669   EXPECT_EQ(WebInputEvent::GestureScrollUpdate,
670             GestureEventLastQueueEvent().type);
671   EXPECT_EQ(1U, GestureEventQueueSize());
672
673
674   SimulateGesturePinchUpdateEvent(2, 60, 60, 1);
675   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
676   EXPECT_EQ(WebInputEvent::GesturePinchUpdate,
677             GestureEventLastQueueEvent().type);
678   EXPECT_EQ(2U, GestureEventQueueSize());
679
680   SimulateGesturePinchUpdateEvent(3, 60, 60, 1);
681   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
682   EXPECT_EQ(WebInputEvent::GesturePinchUpdate,
683             GestureEventLastQueueEvent().type);
684   EXPECT_EQ(2U, GestureEventQueueSize());
685
686   SimulateGestureScrollUpdateEvent(5, 5, 1);
687   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
688   // The coalesced pinch/scroll pair will have been re-arranged, with the
689   // pinch following the scroll.
690   EXPECT_EQ(WebInputEvent::GesturePinchUpdate,
691             GestureEventLastQueueEvent().type);
692   EXPECT_EQ(3U, GestureEventQueueSize());
693
694   SimulateGesturePinchUpdateEvent(4, 60, 60, 1);
695   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
696   EXPECT_EQ(3U, GestureEventQueueSize());
697
698   SendInputEventACK(WebInputEvent::GestureScrollUpdate,
699                     INPUT_EVENT_ACK_STATE_CONSUMED);
700   EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
701   EXPECT_EQ(2U, GestureEventQueueSize());
702
703   SendInputEventACK(WebInputEvent::GestureScrollUpdate,
704                     INPUT_EVENT_ACK_STATE_CONSUMED);
705   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
706
707   SendInputEventACK(WebInputEvent::GesturePinchUpdate,
708                     INPUT_EVENT_ACK_STATE_CONSUMED);
709   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
710   EXPECT_EQ(2.f * 3.f * 4.f, last_acked_event().data.pinchUpdate.scale);
711
712   EXPECT_EQ(0U, GestureEventQueueSize());
713 }
714
715 TEST_F(GestureEventQueueTest,
716        DoesNotCoalescePinchGestureEventsWithDifferentModifiers) {
717   // Insert an event to force queueing of gestures.
718   SimulateGestureEvent(WebInputEvent::GestureTapCancel,
719                        blink::WebGestureDeviceTouchscreen);
720   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
721   EXPECT_EQ(1U, GestureEventQueueSize());
722
723   SimulateGestureScrollUpdateEvent(5, 5, 1);
724   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
725   EXPECT_EQ(2U, GestureEventQueueSize());
726
727   SimulateGesturePinchUpdateEvent(3, 60, 60, 1);
728   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
729   EXPECT_EQ(3U, GestureEventQueueSize());
730
731   SimulateGestureScrollUpdateEvent(10, 15, 1);
732   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
733   EXPECT_EQ(3U, GestureEventQueueSize());
734
735   SimulateGesturePinchUpdateEvent(4, 60, 60, 1);
736   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
737   EXPECT_EQ(3U, GestureEventQueueSize());
738
739   // Using different modifiers should prevent coalescing.
740   SimulateGesturePinchUpdateEvent(5, 60, 60, 2);
741   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
742   EXPECT_EQ(4U, GestureEventQueueSize());
743
744   SimulateGesturePinchUpdateEvent(6, 60, 60, 3);
745   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
746   EXPECT_EQ(5U, GestureEventQueueSize());
747
748   SendInputEventACK(WebInputEvent::GestureTapCancel,
749                     INPUT_EVENT_ACK_STATE_CONSUMED);
750   EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
751   EXPECT_EQ(4U, GestureEventQueueSize());
752
753   SendInputEventACK(WebInputEvent::GestureScrollUpdate,
754                     INPUT_EVENT_ACK_STATE_CONSUMED);
755   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
756   EXPECT_EQ(3U, GestureEventQueueSize());
757
758   SendInputEventACK(WebInputEvent::GesturePinchUpdate,
759                     INPUT_EVENT_ACK_STATE_CONSUMED);
760   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
761   EXPECT_EQ(3.f * 4.f, last_acked_event().data.pinchUpdate.scale);
762   EXPECT_EQ(2U, GestureEventQueueSize());
763   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
764
765   SendInputEventACK(WebInputEvent::GesturePinchUpdate,
766                     INPUT_EVENT_ACK_STATE_CONSUMED);
767   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
768   EXPECT_EQ(5.f, last_acked_event().data.pinchUpdate.scale);
769   EXPECT_EQ(1U, GestureEventQueueSize());
770   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
771
772   SendInputEventACK(WebInputEvent::GesturePinchUpdate,
773                     INPUT_EVENT_ACK_STATE_CONSUMED);
774   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
775   EXPECT_EQ(6.f, last_acked_event().data.pinchUpdate.scale);
776   EXPECT_EQ(0U, GestureEventQueueSize());
777 }
778
779 TEST_F(GestureEventQueueTest, CoalescesScrollAndPinchEventsIdentity) {
780   // Insert an event to force queueing of gestures.
781   SimulateGestureEvent(WebInputEvent::GestureTapCancel,
782                        blink::WebGestureDeviceTouchscreen);
783   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
784   EXPECT_EQ(1U, GestureEventQueueSize());
785
786   // Ensure that coalescing yields an identity transform for any pinch/scroll
787   // pair combined with its inverse.
788   SimulateGestureScrollUpdateEvent(5, 5, 1);
789   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
790   EXPECT_EQ(2U, GestureEventQueueSize());
791
792   SimulateGesturePinchUpdateEvent(5, 10, 10, 1);
793   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
794   EXPECT_EQ(3U, GestureEventQueueSize());
795
796   SimulateGesturePinchUpdateEvent(.2f, 10, 10, 1);
797   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
798   EXPECT_EQ(3U, GestureEventQueueSize());
799
800   SimulateGestureScrollUpdateEvent(-5, -5, 1);
801   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
802   EXPECT_EQ(3U, GestureEventQueueSize());
803
804   SendInputEventACK(WebInputEvent::GestureTapCancel,
805                     INPUT_EVENT_ACK_STATE_CONSUMED);
806   EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
807   EXPECT_EQ(2U, GestureEventQueueSize());
808
809   SendInputEventACK(WebInputEvent::GestureScrollUpdate,
810                     INPUT_EVENT_ACK_STATE_CONSUMED);
811   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
812   EXPECT_EQ(0.f, last_acked_event().data.scrollUpdate.deltaX);
813   EXPECT_EQ(0.f, last_acked_event().data.scrollUpdate.deltaY);
814
815   SendInputEventACK(WebInputEvent::GesturePinchUpdate,
816                     INPUT_EVENT_ACK_STATE_CONSUMED);
817   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
818   EXPECT_EQ(1.f, last_acked_event().data.pinchUpdate.scale);
819   EXPECT_EQ(0U, GestureEventQueueSize());
820
821   // Insert an event to force queueing of gestures.
822   SimulateGestureEvent(WebInputEvent::GestureTapCancel,
823                        blink::WebGestureDeviceTouchscreen);
824   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
825   EXPECT_EQ(1U, GestureEventQueueSize());
826
827   // Ensure that coalescing yields an identity transform for any pinch/scroll
828   // pair combined with its inverse.
829   SimulateGesturePinchUpdateEvent(2, 10, 10, 1);
830   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
831   EXPECT_EQ(2U, GestureEventQueueSize());
832
833   SimulateGestureScrollUpdateEvent(20, 20, 1);
834   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
835   EXPECT_EQ(3U, GestureEventQueueSize());
836
837   SimulateGesturePinchUpdateEvent(0.5f, 20, 20, 1);
838   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
839   EXPECT_EQ(3U, GestureEventQueueSize());
840
841   SimulateGestureScrollUpdateEvent(-5, -5, 1);
842   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
843   EXPECT_EQ(3U, GestureEventQueueSize());
844
845   SendInputEventACK(WebInputEvent::GestureTapCancel,
846                     INPUT_EVENT_ACK_STATE_CONSUMED);
847   EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
848   EXPECT_EQ(2U, GestureEventQueueSize());
849
850   SendInputEventACK(WebInputEvent::GestureScrollUpdate,
851                     INPUT_EVENT_ACK_STATE_CONSUMED);
852   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
853   EXPECT_EQ(0.f, last_acked_event().data.scrollUpdate.deltaX);
854   EXPECT_EQ(0.f, last_acked_event().data.scrollUpdate.deltaY);
855
856   SendInputEventACK(WebInputEvent::GesturePinchUpdate,
857                     INPUT_EVENT_ACK_STATE_CONSUMED);
858   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
859   EXPECT_EQ(1.f, last_acked_event().data.pinchUpdate.scale);
860 }
861
862 // Tests a single event with an synchronous ack.
863 TEST_F(GestureEventQueueTest, SimpleSyncAck) {
864   set_synchronous_ack(INPUT_EVENT_ACK_STATE_CONSUMED);
865   SimulateGestureEvent(WebInputEvent::GestureTapDown,
866                        blink::WebGestureDeviceTouchscreen);
867   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
868   EXPECT_EQ(0U, GestureEventQueueSize());
869   EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
870 }
871
872 // Tests an event with an synchronous ack which enqueues an additional event.
873 TEST_F(GestureEventQueueTest, SyncAckQueuesEvent) {
874   scoped_ptr<WebGestureEvent> queued_event;
875   set_synchronous_ack(INPUT_EVENT_ACK_STATE_CONSUMED);
876   set_sync_followup_event(WebInputEvent::GestureShowPress,
877                           blink::WebGestureDeviceTouchscreen);
878   // This event enqueues the show press event.
879   SimulateGestureEvent(WebInputEvent::GestureTapDown,
880                        blink::WebGestureDeviceTouchscreen);
881   EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
882   EXPECT_EQ(1U, GestureEventQueueSize());
883   EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
884
885   SendInputEventACK(WebInputEvent::GestureShowPress,
886                     INPUT_EVENT_ACK_STATE_CONSUMED);
887   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
888   EXPECT_EQ(0U, GestureEventQueueSize());
889   EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
890 }
891
892 // Tests an event with an async ack followed by an event with a sync ack.
893 TEST_F(GestureEventQueueTest, AsyncThenSyncAck) {
894   SimulateGestureEvent(WebInputEvent::GestureTapDown,
895                        blink::WebGestureDeviceTouchscreen);
896
897   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
898   EXPECT_EQ(1U, GestureEventQueueSize());
899   EXPECT_EQ(0U, GetAndResetAckedGestureEventCount());
900
901   SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
902                        blink::WebGestureDeviceTouchscreen);
903   set_synchronous_ack(INPUT_EVENT_ACK_STATE_CONSUMED);
904   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
905   EXPECT_EQ(2U, GestureEventQueueSize());
906   EXPECT_EQ(0U, GetAndResetAckedGestureEventCount());
907
908   SendInputEventACK(WebInputEvent::GestureTapDown,
909                     INPUT_EVENT_ACK_STATE_CONSUMED);
910   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
911   EXPECT_EQ(0U, GestureEventQueueSize());
912   EXPECT_EQ(2U, GetAndResetAckedGestureEventCount());
913 }
914
915 TEST_F(GestureEventQueueTest, CoalescesScrollAndPinchEventWithSyncAck) {
916   // Simulate a pinch sequence.
917   SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
918                        blink::WebGestureDeviceTouchscreen);
919   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
920   SimulateGestureEvent(WebInputEvent::GesturePinchBegin,
921                        blink::WebGestureDeviceTouchscreen);
922   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
923
924   SimulateGestureScrollUpdateEvent(8, -4, 1);
925   // Make sure that the queue contains what we think it should.
926   WebGestureEvent merged_event = GestureEventLastQueueEvent();
927   EXPECT_EQ(3U, GestureEventQueueSize());
928   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, merged_event.type);
929
930   // Coalesced without changing event order. Note anchor at (60, 60). Anchoring
931   // from a point that is not the origin should still give us the right scroll.
932   SimulateGesturePinchUpdateEvent(1.5, 60, 60, 1);
933   EXPECT_EQ(4U, GestureEventQueueSize());
934
935   SendInputEventACK(WebInputEvent::GestureScrollBegin,
936                     INPUT_EVENT_ACK_STATE_CONSUMED);
937   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
938   EXPECT_EQ(3U, GestureEventQueueSize());
939
940   // Ack the PinchBegin, and schedule a synchronous ack for GestureScrollUpdate.
941   set_synchronous_ack(INPUT_EVENT_ACK_STATE_CONSUMED);
942   SendInputEventACK(WebInputEvent::GesturePinchBegin,
943                     INPUT_EVENT_ACK_STATE_CONSUMED);
944
945   // Both GestureScrollUpdate and GesturePinchUpdate should have been sent.
946   EXPECT_EQ(WebInputEvent::GestureScrollUpdate, last_acked_event().type);
947   EXPECT_EQ(1U, GestureEventQueueSize());
948   EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
949
950   // Ack the final GesturePinchUpdate.
951   SendInputEventACK(WebInputEvent::GesturePinchUpdate,
952                     INPUT_EVENT_ACK_STATE_CONSUMED);
953   EXPECT_EQ(WebInputEvent::GesturePinchUpdate, last_acked_event().type);
954   EXPECT_EQ(0U, GestureEventQueueSize());
955   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
956 }
957
958 #if GTEST_HAS_PARAM_TEST
959 TEST_P(GestureEventQueueWithSourceTest, GestureFlingCancelsFiltered) {
960   WebGestureDevice source_device = GetParam();
961
962   // GFC without previous GFS is dropped.
963   SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device);
964   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
965   EXPECT_EQ(0U, GestureEventQueueSize());
966
967   // GFC after previous GFS is dispatched and acked.
968   SimulateGestureFlingStartEvent(0, -10, source_device);
969   EXPECT_TRUE(FlingInProgress());
970   SendInputEventACK(WebInputEvent::GestureFlingStart,
971                     INPUT_EVENT_ACK_STATE_CONSUMED);
972   RunUntilIdle();
973   EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
974   SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device);
975   EXPECT_FALSE(FlingInProgress());
976   EXPECT_EQ(2U, GetAndResetSentGestureEventCount());
977   SendInputEventACK(WebInputEvent::GestureFlingCancel,
978                     INPUT_EVENT_ACK_STATE_CONSUMED);
979   RunUntilIdle();
980   EXPECT_EQ(1U, GetAndResetAckedGestureEventCount());
981   EXPECT_EQ(0U, GestureEventQueueSize());
982
983   // GFC before previous GFS is acked.
984   SimulateGestureFlingStartEvent(0, -10, source_device);
985   EXPECT_TRUE(FlingInProgress());
986   SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device);
987   EXPECT_FALSE(FlingInProgress());
988   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
989   EXPECT_EQ(2U, GestureEventQueueSize());
990
991   // Advance state realistically.
992   SendInputEventACK(WebInputEvent::GestureFlingStart,
993                     INPUT_EVENT_ACK_STATE_CONSUMED);
994   RunUntilIdle();
995   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
996   SendInputEventACK(WebInputEvent::GestureFlingCancel,
997                     INPUT_EVENT_ACK_STATE_CONSUMED);
998   RunUntilIdle();
999   EXPECT_EQ(2U, GetAndResetAckedGestureEventCount());
1000   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1001   EXPECT_EQ(0U, GestureEventQueueSize());
1002
1003   // GFS is added to the queue if another event is pending
1004   SimulateGestureScrollUpdateEvent(8, -7, 0);
1005   SimulateGestureFlingStartEvent(0, -10, source_device);
1006   EXPECT_EQ(2U, GestureEventQueueSize());
1007   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
1008   WebGestureEvent merged_event = GestureEventLastQueueEvent();
1009   EXPECT_EQ(WebInputEvent::GestureFlingStart, merged_event.type);
1010   EXPECT_TRUE(FlingInProgress());
1011   EXPECT_EQ(2U, GestureEventQueueSize());
1012
1013   // GFS in queue means that a GFC is added to the queue
1014   SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device);
1015   merged_event =GestureEventLastQueueEvent();
1016   EXPECT_EQ(WebInputEvent::GestureFlingCancel, merged_event.type);
1017   EXPECT_FALSE(FlingInProgress());
1018   EXPECT_EQ(3U, GestureEventQueueSize());
1019
1020   // Adding a second GFC is dropped.
1021   SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device);
1022   EXPECT_FALSE(FlingInProgress());
1023   EXPECT_EQ(3U, GestureEventQueueSize());
1024
1025   // Adding another GFS will add it to the queue.
1026   SimulateGestureFlingStartEvent(0, -10, source_device);
1027   merged_event = GestureEventLastQueueEvent();
1028   EXPECT_EQ(WebInputEvent::GestureFlingStart, merged_event.type);
1029   EXPECT_TRUE(FlingInProgress());
1030   EXPECT_EQ(4U, GestureEventQueueSize());
1031
1032   // GFS in queue means that a GFC is added to the queue
1033   SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device);
1034   merged_event = GestureEventLastQueueEvent();
1035   EXPECT_EQ(WebInputEvent::GestureFlingCancel, merged_event.type);
1036   EXPECT_FALSE(FlingInProgress());
1037   EXPECT_EQ(5U, GestureEventQueueSize());
1038
1039   // Adding another GFC with a GFC already there is dropped.
1040   SimulateGestureEvent(WebInputEvent::GestureFlingCancel, source_device);
1041   merged_event = GestureEventLastQueueEvent();
1042   EXPECT_EQ(WebInputEvent::GestureFlingCancel, merged_event.type);
1043   EXPECT_FALSE(FlingInProgress());
1044   EXPECT_EQ(5U, GestureEventQueueSize());
1045 }
1046
1047 INSTANTIATE_TEST_CASE_P(AllSources,
1048                         GestureEventQueueWithSourceTest,
1049                         testing::Values(blink::WebGestureDeviceTouchscreen,
1050                                         blink::WebGestureDeviceTouchpad));
1051 #endif  // GTEST_HAS_PARAM_TEST
1052
1053 // Test that a GestureScrollEnd | GestureFlingStart are deferred during the
1054 // debounce interval, that Scrolls are not and that the deferred events are
1055 // sent after that timer fires.
1056 TEST_F(GestureEventQueueTest, DebounceDefersFollowingGestureEvents) {
1057   SetUpForDebounce(3);
1058
1059   SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
1060                        blink::WebGestureDeviceTouchscreen);
1061   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
1062   EXPECT_EQ(1U, GestureEventQueueSize());
1063   EXPECT_EQ(0U, GestureEventDebouncingQueueSize());
1064   EXPECT_TRUE(ScrollingInProgress());
1065
1066   SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
1067                        blink::WebGestureDeviceTouchscreen);
1068   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1069   EXPECT_EQ(2U, GestureEventQueueSize());
1070   EXPECT_EQ(0U, GestureEventDebouncingQueueSize());
1071   EXPECT_TRUE(ScrollingInProgress());
1072
1073   SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
1074                        blink::WebGestureDeviceTouchscreen);
1075   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1076   EXPECT_EQ(2U, GestureEventQueueSize());
1077   EXPECT_EQ(1U, GestureEventDebouncingQueueSize());
1078
1079   SimulateGestureFlingStartEvent(0, 10, blink::WebGestureDeviceTouchscreen);
1080   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1081   EXPECT_EQ(2U, GestureEventQueueSize());
1082   EXPECT_EQ(2U, GestureEventDebouncingQueueSize());
1083
1084   SimulateGestureEvent(WebInputEvent::GestureTapDown,
1085                        blink::WebGestureDeviceTouchscreen);
1086   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1087   EXPECT_EQ(2U, GestureEventQueueSize());
1088   EXPECT_EQ(3U, GestureEventDebouncingQueueSize());
1089
1090   base::MessageLoop::current()->PostDelayedTask(
1091       FROM_HERE,
1092       base::MessageLoop::QuitClosure(),
1093       TimeDelta::FromMilliseconds(5));
1094   base::MessageLoop::current()->Run();
1095
1096   // The deferred events are correctly queued in coalescing queue.
1097   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1098   EXPECT_EQ(5U, GestureEventQueueSize());
1099   EXPECT_EQ(0U, GestureEventDebouncingQueueSize());
1100   EXPECT_FALSE(ScrollingInProgress());
1101
1102   // Verify that the coalescing queue contains the correct events.
1103   WebInputEvent::Type expected[] = {
1104       WebInputEvent::GestureScrollUpdate,
1105       WebInputEvent::GestureScrollUpdate,
1106       WebInputEvent::GestureScrollEnd,
1107       WebInputEvent::GestureFlingStart};
1108
1109   for (unsigned i = 0; i < sizeof(expected) / sizeof(WebInputEvent::Type);
1110       i++) {
1111     WebGestureEvent merged_event = GestureEventQueueEventAt(i);
1112     EXPECT_EQ(expected[i], merged_event.type);
1113   }
1114 }
1115
1116 // Test that non-scroll events are deferred while scrolling during the debounce
1117 // interval and are discarded if a GestureScrollUpdate event arrives before the
1118 // interval end.
1119 TEST_F(GestureEventQueueTest, DebounceDropsDeferredEvents) {
1120   SetUpForDebounce(3);
1121
1122   EXPECT_FALSE(ScrollingInProgress());
1123
1124   SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
1125                        blink::WebGestureDeviceTouchscreen);
1126   EXPECT_EQ(1U, GetAndResetSentGestureEventCount());
1127   EXPECT_EQ(1U, GestureEventQueueSize());
1128   EXPECT_EQ(0U, GestureEventDebouncingQueueSize());
1129   EXPECT_TRUE(ScrollingInProgress());
1130
1131   // This event should get discarded.
1132   SimulateGestureEvent(WebInputEvent::GestureScrollEnd,
1133                        blink::WebGestureDeviceTouchscreen);
1134   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1135   EXPECT_EQ(1U, GestureEventQueueSize());
1136   EXPECT_EQ(1U, GestureEventDebouncingQueueSize());
1137
1138   SimulateGestureEvent(WebInputEvent::GestureScrollUpdate,
1139                        blink::WebGestureDeviceTouchscreen);
1140   EXPECT_EQ(0U, GetAndResetSentGestureEventCount());
1141   EXPECT_EQ(2U, GestureEventQueueSize());
1142   EXPECT_EQ(0U, GestureEventDebouncingQueueSize());
1143   EXPECT_TRUE(ScrollingInProgress());
1144
1145   // Verify that the coalescing queue contains the correct events.
1146   WebInputEvent::Type expected[] = {
1147       WebInputEvent::GestureScrollUpdate,
1148       WebInputEvent::GestureScrollUpdate};
1149
1150   for (unsigned i = 0; i < sizeof(expected) / sizeof(WebInputEvent::Type);
1151       i++) {
1152     WebGestureEvent merged_event = GestureEventQueueEventAt(i);
1153     EXPECT_EQ(expected[i], merged_event.type);
1154   }
1155 }
1156
1157 }  // namespace content