Title: [249088] trunk/Source/WebCore
Revision
249088
Author
[email protected]
Date
2019-08-24 10:35:25 -0700 (Sat, 24 Aug 2019)

Log Message

RenderLayer::updateLayerPositions() doesn't propagate the ancestor flags correctly
https://bugs.webkit.org/show_bug.cgi?id=201115

Reviewed by Zalan Bujtas.

When an updateLayerPositions() traversal starts at a non-root layer, we failed to populate
the ancestor-related UpdateLayerPositionsFlag flags, leaving layers with missing flags
(e.g. the m_hasTransformedAncestor flag). This is detected by the patch in bug 201066.

Fix by having updateLayerPositionsAfterStyleChange() and updateLayerPositionsAfterLayout()
initialize the flags from the parent layer.

This is a behavior change not detected by any existing test, but will be exercised once
the patch from bug 201066 lands.

* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::flagsForUpdateLayerPositions):
(WebCore::RenderLayer::updateLayerPositionsAfterStyleChange):
(WebCore::RenderLayer::updateLayerPositionsAfterLayout):
(WebCore::outputPaintOrderTreeLegend):
(WebCore::outputPaintOrderTreeRecursive): Log hasTransformedAncestor().
* rendering/RenderLayer.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (249087 => 249088)


--- trunk/Source/WebCore/ChangeLog	2019-08-24 16:02:52 UTC (rev 249087)
+++ trunk/Source/WebCore/ChangeLog	2019-08-24 17:35:25 UTC (rev 249088)
@@ -1,3 +1,28 @@
+2019-08-23  Simon Fraser  <[email protected]>
+
+        RenderLayer::updateLayerPositions() doesn't propagate the ancestor flags correctly
+        https://bugs.webkit.org/show_bug.cgi?id=201115
+
+        Reviewed by Zalan Bujtas.
+
+        When an updateLayerPositions() traversal starts at a non-root layer, we failed to populate
+        the ancestor-related UpdateLayerPositionsFlag flags, leaving layers with missing flags
+        (e.g. the m_hasTransformedAncestor flag). This is detected by the patch in bug 201066.
+
+        Fix by having updateLayerPositionsAfterStyleChange() and updateLayerPositionsAfterLayout()
+        initialize the flags from the parent layer.
+
+        This is a behavior change not detected by any existing test, but will be exercised once
+        the patch from bug 201066 lands.
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::flagsForUpdateLayerPositions):
+        (WebCore::RenderLayer::updateLayerPositionsAfterStyleChange):
+        (WebCore::RenderLayer::updateLayerPositionsAfterLayout):
+        (WebCore::outputPaintOrderTreeLegend):
+        (WebCore::outputPaintOrderTreeRecursive): Log hasTransformedAncestor().
+        * rendering/RenderLayer.h:
+
 2019-08-24  Zalan Bujtas  <[email protected]>
 
         [LFC][TFC] Add section renderers to the layout tree (THEAD/TBODY/TFOOT)

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (249087 => 249088)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2019-08-24 16:02:52 UTC (rev 249087)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2019-08-24 17:35:25 UTC (rev 249088)
@@ -875,15 +875,36 @@
     return m_filters && m_filters->hasFilterThatMovesPixels();
 }
 
+OptionSet<RenderLayer::UpdateLayerPositionsFlag> RenderLayer::flagsForUpdateLayerPositions(RenderLayer& startingLayer)
+{
+    OptionSet<UpdateLayerPositionsFlag> flags = { CheckForRepaint };
+
+    if (auto* parent = startingLayer.parent()) {
+        if (parent->hasTransformedAncestor() || parent->transform())
+            flags.add(SeenTransformedLayer);
+
+        if (parent->has3DTransformedAncestor() || (parent->transform() && !parent->transform()->isAffine()))
+            flags.add(Seen3DTransformedLayer);
+
+        if (parent->behavesAsFixed() || (parent->renderer().isFixedPositioned() && !parent->hasTransformedAncestor()))
+            flags.add(SeenFixedLayer);
+
+        if (parent->hasCompositedScrollingAncestor() || parent->hasCompositedScrollableOverflow())
+            flags.add(SeenCompositedScrollingLayer);
+    }
+
+    return flags;
+}
+
 void RenderLayer::updateLayerPositionsAfterStyleChange()
 {
-    updateLayerPositions(nullptr, RenderLayer::updateLayerPositionsDefaultFlags());
+    updateLayerPositions(nullptr, flagsForUpdateLayerPositions(*this));
 }
 
 void RenderLayer::updateLayerPositionsAfterLayout(bool isRelayoutingSubtree, bool didFullRepaint)
 {
     auto updateLayerPositionFlags = [&](bool isRelayoutingSubtree, bool didFullRepaint) {
-        auto flags = RenderLayer::updateLayerPositionsDefaultFlags();
+        auto flags = flagsForUpdateLayerPositions(*this);
         if (didFullRepaint) {
             flags.remove(RenderLayer::CheckForRepaint);
             flags.add(RenderLayer::NeedsFullRepaintInBacking);
@@ -6974,7 +6995,7 @@
 static void outputPaintOrderTreeLegend(TextStream& stream)
 {
     stream.nextLine();
-    stream << "(S)tacking Context/(F)orced SC/O(P)portunistic SC, (N)ormal flow only, (O)verflow clip, (A)lpha (opacity or mask), has (B)lend mode, (I)solates blending, (T)ransform-ish, (F)ilter, Fi(X)ed position, Behaves as fi(x)ed, (C)omposited, (P)rovides backing/uses (p)rovided backing/paints to (a)ncestor, (c)omposited descendant, (s)scrolling ancestor\n"
+    stream << "(S)tacking Context/(F)orced SC/O(P)portunistic SC, (N)ormal flow only, (O)verflow clip, (A)lpha (opacity or mask), has (B)lend mode, (I)solates blending, (T)ransform-ish, (F)ilter, Fi(X)ed position, Behaves as fi(x)ed, (C)omposited, (P)rovides backing/uses (p)rovided backing/paints to (a)ncestor, (c)omposited descendant, (s)scrolling ancestor, (t)transformed ancestor\n"
         "Dirty (z)-lists, Dirty (n)ormal flow lists\n"
         "Traversal needs: requirements (t)raversal on descendants, (b)acking or hierarchy traversal on descendants, (r)equirements traversal on all descendants, requirements traversal on all (s)ubsequent layers, (h)ierarchy traversal on all descendants, update of paint (o)rder children\n"
         "Update needs:    post-(l)ayout requirements, (g)eometry, (k)ids geometry, (c)onfig, layer conne(x)ion, (s)crolling tree\n";
@@ -7021,6 +7042,7 @@
     stream << compositedPaintingDestinationString();
     stream << (layer.hasCompositingDescendant() ? "c" : "-");
     stream << (layer.hasCompositedScrollingAncestor() ? "s" : "-");
+    stream << (layer.hasTransformedAncestor() ? "t" : "-");
 
     stream << " ";
 

Modified: trunk/Source/WebCore/rendering/RenderLayer.h (249087 => 249088)


--- trunk/Source/WebCore/rendering/RenderLayer.h	2019-08-24 16:02:52 UTC (rev 249087)
+++ trunk/Source/WebCore/rendering/RenderLayer.h	2019-08-24 17:35:25 UTC (rev 249088)
@@ -784,6 +784,7 @@
     FloatPoint perspectiveOrigin() const;
     bool preserves3D() const { return renderer().style().transformStyle3D() == TransformStyle3D::Preserve3D; }
     bool has3DTransform() const { return m_transform && !m_transform->isAffine(); }
+    bool hasTransformedAncestor() const { return m_hasTransformedAncestor; }
 
     void filterNeedsRepaint();
     bool hasFilter() const { return renderer().hasFilter(); }
@@ -988,12 +989,12 @@
         Seen3DTransformedLayer              = 1 << 6,
         SeenCompositedScrollingLayer        = 1 << 7,
     };
-    static constexpr OptionSet<UpdateLayerPositionsFlag> updateLayerPositionsDefaultFlags() { return { CheckForRepaint }; }
+    static OptionSet<UpdateLayerPositionsFlag> flagsForUpdateLayerPositions(RenderLayer& startingLayer);
 
     // Returns true if the position changed.
     bool updateLayerPosition(OptionSet<UpdateLayerPositionsFlag>* = nullptr);
 
-    void updateLayerPositions(RenderGeometryMap* = nullptr, OptionSet<UpdateLayerPositionsFlag> = updateLayerPositionsDefaultFlags());
+    void updateLayerPositions(RenderGeometryMap*, OptionSet<UpdateLayerPositionsFlag>);
 
     enum UpdateLayerPositionsAfterScrollFlag {
         IsOverflowScroll                        = 1 << 0,
@@ -1127,8 +1128,6 @@
     void setAncestorChainHasVisibleDescendant();
 
     bool has3DTransformedDescendant() const { return m_has3DTransformedDescendant; }
-
-    bool hasTransformedAncestor() const { return m_hasTransformedAncestor; }
     bool has3DTransformedAncestor() const { return m_has3DTransformedAncestor; }
 
     void dirty3DTransformedDescendantStatus();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to