Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: content/browser/renderer_host/input/touch_event_queue_unittest.cc

Issue 48973005: Move TouchEvent timeout code to the TouchEventQueue (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Handle no consumer Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/logging.h" 6 #include "base/logging.h"
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "base/message_loop/message_loop.h"
9 #include "content/browser/renderer_host/input/timeout_monitor.h"
8 #include "content/browser/renderer_host/input/touch_event_queue.h" 10 #include "content/browser/renderer_host/input/touch_event_queue.h"
9 #include "content/common/input/synthetic_web_input_event_builders.h" 11 #include "content/common/input/synthetic_web_input_event_builders.h"
10 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
11 #include "third_party/WebKit/public/web/WebInputEvent.h" 13 #include "third_party/WebKit/public/web/WebInputEvent.h"
12 14
13 using blink::WebGestureEvent; 15 using blink::WebGestureEvent;
14 using blink::WebInputEvent; 16 using blink::WebInputEvent;
15 using blink::WebTouchEvent; 17 using blink::WebTouchEvent;
16 using blink::WebTouchPoint; 18 using blink::WebTouchPoint;
17 19
18 namespace content { 20 namespace content {
21 namespace {
22 const size_t kDefaultTouchTimeoutDelayMs = 10;
23 }
19 24
20 class TouchEventQueueTest : public testing::Test, 25 class TouchEventQueueTest : public testing::Test,
21 public TouchEventQueueClient { 26 public TouchEventQueueClient {
22 public: 27 public:
23 TouchEventQueueTest() 28 TouchEventQueueTest()
24 : sent_event_count_(0), 29 : sent_event_count_(0),
25 acked_event_count_(0), 30 acked_event_count_(0),
26 last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN) {} 31 last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN) {}
27 32
28 virtual ~TouchEventQueueTest() {} 33 virtual ~TouchEventQueueTest() {}
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 scoped_ptr<WebGestureEvent> followup_gesture_event = 65 scoped_ptr<WebGestureEvent> followup_gesture_event =
61 followup_gesture_event_.Pass(); 66 followup_gesture_event_.Pass();
62 queue_->OnGestureScrollEvent( 67 queue_->OnGestureScrollEvent(
63 GestureEventWithLatencyInfo(*followup_gesture_event, 68 GestureEventWithLatencyInfo(*followup_gesture_event,
64 ui::LatencyInfo())); 69 ui::LatencyInfo()));
65 } 70 }
66 } 71 }
67 72
68 protected: 73 protected:
69 74
75 void SetUpForTimeoutTesting(size_t timeout_delay_ms) {
76 queue_->SetAckTimeoutEnabled(true, timeout_delay_ms);
77 }
78
70 void SendTouchEvent(const WebTouchEvent& event) { 79 void SendTouchEvent(const WebTouchEvent& event) {
71 queue_->QueueEvent(TouchEventWithLatencyInfo(event, ui::LatencyInfo())); 80 queue_->QueueEvent(TouchEventWithLatencyInfo(event, ui::LatencyInfo()));
72 } 81 }
73 82
74 void SendTouchEvent() { 83 void SendTouchEvent() {
75 SendTouchEvent(touch_event_); 84 SendTouchEvent(touch_event_);
76 touch_event_.ResetPoints(); 85 touch_event_.ResetPoints();
77 } 86 }
78 87
79 void SendGestureEvent(WebInputEvent::Type type) { 88 void SendGestureEvent(WebInputEvent::Type type) {
(...skipping 12 matching lines...) Expand all
92 } 101 }
93 102
94 void SetFollowupEvent(const WebGestureEvent& event) { 103 void SetFollowupEvent(const WebGestureEvent& event) {
95 followup_gesture_event_.reset(new WebGestureEvent(event)); 104 followup_gesture_event_.reset(new WebGestureEvent(event));
96 } 105 }
97 106
98 void SetSyncAckResult(InputEventAckState sync_ack_result) { 107 void SetSyncAckResult(InputEventAckState sync_ack_result) {
99 sync_ack_result_.reset(new InputEventAckState(sync_ack_result)); 108 sync_ack_result_.reset(new InputEventAckState(sync_ack_result));
100 } 109 }
101 110
102 int PressTouchPoint(int x, int y) { 111 void PressTouchPoint(int x, int y) {
103 return touch_event_.PressPoint(x, y); 112 touch_event_.PressPoint(x, y);
113 SendTouchEvent();
104 } 114 }
105 115
106 void MoveTouchPoint(int index, int x, int y) { 116 void MoveTouchPoint(int index, int x, int y) {
107 touch_event_.MovePoint(index, x, y); 117 touch_event_.MovePoint(index, x, y);
118 SendTouchEvent();
119 }
120
121 void MoveTouchPoints(int index0, int x0, int y0, int index1, int x1, int y1) {
122 touch_event_.MovePoint(index0, x0, y0);
123 touch_event_.MovePoint(index1, x1, y1);
124 SendTouchEvent();
108 } 125 }
109 126
110 void ReleaseTouchPoint(int index) { 127 void ReleaseTouchPoint(int index) {
111 touch_event_.ReleasePoint(index); 128 touch_event_.ReleasePoint(index);
129 SendTouchEvent();
112 } 130 }
113 131
114 void CancelTouchPoint(int index) { 132 void CancelTouchPoint(int index) {
115 touch_event_.CancelPoint(index); 133 touch_event_.CancelPoint(index);
134 SendTouchEvent();
116 } 135 }
117 136
118 size_t GetAndResetAckedEventCount() { 137 size_t GetAndResetAckedEventCount() {
119 size_t count = acked_event_count_; 138 size_t count = acked_event_count_;
120 acked_event_count_ = 0; 139 acked_event_count_ = 0;
121 return count; 140 return count;
122 } 141 }
123 142
124 size_t GetAndResetSentEventCount() { 143 size_t GetAndResetSentEventCount() {
125 size_t count = sent_event_count_; 144 size_t count = sent_event_count_;
126 sent_event_count_ = 0; 145 sent_event_count_ = 0;
127 return count; 146 return count;
128 } 147 }
129 148
130 void Flush() { 149 void Flush() {
131 queue_->FlushQueue(); 150 queue_->FlushQueue();
132 } 151 }
133 152
153 void SetEnableTouchForwarding(bool enabled) {
154 queue_->no_touch_to_renderer_ = !enabled;
155 }
156
157 bool WillForwardTouchEvents() {
158 return !queue_->no_touch_to_renderer_ && !queue_->HasTimeoutEvent();
159 }
160
161 bool IsTimeoutRunning() {
162 return queue_->IsTimeoutRunningForTesting();
163 }
164
134 size_t queued_event_count() const { 165 size_t queued_event_count() const {
135 return queue_->GetQueueSize(); 166 return queue_->size();
136 } 167 }
137 168
138 const WebTouchEvent& latest_event() const { 169 const WebTouchEvent& latest_event() const {
139 return queue_->GetLatestEvent().event; 170 return queue_->GetLatestEventForTesting().event;
140 } 171 }
141 172
142 const WebTouchEvent& acked_event() const { 173 const WebTouchEvent& acked_event() const {
143 return last_acked_event_; 174 return last_acked_event_;
144 } 175 }
145 176
146 const WebTouchEvent& sent_event() const { 177 const WebTouchEvent& sent_event() const {
147 return last_sent_event_; 178 return last_sent_event_;
148 } 179 }
149 180
(...skipping 13 matching lines...) Expand all
163 scoped_ptr<TouchEventQueue> queue_; 194 scoped_ptr<TouchEventQueue> queue_;
164 size_t sent_event_count_; 195 size_t sent_event_count_;
165 size_t acked_event_count_; 196 size_t acked_event_count_;
166 WebTouchEvent last_sent_event_; 197 WebTouchEvent last_sent_event_;
167 WebTouchEvent last_acked_event_; 198 WebTouchEvent last_acked_event_;
168 InputEventAckState last_acked_event_state_; 199 InputEventAckState last_acked_event_state_;
169 SyntheticWebTouchEvent touch_event_; 200 SyntheticWebTouchEvent touch_event_;
170 scoped_ptr<WebTouchEvent> followup_touch_event_; 201 scoped_ptr<WebTouchEvent> followup_touch_event_;
171 scoped_ptr<WebGestureEvent> followup_gesture_event_; 202 scoped_ptr<WebGestureEvent> followup_gesture_event_;
172 scoped_ptr<InputEventAckState> sync_ack_result_; 203 scoped_ptr<InputEventAckState> sync_ack_result_;
204 base::MessageLoopForUI message_loop_;
173 }; 205 };
174 206
175 207
176 // Tests that touch-events are queued properly. 208 // Tests that touch-events are queued properly.
177 TEST_F(TouchEventQueueTest, Basic) { 209 TEST_F(TouchEventQueueTest, Basic) {
178 PressTouchPoint(1, 1); 210 PressTouchPoint(1, 1);
179 SendTouchEvent();
180 EXPECT_EQ(1U, queued_event_count()); 211 EXPECT_EQ(1U, queued_event_count());
181 EXPECT_EQ(1U, GetAndResetSentEventCount()); 212 EXPECT_EQ(1U, GetAndResetSentEventCount());
182 213
183 // The second touch should not be sent since one is already in queue. 214 // The second touch should not be sent since one is already in queue.
184 MoveTouchPoint(0, 5, 5); 215 MoveTouchPoint(0, 5, 5);
185 SendTouchEvent();
186 EXPECT_EQ(2U, queued_event_count()); 216 EXPECT_EQ(2U, queued_event_count());
187 EXPECT_EQ(0U, GetAndResetSentEventCount()); 217 EXPECT_EQ(0U, GetAndResetSentEventCount());
188 218
189 // Receive an ACK for the first touch-event. 219 // Receive an ACK for the first touch-event.
190 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED); 220 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
191 EXPECT_EQ(1U, queued_event_count()); 221 EXPECT_EQ(1U, queued_event_count());
192 EXPECT_EQ(1U, GetAndResetSentEventCount()); 222 EXPECT_EQ(1U, GetAndResetSentEventCount());
193 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 223 EXPECT_EQ(1U, GetAndResetAckedEventCount());
194 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type); 224 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
195 225
196 // Receive an ACK for the second touch-event. 226 // Receive an ACK for the second touch-event.
197 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED); 227 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
198 EXPECT_EQ(0U, queued_event_count()); 228 EXPECT_EQ(0U, queued_event_count());
199 EXPECT_EQ(0U, GetAndResetSentEventCount()); 229 EXPECT_EQ(0U, GetAndResetSentEventCount());
200 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 230 EXPECT_EQ(1U, GetAndResetAckedEventCount());
201 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type); 231 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
202 } 232 }
203 233
204 // Tests that the touch-queue is emptied if a page stops listening for touch 234 // Tests that the touch-queue is emptied if a page stops listening for touch
205 // events. 235 // events.
206 TEST_F(TouchEventQueueTest, Flush) { 236 TEST_F(TouchEventQueueTest, Flush) {
207 Flush(); 237 Flush();
208 EXPECT_EQ(0U, queued_event_count()); 238 EXPECT_EQ(0U, queued_event_count());
209 EXPECT_EQ(0U, GetAndResetSentEventCount()); 239 EXPECT_EQ(0U, GetAndResetSentEventCount());
210 240
211 // Send a touch-press event. 241 // Send a touch-press event.
212 PressTouchPoint(1, 1); 242 PressTouchPoint(1, 1);
213 SendTouchEvent();
214 EXPECT_EQ(1U, GetAndResetSentEventCount()); 243 EXPECT_EQ(1U, GetAndResetSentEventCount());
215 244
216 ReleaseTouchPoint(0); 245 ReleaseTouchPoint(0);
217 SendTouchEvent();
218 246
219 // Events will be queued until the first sent event is ack'ed. 247 // Events will be queued until the first sent event is ack'ed.
220 for (int i = 5; i < 15; ++i) { 248 for (int i = 5; i < 15; ++i) {
221 PressTouchPoint(1, 1); 249 PressTouchPoint(1, 1);
222 SendTouchEvent();
223 MoveTouchPoint(0, i, i); 250 MoveTouchPoint(0, i, i);
224 SendTouchEvent();
225 ReleaseTouchPoint(0); 251 ReleaseTouchPoint(0);
226 SendTouchEvent();
227 } 252 }
228 EXPECT_EQ(32U, queued_event_count()); 253 EXPECT_EQ(32U, queued_event_count());
229 EXPECT_EQ(0U, GetAndResetSentEventCount()); 254 EXPECT_EQ(0U, GetAndResetSentEventCount());
230 255
231 // Receive an ACK for the first touch-event. One of the queued touch-event 256 // Receive an ACK for the first touch-event. One of the queued touch-event
232 // should be forwarded. 257 // should be forwarded.
233 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED); 258 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
234 EXPECT_EQ(31U, queued_event_count()); 259 EXPECT_EQ(31U, queued_event_count());
235 EXPECT_EQ(1U, GetAndResetSentEventCount()); 260 EXPECT_EQ(1U, GetAndResetSentEventCount());
236 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 261 EXPECT_EQ(1U, GetAndResetAckedEventCount());
237 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type); 262 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
238 263
239 // Flush the queue. The touch-event queue should now be emptied, but none of 264 // Flush the queue. The touch-event queue should now be emptied, but none of
240 // the queued touch-events should be sent to the renderer. 265 // the queued touch-events should be sent to the renderer.
241 Flush(); 266 Flush();
242 EXPECT_EQ(0U, queued_event_count()); 267 EXPECT_EQ(0U, queued_event_count());
243 EXPECT_EQ(0U, GetAndResetSentEventCount()); 268 EXPECT_EQ(0U, GetAndResetSentEventCount());
244 EXPECT_EQ(31U, GetAndResetAckedEventCount()); 269 EXPECT_EQ(31U, GetAndResetAckedEventCount());
245 } 270 }
246 271
247 // Tests that touch-events are coalesced properly in the queue. 272 // Tests that touch-events are coalesced properly in the queue.
248 TEST_F(TouchEventQueueTest, Coalesce) { 273 TEST_F(TouchEventQueueTest, Coalesce) {
249 // Send a touch-press event. 274 // Send a touch-press event.
250 PressTouchPoint(1, 1); 275 PressTouchPoint(1, 1);
251 SendTouchEvent();
252 EXPECT_EQ(1U, GetAndResetSentEventCount()); 276 EXPECT_EQ(1U, GetAndResetSentEventCount());
253 277
254 // Send a few touch-move events, followed by a touch-release event. All the 278 // Send a few touch-move events, followed by a touch-release event. All the
255 // touch-move events should be coalesced into a single event. 279 // touch-move events should be coalesced into a single event.
256 for (int i = 5; i < 15; ++i) { 280 for (int i = 5; i < 15; ++i)
257 MoveTouchPoint(0, i, i); 281 MoveTouchPoint(0, i, i);
258 SendTouchEvent(); 282
259 }
260 EXPECT_EQ(0U, GetAndResetSentEventCount()); 283 EXPECT_EQ(0U, GetAndResetSentEventCount());
261 ReleaseTouchPoint(0); 284 ReleaseTouchPoint(0);
262 SendTouchEvent();
263 EXPECT_EQ(0U, GetAndResetSentEventCount()); 285 EXPECT_EQ(0U, GetAndResetSentEventCount());
264 EXPECT_EQ(3U, queued_event_count()); 286 EXPECT_EQ(3U, queued_event_count());
265 287
266 // ACK the press. Coalesced touch-move events should be sent. 288 // ACK the press. Coalesced touch-move events should be sent.
267 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED); 289 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
268 EXPECT_EQ(2U, queued_event_count()); 290 EXPECT_EQ(2U, queued_event_count());
269 EXPECT_EQ(1U, GetAndResetSentEventCount()); 291 EXPECT_EQ(1U, GetAndResetSentEventCount());
270 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 292 EXPECT_EQ(1U, GetAndResetAckedEventCount());
271 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type); 293 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
272 EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, acked_event_state()); 294 EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, acked_event_state());
(...skipping 11 matching lines...) Expand all
284 EXPECT_EQ(0U, GetAndResetSentEventCount()); 306 EXPECT_EQ(0U, GetAndResetSentEventCount());
285 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 307 EXPECT_EQ(1U, GetAndResetAckedEventCount());
286 EXPECT_EQ(WebInputEvent::TouchEnd, acked_event().type); 308 EXPECT_EQ(WebInputEvent::TouchEnd, acked_event().type);
287 } 309 }
288 310
289 // Tests that an event that has already been sent but hasn't been ack'ed yet 311 // Tests that an event that has already been sent but hasn't been ack'ed yet
290 // doesn't get coalesced with newer events. 312 // doesn't get coalesced with newer events.
291 TEST_F(TouchEventQueueTest, SentTouchEventDoesNotCoalesce) { 313 TEST_F(TouchEventQueueTest, SentTouchEventDoesNotCoalesce) {
292 // Send a touch-press event. 314 // Send a touch-press event.
293 PressTouchPoint(1, 1); 315 PressTouchPoint(1, 1);
294 SendTouchEvent();
295 EXPECT_EQ(1U, GetAndResetSentEventCount()); 316 EXPECT_EQ(1U, GetAndResetSentEventCount());
296 317
297 // Send a few touch-move events, followed by a touch-release event. All the 318 // Send a few touch-move events, followed by a touch-release event. All the
298 // touch-move events should be coalesced into a single event. 319 // touch-move events should be coalesced into a single event.
299 for (int i = 5; i < 15; ++i) { 320 for (int i = 5; i < 15; ++i)
300 MoveTouchPoint(0, i, i); 321 MoveTouchPoint(0, i, i);
301 SendTouchEvent(); 322
302 }
303 EXPECT_EQ(0U, GetAndResetSentEventCount()); 323 EXPECT_EQ(0U, GetAndResetSentEventCount());
304 EXPECT_EQ(2U, queued_event_count()); 324 EXPECT_EQ(2U, queued_event_count());
305 325
306 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 326 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
307 EXPECT_EQ(1U, GetAndResetSentEventCount()); 327 EXPECT_EQ(1U, GetAndResetSentEventCount());
308 EXPECT_EQ(1U, queued_event_count()); 328 EXPECT_EQ(1U, queued_event_count());
309 329
310 // The coalesced touch-move event has been sent to the renderer. Any new 330 // The coalesced touch-move event has been sent to the renderer. Any new
311 // touch-move event should not be coalesced with the sent event. 331 // touch-move event should not be coalesced with the sent event.
312 MoveTouchPoint(0, 5, 5); 332 MoveTouchPoint(0, 5, 5);
313 SendTouchEvent();
314 EXPECT_EQ(2U, queued_event_count()); 333 EXPECT_EQ(2U, queued_event_count());
315 334
316 MoveTouchPoint(0, 7, 7); 335 MoveTouchPoint(0, 7, 7);
317 SendTouchEvent();
318 EXPECT_EQ(2U, queued_event_count()); 336 EXPECT_EQ(2U, queued_event_count());
319 } 337 }
320 338
321 // Tests that coalescing works correctly for multi-touch events. 339 // Tests that coalescing works correctly for multi-touch events.
322 TEST_F(TouchEventQueueTest, MultiTouch) { 340 TEST_F(TouchEventQueueTest, MultiTouch) {
323 // Press the first finger. 341 // Press the first finger.
324 PressTouchPoint(1, 1); 342 PressTouchPoint(1, 1);
325 SendTouchEvent();
326 EXPECT_EQ(1U, GetAndResetSentEventCount()); 343 EXPECT_EQ(1U, GetAndResetSentEventCount());
327 344
328 // Move the finger. 345 // Move the finger.
329 MoveTouchPoint(0, 5, 5); 346 MoveTouchPoint(0, 5, 5);
330 SendTouchEvent();
331 EXPECT_EQ(2U, queued_event_count()); 347 EXPECT_EQ(2U, queued_event_count());
332 348
333 // Now press a second finger. 349 // Now press a second finger.
334 PressTouchPoint(2, 2); 350 PressTouchPoint(2, 2);
335 SendTouchEvent();
336 EXPECT_EQ(3U, queued_event_count()); 351 EXPECT_EQ(3U, queued_event_count());
337 352
338 // Move both fingers. 353 // Move both fingers.
339 MoveTouchPoint(0, 10, 10); 354 MoveTouchPoints(0, 10, 10, 1, 20, 20);
340 MoveTouchPoint(1, 20, 20); 355 MoveTouchPoint(1, 20, 20);
341 SendTouchEvent();
342 EXPECT_EQ(4U, queued_event_count()); 356 EXPECT_EQ(4U, queued_event_count());
343 357
344 // Move only one finger now. 358 // Move only one finger now.
345 MoveTouchPoint(0, 15, 15); 359 MoveTouchPoint(0, 15, 15);
346 SendTouchEvent();
347 EXPECT_EQ(4U, queued_event_count()); 360 EXPECT_EQ(4U, queued_event_count());
348 361
349 // Move the other finger. 362 // Move the other finger.
350 MoveTouchPoint(1, 25, 25); 363 MoveTouchPoint(1, 25, 25);
351 SendTouchEvent();
352 EXPECT_EQ(4U, queued_event_count()); 364 EXPECT_EQ(4U, queued_event_count());
353 365
354 // Make sure both fingers are marked as having been moved in the coalesced 366 // Make sure both fingers are marked as having been moved in the coalesced
355 // event. 367 // event.
356 const WebTouchEvent& event = latest_event(); 368 const WebTouchEvent& event = latest_event();
357 EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[0].state); 369 EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[0].state);
358 EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[1].state); 370 EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[1].state);
359 } 371 }
360 372
361 // Tests that if a touch-event queue is destroyed in response to a touch-event 373 // Tests that if a touch-event queue is destroyed in response to a touch-event
362 // in the renderer, then there is no crash when the ACK for that touch-event 374 // in the renderer, then there is no crash when the ACK for that touch-event
363 // comes back. 375 // comes back.
364 TEST_F(TouchEventQueueTest, AckAfterQueueFlushed) { 376 TEST_F(TouchEventQueueTest, AckAfterQueueFlushed) {
365 // Send some touch-events to the renderer. 377 // Send some touch-events to the renderer.
366 PressTouchPoint(1, 1); 378 PressTouchPoint(1, 1);
367 SendTouchEvent();
368 EXPECT_EQ(1U, GetAndResetSentEventCount()); 379 EXPECT_EQ(1U, GetAndResetSentEventCount());
369 EXPECT_EQ(1U, queued_event_count()); 380 EXPECT_EQ(1U, queued_event_count());
370 381
371 MoveTouchPoint(0, 10, 10); 382 MoveTouchPoint(0, 10, 10);
372 SendTouchEvent();
373 EXPECT_EQ(0U, GetAndResetSentEventCount()); 383 EXPECT_EQ(0U, GetAndResetSentEventCount());
374 EXPECT_EQ(2U, queued_event_count()); 384 EXPECT_EQ(2U, queued_event_count());
375 385
376 // Receive an ACK for the press. This should cause the queued touch-move to 386 // Receive an ACK for the press. This should cause the queued touch-move to
377 // be sent to the renderer. 387 // be sent to the renderer.
378 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED); 388 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
379 EXPECT_EQ(1U, GetAndResetSentEventCount()); 389 EXPECT_EQ(1U, GetAndResetSentEventCount());
380 EXPECT_EQ(1U, queued_event_count()); 390 EXPECT_EQ(1U, queued_event_count());
381 391
382 Flush(); 392 Flush();
383 EXPECT_EQ(0U, GetAndResetSentEventCount()); 393 EXPECT_EQ(0U, GetAndResetSentEventCount());
384 EXPECT_EQ(0U, queued_event_count()); 394 EXPECT_EQ(0U, queued_event_count());
385 395
386 // Now receive an ACK for the move. 396 // Now receive an ACK for the move.
387 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED); 397 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
388 EXPECT_EQ(0U, GetAndResetSentEventCount()); 398 EXPECT_EQ(0U, GetAndResetSentEventCount());
389 EXPECT_EQ(0U, queued_event_count()); 399 EXPECT_EQ(0U, queued_event_count());
390 } 400 }
391 401
392 // Tests that touch-move events are not sent to the renderer if the preceding 402 // Tests that touch-move events are not sent to the renderer if the preceding
393 // touch-press event did not have a consumer (and consequently, did not hit the 403 // touch-press event did not have a consumer (and consequently, did not hit the
394 // main thread in the renderer). Also tests that all queued/coalesced touch 404 // main thread in the renderer). Also tests that all queued/coalesced touch
395 // events are flushed immediately when the ACK for the touch-press comes back 405 // events are flushed immediately when the ACK for the touch-press comes back
396 // with NO_CONSUMER status. 406 // with NO_CONSUMER status.
397 TEST_F(TouchEventQueueTest, NoConsumer) { 407 TEST_F(TouchEventQueueTest, NoConsumer) {
398 // The first touch-press should reach the renderer. 408 // The first touch-press should reach the renderer.
399 PressTouchPoint(1, 1); 409 PressTouchPoint(1, 1);
400 SendTouchEvent();
401 EXPECT_EQ(1U, GetAndResetSentEventCount()); 410 EXPECT_EQ(1U, GetAndResetSentEventCount());
402 411
403 // The second touch should not be sent since one is already in queue. 412 // The second touch should not be sent since one is already in queue.
404 MoveTouchPoint(0, 5, 5); 413 MoveTouchPoint(0, 5, 5);
405 SendTouchEvent();
406 EXPECT_EQ(0U, GetAndResetSentEventCount()); 414 EXPECT_EQ(0U, GetAndResetSentEventCount());
407 EXPECT_EQ(2U, queued_event_count()); 415 EXPECT_EQ(2U, queued_event_count());
408 416
409 // Receive an ACK for the first touch-event. This should release the queued 417 // Receive an ACK for the first touch-event. This should release the queued
410 // touch-event, but it should not be sent to the renderer. 418 // touch-event, but it should not be sent to the renderer.
411 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 419 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
412 EXPECT_EQ(0U, queued_event_count()); 420 EXPECT_EQ(0U, queued_event_count());
413 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type); 421 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
414 EXPECT_EQ(2U, GetAndResetAckedEventCount()); 422 EXPECT_EQ(2U, GetAndResetAckedEventCount());
415 EXPECT_EQ(0U, GetAndResetSentEventCount()); 423 EXPECT_EQ(0U, GetAndResetSentEventCount());
416 424
417 // Send a release event. This should not reach the renderer. 425 // Send a release event. This should not reach the renderer.
418 ReleaseTouchPoint(0); 426 ReleaseTouchPoint(0);
419 SendTouchEvent();
420 EXPECT_EQ(0U, GetAndResetSentEventCount()); 427 EXPECT_EQ(0U, GetAndResetSentEventCount());
421 EXPECT_EQ(WebInputEvent::TouchEnd, acked_event().type); 428 EXPECT_EQ(WebInputEvent::TouchEnd, acked_event().type);
422 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 429 EXPECT_EQ(1U, GetAndResetAckedEventCount());
423 430
424 // Send a press-event, followed by move and release events, and another press 431 // Send a press-event, followed by move and release events, and another press
425 // event, before the ACK for the first press event comes back. All of the 432 // event, before the ACK for the first press event comes back. All of the
426 // events should be queued first. After the NO_CONSUMER ack for the first 433 // events should be queued first. After the NO_CONSUMER ack for the first
427 // touch-press, all events upto the second touch-press should be flushed. 434 // touch-press, all events upto the second touch-press should be flushed.
428 PressTouchPoint(10, 10); 435 PressTouchPoint(10, 10);
429 SendTouchEvent();
430 EXPECT_EQ(1U, GetAndResetSentEventCount()); 436 EXPECT_EQ(1U, GetAndResetSentEventCount());
431 437
432 MoveTouchPoint(0, 5, 5); 438 MoveTouchPoint(0, 5, 5);
433 SendTouchEvent();
434 MoveTouchPoint(0, 6, 5); 439 MoveTouchPoint(0, 6, 5);
435 SendTouchEvent();
436 ReleaseTouchPoint(0); 440 ReleaseTouchPoint(0);
437 SendTouchEvent();
438 441
439 PressTouchPoint(6, 5); 442 PressTouchPoint(6, 5);
440 SendTouchEvent();
441 EXPECT_EQ(0U, GetAndResetSentEventCount()); 443 EXPECT_EQ(0U, GetAndResetSentEventCount());
442 // The queue should hold the first sent touch-press event, the coalesced 444 // The queue should hold the first sent touch-press event, the coalesced
443 // touch-move event, the touch-end event and the second touch-press event. 445 // touch-move event, the touch-end event and the second touch-press event.
444 EXPECT_EQ(4U, queued_event_count()); 446 EXPECT_EQ(4U, queued_event_count());
445 447
446 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 448 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
447 EXPECT_EQ(1U, GetAndResetSentEventCount()); 449 EXPECT_EQ(1U, GetAndResetSentEventCount());
448 EXPECT_EQ(WebInputEvent::TouchEnd, acked_event().type); 450 EXPECT_EQ(WebInputEvent::TouchEnd, acked_event().type);
449 EXPECT_EQ(4U, GetAndResetAckedEventCount()); 451 EXPECT_EQ(4U, GetAndResetAckedEventCount());
450 EXPECT_EQ(1U, queued_event_count()); 452 EXPECT_EQ(1U, queued_event_count());
451 453
452 // ACK the second press event as NO_CONSUMER too. 454 // ACK the second press event as NO_CONSUMER too.
453 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 455 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
454 EXPECT_EQ(0U, GetAndResetSentEventCount()); 456 EXPECT_EQ(0U, GetAndResetSentEventCount());
455 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type); 457 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
456 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 458 EXPECT_EQ(1U, GetAndResetAckedEventCount());
457 EXPECT_EQ(0U, queued_event_count()); 459 EXPECT_EQ(0U, queued_event_count());
458 460
459 // Send a second press event. Even though the first touch had NO_CONSUMER, 461 // Send a second press event. Even though the first touch had NO_CONSUMER,
460 // this press event should reach the renderer. 462 // this press event should reach the renderer.
461 PressTouchPoint(1, 1); 463 PressTouchPoint(1, 1);
462 SendTouchEvent();
463 EXPECT_EQ(1U, GetAndResetSentEventCount()); 464 EXPECT_EQ(1U, GetAndResetSentEventCount());
464 EXPECT_EQ(1U, queued_event_count()); 465 EXPECT_EQ(1U, queued_event_count());
465 } 466 }
466 467
467 TEST_F(TouchEventQueueTest, ConsumerIgnoreMultiFinger) { 468 TEST_F(TouchEventQueueTest, ConsumerIgnoreMultiFinger) {
468 // Press two touch points and move them around a bit. The renderer consumes 469 // Press two touch points and move them around a bit. The renderer consumes
469 // the events for the first touch point, but returns NO_CONSUMER_EXISTS for 470 // the events for the first touch point, but returns NO_CONSUMER_EXISTS for
470 // the second touch point. 471 // the second touch point.
471 472
472 PressTouchPoint(1, 1); 473 PressTouchPoint(1, 1);
473 SendTouchEvent();
474 EXPECT_EQ(1U, GetAndResetSentEventCount()); 474 EXPECT_EQ(1U, GetAndResetSentEventCount());
475 475
476 MoveTouchPoint(0, 5, 5); 476 MoveTouchPoint(0, 5, 5);
477 SendTouchEvent();
478 477
479 PressTouchPoint(10, 10); 478 PressTouchPoint(10, 10);
480 SendTouchEvent();
481 479
482 MoveTouchPoint(0, 2, 2); 480 MoveTouchPoint(0, 2, 2);
483 SendTouchEvent();
484 481
485 MoveTouchPoint(1, 4, 10); 482 MoveTouchPoint(1, 4, 10);
486 SendTouchEvent();
487 483
488 MoveTouchPoint(0, 10, 10); 484 MoveTouchPoints(0, 10, 10, 1, 20, 20);
489 MoveTouchPoint(1, 20, 20);
490 SendTouchEvent();
491 485
492 // Since the first touch-press is still pending ACK, no other event should 486 // Since the first touch-press is still pending ACK, no other event should
493 // have been sent to the renderer. 487 // have been sent to the renderer.
494 EXPECT_EQ(0U, GetAndResetSentEventCount()); 488 EXPECT_EQ(0U, GetAndResetSentEventCount());
495 // The queue includes the two presses, the first touch-move of the first 489 // The queue includes the two presses, the first touch-move of the first
496 // point, and a coalesced touch-move of both points. 490 // point, and a coalesced touch-move of both points.
497 EXPECT_EQ(4U, queued_event_count()); 491 EXPECT_EQ(4U, queued_event_count());
498 492
499 // ACK the first press as CONSUMED. This should cause the first touch-move of 493 // ACK the first press as CONSUMED. This should cause the first touch-move of
500 // the first touch-point to be dispatched. 494 // the first touch-point to be dispatched.
(...skipping 15 matching lines...) Expand all
516 EXPECT_EQ(1U, queued_event_count()); 510 EXPECT_EQ(1U, queued_event_count());
517 511
518 // ACK the coalesced move as NOT_CONSUMED. 512 // ACK the coalesced move as NOT_CONSUMED.
519 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 513 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
520 EXPECT_EQ(0U, GetAndResetSentEventCount()); 514 EXPECT_EQ(0U, GetAndResetSentEventCount());
521 EXPECT_EQ(0U, queued_event_count()); 515 EXPECT_EQ(0U, queued_event_count());
522 516
523 // Move just the second touch point. Because the first touch point did not 517 // Move just the second touch point. Because the first touch point did not
524 // move, this event should not reach the renderer. 518 // move, this event should not reach the renderer.
525 MoveTouchPoint(1, 30, 30); 519 MoveTouchPoint(1, 30, 30);
526 SendTouchEvent();
527 EXPECT_EQ(0U, GetAndResetSentEventCount()); 520 EXPECT_EQ(0U, GetAndResetSentEventCount());
528 EXPECT_EQ(0U, queued_event_count()); 521 EXPECT_EQ(0U, queued_event_count());
529 522
530 // Move just the first touch point. This should reach the renderer. 523 // Move just the first touch point. This should reach the renderer.
531 MoveTouchPoint(0, 10, 10); 524 MoveTouchPoint(0, 10, 10);
532 SendTouchEvent();
533 EXPECT_EQ(1U, GetAndResetSentEventCount()); 525 EXPECT_EQ(1U, GetAndResetSentEventCount());
534 EXPECT_EQ(1U, queued_event_count()); 526 EXPECT_EQ(1U, queued_event_count());
535 527
536 // Move both fingers. This event should reach the renderer (after the ACK of 528 // Move both fingers. This event should reach the renderer (after the ACK of
537 // the previous move event is received), because the first touch point did 529 // the previous move event is received), because the first touch point did
538 // move. 530 // move.
539 MoveTouchPoint(0, 15, 15); 531 MoveTouchPoints(0, 15, 15, 1, 25, 25);
540 MoveTouchPoint(1, 25, 25);
541 SendTouchEvent();
542 EXPECT_EQ(0U, GetAndResetSentEventCount()); 532 EXPECT_EQ(0U, GetAndResetSentEventCount());
543 533
544 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED); 534 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
545 EXPECT_EQ(1U, GetAndResetSentEventCount()); 535 EXPECT_EQ(1U, GetAndResetSentEventCount());
546 EXPECT_EQ(1U, queued_event_count()); 536 EXPECT_EQ(1U, queued_event_count());
547 537
548 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED); 538 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
549 EXPECT_EQ(0U, GetAndResetSentEventCount()); 539 EXPECT_EQ(0U, GetAndResetSentEventCount());
550 EXPECT_EQ(0U, queued_event_count()); 540 EXPECT_EQ(0U, queued_event_count());
551 541
552 // Release the first finger. Then move the second finger around some, then 542 // Release the first finger. Then move the second finger around some, then
553 // press another finger. Once the release event is ACKed, the move events of 543 // press another finger. Once the release event is ACKed, the move events of
554 // the second finger should be immediately released to the view, and the 544 // the second finger should be immediately released to the view, and the
555 // touch-press event should be dispatched to the renderer. 545 // touch-press event should be dispatched to the renderer.
556 ReleaseTouchPoint(0); 546 ReleaseTouchPoint(0);
557 SendTouchEvent();
558 EXPECT_EQ(1U, GetAndResetSentEventCount()); 547 EXPECT_EQ(1U, GetAndResetSentEventCount());
559 EXPECT_EQ(1U, queued_event_count()); 548 EXPECT_EQ(1U, queued_event_count());
560 549
561 MoveTouchPoint(1, 40, 40); 550 MoveTouchPoint(1, 40, 40);
562 SendTouchEvent();
563 551
564 MoveTouchPoint(1, 50, 50); 552 MoveTouchPoint(1, 50, 50);
565 SendTouchEvent();
566 553
567 PressTouchPoint(1, 1); 554 PressTouchPoint(1, 1);
568 SendTouchEvent();
569 555
570 MoveTouchPoint(1, 30, 30); 556 MoveTouchPoint(1, 30, 30);
571 SendTouchEvent();
572 EXPECT_EQ(0U, GetAndResetSentEventCount()); 557 EXPECT_EQ(0U, GetAndResetSentEventCount());
573 EXPECT_EQ(4U, queued_event_count()); 558 EXPECT_EQ(4U, queued_event_count());
574 559
575 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 560 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
576 EXPECT_EQ(1U, GetAndResetSentEventCount()); 561 EXPECT_EQ(1U, GetAndResetSentEventCount());
577 EXPECT_EQ(2U, queued_event_count()); 562 EXPECT_EQ(2U, queued_event_count());
578 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type); 563 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
579 564
580 // ACK the press with NO_CONSUMED_EXISTS. This should release the queued 565 // ACK the press with NO_CONSUMED_EXISTS. This should release the queued
581 // touch-move events to the view. 566 // touch-move events to the view.
582 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); 567 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
583 EXPECT_EQ(0U, GetAndResetSentEventCount()); 568 EXPECT_EQ(0U, GetAndResetSentEventCount());
584 EXPECT_EQ(0U, queued_event_count()); 569 EXPECT_EQ(0U, queued_event_count());
585 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type); 570 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
586 571
587 ReleaseTouchPoint(2); 572 ReleaseTouchPoint(2);
588 ReleaseTouchPoint(1); 573 ReleaseTouchPoint(1);
589 EXPECT_EQ(0U, GetAndResetSentEventCount()); 574 EXPECT_EQ(0U, GetAndResetSentEventCount());
590 EXPECT_EQ(0U, queued_event_count()); 575 EXPECT_EQ(0U, queued_event_count());
591 } 576 }
592 577
593 // Tests that touch-event's enqueued via a touch ack are properly handled. 578 // Tests that touch-event's enqueued via a touch ack are properly handled.
594 TEST_F(TouchEventQueueTest, AckWithFollowupEvents) { 579 TEST_F(TouchEventQueueTest, AckWithFollowupEvents) {
595 // Queue a touch down. 580 // Queue a touch down.
596 PressTouchPoint(1, 1); 581 PressTouchPoint(1, 1);
597 SendTouchEvent();
598 EXPECT_EQ(1U, queued_event_count()); 582 EXPECT_EQ(1U, queued_event_count());
599 EXPECT_EQ(1U, GetAndResetSentEventCount()); 583 EXPECT_EQ(1U, GetAndResetSentEventCount());
600 EXPECT_EQ(0U, GetAndResetAckedEventCount()); 584 EXPECT_EQ(0U, GetAndResetAckedEventCount());
601 585
602 // Create a touch event that will be queued synchronously by a touch ack. 586 // Create a touch event that will be queued synchronously by a touch ack.
603 // Note, this will be triggered by all subsequent touch acks. 587 // Note, this will be triggered by all subsequent touch acks.
604 WebTouchEvent followup_event; 588 WebTouchEvent followup_event;
605 followup_event.type = WebInputEvent::TouchStart; 589 followup_event.type = WebInputEvent::TouchStart;
606 followup_event.touchesLength = 1; 590 followup_event.touchesLength = 1;
607 followup_event.touches[0].id = 1; 591 followup_event.touches[0].id = 1;
608 followup_event.touches[0].state = WebTouchPoint::StatePressed; 592 followup_event.touches[0].state = WebTouchPoint::StatePressed;
609 SetFollowupEvent(followup_event); 593 SetFollowupEvent(followup_event);
610 594
611 // Receive an ACK for the press. This should cause the followup touch-move to 595 // Receive an ACK for the press. This should cause the followup touch-move to
612 // be sent to the renderer. 596 // be sent to the renderer.
613 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED); 597 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
614 EXPECT_EQ(1U, queued_event_count()); 598 EXPECT_EQ(1U, queued_event_count());
615 EXPECT_EQ(1U, GetAndResetSentEventCount()); 599 EXPECT_EQ(1U, GetAndResetSentEventCount());
616 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 600 EXPECT_EQ(1U, GetAndResetAckedEventCount());
617 EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, acked_event_state()); 601 EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, acked_event_state());
618 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type); 602 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
619 603
620 // Queue another event. 604 // Queue another event.
621 PressTouchPoint(1, 1);
622 MoveTouchPoint(0, 2, 2); 605 MoveTouchPoint(0, 2, 2);
623 SendTouchEvent();
624 EXPECT_EQ(2U, queued_event_count()); 606 EXPECT_EQ(2U, queued_event_count());
625 607
626 // Receive an ACK for the touch-move followup event. This should cause the 608 // Receive an ACK for the touch-move followup event. This should cause the
627 // subsequent touch move event be sent to the renderer. 609 // subsequent touch move event be sent to the renderer.
628 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED); 610 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
629 EXPECT_EQ(1U, queued_event_count()); 611 EXPECT_EQ(1U, queued_event_count());
630 EXPECT_EQ(1U, GetAndResetSentEventCount()); 612 EXPECT_EQ(1U, GetAndResetSentEventCount());
631 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 613 EXPECT_EQ(1U, GetAndResetAckedEventCount());
632 } 614 }
633 615
634 // Tests that touch-events can be synchronously ack'ed. 616 // Tests that touch-events can be synchronously ack'ed.
635 TEST_F(TouchEventQueueTest, SynchronousAcks) { 617 TEST_F(TouchEventQueueTest, SynchronousAcks) {
636 // TouchStart 618 // TouchStart
637 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED); 619 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
638 PressTouchPoint(1, 1); 620 PressTouchPoint(1, 1);
639 SendTouchEvent();
640 EXPECT_EQ(0U, queued_event_count()); 621 EXPECT_EQ(0U, queued_event_count());
641 EXPECT_EQ(1U, GetAndResetSentEventCount()); 622 EXPECT_EQ(1U, GetAndResetSentEventCount());
642 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 623 EXPECT_EQ(1U, GetAndResetAckedEventCount());
643 624
644 // TouchMove 625 // TouchMove
645 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED); 626 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
646 PressTouchPoint(1, 1);
647 MoveTouchPoint(0, 2, 2); 627 MoveTouchPoint(0, 2, 2);
648 SendTouchEvent();
649 EXPECT_EQ(0U, queued_event_count()); 628 EXPECT_EQ(0U, queued_event_count());
650 EXPECT_EQ(1U, GetAndResetSentEventCount()); 629 EXPECT_EQ(1U, GetAndResetSentEventCount());
651 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 630 EXPECT_EQ(1U, GetAndResetAckedEventCount());
652 631
653 // TouchEnd 632 // TouchEnd
654 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED); 633 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
655 PressTouchPoint(1, 1);
656 ReleaseTouchPoint(0); 634 ReleaseTouchPoint(0);
657 SendTouchEvent();
658 EXPECT_EQ(0U, queued_event_count()); 635 EXPECT_EQ(0U, queued_event_count());
659 EXPECT_EQ(1U, GetAndResetSentEventCount()); 636 EXPECT_EQ(1U, GetAndResetSentEventCount());
660 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 637 EXPECT_EQ(1U, GetAndResetAckedEventCount());
661 638
662 // TouchCancel (first inserting a TouchStart so the TouchCancel will be sent) 639 // TouchCancel (first inserting a TouchStart so the TouchCancel will be sent)
663 PressTouchPoint(1, 1); 640 PressTouchPoint(1, 1);
664 SendTouchEvent();
665 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED); 641 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
666 EXPECT_EQ(0U, queued_event_count()); 642 EXPECT_EQ(0U, queued_event_count());
667 EXPECT_EQ(1U, GetAndResetSentEventCount()); 643 EXPECT_EQ(1U, GetAndResetSentEventCount());
668 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 644 EXPECT_EQ(1U, GetAndResetAckedEventCount());
669 645
670 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED); 646 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
671 PressTouchPoint(1, 1);
672 CancelTouchPoint(0); 647 CancelTouchPoint(0);
673 SendTouchEvent();
674 EXPECT_EQ(0U, queued_event_count()); 648 EXPECT_EQ(0U, queued_event_count());
675 EXPECT_EQ(1U, GetAndResetSentEventCount()); 649 EXPECT_EQ(1U, GetAndResetSentEventCount());
676 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 650 EXPECT_EQ(1U, GetAndResetAckedEventCount());
677 } 651 }
678 652
679 // Tests that followup events triggered by an immediate ack from 653 // Tests that followup events triggered by an immediate ack from
680 // TouchEventQueue::QueueEvent() are properly handled. 654 // TouchEventQueue::QueueEvent() are properly handled.
681 TEST_F(TouchEventQueueTest, ImmediateAckWithFollowupEvents) { 655 TEST_F(TouchEventQueueTest, ImmediateAckWithFollowupEvents) {
682 // Create a touch event that will be queued synchronously by a touch ack. 656 // Create a touch event that will be queued synchronously by a touch ack.
683 WebTouchEvent followup_event; 657 WebTouchEvent followup_event;
(...skipping 16 matching lines...) Expand all
700 EXPECT_EQ(1U, queued_event_count()); 674 EXPECT_EQ(1U, queued_event_count());
701 EXPECT_EQ(1U, GetAndResetSentEventCount()); 675 EXPECT_EQ(1U, GetAndResetSentEventCount());
702 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 676 EXPECT_EQ(1U, GetAndResetAckedEventCount());
703 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state()); 677 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
704 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type); 678 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
705 } 679 }
706 680
707 // Tests basic TouchEvent forwarding suppression. 681 // Tests basic TouchEvent forwarding suppression.
708 TEST_F(TouchEventQueueTest, NoTouchBasic) { 682 TEST_F(TouchEventQueueTest, NoTouchBasic) {
709 // Disable TouchEvent forwarding. 683 // Disable TouchEvent forwarding.
710 set_no_touch_to_renderer(true); 684 SetEnableTouchForwarding(false);
711 MoveTouchPoint(0, 30, 5); 685 MoveTouchPoint(0, 30, 5);
712 SendTouchEvent();
713 EXPECT_EQ(0U, GetAndResetSentEventCount()); 686 EXPECT_EQ(0U, GetAndResetSentEventCount());
714 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 687 EXPECT_EQ(1U, GetAndResetAckedEventCount());
715 688
716 // TouchMove should not be sent to renderer. 689 // TouchMove should not be sent to renderer.
717 MoveTouchPoint(0, 65, 10); 690 MoveTouchPoint(0, 65, 10);
718 SendTouchEvent();
719 EXPECT_EQ(0U, GetAndResetSentEventCount()); 691 EXPECT_EQ(0U, GetAndResetSentEventCount());
720 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 692 EXPECT_EQ(1U, GetAndResetAckedEventCount());
721 693
722 // TouchEnd should not be sent to renderer. 694 // TouchEnd should not be sent to renderer.
723 ReleaseTouchPoint(0); 695 ReleaseTouchPoint(0);
724 SendTouchEvent();
725 EXPECT_EQ(0U, GetAndResetSentEventCount()); 696 EXPECT_EQ(0U, GetAndResetSentEventCount());
726 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 697 EXPECT_EQ(1U, GetAndResetAckedEventCount());
727 698
728 // TouchStart should not be sent to renderer. 699 // TouchStart should not be sent to renderer.
729 PressTouchPoint(5, 5); 700 PressTouchPoint(5, 5);
730 SendTouchEvent();
731 EXPECT_EQ(0U, GetAndResetSentEventCount()); 701 EXPECT_EQ(0U, GetAndResetSentEventCount());
732 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 702 EXPECT_EQ(1U, GetAndResetAckedEventCount());
733 703
734 // Enable TouchEvent forwarding. 704 // Enable TouchEvent forwarding.
735 set_no_touch_to_renderer(false); 705 SetEnableTouchForwarding(true);
736 706
737 PressTouchPoint(80, 10); 707 PressTouchPoint(80, 10);
738 SendTouchEvent();
739 EXPECT_EQ(1U, GetAndResetSentEventCount()); 708 EXPECT_EQ(1U, GetAndResetSentEventCount());
740 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 709 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
741 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 710 EXPECT_EQ(1U, GetAndResetAckedEventCount());
742 711
743 MoveTouchPoint(0, 80, 20); 712 MoveTouchPoint(0, 80, 20);
744 SendTouchEvent();
745 EXPECT_EQ(1U, GetAndResetSentEventCount()); 713 EXPECT_EQ(1U, GetAndResetSentEventCount());
746 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 714 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
747 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 715 EXPECT_EQ(1U, GetAndResetAckedEventCount());
748 716
749 ReleaseTouchPoint(0); 717 ReleaseTouchPoint(0);
750 SendTouchEvent();
751 EXPECT_EQ(1U, GetAndResetSentEventCount()); 718 EXPECT_EQ(1U, GetAndResetSentEventCount());
752 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 719 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
753 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 720 EXPECT_EQ(1U, GetAndResetAckedEventCount());
754 } 721 }
755 722
756 // Tests that no TouchEvents are sent to renderer during scrolling. 723 // Tests that no TouchEvents are sent to renderer during scrolling.
757 TEST_F(TouchEventQueueTest, NoTouchOnScroll) { 724 TEST_F(TouchEventQueueTest, NoTouchOnScroll) {
758 // Queue a TouchStart. 725 // Queue a TouchStart.
759 PressTouchPoint(0, 1); 726 PressTouchPoint(0, 1);
760 SendTouchEvent();
761 EXPECT_EQ(1U, GetAndResetSentEventCount()); 727 EXPECT_EQ(1U, GetAndResetSentEventCount());
762 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 728 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
763 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 729 EXPECT_EQ(1U, GetAndResetAckedEventCount());
764 730
765 MoveTouchPoint(0, 20, 5); 731 MoveTouchPoint(0, 20, 5);
766 SendTouchEvent();
767 EXPECT_EQ(1U, queued_event_count()); 732 EXPECT_EQ(1U, queued_event_count());
768 EXPECT_EQ(1U, GetAndResetSentEventCount()); 733 EXPECT_EQ(1U, GetAndResetSentEventCount());
769 734
770 // Queue another TouchStart. 735 // Queue another TouchStart.
771 PressTouchPoint(20, 20); 736 PressTouchPoint(20, 20);
772 SendTouchEvent();
773 EXPECT_EQ(2U, queued_event_count()); 737 EXPECT_EQ(2U, queued_event_count());
774 EXPECT_EQ(0U, GetAndResetSentEventCount()); 738 EXPECT_EQ(0U, GetAndResetSentEventCount());
775 EXPECT_EQ(WebInputEvent::TouchStart, latest_event().type); 739 EXPECT_EQ(WebInputEvent::TouchStart, latest_event().type);
776 740
777 // GestureScrollBegin inserts a synthetic TouchCancel before the TouchStart. 741 // GestureScrollBegin inserts a synthetic TouchCancel before the TouchStart.
778 WebGestureEvent followup_scroll; 742 WebGestureEvent followup_scroll;
779 followup_scroll.type = WebInputEvent::GestureScrollBegin; 743 followup_scroll.type = WebInputEvent::GestureScrollBegin;
780 SetFollowupEvent(followup_scroll); 744 SetFollowupEvent(followup_scroll);
781 ASSERT_FALSE(no_touch_to_renderer()); 745 ASSERT_TRUE(WillForwardTouchEvents());
782 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 746 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
783 EXPECT_TRUE(no_touch_to_renderer()); 747 EXPECT_FALSE(WillForwardTouchEvents());
784 EXPECT_EQ(1U, GetAndResetSentEventCount()); 748 EXPECT_EQ(1U, GetAndResetSentEventCount());
785 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 749 EXPECT_EQ(1U, GetAndResetAckedEventCount());
786 EXPECT_EQ(2U, queued_event_count()); 750 EXPECT_EQ(2U, queued_event_count());
787 EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type); 751 EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type);
788 EXPECT_EQ(WebInputEvent::TouchStart, latest_event().type); 752 EXPECT_EQ(WebInputEvent::TouchStart, latest_event().type);
789 753
790 // Acking the TouchCancel will result in dispatch of the next TouchStart. 754 // Acking the TouchCancel will result in dispatch of the next TouchStart.
791 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 755 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
792 // The synthetic TouchCancel should not reach client, only the TouchStart. 756 // The synthetic TouchCancel should not reach client, only the TouchStart.
793 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 757 EXPECT_EQ(1U, GetAndResetAckedEventCount());
794 EXPECT_EQ(0U, GetAndResetSentEventCount()); 758 EXPECT_EQ(0U, GetAndResetSentEventCount());
795 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type); 759 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
796 760
797 // TouchMove should not be sent to renderer. 761 // TouchMove should not be sent to the renderer.
798 MoveTouchPoint(0, 30, 5); 762 MoveTouchPoint(0, 30, 5);
799 SendTouchEvent();
800 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 763 EXPECT_EQ(1U, GetAndResetAckedEventCount());
801 EXPECT_EQ(0U, GetAndResetSentEventCount()); 764 EXPECT_EQ(0U, GetAndResetSentEventCount());
802 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state()); 765 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
803 766
804 // GestureScrollUpdates should not change affect touch forwarding. 767 // GestureScrollUpdates should not change affect touch forwarding.
805 SendGestureEvent(WebInputEvent::GestureScrollUpdate); 768 SendGestureEvent(WebInputEvent::GestureScrollUpdate);
806 EXPECT_TRUE(no_touch_to_renderer()); 769 EXPECT_FALSE(WillForwardTouchEvents());
807 770
808 // TouchEnd should not be sent to renderer. 771 // TouchEnd should not be sent to the renderer.
809 ReleaseTouchPoint(0); 772 ReleaseTouchPoint(0);
810 SendTouchEvent();
811 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 773 EXPECT_EQ(1U, GetAndResetAckedEventCount());
812 EXPECT_EQ(0U, GetAndResetSentEventCount()); 774 EXPECT_EQ(0U, GetAndResetSentEventCount());
813 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state()); 775 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
814 776
815 // GestureScrollEnd will resume the sending of TouchEvents to renderer. 777 // GestureScrollEnd will resume the sending of TouchEvents to renderer.
816 SendGestureEvent(blink::WebInputEvent::GestureScrollEnd); 778 SendGestureEvent(blink::WebInputEvent::GestureScrollEnd);
817 EXPECT_FALSE(no_touch_to_renderer()); 779 EXPECT_TRUE(WillForwardTouchEvents());
818 780
819 // Now TouchEvents should be forwarded normally. 781 // Now TouchEvents should be forwarded normally.
820 PressTouchPoint(80, 10); 782 PressTouchPoint(80, 10);
783 EXPECT_EQ(1U, GetAndResetSentEventCount());
784 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
785 EXPECT_EQ(1U, GetAndResetAckedEventCount());
786
787 MoveTouchPoint(0, 80, 20);
788 EXPECT_EQ(1U, GetAndResetSentEventCount());
789 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
790 EXPECT_EQ(1U, GetAndResetAckedEventCount());
791
792 ReleaseTouchPoint(0);
793 EXPECT_EQ(1U, GetAndResetSentEventCount());
794 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
795 EXPECT_EQ(1U, GetAndResetAckedEventCount());
796 }
797
798 // Tests that the touch timeout is started when sending certain touch types.
799 TEST_F(TouchEventQueueTest, TouchTimeoutTypes) {
800 SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
801
802 // Sending a TouchStart will start the timeout.
803 PressTouchPoint(0, 1);
821 SendTouchEvent(); 804 SendTouchEvent();
822 EXPECT_EQ(1U, GetAndResetSentEventCount()); 805 EXPECT_TRUE(IsTimeoutRunning());
823 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 806 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
824 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 807 EXPECT_FALSE(IsTimeoutRunning());
825 808
826 MoveTouchPoint(0, 80, 20); 809 // A TouchMove should start the timeout.
827 SendTouchEvent(); 810 MoveTouchPoint(0, 5, 5);
828 EXPECT_EQ(1U, GetAndResetSentEventCount()); 811 EXPECT_TRUE(IsTimeoutRunning());
829 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 812 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
830 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 813 EXPECT_FALSE(IsTimeoutRunning());
831 814
815 // A TouchEnd should not start the timeout.
832 ReleaseTouchPoint(0); 816 ReleaseTouchPoint(0);
833 SendTouchEvent(); 817 EXPECT_FALSE(IsTimeoutRunning());
834 EXPECT_EQ(1U, GetAndResetSentEventCount()); 818 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
835 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); 819 EXPECT_FALSE(IsTimeoutRunning());
836 EXPECT_EQ(1U, GetAndResetAckedEventCount()); 820
837 } 821 // A TouchCancel should not start the timeout.
838 822 PressTouchPoint(0, 1);
823 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
824 ASSERT_FALSE(IsTimeoutRunning());
825 CancelTouchPoint(0);
826 EXPECT_FALSE(IsTimeoutRunning());
827 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
828 EXPECT_FALSE(IsTimeoutRunning());
829 }
830
831 // Tests that a delayed TouchEvent ack will trigger a TouchCancel timeout,
832 // disabling touch forwarding until the next TouchStart is received after
833 // the timeout events are ack'ed.
834 TEST_F(TouchEventQueueTest, TouchTimeoutBasic) {
835 SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
836
837 // Queue a TouchStart.
838 GetAndResetSentEventCount();
839 GetAndResetAckedEventCount();
840 PressTouchPoint(0, 1);
841 ASSERT_EQ(1U, GetAndResetSentEventCount());
842 ASSERT_EQ(0U, GetAndResetAckedEventCount());
843 EXPECT_TRUE(IsTimeoutRunning());
844 EXPECT_TRUE(WillForwardTouchEvents());
845
846 // Delay the ack.
847 base::MessageLoop::current()->PostDelayedTask(
848 FROM_HERE,
849 base::MessageLoop::QuitClosure(),
850 base::TimeDelta::FromMilliseconds(kDefaultTouchTimeoutDelayMs * 2));
851 base::MessageLoop::current()->Run();
852
853 // The timeout should have fired, synthetically ack'ing the timed-out event.
854 // TouchEvent forwarding is disabled until the ack is received for the
855 // timed-out event and the future cancel event.
856 EXPECT_FALSE(IsTimeoutRunning());
857 EXPECT_FALSE(WillForwardTouchEvents());
858 EXPECT_EQ(0U, GetAndResetSentEventCount());
859 EXPECT_EQ(1U, GetAndResetAckedEventCount());
860
861 // Ack'ing the original event should trigger a cancel event.
862 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
863 EXPECT_FALSE(IsTimeoutRunning());
864 EXPECT_FALSE(WillForwardTouchEvents());
865 EXPECT_EQ(0U, GetAndResetAckedEventCount());
866 EXPECT_EQ(1U, GetAndResetSentEventCount());
867
868 // Touch events should not be forwarded until we receive the cancel acks.
869 PressTouchPoint(0, 1);
870 ASSERT_EQ(0U, GetAndResetSentEventCount());
871 ASSERT_EQ(1U, GetAndResetAckedEventCount());
872
873 // The synthetic TouchCancel ack should not reach the client, but should
874 // resume touch forwarding.
875 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
876 EXPECT_EQ(0U, GetAndResetSentEventCount());
877 EXPECT_EQ(0U, GetAndResetAckedEventCount());
878 EXPECT_TRUE(WillForwardTouchEvents());
879
880 // Subsequent events should be handled normally.
881 PressTouchPoint(0, 1);
882 EXPECT_EQ(1U, GetAndResetSentEventCount());
883 EXPECT_EQ(0U, GetAndResetAckedEventCount());
884 }
885
886 // Tests that the timeout is never started if the renderer consumes
887 // a TouchEvent from the current touch sequence.
888 TEST_F(TouchEventQueueTest, NoTouchTimeoutIfRendererIsConsumingGesture) {
889 SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
890
891 // Queue a TouchStart.
892 PressTouchPoint(0, 1);
893 ASSERT_TRUE(IsTimeoutRunning());
894
895 // Mark the event as consumed. This should prevent the timeout from
896 // being activated on subsequent TouchEvents in this gesture.
897 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
898 EXPECT_FALSE(IsTimeoutRunning());
899
900 // A TouchMove should not start the timeout.
901 MoveTouchPoint(0, 5, 5);
902 EXPECT_FALSE(IsTimeoutRunning());
903 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
904
905 // A TouchCancel should not start the timeout.
906 CancelTouchPoint(0);
907 EXPECT_FALSE(IsTimeoutRunning());
908 }
909
910 // Tests that the timeout is never started if the ack is synchronous.
911 TEST_F(TouchEventQueueTest, NoTouchTimeoutIfAckIsSynchronous) {
912 SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
913
914 // Queue a TouchStart.
915 SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
916 ASSERT_FALSE(IsTimeoutRunning());
917 PressTouchPoint(0, 1);
918 EXPECT_FALSE(IsTimeoutRunning());
919 }
920
921 // Tests that a TouchCancel timeout plays nice when the timed out touch stream
922 // turns into a scroll gesture sequence.
923 TEST_F(TouchEventQueueTest, TouchTimeoutWithFollowupGesture) {
924 SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
925
926 // Queue a TouchStart.
927 PressTouchPoint(0, 1);
928 EXPECT_TRUE(IsTimeoutRunning());
929 EXPECT_TRUE(WillForwardTouchEvents());
930 EXPECT_EQ(1U, GetAndResetSentEventCount());
931
932 // The cancelled sequence may turn into a scroll gesture.
933 WebGestureEvent followup_scroll;
934 followup_scroll.type = WebInputEvent::GestureScrollBegin;
935 SetFollowupEvent(followup_scroll);
936
937 // Delay the ack.
938 base::MessageLoop::current()->PostDelayedTask(
939 FROM_HERE,
940 base::MessageLoop::QuitClosure(),
941 base::TimeDelta::FromMilliseconds(kDefaultTouchTimeoutDelayMs * 2));
942 base::MessageLoop::current()->Run();
943
944 // The timeout should have fired, disabling touch forwarding until both acks
945 // are received, acking the timed out event.
946 EXPECT_FALSE(IsTimeoutRunning());
947 EXPECT_FALSE(WillForwardTouchEvents());
948 EXPECT_EQ(0U, GetAndResetSentEventCount());
949 EXPECT_EQ(1U, GetAndResetAckedEventCount());
950
951 // Ack the original event, triggering a TouchCancel.
952 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
953 EXPECT_FALSE(IsTimeoutRunning());
954 EXPECT_FALSE(WillForwardTouchEvents());
955 EXPECT_EQ(1U, GetAndResetSentEventCount());
956 EXPECT_EQ(0U, GetAndResetAckedEventCount());
957
958 // Ack the cancel event. Normally, this would resume touch forwarding,
959 // but we're still within a scroll gesture so it remains disabled.
960 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
961 EXPECT_FALSE(IsTimeoutRunning());
962 EXPECT_FALSE(WillForwardTouchEvents());
963 EXPECT_EQ(0U, GetAndResetSentEventCount());
964 EXPECT_EQ(0U, GetAndResetAckedEventCount());
965
966 // Try to forward a touch event.
967 GetAndResetSentEventCount();
968 GetAndResetAckedEventCount();
969 PressTouchPoint(0, 1);
970 EXPECT_FALSE(IsTimeoutRunning());
971 EXPECT_EQ(0U, GetAndResetSentEventCount());
972 EXPECT_EQ(1U, GetAndResetAckedEventCount());
973
974 // Now end the scroll sequence, resuming touch handling.
975 SendGestureEvent(blink::WebInputEvent::GestureScrollEnd);
976 EXPECT_TRUE(WillForwardTouchEvents());
977 PressTouchPoint(0, 1);
978 EXPECT_TRUE(IsTimeoutRunning());
979 EXPECT_EQ(1U, GetAndResetSentEventCount());
980 EXPECT_EQ(0U, GetAndResetAckedEventCount());
981 }
982
983 // Tests that a TouchCancel timeout plays nice when the timed out touch stream
984 // turns into a scroll gesture sequence, but the original event acks are
985 // significantly delayed.
986 TEST_F(TouchEventQueueTest, TouchTimeoutWithFollowupGestureAndDelayedAck) {
987 SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
988
989 // Queue a TouchStart.
990 PressTouchPoint(0, 1);
991 EXPECT_TRUE(IsTimeoutRunning());
992 EXPECT_TRUE(WillForwardTouchEvents());
993 EXPECT_EQ(1U, GetAndResetSentEventCount());
994
995 // The cancelled sequence may turn into a scroll gesture.
996 WebGestureEvent followup_scroll;
997 followup_scroll.type = WebInputEvent::GestureScrollBegin;
998 SetFollowupEvent(followup_scroll);
999
1000 // Delay the ack.
1001 base::MessageLoop::current()->PostDelayedTask(
1002 FROM_HERE,
1003 base::MessageLoop::QuitClosure(),
1004 base::TimeDelta::FromMilliseconds(kDefaultTouchTimeoutDelayMs * 2));
1005 base::MessageLoop::current()->Run();
1006
1007 // The timeout should have fired, disabling touch forwarding until both acks
1008 // are received and acking the timed out event.
1009 EXPECT_FALSE(IsTimeoutRunning());
1010 EXPECT_FALSE(WillForwardTouchEvents());
1011 EXPECT_EQ(0U, GetAndResetSentEventCount());
1012 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1013
1014 // Try to forward a touch event.
1015 GetAndResetSentEventCount();
1016 GetAndResetAckedEventCount();
1017 PressTouchPoint(0, 1);
1018 EXPECT_FALSE(IsTimeoutRunning());
1019 EXPECT_EQ(0U, GetAndResetSentEventCount());
1020 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1021
1022 // Now end the scroll sequence. Events will not be forwarded until the two
1023 // outstanding touch acks are received.
1024 SendGestureEvent(blink::WebInputEvent::GestureScrollEnd);
1025 PressTouchPoint(0, 1);
1026 EXPECT_FALSE(IsTimeoutRunning());
1027 EXPECT_EQ(0U, GetAndResetSentEventCount());
1028 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1029
1030 // Ack the original event, triggering a cancel.
1031 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
1032 EXPECT_EQ(1U, GetAndResetSentEventCount());
1033 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1034
1035 // Ack the cancel event, resuming touch forwarding.
1036 SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
1037 EXPECT_EQ(0U, GetAndResetSentEventCount());
1038 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1039
1040 PressTouchPoint(0, 1);
1041 EXPECT_TRUE(IsTimeoutRunning());
1042 EXPECT_EQ(1U, GetAndResetSentEventCount());
1043 }
1044
1045 // Tests that a delayed TouchEvent ack will not trigger a TouchCancel timeout if
1046 // the timed-out event had no consumer.
1047 TEST_F(TouchEventQueueTest, NoCancelOnTouchTimeoutWithoutConsumer) {
1048 SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
1049
1050 // Queue a TouchStart.
1051 PressTouchPoint(0, 1);
1052 ASSERT_EQ(1U, GetAndResetSentEventCount());
1053 ASSERT_EQ(0U, GetAndResetAckedEventCount());
1054 EXPECT_TRUE(IsTimeoutRunning());
1055 EXPECT_TRUE(WillForwardTouchEvents());
1056
1057 // Delay the ack.
1058 base::MessageLoop::current()->PostDelayedTask(
1059 FROM_HERE,
1060 base::MessageLoop::QuitClosure(),
1061 base::TimeDelta::FromMilliseconds(kDefaultTouchTimeoutDelayMs * 2));
1062 base::MessageLoop::current()->Run();
1063
1064 // The timeout should have fired, synthetically ack'ing the timed out event.
1065 // TouchEvent forwarding is disabled until the original ack is received.
1066 EXPECT_FALSE(IsTimeoutRunning());
1067 EXPECT_FALSE(WillForwardTouchEvents());
1068 EXPECT_EQ(0U, GetAndResetSentEventCount());
1069 EXPECT_EQ(1U, GetAndResetAckedEventCount());
1070
1071 // Touch events should not be forwarded until we receive the original ack.
1072 PressTouchPoint(0, 1);
1073 ASSERT_EQ(0U, GetAndResetSentEventCount());
1074 ASSERT_EQ(1U, GetAndResetAckedEventCount());
1075
1076 // Ack'ing the original event should not trigger a cancel event, as the
1077 // TouchStart had no consumer. However, it should re-enable touch forwarding.
1078 SendTouchEventACK(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
1079 EXPECT_FALSE(IsTimeoutRunning());
1080 EXPECT_TRUE(WillForwardTouchEvents());
1081 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1082 EXPECT_EQ(0U, GetAndResetSentEventCount());
1083
1084 // Subsequent events should be handled normally.
1085 PressTouchPoint(0, 1);
1086 EXPECT_EQ(1U, GetAndResetSentEventCount());
1087 EXPECT_EQ(0U, GetAndResetAckedEventCount());
1088 }
839 } // namespace content 1089 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698