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 875b798546c9630d7aec244b9611e68fb6c17535..33a26ca01ccf8ac283893da26315b8889a8e77f7 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, |
// testing::Test |
virtual void SetUp() OVERRIDE { |
queue_.reset(new TouchEventQueue(this)); |
+ queue_->OnHasTouchEventHandlers(true); |
} |
virtual void TearDown() OVERRIDE { |
@@ -145,16 +146,14 @@ class TouchEventQueueTest : public testing::Test, |
return queue_->IsPendingAckTouchStart(); |
} |
- void Flush() { |
- queue_->FlushQueue(); |
- } |
- |
- void SetEnableTouchForwarding(bool enabled) { |
- queue_->no_touch_to_renderer_ = !enabled; |
+ void OnHasTouchEventHandlers(bool has_handlers) { |
+ queue_->OnHasTouchEventHandlers(has_handlers); |
} |
bool WillForwardTouchEvents() { |
- return !queue_->no_touch_to_renderer_ && !queue_->HasTimeoutEvent(); |
+ return queue_->has_handlers_ && |
+ !queue_->scroll_in_progress_ && |
+ !queue_->HasTimeoutEvent(); |
} |
bool IsTimeoutRunning() { |
@@ -181,14 +180,6 @@ class TouchEventQueueTest : public testing::Test, |
return last_acked_event_state_; |
} |
- void set_no_touch_to_renderer(bool no_touch) { |
- queue_->no_touch_to_renderer_ = no_touch; |
- } |
- |
- bool no_touch_to_renderer() const { |
- return queue_->no_touch_to_renderer_; |
- } |
- |
private: |
void SendTouchEvent() { |
SendTouchEvent(touch_event_); |
@@ -237,8 +228,8 @@ TEST_F(TouchEventQueueTest, Basic) { |
// Tests that the touch-queue is emptied if a page stops listening for touch |
// events. |
-TEST_F(TouchEventQueueTest, Flush) { |
- Flush(); |
+TEST_F(TouchEventQueueTest, QueueFlushedWhenHandlersRemoved) { |
+ OnHasTouchEventHandlers(true); |
EXPECT_EQ(0U, queued_event_count()); |
EXPECT_EQ(0U, GetAndResetSentEventCount()); |
@@ -267,12 +258,58 @@ TEST_F(TouchEventQueueTest, Flush) { |
// Flush the queue. The touch-event queue should now be emptied, but none of |
// the queued touch-events should be sent to the renderer. |
- Flush(); |
+ OnHasTouchEventHandlers(false); |
EXPECT_EQ(0U, queued_event_count()); |
EXPECT_EQ(0U, GetAndResetSentEventCount()); |
EXPECT_EQ(31U, GetAndResetAckedEventCount()); |
} |
+// Tests that removal of a touch handler during a touch sequence will prevent |
+// the remaining sequence from being forwarded, even if another touch handler is |
+// registered during the same touch sequence. |
+TEST_F(TouchEventQueueTest, ActiveSequenceDroppedWhenHandlersRemoved) { |
+ // Send a touch-press event. |
+ PressTouchPoint(1, 1); |
+ EXPECT_EQ(1U, GetAndResetSentEventCount()); |
+ EXPECT_EQ(1U, queued_event_count()); |
+ |
+ // Queue a touch-move event. |
+ MoveTouchPoint(0, 5, 5); |
+ EXPECT_EQ(2U, queued_event_count()); |
+ EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
+ EXPECT_EQ(0U, GetAndResetSentEventCount()); |
+ |
+ // Touch handle deregistration should flush the queue. |
+ OnHasTouchEventHandlers(false); |
+ EXPECT_EQ(2U, GetAndResetAckedEventCount()); |
+ EXPECT_EQ(0U, queued_event_count()); |
+ |
+ // The ack should be ignored as the touch queue is now empty. |
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS); |
+ EXPECT_EQ(0U, GetAndResetAckedEventCount()); |
+ EXPECT_EQ(0U, queued_event_count()); |
+ |
+ // Events should be dropped while there is no touch handler. |
+ MoveTouchPoint(0, 10, 10); |
+ EXPECT_EQ(0U, queued_event_count()); |
+ EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
+ EXPECT_EQ(0U, GetAndResetSentEventCount()); |
+ |
+ // Simulate touch handler registration in the middle of a touch sequence. |
+ OnHasTouchEventHandlers(true); |
+ |
+ // The touch end for the interrupted sequence should be dropped. |
+ ReleaseTouchPoint(0); |
+ EXPECT_EQ(0U, queued_event_count()); |
+ EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
+ EXPECT_EQ(0U, GetAndResetSentEventCount()); |
+ |
+ // A new touch sequence should be forwarded properly. |
+ PressTouchPoint(1, 1); |
+ EXPECT_EQ(1U, queued_event_count()); |
+ EXPECT_EQ(1U, GetAndResetSentEventCount()); |
+} |
+ |
// Tests that touch-events are coalesced properly in the queue. |
TEST_F(TouchEventQueueTest, Coalesce) { |
// Send a touch-press event. |
@@ -393,7 +430,7 @@ TEST_F(TouchEventQueueTest, AckAfterQueueFlushed) { |
EXPECT_EQ(1U, GetAndResetSentEventCount()); |
EXPECT_EQ(1U, queued_event_count()); |
- Flush(); |
+ OnHasTouchEventHandlers(false); |
EXPECT_EQ(0U, GetAndResetSentEventCount()); |
EXPECT_EQ(0U, queued_event_count()); |
@@ -685,7 +722,7 @@ TEST_F(TouchEventQueueTest, ImmediateAckWithFollowupEvents) { |
// Tests basic TouchEvent forwarding suppression. |
TEST_F(TouchEventQueueTest, NoTouchBasic) { |
// Disable TouchEvent forwarding. |
- SetEnableTouchForwarding(false); |
+ OnHasTouchEventHandlers(false); |
MoveTouchPoint(0, 30, 5); |
EXPECT_EQ(0U, GetAndResetSentEventCount()); |
EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
@@ -706,7 +743,7 @@ TEST_F(TouchEventQueueTest, NoTouchBasic) { |
EXPECT_EQ(1U, GetAndResetAckedEventCount()); |
// Enable TouchEvent forwarding. |
- SetEnableTouchForwarding(true); |
+ OnHasTouchEventHandlers(true); |
PressTouchPoint(80, 10); |
EXPECT_EQ(1U, GetAndResetSentEventCount()); |
@@ -977,6 +1014,19 @@ TEST_F(TouchEventQueueTest, NoTouchTimeoutIfAckIsSynchronous) { |
EXPECT_FALSE(IsTimeoutRunning()); |
} |
+// Tests that the timeout is disabled if the touch handler disappears. |
+TEST_F(TouchEventQueueTest, TouchTimeoutStoppedIfTouchHandlerRemoved) { |
+ SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs); |
+ |
+ // Queue a TouchStart. |
+ PressTouchPoint(0, 1); |
+ ASSERT_TRUE(IsTimeoutRunning()); |
+ |
+ // Unload the touch handler. |
+ OnHasTouchEventHandlers(false); |
+ EXPECT_FALSE(IsTimeoutRunning()); |
+} |
+ |
// Tests that a TouchCancel timeout plays nice when the timed out touch stream |
// turns into a scroll gesture sequence. |
TEST_F(TouchEventQueueTest, TouchTimeoutWithFollowupGesture) { |