Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(976)

Unified Diff: content/browser/renderer_host/input/touch_event_queue_unittest.cc

Issue 48973005: Move TouchEvent timeout code to the TouchEventQueue (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 3780ae8dd5995778b8c767aefb816db95f7d0d77..875b798546c9630d7aec244b9611e68fb6c17535 100644
--- a/content/browser/renderer_host/input/touch_event_queue_unittest.cc
+++ b/content/browser/renderer_host/input/touch_event_queue_unittest.cc
@@ -5,6 +5,8 @@
#include "base/basictypes.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
+#include "base/message_loop/message_loop.h"
+#include "content/browser/renderer_host/input/timeout_monitor.h"
#include "content/browser/renderer_host/input/touch_event_queue.h"
#include "content/common/input/synthetic_web_input_event_builders.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -16,6 +18,9 @@ using blink::WebTouchEvent;
using blink::WebTouchPoint;
namespace content {
+namespace {
+const size_t kDefaultTouchTimeoutDelayMs = 10;
+}
class TouchEventQueueTest : public testing::Test,
public TouchEventQueueClient {
@@ -67,13 +72,12 @@ class TouchEventQueueTest : public testing::Test,
protected:
- void SendTouchEvent(const WebTouchEvent& event) {
- queue_->QueueEvent(TouchEventWithLatencyInfo(event, ui::LatencyInfo()));
+ void SetUpForTimeoutTesting(size_t timeout_delay_ms) {
+ queue_->SetAckTimeoutEnabled(true, timeout_delay_ms);
}
- void SendTouchEvent() {
- SendTouchEvent(touch_event_);
- touch_event_.ResetPoints();
+ void SendTouchEvent(const WebTouchEvent& event) {
+ queue_->QueueEvent(TouchEventWithLatencyInfo(event, ui::LatencyInfo()));
}
void SendGestureEvent(WebInputEvent::Type type) {
@@ -99,20 +103,30 @@ class TouchEventQueueTest : public testing::Test,
sync_ack_result_.reset(new InputEventAckState(sync_ack_result));
}
- int PressTouchPoint(int x, int y) {
- return touch_event_.PressPoint(x, y);
+ void PressTouchPoint(int x, int y) {
+ touch_event_.PressPoint(x, y);
+ SendTouchEvent();
}
void MoveTouchPoint(int index, int x, int y) {
touch_event_.MovePoint(index, x, y);
+ SendTouchEvent();
+ }
+
+ void MoveTouchPoints(int index0, int x0, int y0, int index1, int x1, int y1) {
+ touch_event_.MovePoint(index0, x0, y0);
+ touch_event_.MovePoint(index1, x1, y1);
+ SendTouchEvent();
}
void ReleaseTouchPoint(int index) {
touch_event_.ReleasePoint(index);
+ SendTouchEvent();
}
void CancelTouchPoint(int index) {
touch_event_.CancelPoint(index);
+ SendTouchEvent();
}
size_t GetAndResetAckedEventCount() {
@@ -135,12 +149,24 @@ class TouchEventQueueTest : public testing::Test,
queue_->FlushQueue();
}
+ void SetEnableTouchForwarding(bool enabled) {
+ queue_->no_touch_to_renderer_ = !enabled;
+ }
+
+ bool WillForwardTouchEvents() {
+ return !queue_->no_touch_to_renderer_ && !queue_->HasTimeoutEvent();
+ }
+
+ bool IsTimeoutRunning() {
+ return queue_->IsTimeoutRunningForTesting();
+ }
+
size_t queued_event_count() const {
- return queue_->GetQueueSize();
+ return queue_->size();
}
const WebTouchEvent& latest_event() const {
- return queue_->GetLatestEvent().event;
+ return queue_->GetLatestEventForTesting().event;
}
const WebTouchEvent& acked_event() const {
@@ -164,6 +190,11 @@ class TouchEventQueueTest : public testing::Test,
}
private:
+ void SendTouchEvent() {
+ SendTouchEvent(touch_event_);
+ touch_event_.ResetPoints();
+ }
+
scoped_ptr<TouchEventQueue> queue_;
size_t sent_event_count_;
size_t acked_event_count_;
@@ -174,19 +205,18 @@ class TouchEventQueueTest : public testing::Test,
scoped_ptr<WebTouchEvent> followup_touch_event_;
scoped_ptr<WebGestureEvent> followup_gesture_event_;
scoped_ptr<InputEventAckState> sync_ack_result_;
+ base::MessageLoopForUI message_loop_;
};
// Tests that touch-events are queued properly.
TEST_F(TouchEventQueueTest, Basic) {
PressTouchPoint(1, 1);
- SendTouchEvent();
EXPECT_EQ(1U, queued_event_count());
EXPECT_EQ(1U, GetAndResetSentEventCount());
// The second touch should not be sent since one is already in queue.
MoveTouchPoint(0, 5, 5);
- SendTouchEvent();
EXPECT_EQ(2U, queued_event_count());
EXPECT_EQ(0U, GetAndResetSentEventCount());
@@ -214,20 +244,15 @@ TEST_F(TouchEventQueueTest, Flush) {
// Send a touch-press event.
PressTouchPoint(1, 1);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
ReleaseTouchPoint(0);
- SendTouchEvent();
// Events will be queued until the first sent event is ack'ed.
for (int i = 5; i < 15; ++i) {
PressTouchPoint(1, 1);
- SendTouchEvent();
MoveTouchPoint(0, i, i);
- SendTouchEvent();
ReleaseTouchPoint(0);
- SendTouchEvent();
}
EXPECT_EQ(32U, queued_event_count());
EXPECT_EQ(0U, GetAndResetSentEventCount());
@@ -252,18 +277,15 @@ TEST_F(TouchEventQueueTest, Flush) {
TEST_F(TouchEventQueueTest, Coalesce) {
// Send a touch-press event.
PressTouchPoint(1, 1);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
// Send a few touch-move events, followed by a touch-release event. All the
// touch-move events should be coalesced into a single event.
- for (int i = 5; i < 15; ++i) {
+ for (int i = 5; i < 15; ++i)
MoveTouchPoint(0, i, i);
- SendTouchEvent();
- }
+
EXPECT_EQ(0U, GetAndResetSentEventCount());
ReleaseTouchPoint(0);
- SendTouchEvent();
EXPECT_EQ(0U, GetAndResetSentEventCount());
EXPECT_EQ(3U, queued_event_count());
@@ -295,15 +317,13 @@ TEST_F(TouchEventQueueTest, Coalesce) {
TEST_F(TouchEventQueueTest, SentTouchEventDoesNotCoalesce) {
// Send a touch-press event.
PressTouchPoint(1, 1);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
// Send a few touch-move events, followed by a touch-release event. All the
// touch-move events should be coalesced into a single event.
- for (int i = 5; i < 15; ++i) {
+ for (int i = 5; i < 15; ++i)
MoveTouchPoint(0, i, i);
- SendTouchEvent();
- }
+
EXPECT_EQ(0U, GetAndResetSentEventCount());
EXPECT_EQ(2U, queued_event_count());
@@ -314,11 +334,9 @@ TEST_F(TouchEventQueueTest, SentTouchEventDoesNotCoalesce) {
// The coalesced touch-move event has been sent to the renderer. Any new
// touch-move event should not be coalesced with the sent event.
MoveTouchPoint(0, 5, 5);
- SendTouchEvent();
EXPECT_EQ(2U, queued_event_count());
MoveTouchPoint(0, 7, 7);
- SendTouchEvent();
EXPECT_EQ(2U, queued_event_count());
}
@@ -326,33 +344,27 @@ TEST_F(TouchEventQueueTest, SentTouchEventDoesNotCoalesce) {
TEST_F(TouchEventQueueTest, MultiTouch) {
// Press the first finger.
PressTouchPoint(1, 1);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
// Move the finger.
MoveTouchPoint(0, 5, 5);
- SendTouchEvent();
EXPECT_EQ(2U, queued_event_count());
// Now press a second finger.
PressTouchPoint(2, 2);
- SendTouchEvent();
EXPECT_EQ(3U, queued_event_count());
// Move both fingers.
- MoveTouchPoint(0, 10, 10);
+ MoveTouchPoints(0, 10, 10, 1, 20, 20);
MoveTouchPoint(1, 20, 20);
- SendTouchEvent();
EXPECT_EQ(4U, queued_event_count());
// Move only one finger now.
MoveTouchPoint(0, 15, 15);
- SendTouchEvent();
EXPECT_EQ(4U, queued_event_count());
// Move the other finger.
MoveTouchPoint(1, 25, 25);
- SendTouchEvent();
EXPECT_EQ(4U, queued_event_count());
// Make sure both fingers are marked as having been moved in the coalesced
@@ -368,12 +380,10 @@ TEST_F(TouchEventQueueTest, MultiTouch) {
TEST_F(TouchEventQueueTest, AckAfterQueueFlushed) {
// Send some touch-events to the renderer.
PressTouchPoint(1, 1);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
EXPECT_EQ(1U, queued_event_count());
MoveTouchPoint(0, 10, 10);
- SendTouchEvent();
EXPECT_EQ(0U, GetAndResetSentEventCount());
EXPECT_EQ(2U, queued_event_count());
@@ -401,12 +411,10 @@ TEST_F(TouchEventQueueTest, AckAfterQueueFlushed) {
TEST_F(TouchEventQueueTest, NoConsumer) {
// The first touch-press should reach the renderer.
PressTouchPoint(1, 1);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
// The second touch should not be sent since one is already in queue.
MoveTouchPoint(0, 5, 5);
- SendTouchEvent();
EXPECT_EQ(0U, GetAndResetSentEventCount());
EXPECT_EQ(2U, queued_event_count());
@@ -420,7 +428,6 @@ TEST_F(TouchEventQueueTest, NoConsumer) {
// Send a release event. This should not reach the renderer.
ReleaseTouchPoint(0);
- SendTouchEvent();
EXPECT_EQ(0U, GetAndResetSentEventCount());
EXPECT_EQ(WebInputEvent::TouchEnd, acked_event().type);
EXPECT_EQ(1U, GetAndResetAckedEventCount());
@@ -430,18 +437,13 @@ TEST_F(TouchEventQueueTest, NoConsumer) {
// events should be queued first. After the NO_CONSUMER ack for the first
// touch-press, all events upto the second touch-press should be flushed.
PressTouchPoint(10, 10);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
MoveTouchPoint(0, 5, 5);
- SendTouchEvent();
MoveTouchPoint(0, 6, 5);
- SendTouchEvent();
ReleaseTouchPoint(0);
- SendTouchEvent();
PressTouchPoint(6, 5);
- SendTouchEvent();
EXPECT_EQ(0U, GetAndResetSentEventCount());
// The queue should hold the first sent touch-press event, the coalesced
// touch-move event, the touch-end event and the second touch-press event.
@@ -463,7 +465,6 @@ TEST_F(TouchEventQueueTest, NoConsumer) {
// Send a second press event. Even though the first touch had NO_CONSUMER,
// this press event should reach the renderer.
PressTouchPoint(1, 1);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
EXPECT_EQ(1U, queued_event_count());
}
@@ -474,24 +475,17 @@ TEST_F(TouchEventQueueTest, ConsumerIgnoreMultiFinger) {
// the second touch point.
PressTouchPoint(1, 1);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
MoveTouchPoint(0, 5, 5);
- SendTouchEvent();
PressTouchPoint(10, 10);
- SendTouchEvent();
MoveTouchPoint(0, 2, 2);
- SendTouchEvent();
MoveTouchPoint(1, 4, 10);
- SendTouchEvent();
- MoveTouchPoint(0, 10, 10);
- MoveTouchPoint(1, 20, 20);
- SendTouchEvent();
+ MoveTouchPoints(0, 10, 10, 1, 20, 20);
// Since the first touch-press is still pending ACK, no other event should
// have been sent to the renderer.
@@ -527,22 +521,18 @@ TEST_F(TouchEventQueueTest, ConsumerIgnoreMultiFinger) {
// Move just the second touch point. Because the first touch point did not
// move, this event should not reach the renderer.
MoveTouchPoint(1, 30, 30);
- SendTouchEvent();
EXPECT_EQ(0U, GetAndResetSentEventCount());
EXPECT_EQ(0U, queued_event_count());
// Move just the first touch point. This should reach the renderer.
MoveTouchPoint(0, 10, 10);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
EXPECT_EQ(1U, queued_event_count());
// Move both fingers. This event should reach the renderer (after the ACK of
// the previous move event is received), because the first touch point did
// move.
- MoveTouchPoint(0, 15, 15);
- MoveTouchPoint(1, 25, 25);
- SendTouchEvent();
+ MoveTouchPoints(0, 15, 15, 1, 25, 25);
EXPECT_EQ(0U, GetAndResetSentEventCount());
SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
@@ -558,21 +548,16 @@ TEST_F(TouchEventQueueTest, ConsumerIgnoreMultiFinger) {
// the second finger should be immediately released to the view, and the
// touch-press event should be dispatched to the renderer.
ReleaseTouchPoint(0);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
EXPECT_EQ(1U, queued_event_count());
MoveTouchPoint(1, 40, 40);
- SendTouchEvent();
MoveTouchPoint(1, 50, 50);
- SendTouchEvent();
PressTouchPoint(1, 1);
- SendTouchEvent();
MoveTouchPoint(1, 30, 30);
- SendTouchEvent();
EXPECT_EQ(0U, GetAndResetSentEventCount());
EXPECT_EQ(4U, queued_event_count());
@@ -598,7 +583,6 @@ TEST_F(TouchEventQueueTest, ConsumerIgnoreMultiFinger) {
TEST_F(TouchEventQueueTest, AckWithFollowupEvents) {
// Queue a touch down.
PressTouchPoint(1, 1);
- SendTouchEvent();
EXPECT_EQ(1U, queued_event_count());
EXPECT_EQ(1U, GetAndResetSentEventCount());
EXPECT_EQ(0U, GetAndResetAckedEventCount());
@@ -622,9 +606,7 @@ TEST_F(TouchEventQueueTest, AckWithFollowupEvents) {
EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
// Queue another event.
- PressTouchPoint(1, 1);
MoveTouchPoint(0, 2, 2);
- SendTouchEvent();
EXPECT_EQ(2U, queued_event_count());
// Receive an ACK for the touch-move followup event. This should cause the
@@ -640,41 +622,33 @@ TEST_F(TouchEventQueueTest, SynchronousAcks) {
// TouchStart
SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
PressTouchPoint(1, 1);
- SendTouchEvent();
EXPECT_EQ(0U, queued_event_count());
EXPECT_EQ(1U, GetAndResetSentEventCount());
EXPECT_EQ(1U, GetAndResetAckedEventCount());
// TouchMove
SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
- PressTouchPoint(1, 1);
MoveTouchPoint(0, 2, 2);
- SendTouchEvent();
EXPECT_EQ(0U, queued_event_count());
EXPECT_EQ(1U, GetAndResetSentEventCount());
EXPECT_EQ(1U, GetAndResetAckedEventCount());
// TouchEnd
SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
- PressTouchPoint(1, 1);
ReleaseTouchPoint(0);
- SendTouchEvent();
EXPECT_EQ(0U, queued_event_count());
EXPECT_EQ(1U, GetAndResetSentEventCount());
EXPECT_EQ(1U, GetAndResetAckedEventCount());
// TouchCancel (first inserting a TouchStart so the TouchCancel will be sent)
PressTouchPoint(1, 1);
- SendTouchEvent();
SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
EXPECT_EQ(0U, queued_event_count());
EXPECT_EQ(1U, GetAndResetSentEventCount());
EXPECT_EQ(1U, GetAndResetAckedEventCount());
SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
- PressTouchPoint(1, 1);
CancelTouchPoint(0);
- SendTouchEvent();
EXPECT_EQ(0U, queued_event_count());
EXPECT_EQ(1U, GetAndResetSentEventCount());
EXPECT_EQ(1U, GetAndResetAckedEventCount());
@@ -711,47 +685,40 @@ TEST_F(TouchEventQueueTest, ImmediateAckWithFollowupEvents) {
// Tests basic TouchEvent forwarding suppression.
TEST_F(TouchEventQueueTest, NoTouchBasic) {
// Disable TouchEvent forwarding.
- set_no_touch_to_renderer(true);
+ SetEnableTouchForwarding(false);
MoveTouchPoint(0, 30, 5);
- SendTouchEvent();
EXPECT_EQ(0U, GetAndResetSentEventCount());
EXPECT_EQ(1U, GetAndResetAckedEventCount());
// TouchMove should not be sent to renderer.
MoveTouchPoint(0, 65, 10);
- SendTouchEvent();
EXPECT_EQ(0U, GetAndResetSentEventCount());
EXPECT_EQ(1U, GetAndResetAckedEventCount());
// TouchEnd should not be sent to renderer.
ReleaseTouchPoint(0);
- SendTouchEvent();
EXPECT_EQ(0U, GetAndResetSentEventCount());
EXPECT_EQ(1U, GetAndResetAckedEventCount());
// TouchStart should not be sent to renderer.
PressTouchPoint(5, 5);
- SendTouchEvent();
EXPECT_EQ(0U, GetAndResetSentEventCount());
EXPECT_EQ(1U, GetAndResetAckedEventCount());
// Enable TouchEvent forwarding.
- set_no_touch_to_renderer(false);
+ SetEnableTouchForwarding(true);
PressTouchPoint(80, 10);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
EXPECT_EQ(1U, GetAndResetAckedEventCount());
MoveTouchPoint(0, 80, 20);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
EXPECT_EQ(1U, GetAndResetAckedEventCount());
ReleaseTouchPoint(0);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
EXPECT_EQ(1U, GetAndResetAckedEventCount());
@@ -761,19 +728,16 @@ TEST_F(TouchEventQueueTest, NoTouchBasic) {
TEST_F(TouchEventQueueTest, NoTouchOnScroll) {
// Queue a TouchStart.
PressTouchPoint(0, 1);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
EXPECT_EQ(1U, GetAndResetAckedEventCount());
MoveTouchPoint(0, 20, 5);
- SendTouchEvent();
EXPECT_EQ(1U, queued_event_count());
EXPECT_EQ(1U, GetAndResetSentEventCount());
// Queue another TouchStart.
PressTouchPoint(20, 20);
- SendTouchEvent();
EXPECT_EQ(2U, queued_event_count());
EXPECT_EQ(0U, GetAndResetSentEventCount());
EXPECT_EQ(WebInputEvent::TouchStart, latest_event().type);
@@ -782,9 +746,9 @@ TEST_F(TouchEventQueueTest, NoTouchOnScroll) {
WebGestureEvent followup_scroll;
followup_scroll.type = WebInputEvent::GestureScrollBegin;
SetFollowupEvent(followup_scroll);
- ASSERT_FALSE(no_touch_to_renderer());
+ ASSERT_TRUE(WillForwardTouchEvents());
SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
- EXPECT_TRUE(no_touch_to_renderer());
+ EXPECT_FALSE(WillForwardTouchEvents());
EXPECT_EQ(1U, GetAndResetSentEventCount());
EXPECT_EQ(1U, GetAndResetAckedEventCount());
EXPECT_EQ(2U, queued_event_count());
@@ -798,43 +762,38 @@ TEST_F(TouchEventQueueTest, NoTouchOnScroll) {
EXPECT_EQ(0U, GetAndResetSentEventCount());
EXPECT_EQ(WebInputEvent::TouchStart, acked_event().type);
- // TouchMove should not be sent to renderer.
+ // TouchMove should not be sent to the renderer.
MoveTouchPoint(0, 30, 5);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetAckedEventCount());
EXPECT_EQ(0U, GetAndResetSentEventCount());
EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
// GestureScrollUpdates should not change affect touch forwarding.
SendGestureEvent(WebInputEvent::GestureScrollUpdate);
- EXPECT_TRUE(no_touch_to_renderer());
+ EXPECT_FALSE(WillForwardTouchEvents());
- // TouchEnd should not be sent to renderer.
+ // TouchEnd should not be sent to the renderer.
ReleaseTouchPoint(0);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetAckedEventCount());
EXPECT_EQ(0U, GetAndResetSentEventCount());
EXPECT_EQ(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS, acked_event_state());
// GestureScrollEnd will resume the sending of TouchEvents to renderer.
SendGestureEvent(blink::WebInputEvent::GestureScrollEnd);
- EXPECT_FALSE(no_touch_to_renderer());
+ EXPECT_TRUE(WillForwardTouchEvents());
// Now TouchEvents should be forwarded normally.
PressTouchPoint(80, 10);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
EXPECT_EQ(1U, GetAndResetAckedEventCount());
MoveTouchPoint(0, 80, 20);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
EXPECT_EQ(1U, GetAndResetAckedEventCount());
ReleaseTouchPoint(0);
- SendTouchEvent();
EXPECT_EQ(1U, GetAndResetSentEventCount());
SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
EXPECT_EQ(1U, GetAndResetAckedEventCount());
@@ -847,13 +806,11 @@ TEST_F(TouchEventQueueTest, PendingStart) {
// Send the touchstart for one point (#1).
PressTouchPoint(1, 1);
- SendTouchEvent();
EXPECT_EQ(1U, queued_event_count());
EXPECT_TRUE(IsPendingAckTouchStart());
// Send a touchmove for that point (#2).
MoveTouchPoint(0, 5, 5);
- SendTouchEvent();
EXPECT_EQ(2U, queued_event_count());
EXPECT_TRUE(IsPendingAckTouchStart());
@@ -864,7 +821,6 @@ TEST_F(TouchEventQueueTest, PendingStart) {
// Send a touchstart for another point (#3).
PressTouchPoint(10, 10);
- SendTouchEvent();
EXPECT_EQ(2U, queued_event_count());
EXPECT_FALSE(IsPendingAckTouchStart());
@@ -875,7 +831,6 @@ TEST_F(TouchEventQueueTest, PendingStart) {
// Send a touchstart for a third point (#4).
PressTouchPoint(15, 15);
- SendTouchEvent();
EXPECT_EQ(2U, queued_event_count());
EXPECT_TRUE(IsPendingAckTouchStart());
@@ -890,4 +845,304 @@ TEST_F(TouchEventQueueTest, PendingStart) {
EXPECT_FALSE(IsPendingAckTouchStart());
}
+// Tests that the touch timeout is started when sending certain touch types.
+TEST_F(TouchEventQueueTest, TouchTimeoutTypes) {
+ SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
+
+ // Sending a TouchStart will start the timeout.
+ PressTouchPoint(0, 1);
+ EXPECT_TRUE(IsTimeoutRunning());
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ EXPECT_FALSE(IsTimeoutRunning());
+
+ // A TouchMove should start the timeout.
+ MoveTouchPoint(0, 5, 5);
+ EXPECT_TRUE(IsTimeoutRunning());
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ EXPECT_FALSE(IsTimeoutRunning());
+
+ // A TouchEnd should not start the timeout.
+ ReleaseTouchPoint(0);
+ EXPECT_FALSE(IsTimeoutRunning());
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ EXPECT_FALSE(IsTimeoutRunning());
+
+ // A TouchCancel should not start the timeout.
+ PressTouchPoint(0, 1);
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ ASSERT_FALSE(IsTimeoutRunning());
+ CancelTouchPoint(0);
+ EXPECT_FALSE(IsTimeoutRunning());
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ EXPECT_FALSE(IsTimeoutRunning());
+}
+
+// Tests that a delayed TouchEvent ack will trigger a TouchCancel timeout,
+// disabling touch forwarding until the next TouchStart is received after
+// the timeout events are ack'ed.
+TEST_F(TouchEventQueueTest, TouchTimeoutBasic) {
+ SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
+
+ // Queue a TouchStart.
+ GetAndResetSentEventCount();
+ GetAndResetAckedEventCount();
+ PressTouchPoint(0, 1);
+ ASSERT_EQ(1U, GetAndResetSentEventCount());
+ ASSERT_EQ(0U, GetAndResetAckedEventCount());
+ EXPECT_TRUE(IsTimeoutRunning());
+ EXPECT_TRUE(WillForwardTouchEvents());
+
+ // Delay the ack.
+ base::MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ base::MessageLoop::QuitClosure(),
+ base::TimeDelta::FromMilliseconds(kDefaultTouchTimeoutDelayMs * 2));
+ base::MessageLoop::current()->Run();
+
+ // The timeout should have fired, synthetically ack'ing the timed-out event.
+ // TouchEvent forwarding is disabled until the ack is received for the
+ // timed-out event and the future cancel event.
+ EXPECT_FALSE(IsTimeoutRunning());
+ EXPECT_FALSE(WillForwardTouchEvents());
+ EXPECT_EQ(0U, GetAndResetSentEventCount());
+ EXPECT_EQ(1U, GetAndResetAckedEventCount());
+
+ // Ack'ing the original event should trigger a cancel event.
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ EXPECT_FALSE(IsTimeoutRunning());
+ EXPECT_FALSE(WillForwardTouchEvents());
+ EXPECT_EQ(0U, GetAndResetAckedEventCount());
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+
+ // Touch events should not be forwarded until we receive the cancel acks.
+ PressTouchPoint(0, 1);
+ ASSERT_EQ(0U, GetAndResetSentEventCount());
+ ASSERT_EQ(1U, GetAndResetAckedEventCount());
+
+ // The synthetic TouchCancel ack should not reach the client, but should
+ // resume touch forwarding.
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ EXPECT_EQ(0U, GetAndResetSentEventCount());
+ EXPECT_EQ(0U, GetAndResetAckedEventCount());
+ EXPECT_TRUE(WillForwardTouchEvents());
+
+ // Subsequent events should be handled normally.
+ PressTouchPoint(0, 1);
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+ EXPECT_EQ(0U, GetAndResetAckedEventCount());
+}
+
+// Tests that the timeout is never started if the renderer consumes
+// a TouchEvent from the current touch sequence.
+TEST_F(TouchEventQueueTest, NoTouchTimeoutIfRendererIsConsumingGesture) {
+ SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
+
+ // Queue a TouchStart.
+ PressTouchPoint(0, 1);
+ ASSERT_TRUE(IsTimeoutRunning());
+
+ // Mark the event as consumed. This should prevent the timeout from
+ // being activated on subsequent TouchEvents in this gesture.
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
+ EXPECT_FALSE(IsTimeoutRunning());
+
+ // A TouchMove should not start the timeout.
+ MoveTouchPoint(0, 5, 5);
+ EXPECT_FALSE(IsTimeoutRunning());
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+
+ // A secondary TouchStart should not start the timeout.
+ PressTouchPoint(1, 0);
+ EXPECT_FALSE(IsTimeoutRunning());
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+
+ // A TouchEnd should not start the timeout.
+ ReleaseTouchPoint(1);
+ EXPECT_FALSE(IsTimeoutRunning());
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+
+ // A TouchCancel should not start the timeout.
+ CancelTouchPoint(0);
+ EXPECT_FALSE(IsTimeoutRunning());
+}
+
+// Tests that the timeout is never started if the ack is synchronous.
+TEST_F(TouchEventQueueTest, NoTouchTimeoutIfAckIsSynchronous) {
+ SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
+
+ // Queue a TouchStart.
+ SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
+ ASSERT_FALSE(IsTimeoutRunning());
+ PressTouchPoint(0, 1);
+ 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) {
+ SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
+
+ // Queue a TouchStart.
+ PressTouchPoint(0, 1);
+ EXPECT_TRUE(IsTimeoutRunning());
+ EXPECT_TRUE(WillForwardTouchEvents());
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+
+ // The cancelled sequence may turn into a scroll gesture.
+ WebGestureEvent followup_scroll;
+ followup_scroll.type = WebInputEvent::GestureScrollBegin;
+ SetFollowupEvent(followup_scroll);
+
+ // Delay the ack.
+ base::MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ base::MessageLoop::QuitClosure(),
+ base::TimeDelta::FromMilliseconds(kDefaultTouchTimeoutDelayMs * 2));
+ base::MessageLoop::current()->Run();
+
+ // The timeout should have fired, disabling touch forwarding until both acks
+ // are received, acking the timed out event.
+ EXPECT_FALSE(IsTimeoutRunning());
+ EXPECT_FALSE(WillForwardTouchEvents());
+ EXPECT_EQ(0U, GetAndResetSentEventCount());
+ EXPECT_EQ(1U, GetAndResetAckedEventCount());
+
+ // Ack the original event, triggering a TouchCancel.
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
+ EXPECT_FALSE(IsTimeoutRunning());
+ EXPECT_FALSE(WillForwardTouchEvents());
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+ EXPECT_EQ(0U, GetAndResetAckedEventCount());
+
+ // Ack the cancel event. Normally, this would resume touch forwarding,
+ // but we're still within a scroll gesture so it remains disabled.
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
+ EXPECT_FALSE(IsTimeoutRunning());
+ EXPECT_FALSE(WillForwardTouchEvents());
+ EXPECT_EQ(0U, GetAndResetSentEventCount());
+ EXPECT_EQ(0U, GetAndResetAckedEventCount());
+
+ // Try to forward a touch event.
+ GetAndResetSentEventCount();
+ GetAndResetAckedEventCount();
+ PressTouchPoint(0, 1);
+ EXPECT_FALSE(IsTimeoutRunning());
+ EXPECT_EQ(0U, GetAndResetSentEventCount());
+ EXPECT_EQ(1U, GetAndResetAckedEventCount());
+
+ // Now end the scroll sequence, resuming touch handling.
+ SendGestureEvent(blink::WebInputEvent::GestureScrollEnd);
+ EXPECT_TRUE(WillForwardTouchEvents());
+ PressTouchPoint(0, 1);
+ EXPECT_TRUE(IsTimeoutRunning());
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+ EXPECT_EQ(0U, GetAndResetAckedEventCount());
+}
+
+// Tests that a TouchCancel timeout plays nice when the timed out touch stream
+// turns into a scroll gesture sequence, but the original event acks are
+// significantly delayed.
+TEST_F(TouchEventQueueTest, TouchTimeoutWithFollowupGestureAndDelayedAck) {
+ SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
+
+ // Queue a TouchStart.
+ PressTouchPoint(0, 1);
+ EXPECT_TRUE(IsTimeoutRunning());
+ EXPECT_TRUE(WillForwardTouchEvents());
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+
+ // The cancelled sequence may turn into a scroll gesture.
+ WebGestureEvent followup_scroll;
+ followup_scroll.type = WebInputEvent::GestureScrollBegin;
+ SetFollowupEvent(followup_scroll);
+
+ // Delay the ack.
+ base::MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ base::MessageLoop::QuitClosure(),
+ base::TimeDelta::FromMilliseconds(kDefaultTouchTimeoutDelayMs * 2));
+ base::MessageLoop::current()->Run();
+
+ // The timeout should have fired, disabling touch forwarding until both acks
+ // are received and acking the timed out event.
+ EXPECT_FALSE(IsTimeoutRunning());
+ EXPECT_FALSE(WillForwardTouchEvents());
+ EXPECT_EQ(0U, GetAndResetSentEventCount());
+ EXPECT_EQ(1U, GetAndResetAckedEventCount());
+
+ // Try to forward a touch event.
+ GetAndResetSentEventCount();
+ GetAndResetAckedEventCount();
+ PressTouchPoint(0, 1);
+ EXPECT_FALSE(IsTimeoutRunning());
+ EXPECT_EQ(0U, GetAndResetSentEventCount());
+ EXPECT_EQ(1U, GetAndResetAckedEventCount());
+
+ // Now end the scroll sequence. Events will not be forwarded until the two
+ // outstanding touch acks are received.
+ SendGestureEvent(blink::WebInputEvent::GestureScrollEnd);
+ PressTouchPoint(0, 1);
+ EXPECT_FALSE(IsTimeoutRunning());
+ EXPECT_EQ(0U, GetAndResetSentEventCount());
+ EXPECT_EQ(1U, GetAndResetAckedEventCount());
+
+ // Ack the original event, triggering a cancel.
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+ EXPECT_EQ(0U, GetAndResetAckedEventCount());
+
+ // Ack the cancel event, resuming touch forwarding.
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_CONSUMED);
+ EXPECT_EQ(0U, GetAndResetSentEventCount());
+ EXPECT_EQ(0U, GetAndResetAckedEventCount());
+
+ PressTouchPoint(0, 1);
+ EXPECT_TRUE(IsTimeoutRunning());
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+}
+
+// Tests that a delayed TouchEvent ack will not trigger a TouchCancel timeout if
+// the timed-out event had no consumer.
+TEST_F(TouchEventQueueTest, NoCancelOnTouchTimeoutWithoutConsumer) {
+ SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
+
+ // Queue a TouchStart.
+ PressTouchPoint(0, 1);
+ ASSERT_EQ(1U, GetAndResetSentEventCount());
+ ASSERT_EQ(0U, GetAndResetAckedEventCount());
+ EXPECT_TRUE(IsTimeoutRunning());
+ EXPECT_TRUE(WillForwardTouchEvents());
+
+ // Delay the ack.
+ base::MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ base::MessageLoop::QuitClosure(),
+ base::TimeDelta::FromMilliseconds(kDefaultTouchTimeoutDelayMs * 2));
+ base::MessageLoop::current()->Run();
+
+ // The timeout should have fired, synthetically ack'ing the timed out event.
+ // TouchEvent forwarding is disabled until the original ack is received.
+ EXPECT_FALSE(IsTimeoutRunning());
+ EXPECT_FALSE(WillForwardTouchEvents());
+ EXPECT_EQ(0U, GetAndResetSentEventCount());
+ EXPECT_EQ(1U, GetAndResetAckedEventCount());
+
+ // Touch events should not be forwarded until we receive the original ack.
+ PressTouchPoint(0, 1);
+ ASSERT_EQ(0U, GetAndResetSentEventCount());
+ ASSERT_EQ(1U, GetAndResetAckedEventCount());
+
+ // Ack'ing the original event should not trigger a cancel event, as the
+ // TouchStart had no consumer. However, it should re-enable touch forwarding.
+ SendTouchEventACK(INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS);
+ EXPECT_FALSE(IsTimeoutRunning());
+ EXPECT_TRUE(WillForwardTouchEvents());
+ EXPECT_EQ(0U, GetAndResetAckedEventCount());
+ EXPECT_EQ(0U, GetAndResetSentEventCount());
+
+ // Subsequent events should be handled normally.
+ PressTouchPoint(0, 1);
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+ EXPECT_EQ(0U, GetAndResetAckedEventCount());
+}
} // namespace content
« no previous file with comments | « content/browser/renderer_host/input/touch_event_queue.cc ('k') | content/browser/renderer_host/render_widget_host_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698