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

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

Issue 188833004: [Android] Properly disable the touch ack timeout during a touch sequence (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@input_log_verbose
Patch Set: Timeout tweaks Created 6 years, 9 months 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
« no previous file with comments | « content/browser/renderer_host/input/touch_event_queue.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 330d6cdf8e0c96441856131ab8e782f965536f32..60a0dc5c3e4ceac586e3c1e6109159dc12a0cdf5 100644
--- a/content/browser/renderer_host/input/touch_event_queue_unittest.cc
+++ b/content/browser/renderer_host/input/touch_event_queue_unittest.cc
@@ -19,8 +19,10 @@ using blink::WebTouchPoint;
namespace content {
namespace {
-const size_t kDefaultTouchTimeoutDelayMs = 10;
+base::TimeDelta DefaultTouchTimeoutDelay() {
+ return base::TimeDelta::FromMilliseconds(1);
}
+} // namespace
class TouchEventQueueTest : public testing::Test,
public TouchEventQueueClient {
@@ -79,8 +81,8 @@ class TouchEventQueueTest : public testing::Test,
protected:
- void SetUpForTimeoutTesting(size_t timeout_delay_ms) {
- queue_->SetAckTimeoutEnabled(true, timeout_delay_ms);
+ void SetUpForTimeoutTesting(base::TimeDelta timeout_delay) {
+ queue_->SetAckTimeoutEnabled(true, timeout_delay);
}
void SetUpForTouchMoveSlopTesting(double slop_length_dips) {
@@ -169,6 +171,14 @@ class TouchEventQueueTest : public testing::Test,
queue_->OnHasTouchEventHandlers(has_handlers);
}
+ void SetAckTimeoutDisabled() {
+ queue_->SetAckTimeoutEnabled(false, base::TimeDelta());
+ }
+
+ bool IsTimeoutEnabled() {
+ return queue_->ack_timeout_enabled();
+ }
+
bool IsTimeoutRunning() {
return queue_->IsTimeoutRunningForTesting();
}
@@ -193,6 +203,12 @@ class TouchEventQueueTest : public testing::Test,
return last_acked_event_state_;
}
+ static void RunTasksAndWait(base::TimeDelta delay) {
+ base::MessageLoop::current()->PostDelayedTask(
+ FROM_HERE, base::MessageLoop::QuitClosure(), delay);
+ base::MessageLoop::current()->Run();
+ }
+
private:
void SendTouchEvent() {
SendTouchEvent(touch_event_);
@@ -970,7 +986,7 @@ TEST_F(TouchEventQueueTest, PendingStart) {
// Tests that the touch timeout is started when sending certain touch types.
TEST_F(TouchEventQueueTest, TouchTimeoutTypes) {
- SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
+ SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
// Sending a TouchStart will start the timeout.
PressTouchPoint(0, 1);
@@ -1004,7 +1020,7 @@ TEST_F(TouchEventQueueTest, TouchTimeoutTypes) {
// disabling touch forwarding until the next TouchStart is received after
// the timeout events are ack'ed.
TEST_F(TouchEventQueueTest, TouchTimeoutBasic) {
- SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
+ SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
// Queue a TouchStart.
GetAndResetSentEventCount();
@@ -1015,11 +1031,7 @@ TEST_F(TouchEventQueueTest, TouchTimeoutBasic) {
EXPECT_TRUE(IsTimeoutRunning());
// Delay the ack.
- base::MessageLoop::current()->PostDelayedTask(
- FROM_HERE,
- base::MessageLoop::QuitClosure(),
- base::TimeDelta::FromMilliseconds(kDefaultTouchTimeoutDelayMs * 2));
- base::MessageLoop::current()->Run();
+ RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
// The timeout should have fired, synthetically ack'ing the timed-out event.
// TouchEvent forwarding is disabled until the ack is received for the
@@ -1058,7 +1070,7 @@ TEST_F(TouchEventQueueTest, TouchTimeoutBasic) {
// Tests that the timeout is never started if the renderer consumes
// a TouchEvent from the current touch sequence.
TEST_F(TouchEventQueueTest, NoTouchTimeoutIfRendererIsConsumingGesture) {
- SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
+ SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
// Queue a TouchStart.
PressTouchPoint(0, 1);
@@ -1089,9 +1101,38 @@ TEST_F(TouchEventQueueTest, NoTouchTimeoutIfRendererIsConsumingGesture) {
EXPECT_FALSE(IsTimeoutRunning());
}
+// Tests that the timeout is never started if the renderer consumes
+// a TouchEvent from the current touch sequence.
+TEST_F(TouchEventQueueTest, NoTouchTimeoutIfDisabledAfterTouchStart) {
+ SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
+
+ // Queue a TouchStart.
+ PressTouchPoint(0, 1);
+ ASSERT_TRUE(IsTimeoutRunning());
+
+ // Send the ack immediately. The timeout should not have fired.
+ SendTouchEventAck(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ EXPECT_FALSE(IsTimeoutRunning());
+ EXPECT_TRUE(IsTimeoutEnabled());
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+ EXPECT_EQ(1U, GetAndResetAckedEventCount());
+
+ // Now explicitly disable the timeout.
+ SetAckTimeoutDisabled();
+ EXPECT_FALSE(IsTimeoutRunning());
+ EXPECT_FALSE(IsTimeoutEnabled());
+
+ // A TouchMove should not start or trigger the timeout.
+ MoveTouchPoint(0, 5, 5);
+ EXPECT_FALSE(IsTimeoutRunning());
+ EXPECT_EQ(1U, GetAndResetSentEventCount());
+ RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
+ EXPECT_EQ(0U, GetAndResetAckedEventCount());
+}
+
// Tests that the timeout is never started if the ack is synchronous.
TEST_F(TouchEventQueueTest, NoTouchTimeoutIfAckIsSynchronous) {
- SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
+ SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
// Queue a TouchStart.
SetSyncAckResult(INPUT_EVENT_ACK_STATE_CONSUMED);
@@ -1101,8 +1142,8 @@ TEST_F(TouchEventQueueTest, NoTouchTimeoutIfAckIsSynchronous) {
}
// Tests that the timeout is disabled if the touch handler disappears.
-TEST_F(TouchEventQueueTest, TouchTimeoutStoppedIfTouchHandlerRemoved) {
- SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
+TEST_F(TouchEventQueueTest, NoTouchTimeoutIfTouchHandlerRemoved) {
+ SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
// Queue a TouchStart.
PressTouchPoint(0, 1);
@@ -1113,10 +1154,26 @@ TEST_F(TouchEventQueueTest, TouchTimeoutStoppedIfTouchHandlerRemoved) {
EXPECT_FALSE(IsTimeoutRunning());
}
+// Tests that the timeout does not fire if explicitly disabled while an event
+// is in-flight.
+TEST_F(TouchEventQueueTest, NoTouchTimeoutIfDisabledWhileTimerIsActive) {
+ SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
+
+ // Queue a TouchStart.
+ PressTouchPoint(0, 1);
+ ASSERT_TRUE(IsTimeoutRunning());
+
+ // Verify that disabling the timeout also turns off the timer.
+ SetAckTimeoutDisabled();
+ EXPECT_FALSE(IsTimeoutRunning());
+ RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
+ EXPECT_EQ(0U, GetAndResetAckedEventCount());
+}
+
// 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);
+ SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
// Queue a TouchStart.
PressTouchPoint(0, 1);
@@ -1129,11 +1186,7 @@ TEST_F(TouchEventQueueTest, TouchTimeoutWithFollowupGesture) {
SetFollowupEvent(followup_scroll);
// Delay the ack.
- base::MessageLoop::current()->PostDelayedTask(
- FROM_HERE,
- base::MessageLoop::QuitClosure(),
- base::TimeDelta::FromMilliseconds(kDefaultTouchTimeoutDelayMs * 2));
- base::MessageLoop::current()->Run();
+ RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
// The timeout should have fired, disabling touch forwarding until both acks
// are received, acking the timed out event.
@@ -1175,7 +1228,7 @@ TEST_F(TouchEventQueueTest, TouchTimeoutWithFollowupGesture) {
// turns into a scroll gesture sequence, but the original event acks are
// significantly delayed.
TEST_F(TouchEventQueueTest, TouchTimeoutWithFollowupGestureAndDelayedAck) {
- SetUpForTimeoutTesting(kDefaultTouchTimeoutDelayMs);
+ SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
// Queue a TouchStart.
PressTouchPoint(0, 1);
@@ -1188,11 +1241,7 @@ TEST_F(TouchEventQueueTest, TouchTimeoutWithFollowupGestureAndDelayedAck) {
SetFollowupEvent(followup_scroll);
// Delay the ack.
- base::MessageLoop::current()->PostDelayedTask(
- FROM_HERE,
- base::MessageLoop::QuitClosure(),
- base::TimeDelta::FromMilliseconds(kDefaultTouchTimeoutDelayMs * 2));
- base::MessageLoop::current()->Run();
+ RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
// The timeout should have fired, disabling touch forwarding until both acks
// are received and acking the timed out event.
@@ -1235,7 +1284,7 @@ TEST_F(TouchEventQueueTest, TouchTimeoutWithFollowupGestureAndDelayedAck) {
// 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);
+ SetUpForTimeoutTesting(DefaultTouchTimeoutDelay());
// Queue a TouchStart.
PressTouchPoint(0, 1);
@@ -1244,11 +1293,7 @@ TEST_F(TouchEventQueueTest, NoCancelOnTouchTimeoutWithoutConsumer) {
EXPECT_TRUE(IsTimeoutRunning());
// Delay the ack.
- base::MessageLoop::current()->PostDelayedTask(
- FROM_HERE,
- base::MessageLoop::QuitClosure(),
- base::TimeDelta::FromMilliseconds(kDefaultTouchTimeoutDelayMs * 2));
- base::MessageLoop::current()->Run();
+ RunTasksAndWait(DefaultTouchTimeoutDelay() * 2);
// The timeout should have fired, synthetically ack'ing the timed out event.
// TouchEvent forwarding is disabled until the original ack is received.
« no previous file with comments | « content/browser/renderer_host/input/touch_event_queue.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698