| 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 2360461a037ce76e276d2c88137540fd77e6004f..7da1fc58670f5a68bff284de588e5ba55691bf2e 100644
|
| --- a/content/browser/renderer_host/input/touch_event_queue_unittest.cc
|
| +++ b/content/browser/renderer_host/input/touch_event_queue_unittest.cc
|
| @@ -1387,9 +1387,9 @@
|
| EXPECT_EQ(0U, GetAndResetAckedEventCount());
|
| }
|
|
|
| -// Tests that TouchMove's movedBeyondSlopRegion is set to false if within the
|
| -// boundary-inclusive slop region for an unconsumed TouchStart.
|
| -TEST_F(TouchEventQueueTest, TouchMovedBeyondSlopRegionCheck) {
|
| +// Tests that TouchMove's are dropped if within the boundary-inclusive slop
|
| +// suppression region for an unconsumed TouchStart.
|
| +TEST_F(TouchEventQueueTest, TouchMoveSuppressionIncludingSlopBoundary) {
|
| SetUpForTouchMoveSlopTesting(kSlopLengthDips);
|
|
|
| // Queue a TouchStart.
|
| @@ -1398,44 +1398,39 @@
|
| ASSERT_EQ(1U, GetAndResetSentEventCount());
|
| ASSERT_EQ(1U, GetAndResetAckedEventCount());
|
|
|
| - // TouchMove's movedBeyondSlopRegion within the slop region is set to false.
|
| + // TouchMove's within the region should be suppressed.
|
| MoveTouchPoint(0, 0, kHalfSlopLengthDips);
|
| - EXPECT_EQ(1U, queued_event_count());
|
| - SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| - EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| - EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| - EXPECT_FALSE(acked_event().movedBeyondSlopRegion);
|
| + EXPECT_EQ(0U, queued_event_count());
|
| + EXPECT_EQ(0U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| + EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
|
|
|
| MoveTouchPoint(0, kHalfSlopLengthDips, 0);
|
| - EXPECT_EQ(1U, queued_event_count());
|
| - SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| - EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| - EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| - EXPECT_FALSE(acked_event().movedBeyondSlopRegion);
|
| + EXPECT_EQ(0U, queued_event_count());
|
| + EXPECT_EQ(0U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| + EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
|
|
|
| MoveTouchPoint(0, -kHalfSlopLengthDips, 0);
|
| - EXPECT_EQ(1U, queued_event_count());
|
| - SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| - EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| - EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| - EXPECT_FALSE(acked_event().movedBeyondSlopRegion);
|
| + EXPECT_EQ(0U, queued_event_count());
|
| + EXPECT_EQ(0U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| + EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
|
|
|
| MoveTouchPoint(0, -kSlopLengthDips, 0);
|
| - EXPECT_EQ(1U, queued_event_count());
|
| - SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| - EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| - EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| - EXPECT_FALSE(acked_event().movedBeyondSlopRegion);
|
| + EXPECT_EQ(0U, queued_event_count());
|
| + EXPECT_EQ(0U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| + EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
|
|
|
| MoveTouchPoint(0, 0, kSlopLengthDips);
|
| - EXPECT_EQ(1U, queued_event_count());
|
| - SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| - EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| - EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| - EXPECT_FALSE(acked_event().movedBeyondSlopRegion);
|
| -
|
| - // When a TouchMove exceeds the (Euclidean) distance, the TouchMove's
|
| - // movedBeyondSlopRegion is set to true.
|
| + EXPECT_EQ(0U, queued_event_count());
|
| + EXPECT_EQ(0U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| + EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state());
|
| +
|
| + // As soon as a TouchMove exceeds the (Euclidean) distance, no more
|
| + // TouchMove's should be suppressed.
|
| const float kFortyFiveDegreeSlopLengthXY =
|
| kSlopLengthDips * std::sqrt(2.f) / 2;
|
| MoveTouchPoint(0, kFortyFiveDegreeSlopLengthXY + .2f,
|
| @@ -1445,26 +1440,113 @@
|
| EXPECT_EQ(0U, GetAndResetAckedEventCount());
|
| SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| - EXPECT_TRUE(acked_event().movedBeyondSlopRegion);
|
| -}
|
| -
|
| -// Tests that even very small TouchMove's movedBeyondSlopRegion is set to true
|
| -// when the slop region's dimension is 0.
|
| -TEST_F(TouchEventQueueTest, MovedBeyondSlopRegionAlwaysTrueIfDimensionZero) {
|
| +
|
| + // Even TouchMove's within the original slop region should now be forwarded.
|
| + MoveTouchPoint(0, 0, 0);
|
| + EXPECT_EQ(1U, queued_event_count());
|
| + EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(0U, GetAndResetAckedEventCount());
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| +
|
| + // A new touch sequence should reset suppression.
|
| + ReleaseTouchPoint(0);
|
| + PressTouchPoint(0, 0);
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| + ASSERT_EQ(2U, GetAndResetSentEventCount());
|
| + ASSERT_EQ(2U, GetAndResetAckedEventCount());
|
| + ASSERT_EQ(0U, queued_event_count());
|
| +
|
| + // The slop region is boundary-inclusive.
|
| + MoveTouchPoint(0, kSlopLengthDips - 1, 0);
|
| + EXPECT_EQ(0U, queued_event_count());
|
| + EXPECT_EQ(0U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| +
|
| + MoveTouchPoint(0, kSlopLengthDips, 0);
|
| + EXPECT_EQ(0U, queued_event_count());
|
| + EXPECT_EQ(0U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| +}
|
| +
|
| +// Tests that TouchMove's are not dropped within the slop suppression region if
|
| +// the touchstart was consumed.
|
| +TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionAfterTouchConsumed) {
|
| + SetUpForTouchMoveSlopTesting(kSlopLengthDips);
|
| +
|
| // Queue a TouchStart.
|
| PressTouchPoint(0, 0);
|
| - SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_CONSUMED);
|
| ASSERT_EQ(1U, GetAndResetSentEventCount());
|
| ASSERT_EQ(1U, GetAndResetAckedEventCount());
|
|
|
| - // Small TouchMove's movedBeyondSlopRegion is set to true.
|
| + // TouchMove's within the region should not be suppressed, as a touch was
|
| + // consumed.
|
| + MoveTouchPoint(0, 0, kHalfSlopLengthDips);
|
| + EXPECT_EQ(1U, queued_event_count());
|
| + EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(0U, GetAndResetAckedEventCount());
|
| +}
|
| +
|
| +// Tests that even very small TouchMove's are not suppressed when suppression is
|
| +// disabled.
|
| +TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionIfDisabled) {
|
| + // Queue a TouchStart.
|
| + PressTouchPoint(0, 0);
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| + ASSERT_EQ(1U, GetAndResetSentEventCount());
|
| + ASSERT_EQ(1U, GetAndResetAckedEventCount());
|
| +
|
| + // Small TouchMove's should not be suppressed.
|
| MoveTouchPoint(0, 0.001f, 0.001f);
|
| EXPECT_EQ(1U, queued_event_count());
|
| EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| EXPECT_EQ(0U, GetAndResetAckedEventCount());
|
| - SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| - EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| - EXPECT_TRUE(acked_event().movedBeyondSlopRegion);
|
| +}
|
| +
|
| +// Tests that TouchMove's are not dropped if a secondary pointer is present
|
| +// during any movement.
|
| +TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionAfterMultiTouch) {
|
| + SetUpForTouchMoveSlopTesting(kSlopLengthDips);
|
| +
|
| + // Queue a TouchStart.
|
| + PressTouchPoint(0, 0);
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| + ASSERT_EQ(1U, GetAndResetSentEventCount());
|
| + ASSERT_EQ(1U, GetAndResetAckedEventCount());
|
| +
|
| + // TouchMove's within the region should be suppressed.
|
| + MoveTouchPoint(0, 0, kHalfSlopLengthDips);
|
| + EXPECT_EQ(0U, queued_event_count());
|
| + EXPECT_EQ(0U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| +
|
| + // Simulate a secondary pointer press.
|
| + PressTouchPoint(kSlopLengthDips, 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, kSlopLengthDips+1, 0);
|
| + EXPECT_EQ(1U, queued_event_count());
|
| + EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| +
|
| + // Release the secondary pointer.
|
| + ReleaseTouchPoint(0);
|
| + SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| + EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(1U, GetAndResetAckedEventCount());
|
| +
|
| + // TouchMove's should not should be suppressed, even with the original
|
| + // unmoved pointer.
|
| + MoveTouchPoint(0, 0, 0);
|
| + EXPECT_EQ(1U, queued_event_count());
|
| + EXPECT_EQ(1U, GetAndResetSentEventCount());
|
| + EXPECT_EQ(0U, GetAndResetAckedEventCount());
|
| }
|
|
|
| // Tests that secondary touch points can be forwarded even if the primary touch
|
|
|