| 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) {
|
|
|