| 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 7807c59544880cfb67fdcf1217187d52ae43582d..9502c5cd45c6a5dc4cc5997bb781c20d6295d313 100644
|
| --- a/content/browser/renderer_host/input/immediate_input_router_unittest.cc
|
| +++ b/content/browser/renderer_host/input/immediate_input_router_unittest.cc
|
| @@ -547,6 +547,14 @@ class ImmediateInputRouterTest : public testing::Test {
|
| return touch_event_queue()->GetLatestEvent().event;
|
| }
|
|
|
| + void EnableNoTouchToRendererWhileScrolling() {
|
| + input_router_->enable_no_touch_to_renderer_while_scrolling_ = true;
|
| + }
|
| +
|
| + bool no_touch_move_to_renderer() {
|
| + return touch_event_queue()->no_touch_move_to_renderer_;
|
| + }
|
| +
|
| TouchEventQueue* touch_event_queue() const {
|
| return input_router_->touch_event_queue();
|
| }
|
| @@ -2164,4 +2172,95 @@ TEST_F(ImmediateInputRouterTest, UnhandledWheelEvent) {
|
| EXPECT_EQ(client_->acked_wheel_event().deltaY, -5);
|
| }
|
|
|
| +// Tests that no touch move events are sent to renderer during scrolling.
|
| +TEST_F(ImmediateInputRouterTest, NoTouchMoveWhileScroll) {
|
| + EnableNoTouchToRendererWhileScrolling();
|
| + set_debounce_interval_time_ms(0);
|
| + input_router_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true));
|
| + process_->sink().ClearMessages();
|
| +
|
| + // First touch press.
|
| + PressTouchPoint(0, 1);
|
| + SendTouchEvent();
|
| + EXPECT_EQ(1U, process_->sink().message_count());
|
| + process_->sink().ClearMessages();
|
| + SendInputEventACK(WebInputEvent::TouchStart,
|
| + INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| +
|
| + // Touch move will trigger scroll.
|
| + MoveTouchPoint(0, 20, 5);
|
| + SendTouchEvent();
|
| + EXPECT_EQ(1U, process_->sink().message_count());
|
| + process_->sink().ClearMessages();
|
| + SendInputEventACK(WebInputEvent::TouchMove,
|
| + INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| +
|
| + SimulateGestureEvent(WebInputEvent::GestureScrollBegin,
|
| + WebGestureEvent::Touchscreen);
|
| + EXPECT_EQ(1U, process_->sink().message_count());
|
| + EXPECT_FALSE(no_touch_move_to_renderer());
|
| + process_->sink().ClearMessages();
|
| + SendInputEventACK(WebInputEvent::GestureScrollBegin,
|
| + INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| +
|
| + // Touch event keeps coming.
|
| + MoveTouchPoint(0, 30, 5);
|
| + SendTouchEvent();
|
| + EXPECT_EQ(1U, process_->sink().message_count());
|
| + process_->sink().ClearMessages();
|
| + SendInputEventACK(WebInputEvent::TouchMove,
|
| + INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| +
|
| + // On GestureScrollUpdate, stop sending touch move to renderer.
|
| + 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.
|
| + ReleaseTouchPoint(0);
|
| + SendTouchEvent();
|
| + EXPECT_EQ(1U, 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());
|
| + process_->sink().ClearMessages();
|
| + SendInputEventACK(WebInputEvent::GestureScrollEnd,
|
| + INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| +
|
| + // Now touch events should come through to renderer.
|
| + PressTouchPoint(80, 10);
|
| + SendTouchEvent();
|
| + EXPECT_EQ(1U, process_->sink().message_count());
|
| + process_->sink().ClearMessages();
|
| + SendInputEventACK(WebInputEvent::TouchStart,
|
| + INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| +
|
| + MoveTouchPoint(0, 80, 20);
|
| + SendTouchEvent();
|
| + EXPECT_EQ(1U, process_->sink().message_count());
|
| + process_->sink().ClearMessages();
|
| + SendInputEventACK(WebInputEvent::TouchMove,
|
| + INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| +
|
| + ReleaseTouchPoint(0);
|
| + SendTouchEvent();
|
| + EXPECT_EQ(1U, process_->sink().message_count());
|
| + process_->sink().ClearMessages();
|
| + SendInputEventACK(WebInputEvent::TouchEnd,
|
| + INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
|
| +}
|
| } // namespace content
|
|
|