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 6c23e984ac8f5d1320218038075b7227e0bf68b0..06a3a9f40f3e1113a1341b17228683afe45f76b6 100644 |
--- a/content/browser/renderer_host/input/touch_event_queue_unittest.cc |
+++ b/content/browser/renderer_host/input/touch_event_queue_unittest.cc |
@@ -35,6 +35,7 @@ class TouchEventQueueTest : public testing::Test, |
acked_event_count_(0), |
last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN), |
slop_length_dips_(0), |
+ slop_includes_boundary_(true), |
touch_scrolling_mode_(TouchEventQueue::TOUCH_SCROLLING_MODE_DEFAULT) {} |
virtual ~TouchEventQueueTest() {} |
@@ -80,6 +81,8 @@ class TouchEventQueueTest : public testing::Test, |
TouchEventQueue::Config config; |
config.touch_scrolling_mode = touch_scrolling_mode_; |
config.touchmove_slop_suppression_length_dips = slop_length_dips_; |
+ config.touchmove_slop_suppression_region_includes_boundary = |
+ slop_includes_boundary_; |
return config; |
} |
@@ -88,8 +91,10 @@ class TouchEventQueueTest : public testing::Test, |
ResetQueueWithConfig(CreateConfig()); |
} |
- void SetUpForTouchMoveSlopTesting(double slop_length_dips) { |
+ void SetUpForTouchMoveSlopTesting(double slop_length_dips, |
+ bool slop_includes_boundary) { |
slop_length_dips_ = slop_length_dips; |
+ slop_includes_boundary_ = slop_includes_boundary; |
ResetQueueWithConfig(CreateConfig()); |
} |
@@ -248,6 +253,7 @@ class TouchEventQueueTest : public testing::Test, |
scoped_ptr<WebGestureEvent> followup_gesture_event_; |
scoped_ptr<InputEventAckState> sync_ack_result_; |
double slop_length_dips_; |
+ bool slop_includes_boundary_; |
TouchEventQueue::TouchScrollingMode touch_scrolling_mode_; |
base::MessageLoopForUI message_loop_; |
}; |
@@ -1347,12 +1353,13 @@ TEST_F(TouchEventQueueTest, NoCancelOnTouchTimeoutWithoutConsumer) { |
EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
} |
-// Tests that TouchMove's are dropped if within the slop suppression region |
-// for an unconsumed TouchStart |
-TEST_F(TouchEventQueueTest, TouchMoveSuppressionWithinSlopRegion) { |
+// Tests that TouchMove's are dropped if within the boundary-inclusive slop |
+// suppression region for an unconsumed TouchStart. |
+TEST_F(TouchEventQueueTest, TouchMoveSuppressionIncludingSlopBoundary) { |
const double kSlopLengthDips = 10.; |
const double kHalfSlopLengthDips = kSlopLengthDips / 2; |
- SetUpForTouchMoveSlopTesting(kSlopLengthDips); |
+ const bool slop_includes_boundary = true; |
+ SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary); |
// Queue a TouchStart. |
PressTouchPoint(0, 0); |
@@ -1379,6 +1386,18 @@ TEST_F(TouchEventQueueTest, TouchMoveSuppressionWithinSlopRegion) { |
EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state()); |
+ MoveTouchPoint(0, -kSlopLengthDips, 0); |
+ 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(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 double kFortyFiveDegreeSlopLengthXY = |
@@ -1420,12 +1439,57 @@ TEST_F(TouchEventQueueTest, TouchMoveSuppressionWithinSlopRegion) { |
EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
} |
+// Tests that TouchMove's are dropped if within the boundary-exclusive slop |
+// suppression region for an unconsumed TouchStart. |
+TEST_F(TouchEventQueueTest, TouchMoveSuppressionExcludingSlopBoundary) { |
+ const double kSlopLengthDips = 10.; |
+ const double kHalfSlopLengthDips = kSlopLengthDips / 2; |
+ const bool slop_includes_boundary = false; |
+ SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary); |
+ |
+ // 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()); |
+ EXPECT_EQ(INPUT_EVENT_ACK_STATE_NOT_CONSUMED, acked_event_state()); |
+ |
+ MoveTouchPoint(0, kSlopLengthDips - 0.2f, 0); |
+ 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 reaches the (Euclidean) slop distance, no more |
+ // TouchMove's should be suppressed. |
+ MoveTouchPoint(0, kSlopLengthDips, 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()); |
+ |
+ MoveTouchPoint(0, kHalfSlopLengthDips, 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()); |
+} |
+ |
// Tests that TouchMove's are not dropped within the slop suppression region if |
// the touchstart was consumed. |
TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionAfterTouchConsumed) { |
const double kSlopLengthDips = 10.; |
const double kHalfSlopLengthDips = kSlopLengthDips / 2; |
- SetUpForTouchMoveSlopTesting(kSlopLengthDips); |
+ const bool slop_includes_boundary = true; |
+ SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary); |
// Queue a TouchStart. |
PressTouchPoint(0, 0); |
@@ -1446,7 +1510,9 @@ TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionAfterTouchConsumed) { |
TEST_F(TouchEventQueueTest, TouchMoveSuppressionWithDIPScaling) { |
const float kSlopLengthPixels = 7.f; |
const float kDPIScale = 3.f; |
- SetUpForTouchMoveSlopTesting(kSlopLengthPixels / kDPIScale); |
+ const bool slop_includes_boundary = true; |
+ SetUpForTouchMoveSlopTesting(kSlopLengthPixels / kDPIScale, |
+ slop_includes_boundary); |
// Queue a TouchStart. |
PressTouchPoint(0, 0); |
@@ -1486,7 +1552,8 @@ TEST_F(TouchEventQueueTest, TouchMoveSuppressionWithDIPScaling) { |
TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionAfterMultiTouch) { |
const double kSlopLengthDips = 10.; |
const double kHalfSlopLengthDips = kSlopLengthDips / 2; |
- SetUpForTouchMoveSlopTesting(kSlopLengthDips); |
+ const bool slop_includes_boundary = true; |
+ SetUpForTouchMoveSlopTesting(kSlopLengthDips, slop_includes_boundary); |
// Queue a TouchStart. |
PressTouchPoint(0, 0); |
@@ -1833,8 +1900,14 @@ TEST_F(TouchEventQueueTest, AsyncTouchWithAckTimeout) { |
PressTouchPoint(0, 0); |
EXPECT_EQ(1U, GetAndResetSentEventCount()); |
EXPECT_TRUE(IsTimeoutRunning()); |
+ SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
+ EXPECT_FALSE(IsTimeoutRunning()); |
// The start of a scroll gesture should trigger async touch event dispatch. |
+ MoveTouchPoint(0, 1, 1); |
+ EXPECT_EQ(1U, GetAndResetSentEventCount()); |
+ EXPECT_TRUE(IsTimeoutRunning()); |
WebGestureEvent followup_scroll; |
followup_scroll.type = WebInputEvent::GestureScrollBegin; |
SetFollowupEvent(followup_scroll); |
@@ -1907,8 +1980,12 @@ TEST_F(TouchEventQueueTest, AsyncTouchWithTouchCancelAfterAck) { |
PressTouchPoint(0, 0); |
EXPECT_EQ(1U, GetAndResetSentEventCount()); |
+ SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
// The start of a scroll gesture should trigger async touch event dispatch. |
+ MoveTouchPoint(0, 1, 1); |
+ EXPECT_EQ(1U, GetAndResetSentEventCount()); |
WebGestureEvent followup_scroll; |
followup_scroll.type = WebInputEvent::GestureScrollBegin; |
SetFollowupEvent(followup_scroll); |