summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorvollick@chromium.org <vollick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-16 21:22:51 +0000
committervollick@chromium.org <vollick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-16 21:22:51 +0000
commit05ba53c15fe575acc97b880c76c8848bb293a3d7 (patch)
tree85509b4612c2ab2e479e6f125c177c0c6af54073 /content
parentef7e5d6977942d65fad34407eca0ef9fabb9fbef (diff)
downloadchromium_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.cc15
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;
}