⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 249088 in webkit


Ignore:
Timestamp:
Aug 24, 2019, 10:35:25 AM (7 years ago)
Author:
Simon Fraser
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:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r249086 r249088  
     12019-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
    1262019-08-24  Zalan Bujtas  <zalan@apple.com>
    227
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r249080 r249088  
    876876}
    877877
     878OptionSet<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
    878899void RenderLayer::updateLayerPositionsAfterStyleChange()
    879900{
    880     updateLayerPositions(nullptr, RenderLayer::updateLayerPositionsDefaultFlags());
     901    updateLayerPositions(nullptr, flagsForUpdateLayerPositions(*this));
    881902}
    882903
     
    884905{
    885906    auto updateLayerPositionFlags = [&](bool isRelayoutingSubtree, bool didFullRepaint) {
    886         auto flags = RenderLayer::updateLayerPositionsDefaultFlags();
     907        auto flags = flagsForUpdateLayerPositions(*this);
    887908        if (didFullRepaint) {
    888909            flags.remove(RenderLayer::CheckForRepaint);
     
    69756996{
    69766997    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"
    69786999        "Dirty (z)-lists, Dirty (n)ormal flow lists\n"
    69797000        "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"
     
    70227043    stream << (layer.hasCompositingDescendant() ? "c" : "-");
    70237044    stream << (layer.hasCompositedScrollingAncestor() ? "s" : "-");
     7045    stream << (layer.hasTransformedAncestor() ? "t" : "-");
    70247046
    70257047    stream << " ";
  • trunk/Source/WebCore/rendering/RenderLayer.h

    r249080 r249088  
    785785    bool preserves3D() const { return renderer().style().transformStyle3D() == TransformStyle3D::Preserve3D; }
    786786    bool has3DTransform() const { return m_transform && !m_transform->isAffine(); }
     787    bool hasTransformedAncestor() const { return m_hasTransformedAncestor; }
    787788
    788789    void filterNeedsRepaint();
     
    989990        SeenCompositedScrollingLayer        = 1 << 7,
    990991    };
    991     static constexpr OptionSet<UpdateLayerPositionsFlag> updateLayerPositionsDefaultFlags() { return { CheckForRepaint }; }
     992    static OptionSet<UpdateLayerPositionsFlag> flagsForUpdateLayerPositions(RenderLayer& startingLayer);
    992993
    993994    // Returns true if the position changed.
    994995    bool updateLayerPosition(OptionSet<UpdateLayerPositionsFlag>* = nullptr);
    995996
    996     void updateLayerPositions(RenderGeometryMap* = nullptr, OptionSet<UpdateLayerPositionsFlag> = updateLayerPositionsDefaultFlags());
     997    void updateLayerPositions(RenderGeometryMap*, OptionSet<UpdateLayerPositionsFlag>);
    997998
    998999    enum UpdateLayerPositionsAfterScrollFlag {
     
    11281129
    11291130    bool has3DTransformedDescendant() const { return m_has3DTransformedDescendant; }
    1130 
    1131     bool hasTransformedAncestor() const { return m_hasTransformedAncestor; }
    11321131    bool has3DTransformedAncestor() const { return m_has3DTransformedAncestor; }
    11331132
Note: See TracChangeset for help on using the changeset viewer.