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..0af2a0f76de61aa24fe886455cac05778c85fe09 100644 |
--- a/ui/events/blink/input_handler_proxy.cc |
+++ b/ui/events/blink/input_handler_proxy.cc |
@@ -620,20 +620,40 @@ 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; |
+ // Send the event and its disposition to the elasticity controller to update |
+ // the over-scroll animation. If the event is to be handled on the main |
+ // thread, the event and its disposition will be sent to the elasticity |
+ // controller after being handled on the main thread. |
+ if (scroll_elasticity_controller_ && result != DID_NOT_HANDLE) { |
+ // 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, |
+ cc::InputHandlerScrollResult())); |
+ } |
+ |
+ return result; |
} |
InputHandlerProxy::EventDisposition |
@@ -665,6 +685,21 @@ InputHandlerProxy::HandleGestureScrollUpdate( |
cc::InputHandlerScrollResult scroll_result = |
input_handler_->ScrollBy(&scroll_state); |
HandleOverscroll(scroll_point, scroll_result); |
+ |
+ // Send the event and its disposition to the elasticity controller to update |
+ // the over-scroll animation. |
+ if (scroll_elasticity_controller_) { |
+ // 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( |
tdresser
2016/03/02 18:26:53
Can we share this logic with HandleGestureScrollBe
dtapuska
2016/03/07 18:03:59
Done.
|
+ FROM_HERE, |
+ base::Bind( |
+ &InputScrollElasticityController::ObserveGestureEventAndResult, |
+ scroll_elasticity_controller_->GetWeakPtr(), gesture_event, |
+ scroll_result)); |
+ } |
+ |
return scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT; |
} |
@@ -678,6 +713,23 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::HandleGestureScrollEnd( |
input_handler_->ScrollEnd(&scroll_state); |
if (!gesture_scroll_on_impl_thread_) |
return DID_NOT_HANDLE; |
+ |
+ // Send the event and its disposition to the elasticity controller to update |
+ // the over-scroll animation. If the event is to be handled on the main |
+ // thread, the event and its disposition will be sent to the elasticity |
+ // controller after being handled on the main thread. |
+ if (scroll_elasticity_controller_) { |
+ // 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, |
+ cc::InputHandlerScrollResult())); |
+ } |
+ |
gesture_scroll_on_impl_thread_ = false; |
return DID_HANDLE; |
} |