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

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

Issue 23856016: Send touch cancel to renderer when scrolling starts (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: rebase Created 7 years, 2 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
Index: content/browser/renderer_host/input/immediate_input_router_unittest.cc
diff --git a/content/browser/renderer_host/input/immediate_input_router_unittest.cc b/content/browser/renderer_host/input/immediate_input_router_unittest.cc
index 8a74565d7f499dcce0854b948f9b98edf19f01ea..b8d6981102172a86b4c4f83025b062465d1b292d 100644
--- a/content/browser/renderer_host/input/immediate_input_router_unittest.cc
+++ b/content/browser/renderer_host/input/immediate_input_router_unittest.cc
@@ -141,8 +141,8 @@ class ImmediateInputRouterTest : public InputRouterTest {
input_router()->enable_no_touch_to_renderer_while_scrolling_ = true;
}
- bool no_touch_move_to_renderer() {
- return input_router()->touch_event_queue()->no_touch_move_to_renderer();
+ bool no_touch_to_renderer() {
+ return input_router()->touch_event_queue()->no_touch_to_renderer();
}
bool TouchEventQueueEmpty() const {
@@ -1314,8 +1314,8 @@ TEST_F(ImmediateInputRouterTest, UnhandledWheelEvent) {
EXPECT_EQ(ack_handler_->acked_wheel_event().deltaY, -5);
}
-// Tests that no touch move events are sent to renderer during scrolling.
-TEST_F(ImmediateInputRouterTest, NoTouchMoveWhileScroll) {
+// Tests that no touch events are sent to renderer during scrolling.
+TEST_F(ImmediateInputRouterTest, NoTouchWhileScroll) {
EnableNoTouchToRendererWhileScrolling();
set_debounce_interval_time_ms(0);
input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true));
@@ -1328,22 +1328,64 @@ TEST_F(ImmediateInputRouterTest, NoTouchMoveWhileScroll) {
process_->sink().ClearMessages();
SendInputEventACK(WebInputEvent::TouchStart,
INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ ack_handler_->ExpectAckCalled(1);
// Touch move will trigger scroll.
MoveTouchPoint(0, 20, 5);
SendTouchEvent();
EXPECT_EQ(1U, process_->sink().message_count());
process_->sink().ClearMessages();
+
+ // A second touch press.
+ PressTouchPoint(20, 20);
+ SendTouchEvent();
+ // This TouchStart is queued.
+ EXPECT_EQ(0U, process_->sink().message_count());
+ process_->sink().ClearMessages();
+
+ WebGestureEvent followup_scroll;
+ followup_scroll.type = WebInputEvent::GestureScrollBegin;
+ ack_handler_->set_followup_touch_event(make_scoped_ptr(
+ new GestureEventWithLatencyInfo(followup_scroll, ui::LatencyInfo())));
+
SendInputEventACK(WebInputEvent::TouchMove,
INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ ack_handler_->ExpectAckCalled(1);
+ // GestureScroll inserts touch cancel into the queue before the touch start.
+ // ScrollBegin is sent first, then the TouchCancel.
+ EXPECT_EQ(2U, process_->sink().message_count());
+ const WebInputEvent* input_event =
+ GetInputEventFromMessage(*process_->sink().GetMessageAt(0));
+ EXPECT_EQ(WebInputEvent::GestureScrollBegin, input_event->type);
+ input_event = GetInputEventFromMessage(*process_->sink().GetMessageAt(1));
+ EXPECT_EQ(WebInputEvent::TouchCancel, input_event->type);
+ EXPECT_TRUE(no_touch_to_renderer());
+ process_->sink().ClearMessages();
- SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
- WebGestureEvent::Touchscreen);
- EXPECT_EQ(1U, process_->sink().message_count());
- EXPECT_TRUE(no_touch_move_to_renderer());
+ // Clear the followup events since now the touch events are directly
+ // sent to client, instead of being sent to renderer and waiting for
+ // ack. So we should use SimulateGestureScrollUpdateEvent() instead of
+ // followup gesture events.
+ ack_handler_->set_followup_touch_event(make_scoped_ptr(
+ static_cast<GestureEventWithLatencyInfo*>(NULL)));
+
+ // Ack the TouchCancel will result in the next TouchStart to be dispatched
+ // to client.
+ SendInputEventACK(WebInputEvent::TouchCancel,
+ INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ // The touch cancel does not reach client, only the touch start.
+ ack_handler_->ExpectAckCalled(1);
+ EXPECT_EQ(WebInputEvent::TouchStart,
+ ack_handler_->acked_touch_event().event.type);
+ // No touch to renderer.
+ EXPECT_EQ(0U, process_->sink().message_count());
process_->sink().ClearMessages();
+
SendInputEventACK(WebInputEvent::GestureScrollBegin,
INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+ ack_handler_->ExpectAckCalled(1);
+ EXPECT_EQ(0U, process_->sink().message_count());
+ process_->sink().ClearMessages();
// Touch move should not be sent to renderer.
MoveTouchPoint(0, 30, 5);
@@ -1353,30 +1395,21 @@ TEST_F(ImmediateInputRouterTest, NoTouchMoveWhileScroll) {
// Touch moves become ScrollUpdate.
SimulateGestureScrollUpdateEvent(20, 4, 0);
- EXPECT_TRUE(no_touch_move_to_renderer());
process_->sink().ClearMessages();
SendInputEventACK(WebInputEvent::GestureScrollUpdate,
INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
- // Touch move should not be sent to renderer.
- MoveTouchPoint(0, 65, 10);
- SendTouchEvent();
- EXPECT_EQ(0U, process_->sink().message_count());
- process_->sink().ClearMessages();
-
- // Touch end should still be sent to renderer.
+ // Touch end should not be sent to renderer.
ReleaseTouchPoint(0);
SendTouchEvent();
- EXPECT_EQ(1U, process_->sink().message_count());
+ EXPECT_EQ(0U, process_->sink().message_count());
process_->sink().ClearMessages();
- SendInputEventACK(WebInputEvent::TouchEnd,
- INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
// On GestureScrollEnd, resume sending touch moves to renderer.
SimulateGestureEvent(WebKit::WebInputEvent::GestureScrollEnd,
WebGestureEvent::Touchscreen);
EXPECT_EQ(1U, process_->sink().message_count());
- EXPECT_FALSE(no_touch_move_to_renderer());
+ EXPECT_FALSE(no_touch_to_renderer());
process_->sink().ClearMessages();
SendInputEventACK(WebInputEvent::GestureScrollEnd,
INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
« no previous file with comments | « content/browser/renderer_host/input/immediate_input_router.cc ('k') | content/browser/renderer_host/input/touch_event_queue.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698