Chromium Code Reviews| Index: ui/events/blink/input_handler_proxy_unittest.cc |
| diff --git a/ui/events/blink/input_handler_proxy_unittest.cc b/ui/events/blink/input_handler_proxy_unittest.cc |
| index 0b7a14b7f1f258c5e4be18b7ed319903e5248f3e..00e94d1a19ff1242e2c84f4d9abea1dcf0ed9c1e 100644 |
| --- a/ui/events/blink/input_handler_proxy_unittest.cc |
| +++ b/ui/events/blink/input_handler_proxy_unittest.cc |
| @@ -454,6 +454,10 @@ class InputHandlerProxyTest |
| input_handler_->smooth_scroll_enabled_ = value; |
| } |
| + void SetTouchpadAndWheelScrollLatchingEnabled(bool value) { |
| + input_handler_->touchpad_and_wheel_scroll_latching_enabled_ = value; |
| + } |
| + |
| base::HistogramTester& histogram_tester() { |
| return histogram_tester_; |
| } |
| @@ -918,6 +922,100 @@ TEST_P(InputHandlerProxyTest, GestureFlingStartedTouchpad) { |
| EXPECT_EQ(expected_disposition_, input_handler_->HandleInputEvent(gesture_)); |
| } |
| +TEST_P(InputHandlerProxyTest, GestureFlingTouchpadScrollLatchingEnabled) { |
| + SetTouchpadAndWheelScrollLatchingEnabled(true); |
| + // We shouldn't send any events to the widget for this gesture. |
| + expected_disposition_ = InputHandlerProxy::DID_HANDLE; |
| + VERIFY_AND_RESET_MOCKS(); |
| + |
| + EXPECT_CALL(mock_input_handler_, ScrollBegin(::testing::_, ::testing::_)) |
| + .WillOnce(testing::Return(kImplThreadScrollState)); |
| + |
| + // HandleGestureScrollBegin will set gesture_scroll_on_impl_thread_. |
| + gesture_.setType(WebInputEvent::GestureScrollBegin); |
| + EXPECT_EQ(expected_disposition_, input_handler_->HandleInputEvent(gesture_)); |
| + EXPECT_TRUE(input_handler_->gesture_scroll_on_impl_thread_for_testing()); |
| + |
| + VERIFY_AND_RESET_MOCKS(); |
| + |
| + // On the fling start, we should schedule an animation but not actually start |
| + // scrolling. |
| + gesture_.setType(WebInputEvent::GestureFlingStart); |
| + WebFloatPoint fling_delta = WebFloatPoint(1000, 0); |
| + WebPoint fling_point = WebPoint(7, 13); |
| + WebPoint fling_global_point = WebPoint(17, 23); |
| + // Note that for trackpad, wheel events with the Control modifier are |
| + // special (reserved for zoom), so don't set that here. |
| + int modifiers = WebInputEvent::ShiftKey | WebInputEvent::AltKey; |
| + gesture_ = CreateFling(blink::WebGestureDeviceTouchpad, fling_delta, |
| + fling_point, fling_global_point, modifiers); |
| + EXPECT_SET_NEEDS_ANIMATE_INPUT(1); |
| + EXPECT_CALL(mock_input_handler_, ScrollBegin(testing::_, testing::_)) |
| + .WillOnce(testing::Return(kImplThreadScrollState)); |
| + |
| + // When scroll latching is enabled, ScrollEnd shouldn't get called while |
| + // handling GestureFlingStart. |
| + EXPECT_CALL(mock_input_handler_, ScrollEnd(testing::_)).Times(0); |
| + EXPECT_EQ(expected_disposition_, input_handler_->HandleInputEvent(gesture_)); |
| + |
| + VERIFY_AND_RESET_MOCKS(); |
| + |
| + // The first animate call won't start scrolling. |
| + EXPECT_SET_NEEDS_ANIMATE_INPUT(1); |
| + base::TimeTicks time = base::TimeTicks() + base::TimeDelta::FromSeconds(10); |
| + Animate(time); |
| + |
| + VERIFY_AND_RESET_MOCKS(); |
| + |
| + // The second call should start scrolling in the -X direction. |
| + EXPECT_SET_NEEDS_ANIMATE_INPUT(1); |
| + EXPECT_CALL(mock_input_handler_, |
| + GetEventListenerProperties(cc::EventListenerClass::kMouseWheel)) |
| + .WillOnce(testing::Return(cc::EventListenerProperties::kNone)); |
| + |
| + // When scroll latching is enabled, ScrollBegin shouldn't get called for |
| + // every tick. |
| + EXPECT_CALL(mock_input_handler_, ScrollBegin(testing::_, testing::_)) |
| + .Times(0); |
| + EXPECT_CALL( |
| + mock_input_handler_, |
| + ScrollBy(testing::Property(&cc::ScrollState::delta_x, testing::Lt(0)))) |
| + .WillOnce(testing::Return(scroll_result_did_scroll_)); |
| + |
| + // When scroll latching is enabled, ScrollEnd shouldn't get called for every |
| + // tick. |
| + EXPECT_CALL(mock_input_handler_, ScrollEnd(testing::_)).Times(0); |
| + time += base::TimeDelta::FromMilliseconds(100); |
| + Animate(time); |
| + |
| + VERIFY_AND_RESET_MOCKS(); |
| + |
| + // The last call should stop scrolling. |
| + EXPECT_CALL(mock_input_handler_, |
| + GetEventListenerProperties(cc::EventListenerClass::kMouseWheel)) |
| + .WillOnce(testing::Return(cc::EventListenerProperties::kNone)); |
| + |
| + // When scroll latching is enabled, ScrollBegin shouldn't get called for |
| + // every tick. |
| + EXPECT_CALL(mock_input_handler_, ScrollBegin(testing::_, testing::_)) |
| + .Times(0); |
| + EXPECT_CALL( |
| + mock_input_handler_, |
| + ScrollBy(testing::Property(&cc::ScrollState::delta_x, testing::Lt(0)))) |
| + .WillOnce(testing::Return(scroll_result_did_not_scroll_)); |
| + |
| + // When scroll latching is enabled, ScrollEnd gets called when the last |
| + // ScrollBy did not scroll. |
| + EXPECT_CALL(mock_input_handler_, ScrollEnd(testing::_)); |
| + time += base::TimeDelta::FromMilliseconds(100); |
| + Animate(time); |
| + |
| + // Fling has ended, the last Animate won't cause any more wheel ticks. |
| + EXPECT_CALL(mock_input_handler_, ScrollBy(testing::_)).Times(0); |
|
bokan
2017/01/12 19:33:17
This needs to go above the Animate call to be effe
sahel
2017/01/12 19:45:22
Thanks for the doc, I will do that.
I think it's e
|
| + |
| + VERIFY_AND_RESET_MOCKS(); |
| +} |
| + |
| TEST_P(InputHandlerProxyTest, GestureFlingOnMainThreadTouchpad) { |
| // We should send all events to the widget for this gesture. |
| expected_disposition_ = InputHandlerProxy::DID_NOT_HANDLE; |