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:
@@ -744,36 +744,43 @@ ApplyAsyncTransformToScrollbarForContent(Layer* aScrollbar,
|
||||
}
|
||||
|
||||
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
|
||||
// that correspond to the scrollbar's scrollId. Verify that we deal with those
|
||||
// cases correctly.
|
||||
|
||||
// Search all siblings of aScrollbar and of its ancestors.
|
||||
LayerMetricsWrapper scrollbar(aScrollbar, LayerMetricsWrapper::StartAt::BOTTOM);
|
||||
for (LayerMetricsWrapper ancestor = scrollbar; ancestor; ancestor = ancestor.GetParent()) {
|
||||
for (LayerMetricsWrapper scrollTarget = ancestor;
|
||||
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;
|
||||
}
|
||||
if (LayerIsScrollbarTarget(aSubtreeRoot, aScrollbar)) {
|
||||
return aSubtreeRoot;
|
||||
}
|
||||
for (LayerMetricsWrapper child = aSubtreeRoot.GetFirstChild(); child;
|
||||
child = child.GetNextSibling()) {
|
||||
LayerMetricsWrapper target = FindScrolledLayerRecursive(aScrollbar, child);
|
||||
if (target) {
|
||||
return target;
|
||||
}
|
||||
}
|
||||
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
|
||||
AsyncCompositionManager::ApplyAsyncTransformToScrollbar(Layer* aLayer)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user