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

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

Issue 1749343004: Implement Wheel Gesture Scrolling on OSX. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Ensure only high precision scroll begins are used Created 4 years, 9 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
« no previous file with comments | « ui/events/blink/input_handler_proxy.h ('k') | ui/events/blink/input_handler_proxy_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 187c9ac85a13cb26f002f2224f96bb42a7fcd13d..1889a89e077137f8d2b9bf18fc658af6050d479d 100644
--- a/ui/events/blink/input_handler_proxy.cc
+++ b/ui/events/blink/input_handler_proxy.cc
@@ -208,6 +208,13 @@ void ReportInputEventLatencyUma(const WebInputEvent& event,
}
}
+cc::InputHandler::ScrollInputType GestureScrollInputType(
+ blink::WebGestureDevice device) {
+ return device == blink::WebGestureDeviceTouchpad
+ ? cc::InputHandler::WHEEL
+ : cc::InputHandler::TOUCHSCREEN;
+}
+
} // namespace
namespace ui {
@@ -424,13 +431,12 @@ void RecordMainThreadScrollingReasons(WebInputEvent::Type type,
}
}
-bool InputHandlerProxy::ShouldAnimate(
- const blink::WebMouseWheelEvent& event) const {
+bool InputHandlerProxy::ShouldAnimate(bool has_precise_scroll_deltas) const {
#if defined(OS_MACOSX)
// Mac does not smooth scroll wheel events (crbug.com/574283).
return false;
#else
- return smooth_scroll_enabled_ && !event.hasPreciseScrollingDeltas;
+ return smooth_scroll_enabled_ && !has_precise_scroll_deltas;
#endif
}
@@ -487,7 +493,7 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::ScrollByMouseWheel(
// Wheel events with |canScroll| == false will not trigger scrolling,
// only event handlers. Forward to the main thread.
result = DID_NOT_HANDLE;
- } else if (ShouldAnimate(wheel_event)) {
+ } else if (ShouldAnimate(wheel_event.hasPreciseScrollingDeltas)) {
cc::InputHandler::ScrollStatus scroll_status =
input_handler_->ScrollAnimated(gfx::Point(wheel_event.x, wheel_event.y),
scroll_delta);
@@ -592,26 +598,15 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::HandleGestureScrollBegin(
scroll_status.main_thread_scrolling_reasons =
cc::MainThreadScrollingReason::kContinuingMainThreadScroll;
} else if (gesture_event.data.scrollBegin.targetViewport) {
- scroll_status = input_handler_->RootScrollBegin(&scroll_state,
- cc::InputHandler::GESTURE);
- } else if (smooth_scroll_enabled_ &&
- gesture_event.data.scrollBegin.deltaHintUnits ==
- blink::WebGestureEvent::ScrollUnits::Pixels) {
- // Generate a scroll begin/end combination to determine if
- // this can actually be handled by the impl thread or not. But
- // don't generate any scroll yet; GestureScrollUpdate will generate
- // the scroll animation.
- scroll_status = input_handler_->ScrollBegin(
- &scroll_state, cc::InputHandler::ANIMATED_WHEEL);
- if (scroll_status.thread == cc::InputHandler::SCROLL_ON_IMPL_THREAD) {
- cc::ScrollStateData scroll_state_end_data;
- scroll_state_end_data.is_ending = true;
- cc::ScrollState scroll_state_end(scroll_state_end_data);
- input_handler_->ScrollEnd(&scroll_state_end);
- }
+ scroll_status = input_handler_->RootScrollBegin(
+ &scroll_state, GestureScrollInputType(gesture_event.sourceDevice));
+ } else if (ShouldAnimate(gesture_event.data.scrollBegin.deltaHintUnits !=
+ blink::WebGestureEvent::ScrollUnits::Pixels)) {
+ gfx::Point scroll_point(gesture_event.x, gesture_event.y);
+ scroll_status = input_handler_->ScrollAnimatedBegin(scroll_point);
} else {
- scroll_status =
- input_handler_->ScrollBegin(&scroll_state, cc::InputHandler::GESTURE);
+ scroll_status = input_handler_->ScrollBegin(
+ &scroll_state, GestureScrollInputType(gesture_event.sourceDevice));
}
UMA_HISTOGRAM_ENUMERATION("Renderer4.CompositorScrollHitTestResult",
scroll_status.thread,
@@ -620,20 +615,28 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::HandleGestureScrollBegin(
RecordMainThreadScrollingReasons(gesture_event.type,
scroll_status.main_thread_scrolling_reasons);
+ InputHandlerProxy::EventDisposition result = DID_NOT_HANDLE;
switch (scroll_status.thread) {
case cc::InputHandler::SCROLL_ON_IMPL_THREAD:
TRACE_EVENT_INSTANT0("input",
"InputHandlerProxy::handle_input gesture scroll",
TRACE_EVENT_SCOPE_THREAD);
gesture_scroll_on_impl_thread_ = true;
- return DID_HANDLE;
+ result = DID_HANDLE;
+ break;
case cc::InputHandler::SCROLL_UNKNOWN:
case cc::InputHandler::SCROLL_ON_MAIN_THREAD:
- return DID_NOT_HANDLE;
+ result = DID_NOT_HANDLE;
+ break;
case cc::InputHandler::SCROLL_IGNORED:
- return DROP_EVENT;
+ result = DROP_EVENT;
+ break;
}
- return DID_NOT_HANDLE;
+ if (scroll_elasticity_controller_ && result != DID_NOT_HANDLE)
+ HandleScrollElasticityOverscroll(gesture_event,
+ cc::InputHandlerScrollResult());
+
+ return result;
}
InputHandlerProxy::EventDisposition
@@ -650,9 +653,8 @@ InputHandlerProxy::HandleGestureScrollUpdate(
gfx::Vector2dF scroll_delta(-gesture_event.data.scrollUpdate.deltaX,
-gesture_event.data.scrollUpdate.deltaY);
- if (smooth_scroll_enabled_ &&
- gesture_event.data.scrollUpdate.deltaUnits ==
- blink::WebGestureEvent::ScrollUnits::Pixels) {
+ if (ShouldAnimate(gesture_event.data.scrollUpdate.deltaUnits !=
+ blink::WebGestureEvent::ScrollUnits::Pixels)) {
switch (input_handler_->ScrollAnimated(scroll_point, scroll_delta).thread) {
case cc::InputHandler::SCROLL_ON_IMPL_THREAD:
return DID_HANDLE;
@@ -665,6 +667,10 @@ InputHandlerProxy::HandleGestureScrollUpdate(
cc::InputHandlerScrollResult scroll_result =
input_handler_->ScrollBy(&scroll_state);
HandleOverscroll(scroll_point, scroll_result);
+
+ if (scroll_elasticity_controller_)
+ HandleScrollElasticityOverscroll(gesture_event, scroll_result);
+
return scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT;
}
@@ -674,10 +680,21 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::HandleGestureScrollEnd(
DCHECK(expect_scroll_update_end_);
expect_scroll_update_end_ = false;
#endif
- cc::ScrollState scroll_state = CreateScrollStateForGesture(gesture_event);
- input_handler_->ScrollEnd(&scroll_state);
+ if (ShouldAnimate(gesture_event.data.scrollEnd.deltaUnits !=
+ blink::WebGestureEvent::ScrollUnits::Pixels)) {
+ // Do nothing if the scroll is being animated; the scroll animation will
+ // generate the ScrollEnd when it is done.
+ } else {
+ cc::ScrollState scroll_state = CreateScrollStateForGesture(gesture_event);
+ input_handler_->ScrollEnd(&scroll_state);
+ }
if (!gesture_scroll_on_impl_thread_)
return DID_NOT_HANDLE;
+
+ if (scroll_elasticity_controller_)
+ HandleScrollElasticityOverscroll(gesture_event,
+ cc::InputHandlerScrollResult());
+
gesture_scroll_on_impl_thread_ = false;
return DID_HANDLE;
}
@@ -890,7 +907,7 @@ bool InputHandlerProxy::FilterInputEventForFlingBoosting(
gfx::Point(gesture_event.x, gesture_event.y),
fling_parameters_.sourceDevice == blink::WebGestureDeviceTouchpad
? cc::InputHandler::NON_BUBBLING_GESTURE
- : cc::InputHandler::GESTURE)) {
+ : cc::InputHandler::TOUCHSCREEN)) {
CancelCurrentFling();
return false;
}
@@ -1310,4 +1327,19 @@ bool InputHandlerProxy::scrollBy(const WebFloatSize& increment,
return did_scroll;
}
+void InputHandlerProxy::HandleScrollElasticityOverscroll(
+ const WebGestureEvent& gesture_event,
+ const cc::InputHandlerScrollResult& scroll_result) {
+ DCHECK(scroll_elasticity_controller_);
+ // Send the event and its disposition to the elasticity controller to update
+ // the over-scroll animation. Note that the call to the elasticity controller
+ // is made asynchronously, to minimize divergence between main thread and
+ // impl thread event handling paths.
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE,
+ base::Bind(&InputScrollElasticityController::ObserveGestureEventAndResult,
+ scroll_elasticity_controller_->GetWeakPtr(), gesture_event,
+ scroll_result));
+}
+
} // namespace ui
« no previous file with comments | « ui/events/blink/input_handler_proxy.h ('k') | ui/events/blink/input_handler_proxy_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698