| Index: ui/events/blink/input_handler_proxy.cc
|
| diff --git a/ui/events/blink/input_handler_proxy.cc b/ui/events/blink/input_handler_proxy.cc
|
| index fcd5b33aa14e40e0a52a464a801bac8369433f1f..4612648ab954813bea94efc1bf5ec1b783c65e86 100644
|
| --- a/ui/events/blink/input_handler_proxy.cc
|
| +++ b/ui/events/blink/input_handler_proxy.cc
|
| @@ -254,6 +254,7 @@ InputHandlerProxy::InputHandlerProxy(cc::InputHandler* input_handler,
|
| has_fling_animation_started_(false),
|
| smooth_scroll_enabled_(false),
|
| uma_latency_reporting_enabled_(base::TimeTicks::IsHighResolution()),
|
| + touchpad_and_wheel_scroll_latching_enabled_(false),
|
| touch_start_result_(kEventDispositionUndefined),
|
| current_overscroll_params_(nullptr),
|
| has_ongoing_compositor_scroll_pinch_(false),
|
| @@ -613,53 +614,46 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::HandleMouseWheel(
|
| }
|
| }
|
|
|
| -InputHandlerProxy::EventDisposition InputHandlerProxy::ScrollByMouseWheel(
|
| +InputHandlerProxy::EventDisposition InputHandlerProxy::FlingScrollByMouseWheel(
|
| const WebMouseWheelEvent& wheel_event,
|
| cc::EventListenerProperties listener_properties) {
|
| DCHECK(listener_properties == cc::EventListenerProperties::kPassive ||
|
| listener_properties == cc::EventListenerProperties::kNone);
|
|
|
| - // TODO(ccameron): The rail information should be pushed down into
|
| - // InputHandler.
|
| - gfx::Vector2dF scroll_delta(
|
| - wheel_event.railsMode != WebInputEvent::RailsModeVertical
|
| - ? -wheel_event.deltaX
|
| - : 0,
|
| - wheel_event.railsMode != WebInputEvent::RailsModeHorizontal
|
| - ? -wheel_event.deltaY
|
| - : 0);
|
| -
|
| - if (wheel_event.scrollByPage) {
|
| - // TODO(jamesr): We don't properly handle scroll by page in the compositor
|
| - // thread, so punt it to the main thread. http://crbug.com/236639
|
| - RecordMainThreadScrollingReasons(
|
| - blink::WebGestureDeviceTouchpad,
|
| - cc::MainThreadScrollingReason::kPageBasedScrolling);
|
| - return DID_NOT_HANDLE;
|
| + DCHECK(!wheel_event.railsMode);
|
| + gfx::Vector2dF scroll_delta(-wheel_event.deltaX, -wheel_event.deltaY);
|
|
|
| - } else if (ShouldAnimate(wheel_event.hasPreciseScrollingDeltas)) {
|
| - base::TimeTicks event_time =
|
| - base::TimeTicks() +
|
| - base::TimeDelta::FromSecondsD(wheel_event.timeStampSeconds);
|
| - base::TimeDelta delay = base::TimeTicks::Now() - event_time;
|
| - cc::InputHandler::ScrollStatus scroll_status =
|
| - input_handler_->ScrollAnimated(gfx::Point(wheel_event.x, wheel_event.y),
|
| - scroll_delta, delay);
|
| + DCHECK(!wheel_event.scrollByPage);
|
| + DCHECK(wheel_event.hasPreciseScrollingDeltas);
|
| + if (touchpad_and_wheel_scroll_latching_enabled_) {
|
| + if (gesture_scroll_on_impl_thread_) {
|
| + TRACE_EVENT_INSTANT2("input",
|
| + "InputHandlerProxy::handle_input wheel scroll",
|
| + TRACE_EVENT_SCOPE_THREAD, "deltaX", scroll_delta.x(),
|
| + "deltaY", scroll_delta.y());
|
|
|
| - RecordMainThreadScrollingReasons(
|
| - blink::WebGestureDeviceTouchpad,
|
| - scroll_status.main_thread_scrolling_reasons);
|
| + cc::ScrollStateData scroll_state_update_data;
|
| + scroll_state_update_data.delta_x = scroll_delta.x();
|
| + scroll_state_update_data.delta_y = scroll_delta.y();
|
| + scroll_state_update_data.position_x = wheel_event.x;
|
| + scroll_state_update_data.position_y = wheel_event.y;
|
| + cc::ScrollState scroll_state_update(scroll_state_update_data);
|
|
|
| - switch (scroll_status.thread) {
|
| - case cc::InputHandler::SCROLL_ON_IMPL_THREAD:
|
| - return DID_HANDLE;
|
| - case cc::InputHandler::SCROLL_IGNORED:
|
| - return DROP_EVENT;
|
| - default:
|
| - return DID_NOT_HANDLE;
|
| - }
|
| + cc::InputHandlerScrollResult scroll_result =
|
| + input_handler_->ScrollBy(&scroll_state_update);
|
| + HandleOverscroll(gfx::Point(wheel_event.x, wheel_event.y), scroll_result,
|
| + false);
|
| + if (scroll_result.did_scroll) {
|
| + return listener_properties == cc::EventListenerProperties::kPassive
|
| + ? DID_HANDLE_NON_BLOCKING
|
| + : DID_HANDLE;
|
| + }
|
|
|
| - } else {
|
| + return DROP_EVENT;
|
| + } else {
|
| + return DID_NOT_HANDLE;
|
| + }
|
| + } else { // !touchpad_and_wheel_scroll_latching_enabled_
|
| cc::ScrollStateData scroll_state_begin_data;
|
| scroll_state_begin_data.position_x = wheel_event.x;
|
| scroll_state_begin_data.position_y = wheel_event.y;
|
| @@ -880,7 +874,8 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::HandleGestureFlingStart(
|
|
|
| switch (scroll_status.thread) {
|
| case cc::InputHandler::SCROLL_ON_IMPL_THREAD: {
|
| - if (gesture_event.sourceDevice == blink::WebGestureDeviceTouchpad) {
|
| + if (!touchpad_and_wheel_scroll_latching_enabled_ &&
|
| + gesture_event.sourceDevice == blink::WebGestureDeviceTouchpad) {
|
| scroll_state.set_is_ending(true);
|
| input_handler_->ScrollEnd(&scroll_state);
|
| }
|
| @@ -1345,7 +1340,9 @@ bool InputHandlerProxy::CancelCurrentFling() {
|
| bool InputHandlerProxy::CancelCurrentFlingWithoutNotifyingClient() {
|
| bool had_fling_animation = !!fling_curve_;
|
| if (had_fling_animation &&
|
| - fling_parameters_.sourceDevice == blink::WebGestureDeviceTouchscreen) {
|
| + (fling_parameters_.sourceDevice == blink::WebGestureDeviceTouchscreen ||
|
| + (touchpad_and_wheel_scroll_latching_enabled_ &&
|
| + fling_parameters_.sourceDevice == blink::WebGestureDeviceTouchpad))) {
|
| cc::ScrollStateData scroll_state_data;
|
| scroll_state_data.is_ending = true;
|
| cc::ScrollState scroll_state(scroll_state_data);
|
| @@ -1416,7 +1413,7 @@ bool InputHandlerProxy::TouchpadFlingScroll(
|
| synthetic_wheel.globalX = fling_parameters_.globalPoint.x;
|
| synthetic_wheel.globalY = fling_parameters_.globalPoint.y;
|
|
|
| - disposition = ScrollByMouseWheel(synthetic_wheel, properties);
|
| + disposition = FlingScrollByMouseWheel(synthetic_wheel, properties);
|
|
|
| // Send the event over to the main thread.
|
| if (disposition == DID_HANDLE_NON_BLOCKING) {
|
|
|