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 006e79de12a9c8bf01a6da468ba19f652d06b232..91bcbf1feaa8b1bfa6964289b5ff3052eb1c327a 100644 |
--- a/content/browser/renderer_host/input/touch_event_queue_unittest.cc |
+++ b/content/browser/renderer_host/input/touch_event_queue_unittest.cc |
@@ -28,14 +28,20 @@ class TouchEventQueueTest : public testing::Test, |
TouchEventQueueTest() |
: sent_event_count_(0), |
acked_event_count_(0), |
- last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN) {} |
+ last_acked_event_state_(INPUT_EVENT_ACK_STATE_UNKNOWN), |
+ slop_length_dips_(0), |
+ touch_scrolling_mode_(TouchEventQueue::TOUCH_SCROLLING_MODE_DEFAULT) {} |
virtual ~TouchEventQueueTest() {} |
// testing::Test |
virtual void SetUp() OVERRIDE { |
- queue_.reset(new TouchEventQueue(this, 0)); |
- queue_->OnHasTouchEventHandlers(true); |
+ ResetQueueWithParameters(touch_scrolling_mode_, slop_length_dips_); |
+ } |
+ |
+ virtual void SetTouchScrollingMode(TouchEventQueue::TouchScrollingMode mode) { |
+ touch_scrolling_mode_ = mode; |
+ ResetQueueWithParameters(touch_scrolling_mode_, slop_length_dips_); |
} |
virtual void TearDown() OVERRIDE { |
@@ -78,8 +84,8 @@ class TouchEventQueueTest : public testing::Test, |
} |
void SetUpForTouchMoveSlopTesting(double slop_length_dips) { |
- queue_.reset(new TouchEventQueue(this, slop_length_dips)); |
- queue_->OnHasTouchEventHandlers(true); |
+ slop_length_dips_ = slop_length_dips; |
+ ResetQueueWithParameters(touch_scrolling_mode_, slop_length_dips_); |
} |
void SendTouchEvent(const WebTouchEvent& event) { |
@@ -102,6 +108,7 @@ class TouchEventQueueTest : public testing::Test, |
blink::WebGestureEvent gesture_event; |
gesture_event.type = type; |
GestureEventWithLatencyInfo event(gesture_event, ui::LatencyInfo()); |
+ queue_->OnGestureEventAck(event, ack_result); |
} |
void SetFollowupEvent(const WebTouchEvent& event) { |
@@ -192,6 +199,12 @@ class TouchEventQueueTest : public testing::Test, |
touch_event_.ResetPoints(); |
} |
+ void ResetQueueWithParameters(TouchEventQueue::TouchScrollingMode mode, |
+ double slop_length_dips) { |
+ queue_.reset(new TouchEventQueue(this, mode, slop_length_dips)); |
+ queue_->OnHasTouchEventHandlers(true); |
+ } |
+ |
scoped_ptr<TouchEventQueue> queue_; |
size_t sent_event_count_; |
size_t acked_event_count_; |
@@ -202,6 +215,8 @@ class TouchEventQueueTest : public testing::Test, |
scoped_ptr<WebTouchEvent> followup_touch_event_; |
scoped_ptr<WebGestureEvent> followup_gesture_event_; |
scoped_ptr<InputEventAckState> sync_ack_result_; |
+ double slop_length_dips_; |
+ TouchEventQueue::TouchScrollingMode touch_scrolling_mode_; |
base::MessageLoopForUI message_loop_; |
}; |
@@ -1401,4 +1416,55 @@ TEST_F(TouchEventQueueTest, NoTouchMoveSuppressionAfterMultiTouch) { |
EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
} |
+TEST_F(TouchEventQueueTest, SyncTouchMoveDoesntCancelTouchOnScroll) { |
+ SetTouchScrollingMode(TouchEventQueue::TOUCH_SCROLLING_MODE_SYNC_TOUCHMOVE); |
+ // Queue a TouchStart. |
+ PressTouchPoint(0, 1); |
+ EXPECT_EQ(1U, GetAndResetSentEventCount()); |
+ SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
+ |
+ MoveTouchPoint(0, 20, 5); |
+ EXPECT_EQ(1U, queued_event_count()); |
+ EXPECT_EQ(1U, GetAndResetSentEventCount()); |
+ |
+ // GestureScrollBegin doesn't insert a synthetic TouchCancel. |
+ WebGestureEvent followup_scroll; |
+ followup_scroll.type = WebInputEvent::GestureScrollBegin; |
+ SetFollowupEvent(followup_scroll); |
+ SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(0U, GetAndResetSentEventCount()); |
+ EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
+ EXPECT_EQ(0U, queued_event_count()); |
+} |
+ |
+TEST_F(TouchEventQueueTest, TouchAbsorption) { |
+ SetTouchScrollingMode( |
+ TouchEventQueue::TOUCH_SCROLLING_MODE_ABSORB_TOUCHMOVE); |
+ // Queue a TouchStart. |
+ PressTouchPoint(0, 1); |
+ EXPECT_EQ(1U, GetAndResetSentEventCount()); |
+ SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
+ |
+ for (int i = 0; i < 3; ++i) { |
+ SendGestureEventAck(WebInputEvent::GestureScrollUpdate, |
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ |
+ MoveTouchPoint(0, 20, 5); |
+ SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(0U, queued_event_count()); |
+ EXPECT_EQ(1U, GetAndResetSentEventCount()); |
+ |
+ // Consuming a scroll event prevents the next touch moves from being |
+ // dispatched. |
+ SendGestureEventAck(WebInputEvent::GestureScrollUpdate, |
+ INPUT_EVENT_ACK_STATE_CONSUMED); |
+ MoveTouchPoint(0, 20, 5); |
+ SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
+ EXPECT_EQ(0U, queued_event_count()); |
+ EXPECT_EQ(0U, GetAndResetSentEventCount()); |
+ } |
+} |
+ |
} // namespace content |