Commit 2302380d authored by Rahul Arakeri's avatar Rahul Arakeri Committed by Commit Bot

[Compositor threaded scrollbar scrolling] Animate Mac track click.

This CL fixes an issue with Mac scrollbars which caused scrollbar
track clicks to not get animated.

Bug: 1025147
Change-Id: I7304cb8e9a6c02439ee7c4a6e7f6c1d3dbfeebf2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1917956
Commit-Queue: Rahul Arakeri <arakeri@microsoft.com>
Reviewed-by: default avatarDavid Bokan <bokan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#716909}
parent 84ba5199
......@@ -708,12 +708,18 @@ void InputHandlerProxy::RecordMainThreadScrollingReasons(
}
}
bool InputHandlerProxy::ShouldAnimate(bool has_precise_scroll_deltas) const {
bool InputHandlerProxy::ShouldAnimate(blink::WebGestureDevice device,
bool has_precise_scroll_deltas) const {
if (!smooth_scroll_enabled_)
return false;
#if defined(OS_MACOSX)
// Mac does not smooth scroll wheel events (crbug.com/574283).
return false;
return device == blink::WebGestureDevice::kScrollbar
? !has_precise_scroll_deltas
: false;
#else
return smooth_scroll_enabled_ && !has_precise_scroll_deltas;
return !has_precise_scroll_deltas;
#endif
}
......@@ -794,8 +800,9 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::HandleGestureScrollBegin(
scroll_status = input_handler_->RootScrollBegin(
&scroll_state, GestureScrollInputType(gesture_event.SourceDevice()));
} else if (ShouldAnimate(
gesture_event.SourceDevice(),
gesture_event.data.scroll_begin.delta_hint_units !=
ui::input_types::ScrollGranularity::kScrollByPixel)) {
ui::input_types::ScrollGranularity::kScrollByPixel)) {
DCHECK(!scroll_state.is_in_inertial_phase());
scroll_status = input_handler_->ScrollAnimatedBegin(&scroll_state);
} else {
......@@ -863,8 +870,9 @@ InputHandlerProxy::HandleGestureScrollUpdate(
in_inertial_scrolling_ = scroll_state.is_in_inertial_phase();
gfx::PointF scroll_point(gesture_event.PositionInWidget());
if (ShouldAnimate(gesture_event.data.scroll_update.delta_units !=
ui::input_types::ScrollGranularity::kScrollByPixel)) {
if (ShouldAnimate(gesture_event.SourceDevice(),
gesture_event.data.scroll_update.delta_units !=
ui::input_types::ScrollGranularity::kScrollByPixel)) {
DCHECK(!scroll_state.is_in_inertial_phase());
base::TimeTicks event_time = gesture_event.TimeStamp();
base::TimeDelta delay = base::TimeTicks::Now() - event_time;
......
......@@ -168,7 +168,8 @@ class InputHandlerProxy : public cc::InputHandlerClient,
const cc::InputHandlerScrollResult& scroll_result);
// Whether to use a smooth scroll animation for this event.
bool ShouldAnimate(bool has_precise_scroll_deltas) const;
bool ShouldAnimate(blink::WebGestureDevice device,
bool has_precise_scroll_deltas) const;
// Update the elastic overscroll controller with |gesture_event|.
void HandleScrollElasticityOverscroll(
......
......@@ -743,6 +743,71 @@ TEST_P(InputHandlerProxyTest, GestureScrollIgnored) {
VERIFY_AND_RESET_MOCKS();
}
TEST_P(InputHandlerProxyTest, AnimatedScrollbarScroll) {
VERIFY_AND_RESET_MOCKS();
SetSmoothScrollEnabled(true);
expected_disposition_ = InputHandlerProxy::DID_HANDLE;
gesture_.SetSourceDevice(blink::WebGestureDevice::kScrollbar);
gesture_.data.scroll_begin.delta_hint_units =
gesture_.data.scroll_update.delta_units =
ui::input_types::ScrollGranularity::kScrollByPixel;
// Test setup for a kGestureScrollBegin.
gesture_.SetType(WebInputEvent::kGestureScrollBegin);
EXPECT_CALL(mock_input_handler_, ScrollAnimatedBegin(_))
.WillOnce(testing::Return(kImplThreadScrollState));
EXPECT_EQ(expected_disposition_,
input_handler_->RouteToTypeSpecificHandler(gesture_));
EXPECT_TRUE(input_handler_->gesture_scroll_on_impl_thread_for_testing());
VERIFY_AND_RESET_MOCKS();
// Test setup for a kGestureScrollUpdate.
gesture_.SetType(WebInputEvent::kGestureScrollUpdate);
EXPECT_CALL(mock_input_handler_, ScrollAnimated(_, _, _))
.WillOnce(testing::Return(kImplThreadScrollState));
EXPECT_EQ(expected_disposition_,
input_handler_->RouteToTypeSpecificHandler(gesture_));
EXPECT_TRUE(input_handler_->gesture_scroll_on_impl_thread_for_testing());
VERIFY_AND_RESET_MOCKS();
}
TEST_P(InputHandlerProxyTest, NonAnimatedScrollbarScroll) {
VERIFY_AND_RESET_MOCKS();
SetSmoothScrollEnabled(false);
expected_disposition_ = InputHandlerProxy::DID_HANDLE;
gesture_.SetSourceDevice(blink::WebGestureDevice::kScrollbar);
gesture_.data.scroll_begin.delta_hint_units =
gesture_.data.scroll_update.delta_units =
ui::input_types::ScrollGranularity::kScrollByPixel;
// Test setup for a kGestureScrollBegin.
gesture_.SetType(WebInputEvent::kGestureScrollBegin);
EXPECT_CALL(mock_input_handler_, ScrollBegin(_, _))
.WillOnce(testing::Return(kImplThreadScrollState));
EXPECT_EQ(expected_disposition_,
input_handler_->RouteToTypeSpecificHandler(gesture_));
EXPECT_TRUE(input_handler_->gesture_scroll_on_impl_thread_for_testing());
VERIFY_AND_RESET_MOCKS();
// Test setup for a kGestureScrollUpdate.
gesture_.SetType(WebInputEvent::kGestureScrollUpdate);
gesture_.data.scroll_update.delta_y =
-40; // -ve value implies "scrolling down".
EXPECT_CALL(
mock_input_handler_,
ScrollBy(testing::Property(&cc::ScrollState::delta_y, testing::Gt(0))))
.WillOnce(testing::Return(scroll_result_did_scroll_));
EXPECT_CALL(mock_input_handler_, ScrollAnimated(_, _, _)).Times(0);
EXPECT_EQ(expected_disposition_,
input_handler_->RouteToTypeSpecificHandler(gesture_));
EXPECT_TRUE(input_handler_->gesture_scroll_on_impl_thread_for_testing());
VERIFY_AND_RESET_MOCKS();
}
TEST_P(InputHandlerProxyTest, GestureScrollByPage) {
// We should send all events to the widget for this gesture.
expected_disposition_ = InputHandlerProxy::DID_NOT_HANDLE;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment