Changeset 230392 in webkit


Ignore:
Timestamp:
Apr 9, 2018 3:52:15 AM (6 years ago)
Author:
Carlos Garcia Campos
Message:

Merge r229200 - [RenderTreeBuilder] Move styleDidChange mutation logic to RenderTreeUpdater
https://bugs.webkit.org/show_bug.cgi?id=183273
<rdar://problem/38054892>

Reviewed by Antti Koivisto.

Source/WebCore:

Covered by existing tests.

  • rendering/RenderBlockFlow.cpp:

(WebCore::RenderBlockFlow::styleDidChange):

  • rendering/RenderElement.cpp:

(WebCore::RenderElement::styleDidChange):
(WebCore::RenderElement::noLongerAffectsParentBlock const): Deleted.

  • rendering/RenderElement.h:
  • rendering/updating/RenderTreeUpdater.cpp:

(WebCore::RenderTreeUpdater::updateElementRenderer):

LayoutTests:

This is just a different repaint order.

  • fast/repaint/absolute-position-change-containing-block-expected.txt:
Location:
releases/WebKitGTK/webkit-2.20
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • releases/WebKitGTK/webkit-2.20/LayoutTests/ChangeLog

    r229280 r230392  
     12018-03-03  Zalan Bujtas  <zalan@apple.com>
     2
     3        [RenderTreeBuilder] Move styleDidChange mutation logic to RenderTreeUpdater
     4        https://bugs.webkit.org/show_bug.cgi?id=183273
     5        <rdar://problem/38054892>
     6
     7        Reviewed by Antti Koivisto.
     8
     9        This is just a different repaint order.
     10
     11        * fast/repaint/absolute-position-change-containing-block-expected.txt:
     12
    1132018-03-02  Claudio Saavedra  <csaavedra@igalia.com>
    214
  • releases/WebKitGTK/webkit-2.20/LayoutTests/fast/repaint/absolute-position-change-containing-block-expected.txt

    r190658 r230392  
    22  (rect 8 5000 100 100)
    33  (rect 108 5100 100 100)
    4   (rect 8 8 784 2000)
    54  (rect 8 5000 100 100)
    65  (rect 108 5100 100 100)
    76  (rect 100 100 100 100)
     7  (rect 8 8 784 2000)
    88  (rect 16 5008 100 100)
    99  (rect 16 5008 100 100)
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/ChangeLog

    r229526 r230392  
     12018-03-03  Zalan Bujtas  <zalan@apple.com>
     2
     3        [RenderTreeBuilder] Move styleDidChange mutation logic to RenderTreeUpdater
     4        https://bugs.webkit.org/show_bug.cgi?id=183273
     5        <rdar://problem/38054892>
     6
     7        Reviewed by Antti Koivisto.
     8
     9        Covered by existing tests.
     10
     11        * rendering/RenderBlockFlow.cpp:
     12        (WebCore::RenderBlockFlow::styleDidChange):
     13        * rendering/RenderElement.cpp:
     14        (WebCore::RenderElement::styleDidChange):
     15        (WebCore::RenderElement::noLongerAffectsParentBlock const): Deleted.
     16        * rendering/RenderElement.h:
     17        * rendering/updating/RenderTreeUpdater.cpp:
     18        (WebCore::RenderTreeUpdater::updateElementRenderer):
     19
    1202018-03-12  Michael Catanzaro  <mcatanzaro@igalia.com>
    221
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderBlockFlow.cpp

    r229268 r230392  
    20212021        parentBlock->markSiblingsWithFloatsForLayout();
    20222022    }
    2023     // Fresh floats need to be reparented if they actually belong to the previous anonymous block.
    2024     // It copies the logic of RenderBlock::addChildIgnoringContinuation
    2025     if (oldStyle && noLongerAffectsParentBlock(*oldStyle) && style().isFloating() && previousSibling() && previousSibling()->isAnonymousBlock())
    2026         RenderTreeBuilder::current()->move(downcast<RenderBoxModelObject>(*parent()), downcast<RenderBoxModelObject>(*previousSibling()), *this, RenderTreeBuilder::NormalizeAfterInsertion::No);
    20272023
    20282024    if (diff >= StyleDifferenceRepaint) {
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderElement.cpp

    r229268 r230392  
    793793#endif
    794794
    795 bool RenderElement::noLongerAffectsParentBlock(const RenderStyle& oldStyle) const
    796 {
    797     return parent() && parent()->isRenderBlock()
    798         && ((!oldStyle.isFloating() && style().isFloating()) || (!oldStyle.hasOutOfFlowPosition() && style().hasOutOfFlowPosition()));
    799 }
    800 
    801795void RenderElement::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
    802796{
     
    806800    updateImage(oldStyle ? oldStyle->maskBoxImage().image() : nullptr, m_style.maskBoxImage().image());
    807801    updateShapeImage(oldStyle ? oldStyle->shapeOutside() : nullptr, m_style.shapeOutside());
    808 
    809     bool affectsParentBlock = oldStyle && (oldStyle->isFloating() || oldStyle->hasOutOfFlowPosition())
    810         && !style().isFloating() && !style().hasOutOfFlowPosition()
    811         && parent() && (parent()->isRenderBlockFlow() || parent()->isRenderInline());
    812     if (affectsParentBlock) {
    813         // We have gone from not affecting the inline status of the parent flow to suddenly
    814         // having an impact. See if there is a mismatch between the parent flow's
    815         // childrenInline() state and our state.
    816         setInline(style().isDisplayInlineType());
    817         if (isInline() != parent()->childrenInline())
    818             RenderTreeBuilder::current()->childFlowStateChangesAndAffectsParentBlock(*this);
    819     }
    820 
    821     if (oldStyle && noLongerAffectsParentBlock(*oldStyle))
    822         RenderTreeBuilder::current()->childFlowStateChangesAndNoLongerAffectsParentBlock(*this);
    823802
    824803    SVGRenderSupport::styleChanged(*this, oldStyle);
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderElement.h

    r229268 r230392  
    283283    bool isVisibleInViewport() const;
    284284
    285     bool noLongerAffectsParentBlock(const RenderStyle& oldStyle) const;
    286 
    287285private:
    288286    RenderElement(ContainerNode&, RenderStyle&&, BaseTypeFlags);
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp

    r229232 r230392  
    514514}
    515515
     516void RenderTreeBuilder::normalizeTreeAfterStyleChange(RenderElement& renderer, RenderStyle& oldStyle)
     517{
     518    if (!renderer.parent())
     519        return;
     520
     521    auto& parent = *renderer.parent();
     522
     523    bool wasFloating = oldStyle.isFloating();
     524    bool wasOufOfFlowPositioned = oldStyle.hasOutOfFlowPosition();
     525    bool isFloating = renderer.style().isFloating();
     526    bool isOutOfFlowPositioned = renderer.style().hasOutOfFlowPosition();
     527    bool startsAffectingParent = false;
     528    bool noLongerAffectsParent = false;
     529
     530    if (is<RenderBlock>(parent))
     531        noLongerAffectsParent = (!wasFloating && isFloating) || (!wasOufOfFlowPositioned && isOutOfFlowPositioned);
     532
     533    if (is<RenderBlockFlow>(parent) || is<RenderInline>(parent)) {
     534        startsAffectingParent = (wasFloating || wasOufOfFlowPositioned) && !isFloating && !isOutOfFlowPositioned;
     535        ASSERT(!startsAffectingParent || !noLongerAffectsParent);
     536    }
     537
     538    if (startsAffectingParent) {
     539        // We have gone from not affecting the inline status of the parent flow to suddenly
     540        // having an impact. See if there is a mismatch between the parent flow's
     541        // childrenInline() state and our state.
     542        renderer.setInline(renderer.style().isDisplayInlineType());
     543        if (renderer.isInline() != renderer.parent()->childrenInline())
     544            childFlowStateChangesAndAffectsParentBlock(renderer);
     545        return;
     546    }
     547
     548    if (noLongerAffectsParent) {
     549        childFlowStateChangesAndNoLongerAffectsParentBlock(renderer);
     550
     551        if (is<RenderBlockFlow>(renderer)) {
     552            // Fresh floats need to be reparented if they actually belong to the previous anonymous block.
     553            // It copies the logic of RenderBlock::addChildIgnoringContinuation
     554            if (isFloating && renderer.previousSibling() && renderer.previousSibling()->isAnonymousBlock())
     555                move(downcast<RenderBoxModelObject>(parent), downcast<RenderBoxModelObject>(*renderer.previousSibling()), renderer, RenderTreeBuilder::NormalizeAfterInsertion::No);
     556        }
     557    }
     558}
     559
    516560void RenderTreeBuilder::makeChildrenNonInline(RenderBlock& parent, RenderObject* insertionPoint)
    517561{
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilder.h

    r229232 r230392  
    5555    void updateAfterDescendants(RenderElement&);
    5656    void destroyAndCleanUpAnonymousWrappers(RenderObject& child);
     57    void normalizeTreeAfterStyleChange(RenderElement&, RenderStyle& oldStyle);
    5758
    5859#if ENABLE(FULLSCREEN_API)
     
    6061#endif
    6162
     63private:
    6264    void childFlowStateChangesAndAffectsParentBlock(RenderElement& child);
    6365    void childFlowStateChangesAndNoLongerAffectsParentBlock(RenderElement& child);
    64 
    65 private:
    6666    void attachIgnoringContinuation(RenderElement& parent, RenderPtr<RenderObject>, RenderObject* beforeChild = nullptr);
    6767    void attachToRenderGrid(RenderGrid& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild = nullptr);
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp

    r229225 r230392  
    295295}
    296296
     297void RenderTreeUpdater::updateRendererStyle(RenderElement& renderer, RenderStyle&& newStyle, StyleDifference minimalStyleDifference)
     298{
     299    auto oldStyle = RenderStyle::clone(renderer.style());
     300    renderer.setStyle(WTFMove(newStyle), minimalStyleDifference);
     301    m_builder.normalizeTreeAfterStyleChange(renderer, oldStyle);
     302}
     303
    297304void RenderTreeUpdater::updateElementRenderer(Element& element, const Style::ElementUpdate& update)
    298305{
     
    336343
    337344    if (update.recompositeLayer) {
    338         renderer.setStyle(RenderStyle::clone(*update.style), StyleDifferenceRecompositeLayer);
     345        updateRendererStyle(renderer, RenderStyle::clone(*update.style), StyleDifferenceRecompositeLayer);
    339346        return;
    340347    }
     
    342349    if (update.change == Style::NoChange) {
    343350        if (pseudoStyleCacheIsInvalid(&renderer, update.style.get())) {
    344             renderer.setStyle(RenderStyle::clone(*update.style), StyleDifferenceEqual);
     351            updateRendererStyle(renderer, RenderStyle::clone(*update.style), StyleDifferenceEqual);
    345352            return;
    346353        }
     
    348355    }
    349356
    350     renderer.setStyle(RenderStyle::clone(*update.style), StyleDifferenceEqual);
     357    updateRendererStyle(renderer, RenderStyle::clone(*update.style), StyleDifferenceEqual);
    351358}
    352359
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeUpdater.h

    r228655 r230392  
    5959    void createTextRenderer(Text&, const Style::TextUpdate*);
    6060    void updateElementRenderer(Element&, const Style::ElementUpdate&);
     61    void updateRendererStyle(RenderElement&, RenderStyle&&, StyleDifference);
    6162    void createRenderer(Element&, RenderStyle&&);
    6263    void updateBeforeDescendants(Element&, const Style::ElementUpdates*);
Note: See TracChangeset for help on using the changeset viewer.