Changeset 249088 in webkit
- Timestamp:
- Aug 24, 2019, 10:35:25 AM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
-
ChangeLog (modified) (1 diff)
-
rendering/RenderLayer.cpp (modified) (4 diffs)
-
rendering/RenderLayer.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r249086 r249088 1 2019-08-23 Simon Fraser <simon.fraser@apple.com> 2 3 RenderLayer::updateLayerPositions() doesn't propagate the ancestor flags correctly 4 https://bugs.webkit.org/show_bug.cgi?id=201115 5 6 Reviewed by Zalan Bujtas. 7 8 When an updateLayerPositions() traversal starts at a non-root layer, we failed to populate 9 the ancestor-related UpdateLayerPositionsFlag flags, leaving layers with missing flags 10 (e.g. the m_hasTransformedAncestor flag). This is detected by the patch in bug 201066. 11 12 Fix by having updateLayerPositionsAfterStyleChange() and updateLayerPositionsAfterLayout() 13 initialize the flags from the parent layer. 14 15 This is a behavior change not detected by any existing test, but will be exercised once 16 the patch from bug 201066 lands. 17 18 * rendering/RenderLayer.cpp: 19 (WebCore::RenderLayer::flagsForUpdateLayerPositions): 20 (WebCore::RenderLayer::updateLayerPositionsAfterStyleChange): 21 (WebCore::RenderLayer::updateLayerPositionsAfterLayout): 22 (WebCore::outputPaintOrderTreeLegend): 23 (WebCore::outputPaintOrderTreeRecursive): Log hasTransformedAncestor(). 24 * rendering/RenderLayer.h: 25 1 26 2019-08-24 Zalan Bujtas <zalan@apple.com> 2 27 -
trunk/Source/WebCore/rendering/RenderLayer.cpp
r249080 r249088 876 876 } 877 877 878 OptionSet<RenderLayer::UpdateLayerPositionsFlag> RenderLayer::flagsForUpdateLayerPositions(RenderLayer& startingLayer) 879 { 880 OptionSet<UpdateLayerPositionsFlag> flags = { CheckForRepaint }; 881 882 if (auto* parent = startingLayer.parent()) { 883 if (parent->hasTransformedAncestor() || parent->transform()) 884 flags.add(SeenTransformedLayer); 885 886 if (parent->has3DTransformedAncestor() || (parent->transform() && !parent->transform()->isAffine())) 887 flags.add(Seen3DTransformedLayer); 888 889 if (parent->behavesAsFixed() || (parent->renderer().isFixedPositioned() && !parent->hasTransformedAncestor())) 890 flags.add(SeenFixedLayer); 891 892 if (parent->hasCompositedScrollingAncestor() || parent->hasCompositedScrollableOverflow()) 893 flags.add(SeenCompositedScrollingLayer); 894 } 895 896 return flags; 897 } 898 878 899 void RenderLayer::updateLayerPositionsAfterStyleChange() 879 900 { 880 updateLayerPositions(nullptr, RenderLayer::updateLayerPositionsDefaultFlags());901 updateLayerPositions(nullptr, flagsForUpdateLayerPositions(*this)); 881 902 } 882 903 … … 884 905 { 885 906 auto updateLayerPositionFlags = [&](bool isRelayoutingSubtree, bool didFullRepaint) { 886 auto flags = RenderLayer::updateLayerPositionsDefaultFlags();907 auto flags = flagsForUpdateLayerPositions(*this); 887 908 if (didFullRepaint) { 888 909 flags.remove(RenderLayer::CheckForRepaint); … … 6975 6996 { 6976 6997 stream.nextLine(); 6977 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"6998 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" 6978 6999 "Dirty (z)-lists, Dirty (n)ormal flow lists\n" 6979 7000 "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" … … 7022 7043 stream << (layer.hasCompositingDescendant() ? "c" : "-"); 7023 7044 stream << (layer.hasCompositedScrollingAncestor() ? "s" : "-"); 7045 stream << (layer.hasTransformedAncestor() ? "t" : "-"); 7024 7046 7025 7047 stream << " "; -
trunk/Source/WebCore/rendering/RenderLayer.h
r249080 r249088 785 785 bool preserves3D() const { return renderer().style().transformStyle3D() == TransformStyle3D::Preserve3D; } 786 786 bool has3DTransform() const { return m_transform && !m_transform->isAffine(); } 787 bool hasTransformedAncestor() const { return m_hasTransformedAncestor; } 787 788 788 789 void filterNeedsRepaint(); … … 989 990 SeenCompositedScrollingLayer = 1 << 7, 990 991 }; 991 static constexpr OptionSet<UpdateLayerPositionsFlag> updateLayerPositionsDefaultFlags() { return { CheckForRepaint }; }992 static OptionSet<UpdateLayerPositionsFlag> flagsForUpdateLayerPositions(RenderLayer& startingLayer); 992 993 993 994 // Returns true if the position changed. 994 995 bool updateLayerPosition(OptionSet<UpdateLayerPositionsFlag>* = nullptr); 995 996 996 void updateLayerPositions(RenderGeometryMap* = nullptr, OptionSet<UpdateLayerPositionsFlag> = updateLayerPositionsDefaultFlags());997 void updateLayerPositions(RenderGeometryMap*, OptionSet<UpdateLayerPositionsFlag>); 997 998 998 999 enum UpdateLayerPositionsAfterScrollFlag { … … 1128 1129 1129 1130 bool has3DTransformedDescendant() const { return m_has3DTransformedDescendant; } 1130 1131 bool hasTransformedAncestor() const { return m_hasTransformedAncestor; }1132 1131 bool has3DTransformedAncestor() const { return m_has3DTransformedAncestor; } 1133 1132
Note:
See TracChangeset
for help on using the changeset viewer.