Bug 1061327 - When the scrolled layer is not an ancestor of the scrollbar layer, search the whole layer tree. r=botond

This commit is contained in:
Markus Stange
2014-09-10 12:19:53 +02:00
parent 4571aff914
commit e45b4b97a1

View File

@@ -744,36 +744,43 @@ ApplyAsyncTransformToScrollbarForContent(Layer* aScrollbar,
} }
static LayerMetricsWrapper static LayerMetricsWrapper
FindScrolledLayerForScrollbar(Layer* aScrollbar, bool* aOutIsAncestor) FindScrolledLayerRecursive(Layer* aScrollbar, const LayerMetricsWrapper& aSubtreeRoot)
{ {
// XXX: once bug 967844 is implemented there might be multiple scrolled layers if (LayerIsScrollbarTarget(aSubtreeRoot, aScrollbar)) {
// that correspond to the scrollbar's scrollId. Verify that we deal with those return aSubtreeRoot;
// cases correctly. }
for (LayerMetricsWrapper child = aSubtreeRoot.GetFirstChild(); child;
// Search all siblings of aScrollbar and of its ancestors. child = child.GetNextSibling()) {
LayerMetricsWrapper scrollbar(aScrollbar, LayerMetricsWrapper::StartAt::BOTTOM); LayerMetricsWrapper target = FindScrolledLayerRecursive(aScrollbar, child);
for (LayerMetricsWrapper ancestor = scrollbar; ancestor; ancestor = ancestor.GetParent()) { if (target) {
for (LayerMetricsWrapper scrollTarget = ancestor; return target;
scrollTarget;
scrollTarget = scrollTarget.GetPrevSibling()) {
if (scrollTarget != scrollbar &&
LayerIsScrollbarTarget(scrollTarget, aScrollbar)) {
*aOutIsAncestor = (scrollTarget == ancestor);
return scrollTarget;
}
}
for (LayerMetricsWrapper scrollTarget = ancestor.GetNextSibling();
scrollTarget;
scrollTarget = scrollTarget.GetNextSibling()) {
if (LayerIsScrollbarTarget(scrollTarget, aScrollbar)) {
*aOutIsAncestor = false;
return scrollTarget;
}
} }
} }
return LayerMetricsWrapper(); return LayerMetricsWrapper();
} }
static LayerMetricsWrapper
FindScrolledLayerForScrollbar(Layer* aScrollbar, bool* aOutIsAncestor)
{
// Search ancestors first.
LayerMetricsWrapper scrollbar(aScrollbar);
for (LayerMetricsWrapper ancestor = scrollbar; ancestor; ancestor = ancestor.GetParent()) {
if (LayerIsScrollbarTarget(ancestor, aScrollbar)) {
*aOutIsAncestor = true;
return ancestor;
}
}
// If the scrolled target is not an ancestor, search the whole layer tree.
// XXX It would be much better to search the APZC tree instead of the layer
// tree. That way we would ignore non-scrollable layers, and we'd only visit
// each scroll ID once. In the end we only need the APZC and the FrameMetrics
// of the scrolled target.
*aOutIsAncestor = false;
LayerMetricsWrapper root(aScrollbar->Manager()->GetRoot());
return FindScrolledLayerRecursive(aScrollbar, root);
}
void void
AsyncCompositionManager::ApplyAsyncTransformToScrollbar(Layer* aLayer) AsyncCompositionManager::ApplyAsyncTransformToScrollbar(Layer* aLayer)
{ {