OLD | NEW |
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" | 8 #include "base/message_loop/message_loop.h" |
9 #include "content/browser/renderer_host/input/timeout_monitor.h" | 9 #include "content/browser/renderer_host/input/timeout_monitor.h" |
10 #include "content/browser/renderer_host/input/touch_event_queue.h" | 10 #include "content/browser/renderer_host/input/touch_event_queue.h" |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 | 278 |
279 // Receive an ACK for the second touch-event. | 279 // Receive an ACK for the second touch-event. |
280 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 280 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
281 EXPECT_EQ(0U, queued_event_count()); | 281 EXPECT_EQ(0U, queued_event_count()); |
282 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 282 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
283 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 283 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
284 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type); | 284 EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type); |
285 EXPECT_TRUE(acked_event().cancelable); | 285 EXPECT_TRUE(acked_event().cancelable); |
286 } | 286 } |
287 | 287 |
288 // Tests that the touch-queue is emptied if a page stops listening for touch | 288 // Tests that the touch-queue is emptied after the outstanding ack is received |
289 // events. | 289 // if a page stops listening for touch events. |
290 TEST_F(TouchEventQueueTest, QueueFlushedWhenHandlersRemoved) { | 290 TEST_F(TouchEventQueueTest, QueueFlushedOnAckAfterHandlersRemoved) { |
291 OnHasTouchEventHandlers(true); | 291 OnHasTouchEventHandlers(true); |
292 EXPECT_EQ(0U, queued_event_count()); | 292 EXPECT_EQ(0U, queued_event_count()); |
293 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 293 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
294 | 294 |
295 // Send a touch-press event. | 295 // Send a touch-press event. |
296 PressTouchPoint(1, 1); | 296 PressTouchPoint(1, 1); |
297 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 297 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 298 EXPECT_EQ(1U, queued_event_count()); |
298 | 299 |
| 300 // Signal that all touch handlers have been removed. |
| 301 OnHasTouchEventHandlers(false); |
| 302 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 303 EXPECT_EQ(1U, queued_event_count()); |
| 304 |
| 305 // Process the ack for the sent touch, ensuring that it is honored (despite |
| 306 // the touch handler having been removed). |
| 307 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
| 308 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 309 EXPECT_EQ(0U, queued_event_count()); |
| 310 EXPECT_EQ(INPUT_EVENT_ACK_STATE_CONSUMED, acked_event_state()); |
| 311 |
| 312 // The release should not be forwarded. |
299 ReleaseTouchPoint(0); | 313 ReleaseTouchPoint(0); |
| 314 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
| 315 EXPECT_EQ(0U, queued_event_count()); |
| 316 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state()); |
| 317 |
| 318 OnHasTouchEventHandlers(true); |
300 | 319 |
301 // Events will be queued until the first sent event is ack'ed. | 320 // Events will be queued until the first sent event is ack'ed. |
302 for (int i = 5; i < 15; ++i) { | 321 for (int i = 0; i < 10; ++i) { |
303 PressTouchPoint(1, 1); | 322 PressTouchPoint(1, 1); |
304 MoveTouchPoint(0, i, i); | 323 MoveTouchPoint(0, i, i); |
305 ReleaseTouchPoint(0); | 324 ReleaseTouchPoint(0); |
306 } | 325 } |
307 EXPECT_EQ(32U, queued_event_count()); | 326 EXPECT_EQ(30U, queued_event_count()); |
| 327 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
| 328 |
| 329 // Signal that all touch handlers have been removed. Note that flushing of |
| 330 // the queue will not occur until *after* the outstanding ack is received. |
| 331 OnHasTouchEventHandlers(false); |
| 332 EXPECT_EQ(30U, queued_event_count()); |
308 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 333 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
| 334 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
309 | 335 |
310 // Receive an ACK for the first touch-event. One of the queued touch-event | 336 // Receive an ACK for the first touch-event. All remaining touch events should |
311 // should be forwarded. | 337 // be flushed with the appropriate ack type. |
312 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 338 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
313 EXPECT_EQ(31U, queued_event_count()); | |
314 EXPECT_EQ(1U, GetAndResetSentEventCount()); | |
315 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | |
316 EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type); | |
317 | |
318 // Flush the queue. The touch-event queue should now be emptied, but none of | |
319 // the queued touch-events should be sent to the renderer. | |
320 OnHasTouchEventHandlers(false); | |
321 EXPECT_EQ(0U, queued_event_count()); | 339 EXPECT_EQ(0U, queued_event_count()); |
322 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 340 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
323 EXPECT_EQ(31U, GetAndResetAckedEventCount()); | 341 EXPECT_EQ(30U, GetAndResetAckedEventCount()); |
| 342 EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state()); |
324 } | 343 } |
325 | 344 |
326 // Tests that addition of a touch handler during a touch sequence will not cause | 345 // Tests that addition of a touch handler during a touch sequence will not cause |
327 // the remaining sequence to be forwarded. | 346 // the remaining sequence to be forwarded. |
328 TEST_F(TouchEventQueueTest, ActiveSequenceNotForwardedWhenHandlersAdded) { | 347 TEST_F(TouchEventQueueTest, ActiveSequenceNotForwardedWhenHandlersAdded) { |
329 OnHasTouchEventHandlers(false); | 348 OnHasTouchEventHandlers(false); |
330 | 349 |
331 // Send a touch-press event while there is no handler. | 350 // Send a touch-press event while there is no handler. |
332 PressTouchPoint(1, 1); | 351 PressTouchPoint(1, 1); |
333 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 352 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
(...skipping 23 matching lines...) Expand all Loading... |
357 PressTouchPoint(1, 1); | 376 PressTouchPoint(1, 1); |
358 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 377 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
359 EXPECT_EQ(1U, queued_event_count()); | 378 EXPECT_EQ(1U, queued_event_count()); |
360 | 379 |
361 // Queue a touch-move event. | 380 // Queue a touch-move event. |
362 MoveTouchPoint(0, 5, 5); | 381 MoveTouchPoint(0, 5, 5); |
363 EXPECT_EQ(2U, queued_event_count()); | 382 EXPECT_EQ(2U, queued_event_count()); |
364 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | 383 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
365 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 384 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
366 | 385 |
367 // Touch handle deregistration should flush the queue. | 386 // Unregister all touch handlers. |
368 OnHasTouchEventHandlers(false); | 387 OnHasTouchEventHandlers(false); |
| 388 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 389 EXPECT_EQ(2U, queued_event_count()); |
| 390 |
| 391 // The ack should be flush the queue. |
| 392 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
369 EXPECT_EQ(2U, GetAndResetAckedEventCount()); | 393 EXPECT_EQ(2U, GetAndResetAckedEventCount()); |
370 EXPECT_EQ(0U, queued_event_count()); | 394 EXPECT_EQ(0U, queued_event_count()); |
371 | 395 |
372 // The ack should be ignored as the touch queue is now empty. | |
373 SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); | |
374 EXPECT_EQ(0U, GetAndResetAckedEventCount()); | |
375 EXPECT_EQ(0U, queued_event_count()); | |
376 | |
377 // Events should be dropped while there is no touch handler. | 396 // Events should be dropped while there is no touch handler. |
378 MoveTouchPoint(0, 10, 10); | 397 MoveTouchPoint(0, 10, 10); |
379 EXPECT_EQ(0U, queued_event_count()); | 398 EXPECT_EQ(0U, queued_event_count()); |
380 EXPECT_EQ(1U, GetAndResetAckedEventCount()); | 399 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
381 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 400 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
382 | 401 |
383 // Simulate touch handler registration in the middle of a touch sequence. | 402 // Simulate touch handler registration in the middle of a touch sequence. |
384 OnHasTouchEventHandlers(true); | 403 OnHasTouchEventHandlers(true); |
385 | 404 |
386 // The touch end for the interrupted sequence should be dropped. | 405 // The touch end for the interrupted sequence should be dropped. |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
489 MoveTouchPoint(1, 25, 25); | 508 MoveTouchPoint(1, 25, 25); |
490 EXPECT_EQ(4U, queued_event_count()); | 509 EXPECT_EQ(4U, queued_event_count()); |
491 | 510 |
492 // Make sure both fingers are marked as having been moved in the coalesced | 511 // Make sure both fingers are marked as having been moved in the coalesced |
493 // event. | 512 // event. |
494 const WebTouchEvent& event = latest_event(); | 513 const WebTouchEvent& event = latest_event(); |
495 EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[0].state); | 514 EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[0].state); |
496 EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[1].state); | 515 EXPECT_EQ(WebTouchPoint::StateMoved, event.touches[1].state); |
497 } | 516 } |
498 | 517 |
499 // Tests that if a touch-event queue is destroyed in response to a touch-event | 518 // Tests that the touch-event queue is robust to redundant acks. |
500 // in the renderer, then there is no crash when the ACK for that touch-event | 519 TEST_F(TouchEventQueueTest, SpuriousAcksIgnored) { |
501 // comes back. | 520 // Trigger a spurious ack. |
502 TEST_F(TouchEventQueueTest, AckAfterQueueFlushed) { | 521 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
503 // Send some touch-events to the renderer. | 522 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
| 523 |
| 524 // Send and ack a touch press. |
504 PressTouchPoint(1, 1); | 525 PressTouchPoint(1, 1); |
505 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 526 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
506 EXPECT_EQ(1U, queued_event_count()); | 527 EXPECT_EQ(1U, queued_event_count()); |
507 | |
508 MoveTouchPoint(0, 10, 10); | |
509 EXPECT_EQ(0U, GetAndResetSentEventCount()); | |
510 EXPECT_EQ(2U, queued_event_count()); | |
511 | |
512 // Receive an ACK for the press. This should cause the queued touch-move to | |
513 // be sent to the renderer. | |
514 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 528 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
515 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 529 EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
516 EXPECT_EQ(1U, queued_event_count()); | |
517 | |
518 OnHasTouchEventHandlers(false); | |
519 EXPECT_EQ(0U, GetAndResetSentEventCount()); | |
520 EXPECT_EQ(0U, queued_event_count()); | 530 EXPECT_EQ(0U, queued_event_count()); |
521 | 531 |
522 // Now receive an ACK for the move. | 532 // Trigger a spurious ack. |
523 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 533 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
524 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 534 EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
525 EXPECT_EQ(0U, queued_event_count()); | |
526 } | 535 } |
527 | 536 |
528 // Tests that touch-move events are not sent to the renderer if the preceding | 537 // Tests that touch-move events are not sent to the renderer if the preceding |
529 // touch-press event did not have a consumer (and consequently, did not hit the | 538 // touch-press event did not have a consumer (and consequently, did not hit the |
530 // main thread in the renderer). Also tests that all queued/coalesced touch | 539 // main thread in the renderer). Also tests that all queued/coalesced touch |
531 // events are flushed immediately when the ACK for the touch-press comes back | 540 // events are flushed immediately when the ACK for the touch-press comes back |
532 // with NO_CONSUMER status. | 541 // with NO_CONSUMER status. |
533 TEST_F(TouchEventQueueTest, NoConsumer) { | 542 TEST_F(TouchEventQueueTest, NoConsumer) { |
534 // The first touch-press should reach the renderer. | 543 // The first touch-press should reach the renderer. |
535 PressTouchPoint(1, 1); | 544 PressTouchPoint(1, 1); |
(...skipping 1571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2107 EXPECT_EQ(1U, GetAndResetSentEventCount()); | 2116 EXPECT_EQ(1U, GetAndResetSentEventCount()); |
2108 | 2117 |
2109 // Touch move event is throttled. | 2118 // Touch move event is throttled. |
2110 MoveTouchPoint(0, 60, 5); | 2119 MoveTouchPoint(0, 60, 5); |
2111 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); | 2120 SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED); |
2112 EXPECT_EQ(0U, queued_event_count()); | 2121 EXPECT_EQ(0U, queued_event_count()); |
2113 EXPECT_EQ(0U, GetAndResetSentEventCount()); | 2122 EXPECT_EQ(0U, GetAndResetSentEventCount()); |
2114 } | 2123 } |
2115 | 2124 |
2116 } // namespace content | 2125 } // namespace content |
OLD | NEW |