diff options
author | vollick@chromium.org <vollick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-16 21:22:51 +0000 |
---|---|---|
committer | vollick@chromium.org <vollick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-16 21:22:51 +0000 |
commit | 05ba53c15fe575acc97b880c76c8848bb293a3d7 (patch) | |
tree | 85509b4612c2ab2e479e6f125c177c0c6af54073 /content | |
parent | ef7e5d6977942d65fad34407eca0ef9fabb9fbef (diff) | |
download | chromium_src-05ba53c15fe575acc97b880c76c8848bb293a3d7.zip chromium_src-05ba53c15fe575acc97b880c76c8848bb293a3d7.tar.gz chromium_src-05ba53c15fe575acc97b880c76c8848bb293a3d7.tar.bz2 |
Scroll on main if impl-hit testing isn't guaranteed to be correct
It often happens that we have composited layers with
holes. Sometimes we'll try and interact through the
hole (we might, say, want to scroll something back
there). The cc machinery isn't currently smart enough to
figure out exactly what got hit, so when we detect that
our hit testing result might be inaccurate we fall back
to main thread scrolling.
Here are the specifics on how I determine if me might
have hit a "holey" occluder.
I find two starting layers:
1) The first layer below the viewport point.
2) The first scrolling layer below the viewport point.
If we haven't hit an interfering occluder, the first
scrolling layer we should reach when we walk up from 1)
is 2). If we find some other layer, things have likely
gone wonky, so we bail.
I've also added stats so that we can track how often we
fall back to main thread scrolling because we couldn't
figure out what was going on.
R=enne@chromium.org
BUG=364090
Review URL: https://codereview.chromium.org/238803005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@264306 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r-- | content/renderer/input/input_handler_proxy.cc | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/content/renderer/input/input_handler_proxy.cc b/content/renderer/input/input_handler_proxy.cc index 3af2938..d7b594d 100644 --- a/content/renderer/input/input_handler_proxy.cc +++ b/content/renderer/input/input_handler_proxy.cc @@ -160,8 +160,12 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::HandleInputEvent( // 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; } } else if (event.type == WebInputEvent::GestureScrollBegin) { DCHECK(!gesture_scroll_on_impl_thread_); @@ -174,6 +178,9 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::HandleInputEvent( cc::InputHandler::ScrollStatus scroll_status = input_handler_->ScrollBegin( gfx::Point(gesture_event.x, gesture_event.y), cc::InputHandler::Gesture); + UMA_HISTOGRAM_ENUMERATION("Renderer4.CompositorScrollHitTestResult", + scroll_status, + cc::InputHandler::ScrollStatusCount); switch (scroll_status) { case cc::InputHandler::ScrollStarted: TRACE_EVENT_INSTANT0("input", @@ -181,10 +188,14 @@ InputHandlerProxy::EventDisposition InputHandlerProxy::HandleInputEvent( TRACE_EVENT_SCOPE_THREAD); gesture_scroll_on_impl_thread_ = true; return DID_HANDLE; + case cc::InputHandler::ScrollUnknown: case cc::InputHandler::ScrollOnMainThread: return DID_NOT_HANDLE; case cc::InputHandler::ScrollIgnored: return DROP_EVENT; + case cc::InputHandler::ScrollStatusCount: + NOTREACHED(); + break; } } else if (event.type == WebInputEvent::GestureScrollUpdate) { #ifndef NDEBUG @@ -330,6 +341,7 @@ InputHandlerProxy::HandleGestureFling( input_handler_->ScheduleAnimation(); return DID_HANDLE; } + case cc::InputHandler::ScrollUnknown: case cc::InputHandler::ScrollOnMainThread: { TRACE_EVENT_INSTANT0("input", "InputHandlerProxy::HandleGestureFling::" @@ -351,6 +363,9 @@ InputHandlerProxy::HandleGestureFling( } return DROP_EVENT; } + case cc::InputHandler::ScrollStatusCount: + NOTREACHED(); + break; } return DID_NOT_HANDLE; } |