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

Unified Diff: content/renderer/input/input_handler_proxy.cc

Issue 713413002: Hook ScrollElasticityController to InputHandlerProxy (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add missed files Created 6 years, 1 month 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: content/renderer/input/input_handler_proxy.cc
diff --git a/content/renderer/input/input_handler_proxy.cc b/content/renderer/input/input_handler_proxy.cc
index fe6de51a38270a5dbda42c2d74a20d5bd976fa2e..26589795edab4f3042d988174184d0f3dacb538b 100644
--- a/content/renderer/input/input_handler_proxy.cc
+++ b/content/renderer/input/input_handler_proxy.cc
@@ -13,6 +13,7 @@
#include "content/common/input/web_input_event_traits.h"
#include "content/public/common/content_switches.h"
#include "content/renderer/input/input_handler_proxy_client.h"
+#include "content/renderer/input/input_scroll_elasticity_controller.h"
#include "third_party/WebKit/public/platform/Platform.h"
#include "third_party/WebKit/public/web/WebInputEvent.h"
#include "ui/events/latency_info.h"
@@ -161,6 +162,18 @@ InputHandlerProxy::InputHandlerProxy(cc::InputHandler* input_handler,
input_handler_->BindToClient(this);
smooth_scroll_enabled_ = CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableSmoothScrolling);
+
+#if defined(OS_MACOSX)
+ if (CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableThreadedEventHandlingMac)) {
+ cc::ScrollElasticityControllerClient* scroll_elasticity_client =
+ input_handler_->GetScrollElasticityControllerClient();
+ scroll_elasticity_controller_.reset(
+ new InputScrollElasticityController(scroll_elasticity_client));
+ scroll_elasticity_client->BindToController(
+ scroll_elasticity_controller_.get());
+ }
+#endif
}
InputHandlerProxy::~InputHandlerProxy() {}
@@ -276,64 +289,81 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::HandleInputEvent(
InputHandlerProxy::EventDisposition InputHandlerProxy::HandleMouseWheel(
const WebMouseWheelEvent& wheel_event) {
+ InputHandlerProxy::EventDisposition result = DID_NOT_HANDLE;
+ cc::InputHandlerScrollResult scroll_result;
+
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
- return DID_NOT_HANDLE;
- }
- if (wheel_event.modifiers & WebInputEvent::ControlKey) {
+ result = DID_NOT_HANDLE;
+ } else if (wheel_event.modifiers & WebInputEvent::ControlKey) {
// Wheel events involving the control key never trigger scrolling, only
// event handlers. Forward to the main thread.
- return DID_NOT_HANDLE;
- }
- if (smooth_scroll_enabled_) {
+ result = DID_NOT_HANDLE;
+ } else if (smooth_scroll_enabled_) {
cc::InputHandler::ScrollStatus scroll_status =
input_handler_->ScrollAnimated(
gfx::Point(wheel_event.x, wheel_event.y),
gfx::Vector2dF(-wheel_event.deltaX, -wheel_event.deltaY));
switch (scroll_status) {
case cc::InputHandler::ScrollStarted:
- return DID_HANDLE;
+ result = DID_HANDLE;
+ break;
case cc::InputHandler::ScrollIgnored:
- return DROP_EVENT;
+ result = DROP_EVENT;
default:
- return DID_NOT_HANDLE;
+ result = DID_NOT_HANDLE;
+ break;
}
- }
- cc::InputHandler::ScrollStatus scroll_status = input_handler_->ScrollBegin(
- gfx::Point(wheel_event.x, wheel_event.y), cc::InputHandler::Wheel);
- switch (scroll_status) {
- case cc::InputHandler::ScrollStarted: {
- TRACE_EVENT_INSTANT2(
- "input",
- "InputHandlerProxy::handle_input wheel scroll",
- TRACE_EVENT_SCOPE_THREAD,
- "deltaX",
- -wheel_event.deltaX,
- "deltaY",
- -wheel_event.deltaY);
- gfx::Point scroll_point(wheel_event.x, wheel_event.y);
- gfx::Vector2dF scroll_delta(-wheel_event.deltaX, -wheel_event.deltaY);
- cc::InputHandlerScrollResult scroll_result = input_handler_->ScrollBy(
- scroll_point, scroll_delta);
- HandleOverscroll(scroll_point, scroll_result);
- input_handler_->ScrollEnd();
- return scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT;
+ } else {
+ cc::InputHandler::ScrollStatus scroll_status = input_handler_->ScrollBegin(
+ gfx::Point(wheel_event.x, wheel_event.y), cc::InputHandler::Wheel);
+ switch (scroll_status) {
+ case cc::InputHandler::ScrollStarted: {
+ TRACE_EVENT_INSTANT2(
+ "input", "InputHandlerProxy::handle_input wheel scroll",
+ TRACE_EVENT_SCOPE_THREAD, "deltaX", -wheel_event.deltaX, "deltaY",
+ -wheel_event.deltaY);
+ gfx::Point scroll_point(wheel_event.x, wheel_event.y);
+ gfx::Vector2dF scroll_delta(-wheel_event.deltaX, -wheel_event.deltaY);
+ scroll_result = input_handler_->ScrollBy(scroll_point, scroll_delta);
+ HandleOverscroll(scroll_point, scroll_result);
+ input_handler_->ScrollEnd();
+ result = scroll_result.did_scroll ? DID_HANDLE : DROP_EVENT;
+ break;
+ }
+ case cc::InputHandler::ScrollIgnored:
+ // TODO(jamesr): This should be DROP_EVENT, but in cases where we fail
+ // to properly sync scrollability it's safer to send the event to the
+ // main thread. Change back to DROP_EVENT once we have synchronization
+ // bugs sorted out.
+ result = DID_NOT_HANDLE;
+ break;
+ case cc::InputHandler::ScrollUnknown:
+ case cc::InputHandler::ScrollOnMainThread:
+ result = DID_NOT_HANDLE;
+ break;
+ case cc::InputHandler::ScrollStatusCount:
+ NOTREACHED();
+ break;
}
- case cc::InputHandler::ScrollIgnored:
- // TODO(jamesr): This should be DROP_EVENT, but in cases where we fail
- // to properly sync scrollability it's safer to send the event to the
- // main thread. Change back to DROP_EVENT once we have synchronization
- // bugs sorted out.
- return DID_NOT_HANDLE;
- case cc::InputHandler::ScrollUnknown:
- case cc::InputHandler::ScrollOnMainThread:
- return DID_NOT_HANDLE;
- case cc::InputHandler::ScrollStatusCount:
- NOTREACHED();
- 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 after being handled
jdduke (slow) 2014/11/12 02:32:24 Maybe tweak this to say something like "... and it
ccameron 2014/11/12 08:15:29 Good point -- changed to " event and its dispositi
+ // there.
+ 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::MessageLoop::current()->PostTask(
jdduke (slow) 2014/11/12 00:55:34 Is this a speculative solution? Or have you observ
ccameron 2014/11/12 02:08:24 This was aelias' suggestion (aelais: please verify
aelias_OOO_until_Jul13 2014/11/12 02:27:41 Yes, I suggested it based on my past experience th
jdduke (slow) 2014/11/12 02:32:24 OK, thanks for the explanation, seems reasonable e
ccameron 2014/11/12 08:15:29 To be clear, that may be the right thing to do, I
+ FROM_HERE,
+ base::Bind(&InputScrollElasticityController::ObserveWheelEventAndResult,
+ scroll_elasticity_controller_->GetWeakPtr(), wheel_event,
+ scroll_result));
+ }
+ return result;
}
InputHandlerProxy::EventDisposition InputHandlerProxy::HandleGestureScrollBegin(

Powered by Google App Engine
This is Rietveld 408576698