WebKit Bugzilla
Attachment 372980 Details for
Bug 199253
: [Async overflow scrolling] Fix missing or misplaced content inside overflow:scroll
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-199253-20190626180259.patch (text/plain), 47.24 KB, created by
Simon Fraser (smfr)
on 2019-06-26 18:03:00 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Simon Fraser (smfr)
Created:
2019-06-26 18:03:00 PDT
Size:
47.24 KB
patch
obsolete
>Subversion Revision: 246844 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 6b0d732ad503c27f97c73862c70ead9a7f2c55a3..7ad5cf12c809c534afd51c8f4139c658692ca67a 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,52 @@ >+2019-06-26 Simon Fraser <simon.fraser@apple.com> >+ >+ [Async overflow scrolling] Fix missing or misplaced content inside overflow:scroll >+ https://bugs.webkit.org/show_bug.cgi?id=199253 >+ rdar://problem/51855156, rdar://problem/51934514 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ This patch fixes a couple of related issues triggered by failing to composite layers inside non-stacking-context >+ overflow scroll. >+ >+ First, we relied on overlap testing to composite position:relative layers inside overflow:scroll, but this only >+ worked when they came later in z-order, so didn't work for layers with negative z-index. >+ RenderLayerCompositor::requiresCompositingForIndirectReason() was intended to trigger compositing in such cases, >+ but it only did so for position:absolute inside stacking-context scroller, because >+ isNonScrolledLayerInsideScrolledCompositedAncestor() tested ancestorMovedByScroller && !layerMovedByScroller. >+ >+ I fixed this by sharing code between the three places that ask whether compositing crosses a containing-block >+ boundary to call a single function, RenderLayerCompositor::layerScrollBehahaviorRelativeToCompositedAncestor(), >+ that returns a ScrollPositioningBehavior. We now do compositing for both "moves" and "stationary" behaviors (but >+ not "none"), ensuring that position:relative inside non-stacking scroller is always composited. >+ >+ However, this would trigger compositing on layers that should be using backing sharing; if they were outside the >+ visible part of the scroller, the overlap code would not trigger, but the >+ "IndirectCompositingReason::OverflowScrollPositioning" code would. This is undesirable; any layer that can use >+ backing sharing should, because that's fewer composited layers, so smaller layer trees and less backing store. >+ To fix this, I moved the backing-sharing check before the overlap check in >+ RenderLayerCompositor::computeCompositingRequirements(). >+ >+ The "layer.setHasCompositingDescendant(currentState.subtreeIsCompositing)" line was in the wrong place, >+ triggering assertions on some content; "subtreeIsCompositing" only refers to child layers, so this bit needs to >+ be set right after we've traversed the z-order lists. >+ >+ Tests: compositing/scrolling/async-overflow-scrolling/hidden-relative-layer-content-in-scroller.html >+ compositing/scrolling/async-overflow-scrolling/layer-for-negative-z-in-scroller.html >+ compositing/scrolling/async-overflow-scrolling/negative-z-in-scroller.html >+ >+ * rendering/RenderLayerCompositor.cpp: >+ (WebCore::RenderLayerCompositor::computeCompositingRequirements): >+ (WebCore::RenderLayerCompositor::traverseUnchangedSubtree): >+ (WebCore::RenderLayerCompositor::requiresCompositingForIndirectReason const): >+ (WebCore::isScrolledByOverflowScrollLayer): >+ (WebCore::enclosingCompositedScrollingLayer): >+ (WebCore::RenderLayerCompositor::layerScrollBehahaviorRelativeToCompositedAncestor): >+ (WebCore::RenderLayerCompositor::computeCoordinatedPositioningForLayer const): >+ (WebCore::isNonScrolledLayerInsideScrolledCompositedAncestor): Deleted. >+ (WebCore::RenderLayerCompositor::layerContainingBlockCrossesCoordinatedScrollingBoundary): Deleted. >+ * rendering/RenderLayerCompositor.h: >+ > 2019-06-26 Antoine Quint <graouts@apple.com> > > [Pointer Events] Respect pointer capture when dispatching mouse boundary events and updating :hover >diff --git a/Source/WebCore/rendering/RenderLayerCompositor.cpp b/Source/WebCore/rendering/RenderLayerCompositor.cpp >index d6becc3bc44e5af0e31e4ec376364b332473bc4c..ffa15da088edbcdaa7bea83e6a9ff6b0138a8dd7 100644 >--- a/Source/WebCore/rendering/RenderLayerCompositor.cpp >+++ b/Source/WebCore/rendering/RenderLayerCompositor.cpp >@@ -863,12 +863,21 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor > RequiresCompositingData queryData; > bool willBeComposited = layer.isComposited(); > bool becameCompositedAfterDescendantTraversal = false; >+ IndirectCompositingReason compositingReason = compositingState.subtreeIsCompositing ? IndirectCompositingReason::Stacking : IndirectCompositingReason::None; > > if (layer.needsPostLayoutCompositingUpdate() || compositingState.fullPaintOrderTraversalRequired || compositingState.descendantsRequireCompositingUpdate) { > layer.setIndirectCompositingReason(IndirectCompositingReason::None); > willBeComposited = needsToBeComposited(layer, queryData); > } > >+ bool layerPaintsIntoProvidedBacking = false; >+ if (!willBeComposited && compositingState.subtreeIsCompositing && backingSharingState.backingProviderCandidate() && canBeComposited(layer) && backingProviderLayerCanIncludeLayer(*backingSharingState.backingProviderCandidate(), layer)) { >+ backingSharingState.appendSharingLayer(layer); >+ LOG(Compositing, " layer %p can share with %p", &layer, backingSharingState.backingProviderCandidate()); >+ compositingReason = IndirectCompositingReason::None; >+ layerPaintsIntoProvidedBacking = true; >+ } >+ > compositingState.fullPaintOrderTraversalRequired |= layer.subsequentLayersNeedCompositingRequirementsTraversal(); > > OverlapExtent layerExtent; >@@ -880,22 +889,12 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor > bool respectTransforms = !layerExtent.hasTransformAnimation; > overlapMap.geometryMap().pushMappingsToAncestor(&layer, ancestorLayer, respectTransforms); > >- IndirectCompositingReason compositingReason = compositingState.subtreeIsCompositing ? IndirectCompositingReason::Stacking : IndirectCompositingReason::None; >- bool layerPaintsIntoProvidedBacking = false; >- bool didPushOverlapContainer = false; >- > // If we know for sure the layer is going to be composited, don't bother looking it up in the overlap map >- if (!willBeComposited && !overlapMap.isEmpty() && compositingState.testingOverlap) { >+ if (!willBeComposited && !layerPaintsIntoProvidedBacking && !overlapMap.isEmpty() && compositingState.testingOverlap) { > // If we're testing for overlap, we only need to composite if we overlap something that is already composited. >- if (layerOverlaps(overlapMap, layer, layerExtent)) { >- if (backingSharingState.backingProviderCandidate() && canBeComposited(layer) && backingProviderLayerCanIncludeLayer(*backingSharingState.backingProviderCandidate(), layer)) { >- backingSharingState.appendSharingLayer(layer); >- LOG(Compositing, " layer %p can share with %p", &layer, backingSharingState.backingProviderCandidate()); >- compositingReason = IndirectCompositingReason::None; >- layerPaintsIntoProvidedBacking = true; >- } else >- compositingReason = IndirectCompositingReason::Overlap; >- } else >+ if (layerOverlaps(overlapMap, layer, layerExtent)) >+ compositingReason = IndirectCompositingReason::Overlap; >+ else > compositingReason = IndirectCompositingReason::None; > } > >@@ -922,6 +921,7 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor > // a compositing layer among them, so start by inheriting the compositing > // ancestor with subtreeIsCompositing set to false. > CompositingState currentState = compositingState.stateForPaintOrderChildren(layer); >+ bool didPushOverlapContainer = false; > > auto layerWillComposite = [&] { > // This layer is going to be composited, so children can safely ignore the fact that there's an >@@ -993,6 +993,9 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor > for (auto* childLayer : layer.positiveZOrderLayers()) > computeCompositingRequirements(&layer, *childLayer, overlapMap, currentState, backingSharingState, anyDescendantHas3DTransform); > >+ // Set the flag to say that this layer has compositing children. >+ layer.setHasCompositingDescendant(currentState.subtreeIsCompositing); >+ > // If we just entered compositing mode, the root will have become composited (as long as accelerated compositing is enabled). > if (layer.isRenderViewLayer()) { > if (usesCompositing() && m_hasAcceleratedCompositing) >@@ -1022,9 +1025,6 @@ void RenderLayerCompositor::computeCompositingRequirements(RenderLayer* ancestor > layer.reflectionLayer()->setIndirectCompositingReason(willBeComposited ? IndirectCompositingReason::Stacking : IndirectCompositingReason::None); > } > >- // Set the flag to say that this layer has compositing children. >- layer.setHasCompositingDescendant(currentState.subtreeIsCompositing); >- > // setHasCompositingDescendant() may have changed the answer to needsToBeComposited() when clipping, so test that now. > bool isCompositedClippingLayer = canBeComposited(layer) && clipsCompositingDescendants(layer); > if (isCompositedClippingLayer & !willBeComposited) >@@ -1150,7 +1150,7 @@ void RenderLayerCompositor::traverseUnchangedSubtree(RenderLayer* ancestorLayer, > if (currentState.subtreeIsCompositing) > ASSERT(layerIsComposited); > } >- >+ > for (auto* childLayer : layer.normalFlowLayers()) > traverseUnchangedSubtree(&layer, *childLayer, overlapMap, currentState, backingSharingState, anyDescendantHas3DTransform); > >@@ -2992,43 +2992,6 @@ bool RenderLayerCompositor::requiresCompositingForOverflowScrolling(const Render > return layer.hasCompositedScrollableOverflow(); > } > >-static RenderLayer* enclosingCompositedScrollingLayer(const RenderLayer& layer, const RenderLayer& intermediateLayer, bool& sawIntermediateLayer) >-{ >- const auto* ancestorLayer = layer.parent(); >- while (ancestorLayer) { >- if (ancestorLayer == &intermediateLayer) >- sawIntermediateLayer = true; >- >- if (ancestorLayer->hasCompositedScrollableOverflow()) >- return const_cast<RenderLayer*>(ancestorLayer); >- >- ancestorLayer = ancestorLayer->parent(); >- } >- >- return nullptr; >-} >- >-static bool isScrolledByOverflowScrollLayer(const RenderLayer& layer, const RenderLayer& overflowScrollLayer) >-{ >- bool scrolledByOverflowScroll = false; >- traverseAncestorLayers(layer, [&](const RenderLayer& ancestorLayer, bool inContainingBlockChain, bool) { >- if (&ancestorLayer == &overflowScrollLayer) { >- scrolledByOverflowScroll = inContainingBlockChain; >- return AncestorTraversal::Stop; >- } >- return AncestorTraversal::Continue; >- }); >- return scrolledByOverflowScroll; >-} >- >-static bool isNonScrolledLayerInsideScrolledCompositedAncestor(const RenderLayer& layer, const RenderLayer& compositedAncestor, const RenderLayer& scrollingAncestor) >-{ >- bool ancestorMovedByScroller = &compositedAncestor == &scrollingAncestor || isScrolledByOverflowScrollLayer(compositedAncestor, scrollingAncestor); >- bool layerMovedByScroller = isScrolledByOverflowScrollLayer(layer, scrollingAncestor); >- >- return ancestorMovedByScroller && !layerMovedByScroller; >-} >- > // FIXME: why doesn't this handle the clipping cases? > bool RenderLayerCompositor::requiresCompositingForIndirectReason(const RenderLayer& layer, bool hasCompositedDescendants, bool has3DTransformedDescendants, bool paintsIntoProvidedBacking, IndirectCompositingReason& reason) const > { >@@ -3057,9 +3020,7 @@ bool RenderLayerCompositor::requiresCompositingForIndirectReason(const RenderLay > // If this layer scrolls independently from the layer that it would paint into, it needs to get composited. > if (!paintsIntoProvidedBacking && layer.hasCompositedScrollingAncestor()) { > auto* paintDestination = layer.paintOrderParent(); >- bool paintDestinationIsScrolling = false; >- auto* scrollingAncestor = enclosingCompositedScrollingLayer(layer, *paintDestination, paintDestinationIsScrolling); >- if (isNonScrolledLayerInsideScrolledCompositedAncestor(layer, *paintDestination, *scrollingAncestor)) { >+ if (paintDestination && layerScrollBehahaviorRelativeToCompositedAncestor(layer, *paintDestination) != ScrollPositioningBehavior::None) { > reason = IndirectCompositingReason::OverflowScrollPositioning; > return true; > } >@@ -3164,19 +3125,54 @@ bool RenderLayerCompositor::useCoordinatedScrollingForLayer(const RenderLayer& l > return false; > } > >-bool RenderLayerCompositor::layerContainingBlockCrossesCoordinatedScrollingBoundary(const RenderLayer& layer, const RenderLayer& compositedAncestor) >+static bool isScrolledByOverflowScrollLayer(const RenderLayer& layer, const RenderLayer& overflowScrollLayer) > { >+ bool scrolledByOverflowScroll = false; >+ traverseAncestorLayers(layer, [&](const RenderLayer& ancestorLayer, bool inContainingBlockChain, bool) { >+ if (&ancestorLayer == &overflowScrollLayer) { >+ scrolledByOverflowScroll = inContainingBlockChain; >+ return AncestorTraversal::Stop; >+ } >+ return AncestorTraversal::Continue; >+ }); >+ return scrolledByOverflowScroll; >+} >+ >+static RenderLayer* enclosingCompositedScrollingLayer(const RenderLayer& layer, const RenderLayer& intermediateLayer, bool& sawIntermediateLayer) >+{ >+ const auto* ancestorLayer = layer.parent(); >+ while (ancestorLayer) { >+ if (ancestorLayer == &intermediateLayer) >+ sawIntermediateLayer = true; >+ >+ if (ancestorLayer->hasCompositedScrollableOverflow()) >+ return const_cast<RenderLayer*>(ancestorLayer); >+ >+ ancestorLayer = ancestorLayer->parent(); >+ } >+ >+ return nullptr; >+} >+ >+ScrollPositioningBehavior RenderLayerCompositor::layerScrollBehahaviorRelativeToCompositedAncestor(const RenderLayer& layer, const RenderLayer& compositedAncestor) >+{ >+ if (!layer.hasCompositedScrollingAncestor()) >+ return ScrollPositioningBehavior::None; >+ > bool compositedAncestorIsInsideScroller = false; > auto* scrollingAncestor = enclosingCompositedScrollingLayer(layer, compositedAncestor, compositedAncestorIsInsideScroller); > if (!scrollingAncestor) { > ASSERT_NOT_REACHED(); // layer.hasCompositedScrollingAncestor() should guarantee we have one. >- return false; >+ return ScrollPositioningBehavior::None; > } > >- if (!compositedAncestorIsInsideScroller) >- return false; >+ bool ancestorMovedByScroller = &compositedAncestor == scrollingAncestor || (compositedAncestorIsInsideScroller && isScrolledByOverflowScrollLayer(compositedAncestor, *scrollingAncestor)); >+ bool layerMovedByScroller = isScrolledByOverflowScrollLayer(layer, *scrollingAncestor); > >- return isNonScrolledLayerInsideScrolledCompositedAncestor(layer, compositedAncestor, *scrollingAncestor); >+ if (ancestorMovedByScroller == layerMovedByScroller) >+ return ScrollPositioningBehavior::None; >+ >+ return layerMovedByScroller ? ScrollPositioningBehavior::Moves : ScrollPositioningBehavior::Stationary; > } > > static void collectStationaryLayerRelatedOverflowNodes(const RenderLayer& layer, const RenderLayer&, Vector<ScrollingNodeID>& scrollingNodes) >@@ -3227,27 +3223,7 @@ ScrollPositioningBehavior RenderLayerCompositor::computeCoordinatedPositioningFo > return ScrollPositioningBehavior::None; > } > >- bool compositedAncestorIsScrolling = false; >- auto* scrollingAncestor = enclosingCompositedScrollingLayer(layer, *compositedAncestor, compositedAncestorIsScrolling); >- if (!scrollingAncestor) { >- ASSERT_NOT_REACHED(); // layer.hasCompositedScrollingAncestor() should guarantee we have one. >- return ScrollPositioningBehavior::None; >- } >- >- // There are two cases we have to deal with here: >- // 1. There's a composited overflow:scroll in the parent chain between the renderer and its containing block, and the layer's >- // composited (z-order) ancestor is inside the scroller or is the scroller. In this case, we have to compensate for scroll position >- // changes to make the positioned layer stay in the same place. This only applies to position:absolute or descendants of position:absolute. >- if (compositedAncestorIsScrolling && isNonScrolledLayerInsideScrolledCompositedAncestor(layer, *compositedAncestor, *scrollingAncestor)) >- return ScrollPositioningBehavior::Stationary; >- >- // 2. The layer's containing block is the overflow or inside the overflow:scroll, but its z-order ancestor is >- // outside the overflow:scroll. In that case, we have to move the layer via the scrolling tree to make >- // it move along with the overflow scrolling. >- if (!compositedAncestorIsScrolling && isScrolledByOverflowScrollLayer(layer, *scrollingAncestor)) >- return ScrollPositioningBehavior::Moves; >- >- return ScrollPositioningBehavior::None; >+ return layerScrollBehahaviorRelativeToCompositedAncestor(layer, *compositedAncestor); > } > > static Vector<ScrollingNodeID> collectRelatedCoordinatedScrollingNodes(const RenderLayer& layer, ScrollPositioningBehavior positioningBehavior) >diff --git a/Source/WebCore/rendering/RenderLayerCompositor.h b/Source/WebCore/rendering/RenderLayerCompositor.h >index 21c06d97598ca945bebceade6c115e9a305bce61..ec35d7c9cb68805f43dbc5029873a94ca2fc3f8b 100644 >--- a/Source/WebCore/rendering/RenderLayerCompositor.h >+++ b/Source/WebCore/rendering/RenderLayerCompositor.h >@@ -497,7 +497,7 @@ private: > bool requiresCompositingForEditableImage(RenderLayerModelObject&) const; > bool requiresCompositingForIndirectReason(const RenderLayer&, bool hasCompositedDescendants, bool has3DTransformedDescendants, bool paintsIntoProvidedBacking, IndirectCompositingReason&) const; > >- static bool layerContainingBlockCrossesCoordinatedScrollingBoundary(const RenderLayer&, const RenderLayer& compositedAncestor); >+ static ScrollPositioningBehavior layerScrollBehahaviorRelativeToCompositedAncestor(const RenderLayer&, const RenderLayer& compositedAncestor); > > static bool styleChangeMayAffectIndirectCompositingReasons(const RenderStyle& oldStyle, const RenderStyle& newStyle); > >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index f90083beaa805108847afb960a2622a06ec38f5e..90ca57c07a43a636280a0705b4ba76d0419a4d23 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,27 @@ >+2019-06-26 Simon Fraser <simon.fraser@apple.com> >+ >+ [Async overflow scrolling] Fix missing or misplaced content inside overflow:scroll >+ https://bugs.webkit.org/show_bug.cgi?id=199253 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * compositing/geometry/limit-layer-bounds-clipping-ancestor-expected.txt: >+ * compositing/layer-creation/clipping-scope/overlap-constrained-inside-scroller-expected.txt: >+ * compositing/layer-creation/clipping-scope/scroller-with-negative-z-children-expected.txt: >+ * compositing/rtl/rtl-scrolling-with-transformed-descendants-expected.txt: >+ * compositing/scrolling/async-overflow-scrolling/hidden-relative-layer-content-in-scroller-expected.html: Added. >+ * compositing/scrolling/async-overflow-scrolling/hidden-relative-layer-content-in-scroller.html: Added. >+ * compositing/scrolling/async-overflow-scrolling/layer-for-negative-z-in-scroller-expected.txt: Added. >+ * compositing/scrolling/async-overflow-scrolling/layer-for-negative-z-in-scroller.html: Added. >+ * compositing/scrolling/async-overflow-scrolling/negative-z-in-scroller-expected.html: Added. >+ * compositing/scrolling/async-overflow-scrolling/negative-z-in-scroller.html: Added. >+ * compositing/shared-backing/overflow-scroll/nested-absolute-with-clipping-in-stacking-overflow-expected.txt: >+ * platform/ios-wk2/compositing/layer-creation/clipping-scope/overlap-constrained-inside-scroller-expected.txt: >+ * platform/ios-wk2/compositing/layer-creation/clipping-scope/scroller-with-negative-z-children-expected.txt: >+ * platform/ios-wk2/compositing/scrolling/async-overflow-scrolling/layer-for-negative-z-in-scroller-expected.txt: Added. >+ * platform/ios-wk2/compositing/shared-backing/overflow-scroll/nested-absolute-with-clipping-in-stacking-overflow-expected.txt: >+ * platform/ios/compositing/geometry/limit-layer-bounds-clipping-ancestor-expected.txt: >+ > 2019-06-26 Antoine Quint <graouts@apple.com> > > [Pointer Events] Respect pointer capture when dispatching mouse boundary events and updating :hover >diff --git a/LayoutTests/compositing/geometry/limit-layer-bounds-clipping-ancestor-expected.txt b/LayoutTests/compositing/geometry/limit-layer-bounds-clipping-ancestor-expected.txt >index 65c4c45d7d92ca53d29f0a33af231ef922fd320c..42c36561cda62df06707c82361a6bca72e2f4c98 100644 >--- a/LayoutTests/compositing/geometry/limit-layer-bounds-clipping-ancestor-expected.txt >+++ b/LayoutTests/compositing/geometry/limit-layer-bounds-clipping-ancestor-expected.txt >@@ -27,7 +27,8 @@ middlebottom > (children 1 > (GraphicsLayer > (offsetFromRenderer width=0 height=100) >- (bounds 149.00 200.00) >+ (bounds 149.00 2086.00) >+ (usingTiledLayer 1) > (drawsContent 1) > ) > ) >diff --git a/LayoutTests/compositing/layer-creation/clipping-scope/overlap-constrained-inside-scroller-expected.txt b/LayoutTests/compositing/layer-creation/clipping-scope/overlap-constrained-inside-scroller-expected.txt >index 49db9d9f4417411cc2fad73c1f9b25bef730424e..4f46c8367761482c74b57b38498958bb6b3cec30 100644 >--- a/LayoutTests/compositing/layer-creation/clipping-scope/overlap-constrained-inside-scroller-expected.txt >+++ b/LayoutTests/compositing/layer-creation/clipping-scope/overlap-constrained-inside-scroller-expected.txt >@@ -5,7 +5,7 @@ > (GraphicsLayer > (bounds 800.00 600.00) > (contentsOpaque 1) >- (children 5 >+ (children 6 > (GraphicsLayer > (position 8.00 8.00) > (bounds 302.00 302.00) >@@ -69,6 +69,17 @@ > ) > ) > ) >+ (GraphicsLayer >+ (position 9.00 9.00) >+ (bounds 285.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (position 40.00 380.00) >+ (bounds 100.00 100.00) >+ (contentsOpaque 1) >+ ) >+ ) >+ ) > ) > ) > ) >diff --git a/LayoutTests/compositing/layer-creation/clipping-scope/scroller-with-negative-z-children-expected.txt b/LayoutTests/compositing/layer-creation/clipping-scope/scroller-with-negative-z-children-expected.txt >index cd78b437d266fa48e1124c310fa0b1cb621ca639..fd1bdf3f9b80bd9e72fc5d54560a23317320534b 100644 >--- a/LayoutTests/compositing/layer-creation/clipping-scope/scroller-with-negative-z-children-expected.txt >+++ b/LayoutTests/compositing/layer-creation/clipping-scope/scroller-with-negative-z-children-expected.txt >@@ -5,56 +5,88 @@ > (GraphicsLayer > (bounds 800.00 600.00) > (contentsOpaque 1) >- (children 4 >+ (children 1 > (GraphicsLayer >- (position 8.00 8.00) >- (bounds 302.00 302.00) >+ (bounds 800.00 600.00) > (drawsContent 1) >- (children 1 >+ (children 7 > (GraphicsLayer >- (offsetFromRenderer width=1 height=1) >- (position 1.00 1.00) >+ (position 9.00 9.00) > (bounds 285.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (position 40.00 140.00) >+ (bounds 100.00 100.00) >+ (contentsOpaque 1) >+ ) >+ ) >+ ) >+ (GraphicsLayer >+ (bounds 800.00 600.00) >+ (drawsContent 1) >+ ) >+ (GraphicsLayer >+ (position 8.00 8.00) >+ (bounds 302.00 302.00) >+ (drawsContent 1) > (children 1 > (GraphicsLayer > (offsetFromRenderer width=1 height=1) >- (anchor 0.00 0.00) >- (bounds 285.00 500.00) >+ (position 1.00 1.00) >+ (bounds 285.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (offsetFromRenderer width=1 height=1) >+ (anchor 0.00 0.00) >+ (bounds 285.00 500.00) >+ ) >+ ) > ) > ) > ) >- ) >- ) >- (GraphicsLayer >- (position 9.00 9.00) >- (bounds 285.00 300.00) >- (children 1 > (GraphicsLayer >- (position 10.00 10.00) >- (bounds 50.00 200.00) >- (contentsOpaque 1) >+ (position 9.00 9.00) >+ (bounds 285.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (position 10.00 10.00) >+ (bounds 50.00 200.00) >+ (contentsOpaque 1) >+ ) >+ ) > ) >- ) >- ) >- (GraphicsLayer >- (position 9.00 9.00) >- (bounds 285.00 300.00) >- (children 1 > (GraphicsLayer >- (position 40.00 20.00) >- (bounds 100.00 100.00) >- (contentsOpaque 1) >+ (position 9.00 9.00) >+ (bounds 285.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (position 40.00 20.00) >+ (bounds 100.00 100.00) >+ (contentsOpaque 1) >+ ) >+ ) > ) >- ) >- ) >- (GraphicsLayer >- (position 9.00 9.00) >- (bounds 285.00 300.00) >- (children 1 > (GraphicsLayer >- (position 40.00 260.00) >- (bounds 100.00 100.00) >- (contentsOpaque 1) >+ (position 9.00 9.00) >+ (bounds 285.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (position 40.00 260.00) >+ (bounds 100.00 100.00) >+ (contentsOpaque 1) >+ ) >+ ) >+ ) >+ (GraphicsLayer >+ (position 9.00 9.00) >+ (bounds 285.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (position 40.00 380.00) >+ (bounds 100.00 100.00) >+ (contentsOpaque 1) >+ ) >+ ) > ) > ) > ) >diff --git a/LayoutTests/compositing/rtl/rtl-scrolling-with-transformed-descendants-expected.txt b/LayoutTests/compositing/rtl/rtl-scrolling-with-transformed-descendants-expected.txt >index c446161a6bd66ba301ebbc742827fb3e511ee624..3e4da39acdfc00fb7c5bbe623a26ac7cc9803831 100644 >--- a/LayoutTests/compositing/rtl/rtl-scrolling-with-transformed-descendants-expected.txt >+++ b/LayoutTests/compositing/rtl/rtl-scrolling-with-transformed-descendants-expected.txt >@@ -7,7 +7,7 @@ > (GraphicsLayer > (bounds 800.00 600.00) > (contentsOpaque 1) >- (children 3 >+ (children 5 > (GraphicsLayer > (position 8.00 8.00) > (bounds 404.00 223.00) >@@ -58,6 +58,31 @@ > ) > ) > ) >+ (GraphicsLayer >+ (position 10.00 10.00) >+ (bounds origin 366.00 0.00) >+ (bounds 400.00 204.00) >+ (clips 1) >+ (children 1 >+ (GraphicsLayer >+ (position 154.00 0.00) >+ (bounds 150.00 200.00) >+ (contentsOpaque 1) >+ ) >+ ) >+ ) >+ (GraphicsLayer >+ (position 10.00 10.00) >+ (bounds origin 366.00 0.00) >+ (bounds 400.00 204.00) >+ (clips 1) >+ (children 1 >+ (GraphicsLayer >+ (bounds 150.00 200.00) >+ (contentsOpaque 1) >+ ) >+ ) >+ ) > ) > ) > ) >diff --git a/LayoutTests/compositing/scrolling/async-overflow-scrolling/hidden-relative-layer-content-in-scroller-expected.html b/LayoutTests/compositing/scrolling/async-overflow-scrolling/hidden-relative-layer-content-in-scroller-expected.html >new file mode 100644 >index 0000000000000000000000000000000000000000..873e45cf1b6bdb6901ed3ddab7df42fc2e27c15e >--- /dev/null >+++ b/LayoutTests/compositing/scrolling/async-overflow-scrolling/hidden-relative-layer-content-in-scroller-expected.html >@@ -0,0 +1,71 @@ >+<!DOCTYPE html> >+<html> >+<head> >+ <style> >+ .page-scroller { >+ height: 500px; >+ width: 500px; >+ overflow: hidden; >+ border: 1px solid black; >+ } >+ >+ .relative { >+ position: relative; >+ height: 500px; >+ width: 100%; >+ } >+ >+ .absolute { >+ position: absolute; >+ z-index: 1; >+ top: 20px; >+ left: 20px; >+ right: 20px; >+ bottom: 20px; >+ } >+ >+ .scroller { >+ overflow-y: auto; >+ width: 100%; >+ height: 100%; >+ background: white; >+ border: 1px solid black; >+ } >+ >+ .relative-content { >+ position: relative; >+ width: 100%; >+ height: 600px; >+ background-color: green; >+ } >+ .content-sizer { >+ width: 100%; >+ height: 750px; >+ background-color: silver; >+ } >+ >+ .scrollbars-hider { >+ position: absolute; >+ z-index: 2; >+ top: 6px; >+ left: 458px; >+ width: 56px; >+ height: 510px; >+ background-color: gray; >+ } >+ </style> >+</head> >+<body> >+ <div class="page-scroller"> >+ <div class="relative"> >+ <div class="content-sizer"></div> >+ <div class="absolute"> >+ <div class="scroller"> >+ <div class="relative-content"></div> >+ </div> >+ </div> >+ </div> >+ </div> >+ <div class="scrollbars-hider"></div> >+</body> >+</html> >diff --git a/LayoutTests/compositing/scrolling/async-overflow-scrolling/hidden-relative-layer-content-in-scroller.html b/LayoutTests/compositing/scrolling/async-overflow-scrolling/hidden-relative-layer-content-in-scroller.html >new file mode 100644 >index 0000000000000000000000000000000000000000..8cf03b5df51cf4233c088464a71c4eb1816017cf >--- /dev/null >+++ b/LayoutTests/compositing/scrolling/async-overflow-scrolling/hidden-relative-layer-content-in-scroller.html >@@ -0,0 +1,72 @@ >+<!DOCTYPE html> >+<html> >+<head> >+ <style> >+ .page-scroller { >+ height: 500px; >+ width: 500px; >+ overflow-y:auto; >+ overflow-x: hidden; >+ border: 1px solid black; >+ } >+ >+ .relative { >+ position: relative; >+ height: 500px; >+ width: 100%; >+ } >+ >+ .absolute { >+ position: absolute; >+ z-index: 1; >+ top: 20px; >+ left: 20px; >+ right: 20px; >+ bottom: 20px; >+ } >+ >+ .scroller { >+ overflow-y: auto; >+ width: 100%; >+ height: 100%; >+ background: white; >+ border: 1px solid black; >+ } >+ >+ .relative-content { >+ position: relative; >+ width: 100%; >+ height: 600px; >+ background-color: green; >+ } >+ .content-sizer { >+ width: 100%; >+ height: 750px; >+ background-color: silver; >+ } >+ >+ .scrollbars-hider { >+ position: absolute; >+ z-index: 2; >+ top: 6px; >+ left: 458px; >+ width: 56px; >+ height: 510px; >+ background-color: gray; >+ } >+ </style> >+</head> >+<body> >+ <div class="page-scroller"> >+ <div class="relative"> >+ <div class="content-sizer"></div> >+ <div class="absolute"> >+ <div class="scroller"> >+ <div class="relative-content"></div> >+ </div> >+ </div> >+ </div> >+ </div> >+ <div class="scrollbars-hider"></div> >+</body> >+</html> >diff --git a/LayoutTests/compositing/scrolling/async-overflow-scrolling/layer-for-negative-z-in-scroller-expected.txt b/LayoutTests/compositing/scrolling/async-overflow-scrolling/layer-for-negative-z-in-scroller-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..79e3419265c2899643cc619b14d5d251766ab23e >--- /dev/null >+++ b/LayoutTests/compositing/scrolling/async-overflow-scrolling/layer-for-negative-z-in-scroller-expected.txt >@@ -0,0 +1,35 @@ >+(GraphicsLayer >+ (anchor 0.00 0.00) >+ (bounds 800.00 600.00) >+ (clips 1) >+ (children 1 >+ (GraphicsLayer >+ (bounds 800.00 600.00) >+ (contentsOpaque 1) >+ (children 1 >+ (GraphicsLayer >+ (position 8.00 8.00) >+ (bounds 302.00 302.00) >+ (drawsContent 1) >+ (children 1 >+ (GraphicsLayer >+ (offsetFromRenderer width=1 height=1) >+ (position 1.00 1.00) >+ (bounds 285.00 300.00) >+ (clips 1) >+ (children 1 >+ (GraphicsLayer >+ (offsetFromRenderer width=1 height=1) >+ (anchor 0.00 0.00) >+ (bounds 285.00 1240.00) >+ (drawsContent 1) >+ ) >+ ) >+ ) >+ ) >+ ) >+ ) >+ ) >+ ) >+) >+ >diff --git a/LayoutTests/compositing/scrolling/async-overflow-scrolling/layer-for-negative-z-in-scroller.html b/LayoutTests/compositing/scrolling/async-overflow-scrolling/layer-for-negative-z-in-scroller.html >new file mode 100644 >index 0000000000000000000000000000000000000000..8f9e78335dfdd9f6902861dba2a336db5131fc4d >--- /dev/null >+++ b/LayoutTests/compositing/scrolling/async-overflow-scrolling/layer-for-negative-z-in-scroller.html >@@ -0,0 +1,46 @@ >+<!DOCTYPE html> <!-- webkit-test-runner [ internal:AsyncOverflowScrollingEnabled=true ] --> >+<html> >+<head> >+ <style> >+ #scroller { >+ position: relative; >+ overflow-y: scroll; >+ width: 300px; >+ height: 300px; >+ border: 1px solid black; >+ } >+ >+ .negative { >+ position: relative; >+ z-index: -1; >+ margin: 20px; >+ width: 200px; >+ height: 200px; >+ background-color: green; >+ } >+ >+ .spacer { >+ height: 1000px; >+ width: 10px; >+ background-color: silver; >+ } >+ </style> >+ <script> >+ if (window.testRunner) >+ testRunner.dumpAsText(); >+ >+ window.addEventListener('load', () => { >+ if (window.internals) >+ document.getElementById('layers').innerText = window.internals.layerTreeAsText(document, internals.LAYER_TREE_INCLUDES_CLIPPING); >+ }, false); >+ </script> >+</head> >+<body> >+ <div id="scroller"> >+ <div class="negative box"></div> >+ <div class="spacer"></div> >+ </div> >+<pre id="layers"></pre> >+</body> >+</html> >+ >diff --git a/LayoutTests/compositing/scrolling/async-overflow-scrolling/negative-z-in-scroller-expected.html b/LayoutTests/compositing/scrolling/async-overflow-scrolling/negative-z-in-scroller-expected.html >new file mode 100644 >index 0000000000000000000000000000000000000000..3f84332e959d855277d4581fa7d3c04a4795e3dd >--- /dev/null >+++ b/LayoutTests/compositing/scrolling/async-overflow-scrolling/negative-z-in-scroller-expected.html >@@ -0,0 +1,48 @@ >+<!DOCTYPE html> <!-- webkit-test-runner [ internal:AsyncOverflowScrollingEnabled=true ] --> >+<html> >+<head> >+ <style> >+ #scroller { >+ position: relative; >+ overflow-y: scroll; >+ width: 300px; >+ height: 300px; >+ border: 1px solid black; >+ } >+ >+ .negative { >+ position: relative; >+ z-index: 1; >+ margin: 20px; >+ width: 200px; >+ height: 200px; >+ background-color: green; >+ } >+ >+ .spacer { >+ height: 1000px; >+ width: 10px; >+ background-color: silver; >+ } >+ </style> >+ <script> >+ if (window.testRunner) >+ testRunner.waitUntilDone(); >+ >+ window.addEventListener('load', () => { >+ setTimeout(() => { >+ scroller.scrollTo(0, 300); >+ if (window.testRunner) >+ testRunner.notifyDone(); >+ }, 0) >+ }, false); >+ </script> >+</head> >+<body> >+ <div id="scroller"> >+ <div class="negative box"></div> >+ <div class="spacer"></div> >+ </div> >+</body> >+</html> >+ >diff --git a/LayoutTests/compositing/scrolling/async-overflow-scrolling/negative-z-in-scroller.html b/LayoutTests/compositing/scrolling/async-overflow-scrolling/negative-z-in-scroller.html >new file mode 100644 >index 0000000000000000000000000000000000000000..dae9c540bf813e0422303acc187d8b45a3131d53 >--- /dev/null >+++ b/LayoutTests/compositing/scrolling/async-overflow-scrolling/negative-z-in-scroller.html >@@ -0,0 +1,48 @@ >+<!DOCTYPE html> <!-- webkit-test-runner [ internal:AsyncOverflowScrollingEnabled=true ] --> >+<html> >+<head> >+ <style> >+ #scroller { >+ position: relative; >+ overflow-y: scroll; >+ width: 300px; >+ height: 300px; >+ border: 1px solid black; >+ } >+ >+ .negative { >+ position: relative; >+ z-index: -1; >+ margin: 20px; >+ width: 200px; >+ height: 200px; >+ background-color: green; >+ } >+ >+ .spacer { >+ height: 1000px; >+ width: 10px; >+ background-color: silver; >+ } >+ </style> >+ <script> >+ if (window.testRunner) >+ testRunner.waitUntilDone(); >+ >+ window.addEventListener('load', () => { >+ setTimeout(() => { >+ scroller.scrollTo(0, 300); >+ if (window.testRunner) >+ testRunner.notifyDone(); >+ }, 0) >+ }, false); >+ </script> >+</head> >+<body> >+ <div id="scroller"> >+ <div class="negative box"></div> >+ <div class="spacer"></div> >+ </div> >+</body> >+</html> >+ >diff --git a/LayoutTests/compositing/shared-backing/overflow-scroll/nested-absolute-with-clipping-in-stacking-overflow-expected.txt b/LayoutTests/compositing/shared-backing/overflow-scroll/nested-absolute-with-clipping-in-stacking-overflow-expected.txt >index 5c321929e2f8c3cfbaccfb66d154ccca47a3f32e..05a3181a95a21706454e047282bce0cdecc3a61e 100644 >--- a/LayoutTests/compositing/shared-backing/overflow-scroll/nested-absolute-with-clipping-in-stacking-overflow-expected.txt >+++ b/LayoutTests/compositing/shared-backing/overflow-scroll/nested-absolute-with-clipping-in-stacking-overflow-expected.txt >@@ -28,11 +28,6 @@ > (bounds 140.00 140.00) > (contentsOpaque 1) > (drawsContent 1) >- (children 1 >- (GraphicsLayer >- (bounds 140.00 140.00) >- ) >- ) > ) > ) > ) >diff --git a/LayoutTests/platform/ios-wk2/compositing/layer-creation/clipping-scope/overlap-constrained-inside-scroller-expected.txt b/LayoutTests/platform/ios-wk2/compositing/layer-creation/clipping-scope/overlap-constrained-inside-scroller-expected.txt >index 97afdb5ebf4f860d0bc64e557cef3246eebad73f..5ef9bda1cb0207239e495f5b20d861253670588e 100644 >--- a/LayoutTests/platform/ios-wk2/compositing/layer-creation/clipping-scope/overlap-constrained-inside-scroller-expected.txt >+++ b/LayoutTests/platform/ios-wk2/compositing/layer-creation/clipping-scope/overlap-constrained-inside-scroller-expected.txt >@@ -5,7 +5,7 @@ > (GraphicsLayer > (bounds 800.00 600.00) > (contentsOpaque 1) >- (children 5 >+ (children 6 > (GraphicsLayer > (position 8.00 8.00) > (bounds 302.00 302.00) >@@ -69,6 +69,17 @@ > ) > ) > ) >+ (GraphicsLayer >+ (position 9.00 9.00) >+ (bounds 300.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (position 40.00 380.00) >+ (bounds 100.00 100.00) >+ (contentsOpaque 1) >+ ) >+ ) >+ ) > ) > ) > ) >diff --git a/LayoutTests/platform/ios-wk2/compositing/layer-creation/clipping-scope/scroller-with-negative-z-children-expected.txt b/LayoutTests/platform/ios-wk2/compositing/layer-creation/clipping-scope/scroller-with-negative-z-children-expected.txt >index 0d9b8faf56a3d72263d0684d017aaab59acc244f..b9656b6921ef4d80982eb6e713b2683786f24ac3 100644 >--- a/LayoutTests/platform/ios-wk2/compositing/layer-creation/clipping-scope/scroller-with-negative-z-children-expected.txt >+++ b/LayoutTests/platform/ios-wk2/compositing/layer-creation/clipping-scope/scroller-with-negative-z-children-expected.txt >@@ -5,56 +5,88 @@ > (GraphicsLayer > (bounds 800.00 600.00) > (contentsOpaque 1) >- (children 4 >+ (children 1 > (GraphicsLayer >- (position 8.00 8.00) >- (bounds 302.00 302.00) >+ (bounds 800.00 600.00) > (drawsContent 1) >- (children 1 >+ (children 7 > (GraphicsLayer >- (offsetFromRenderer width=1 height=1) >- (position 1.00 1.00) >+ (position 9.00 9.00) > (bounds 300.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (position 40.00 140.00) >+ (bounds 100.00 100.00) >+ (contentsOpaque 1) >+ ) >+ ) >+ ) >+ (GraphicsLayer >+ (bounds 800.00 600.00) >+ (drawsContent 1) >+ ) >+ (GraphicsLayer >+ (position 8.00 8.00) >+ (bounds 302.00 302.00) >+ (drawsContent 1) > (children 1 > (GraphicsLayer > (offsetFromRenderer width=1 height=1) >- (anchor 0.00 0.00) >- (bounds 300.00 500.00) >+ (position 1.00 1.00) >+ (bounds 300.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (offsetFromRenderer width=1 height=1) >+ (anchor 0.00 0.00) >+ (bounds 300.00 500.00) >+ ) >+ ) > ) > ) > ) >- ) >- ) >- (GraphicsLayer >- (position 9.00 9.00) >- (bounds 300.00 300.00) >- (children 1 > (GraphicsLayer >- (position 10.00 10.00) >- (bounds 50.00 200.00) >- (contentsOpaque 1) >+ (position 9.00 9.00) >+ (bounds 300.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (position 10.00 10.00) >+ (bounds 50.00 200.00) >+ (contentsOpaque 1) >+ ) >+ ) > ) >- ) >- ) >- (GraphicsLayer >- (position 9.00 9.00) >- (bounds 300.00 300.00) >- (children 1 > (GraphicsLayer >- (position 40.00 20.00) >- (bounds 100.00 100.00) >- (contentsOpaque 1) >+ (position 9.00 9.00) >+ (bounds 300.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (position 40.00 20.00) >+ (bounds 100.00 100.00) >+ (contentsOpaque 1) >+ ) >+ ) > ) >- ) >- ) >- (GraphicsLayer >- (position 9.00 9.00) >- (bounds 300.00 300.00) >- (children 1 > (GraphicsLayer >- (position 40.00 260.00) >- (bounds 100.00 100.00) >- (contentsOpaque 1) >+ (position 9.00 9.00) >+ (bounds 300.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (position 40.00 260.00) >+ (bounds 100.00 100.00) >+ (contentsOpaque 1) >+ ) >+ ) >+ ) >+ (GraphicsLayer >+ (position 9.00 9.00) >+ (bounds 300.00 300.00) >+ (children 1 >+ (GraphicsLayer >+ (position 40.00 380.00) >+ (bounds 100.00 100.00) >+ (contentsOpaque 1) >+ ) >+ ) > ) > ) > ) >diff --git a/LayoutTests/platform/ios-wk2/compositing/scrolling/async-overflow-scrolling/layer-for-negative-z-in-scroller-expected.txt b/LayoutTests/platform/ios-wk2/compositing/scrolling/async-overflow-scrolling/layer-for-negative-z-in-scroller-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..85ccdaf48eb6f3dff378e7bd2e5f830767f22747 >--- /dev/null >+++ b/LayoutTests/platform/ios-wk2/compositing/scrolling/async-overflow-scrolling/layer-for-negative-z-in-scroller-expected.txt >@@ -0,0 +1,35 @@ >+(GraphicsLayer >+ (anchor 0.00 0.00) >+ (bounds 800.00 600.00) >+ (clips 1) >+ (children 1 >+ (GraphicsLayer >+ (bounds 800.00 600.00) >+ (contentsOpaque 1) >+ (children 1 >+ (GraphicsLayer >+ (position 8.00 8.00) >+ (bounds 302.00 302.00) >+ (drawsContent 1) >+ (children 1 >+ (GraphicsLayer >+ (offsetFromRenderer width=1 height=1) >+ (position 1.00 1.00) >+ (bounds 300.00 300.00) >+ (clips 1) >+ (children 1 >+ (GraphicsLayer >+ (offsetFromRenderer width=1 height=1) >+ (anchor 0.00 0.00) >+ (bounds 300.00 1240.00) >+ (drawsContent 1) >+ ) >+ ) >+ ) >+ ) >+ ) >+ ) >+ ) >+ ) >+) >+ >diff --git a/LayoutTests/platform/ios-wk2/compositing/shared-backing/overflow-scroll/nested-absolute-with-clipping-in-stacking-overflow-expected.txt b/LayoutTests/platform/ios-wk2/compositing/shared-backing/overflow-scroll/nested-absolute-with-clipping-in-stacking-overflow-expected.txt >index 7647e2e13a5f7b79a36e80b2503bcf6a42efa509..8d96467a72d47f5fcd07ab92480a21f6e320e6fe 100644 >--- a/LayoutTests/platform/ios-wk2/compositing/shared-backing/overflow-scroll/nested-absolute-with-clipping-in-stacking-overflow-expected.txt >+++ b/LayoutTests/platform/ios-wk2/compositing/shared-backing/overflow-scroll/nested-absolute-with-clipping-in-stacking-overflow-expected.txt >@@ -28,11 +28,6 @@ > (bounds 140.00 140.00) > (contentsOpaque 1) > (drawsContent 1) >- (children 1 >- (GraphicsLayer >- (bounds 140.00 140.00) >- ) >- ) > ) > ) > ) >diff --git a/LayoutTests/platform/ios/compositing/geometry/limit-layer-bounds-clipping-ancestor-expected.txt b/LayoutTests/platform/ios/compositing/geometry/limit-layer-bounds-clipping-ancestor-expected.txt >index 1648a491c516ddd1d9a23baad9b2f6d5da8a6f87..fd6996d8e8ee2033cf4a3eb4edc5977f55af15b7 100644 >--- a/LayoutTests/platform/ios/compositing/geometry/limit-layer-bounds-clipping-ancestor-expected.txt >+++ b/LayoutTests/platform/ios/compositing/geometry/limit-layer-bounds-clipping-ancestor-expected.txt >@@ -27,7 +27,8 @@ middlebottom > (children 1 > (GraphicsLayer > (offsetFromRenderer width=0 height=100) >- (bounds 149.00 200.00) >+ (bounds 149.00 2086.00) >+ (usingTiledLayer 1) > (drawsContent 1) > ) > )
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
zalan
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 199253
: 372980