| Index: content/browser/renderer_host/input/touch_event_queue_unittest.cc
|
| diff --git a/content/browser/renderer_host/input/touch_event_queue_unittest.cc b/content/browser/renderer_host/input/touch_event_queue_unittest.cc
|
| index 8c6d68fc90804f28633ec97bea9df4a8dcf540ca..779cf25f34c77321ed0e118788515377fabeb187 100644
|
| --- a/content/browser/renderer_host/input/touch_event_queue_unittest.cc
|
| +++ b/content/browser/renderer_host/input/touch_event_queue_unittest.cc
|
| @@ -576,13 +576,14 @@ TEST_F(TouchEventQueueTest, NoConsumer) {
|
| EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| EXPECT_EQ(0U, queued_event_count());
|
|
|
| - // Send a second press event. As the first touch press had NO_CONSUMER, this
|
| - // press event should not reach the renderer.
|
| + // Send a second press event. Even though the first touch press had
|
| + // NO_CONSUMER, this press event should reach the renderer.
|
| PressTouchPoint(1, 1);
|
| - EXPECT_EQ(0U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, queued_event_count());
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
|
| EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
|
| EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| - EXPECT_EQ(0U, queued_event_count());
|
| }
|
|
|
| TEST_F(TouchEventQueueTest, ConsumerIgnoreMultiFinger) {
|
| @@ -1522,6 +1523,65 @@ TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionAfterMultiTouch) {
|
| EXPECT_EQ(0U, GetAndResetAckedEventCount());
|
| }
|
|
|
| +// Tests that secondary touch points can be forwarded even if the primary touch
|
| +// point had no consumer.
|
| +TEST_F(TouchEventQueueTest, SecondaryTouchForwardedAfterPrimaryHadNoConsumer) {
|
| + // Queue a TouchStart.
|
| + PressTouchPoint(0, 0);
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
|
| + ASSERT_EQ(1U, GetAndResetSentEventCount());
|
| + ASSERT_EQ(1U, GetAndResetAckedEventCount());
|
| +
|
| + // Events should not be forwarded, as the point had no consumer.
|
| + MoveTouchPoint(0, 0, 15);
|
| + EXPECT_EQ(0U, queued_event_count());
|
| + EXPECT_EQ(0U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| +
|
| + // Simulate a secondary pointer press.
|
| + PressTouchPoint(20, 0);
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| + EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| +
|
| + // TouchMove with a secondary pointer should not be suppressed.
|
| + MoveTouchPoint(1, 25, 0);
|
| + EXPECT_EQ(1U, queued_event_count());
|
| + EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| +}
|
| +
|
| +// Tests that no touch points will be forwarded after scrolling begins while no
|
| +// touch points have a consumer.
|
| +TEST_F(TouchEventQueueTest, NoForwardingAfterScrollWithNoTouchConsumers) {
|
| + // Queue a TouchStart.
|
| + PressTouchPoint(0, 0);
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
|
| + ASSERT_EQ(1U, GetAndResetSentEventCount());
|
| + ASSERT_EQ(1U, GetAndResetAckedEventCount());
|
| +
|
| + WebGestureEvent followup_scroll;
|
| + followup_scroll.type = WebInputEvent::GestureScrollBegin;
|
| + SetFollowupEvent(followup_scroll);
|
| + MoveTouchPoint(0, 20, 5);
|
| + EXPECT_EQ(0U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| + EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
|
| +
|
| + // The secondary pointer press should not be forwarded.
|
| + PressTouchPoint(20, 0);
|
| + EXPECT_EQ(0U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| + EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
|
| +
|
| + // Neither should any further touchmoves be forwarded.
|
| + MoveTouchPoint(1, 25, 0);
|
| + EXPECT_EQ(0U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| + EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
|
| +}
|
| +
|
| TEST_F(TouchEventQueueTest, SyncTouchMoveDoesntCancelTouchOnScroll) {
|
| SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_SYNC_TOUCHMOVE);
|
| // Queue a TouchStart.
|
| @@ -1770,7 +1830,7 @@ TEST_F(TouchEventQueueTest, AsyncTouchWithAckTimeout) {
|
| EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| EXPECT_TRUE(IsTimeoutRunning());
|
|
|
| - // The start of a scroll gesture should triger async touch event dispatch.
|
| + // The start of a scroll gesture should trigger async touch event dispatch.
|
| WebGestureEvent followup_scroll;
|
| followup_scroll.type = WebInputEvent::GestureScrollBegin;
|
| SetFollowupEvent(followup_scroll);
|
| @@ -1836,4 +1896,53 @@ TEST_F(TouchEventQueueTest, AsyncTouchWithAckTimeout) {
|
| EXPECT_EQ(0U, GetAndResetSentEventCount());
|
| }
|
|
|
| +// Ensure that if the touch ack for an async touchmove triggers a follow-up
|
| +// touch event, that follow-up touch will be forwarded appropriately.
|
| +TEST_F(TouchEventQueueTest, AsyncTouchWithTouchCancelAfterAck) {
|
| + SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_ASYNC_TOUCHMOVE);
|
| +
|
| + PressTouchPoint(0, 0);
|
| + EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| +
|
| + // The start of a scroll gesture should trigger async touch event dispatch.
|
| + WebGestureEvent followup_scroll;
|
| + followup_scroll.type = WebInputEvent::GestureScrollBegin;
|
| + SetFollowupEvent(followup_scroll);
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| + EXPECT_EQ(0U, queued_event_count());
|
| +
|
| + // The async touchmove should be ack'ed immediately, but not forwarded.
|
| + // However, because the ack triggers a touchcancel, both the pending touch and
|
| + // the queued touchcancel should be flushed.
|
| + WebTouchEvent followup_cancel;
|
| + followup_cancel.type = WebInputEvent::TouchCancel;
|
| + followup_cancel.touchesLength = 1;
|
| + followup_cancel.touches[0].state = WebTouchPoint::StateCancelled;
|
| + SetFollowupEvent(followup_cancel);
|
| + MoveTouchPoint(0, 5, 5);
|
| + EXPECT_EQ(2U, queued_event_count());
|
| + EXPECT_FALSE(sent_event().cancelable);
|
| + EXPECT_FALSE(HasPendingAsyncTouchMove());
|
| + EXPECT_EQ(WebInputEvent::TouchMove, acked_event().type);
|
| + EXPECT_EQ(WebInputEvent::TouchMove, sent_event().type);
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| + EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| +
|
| + // The ack for the asnc touchmove should not reach the client, as it has
|
| + // already been ack'ed.
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| + EXPECT_FALSE(sent_event().cancelable);
|
| + EXPECT_EQ(1U, queued_event_count());
|
| + EXPECT_EQ(WebInputEvent::TouchCancel, sent_event().type);
|
| + EXPECT_EQ(0U, GetAndResetAckedEventCount());
|
| + EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| +
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| + EXPECT_EQ(0U, queued_event_count());
|
| + EXPECT_EQ(WebInputEvent::TouchCancel, acked_event().type);
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| + EXPECT_EQ(0U, GetAndResetSentEventCount());
|
| +}
|
| +
|
| } // namespace content
|
|
|