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

Unified Diff: ui/events/blink/input_handler_proxy.cc

Issue 2625453002: Touchpad and wheel scroll latching for ChromeOS behind flag. (Closed)
Patch Set: ScrollEnd gets called when the fling ends before hitting a scroll extent. Created 3 years, 11 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: 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) {

Powered by Google App Engine
This is Rietveld 408576698