Title: [230392] releases/WebKitGTK/webkit-2.20
Revision
230392
Author
carlo...@webkit.org
Date
2018-04-09 03:52:15 -0700 (Mon, 09 Apr 2018)

Log 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:

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.20/LayoutTests/ChangeLog (230391 => 230392)


--- releases/WebKitGTK/webkit-2.20/LayoutTests/ChangeLog	2018-04-09 08:08:50 UTC (rev 230391)
+++ releases/WebKitGTK/webkit-2.20/LayoutTests/ChangeLog	2018-04-09 10:52:15 UTC (rev 230392)
@@ -1,3 +1,15 @@
+2018-03-03  Zalan Bujtas  <za...@apple.com>
+
+        [RenderTreeBuilder] Move styleDidChange mutation logic to RenderTreeUpdater
+        https://bugs.webkit.org/show_bug.cgi?id=183273
+        <rdar://problem/38054892>
+
+        Reviewed by Antti Koivisto.
+
+        This is just a different repaint order.
+
+        * fast/repaint/absolute-position-change-containing-block-expected.txt:
+
 2018-03-02  Claudio Saavedra  <csaave...@igalia.com>
 
         [GTK] Unreviewed gardening

Modified: releases/WebKitGTK/webkit-2.20/LayoutTests/fast/repaint/absolute-position-change-containing-block-expected.txt (230391 => 230392)


--- releases/WebKitGTK/webkit-2.20/LayoutTests/fast/repaint/absolute-position-change-containing-block-expected.txt	2018-04-09 08:08:50 UTC (rev 230391)
+++ releases/WebKitGTK/webkit-2.20/LayoutTests/fast/repaint/absolute-position-change-containing-block-expected.txt	2018-04-09 10:52:15 UTC (rev 230392)
@@ -1,10 +1,10 @@
 (repaint rects
   (rect 8 5000 100 100)
   (rect 108 5100 100 100)
-  (rect 8 8 784 2000)
   (rect 8 5000 100 100)
   (rect 108 5100 100 100)
   (rect 100 100 100 100)
+  (rect 8 8 784 2000)
   (rect 16 5008 100 100)
   (rect 16 5008 100 100)
   (rect 8 8 100 100)

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/ChangeLog (230391 => 230392)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/ChangeLog	2018-04-09 08:08:50 UTC (rev 230391)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/ChangeLog	2018-04-09 10:52:15 UTC (rev 230392)
@@ -1,3 +1,22 @@
+2018-03-03  Zalan Bujtas  <za...@apple.com>
+
+        [RenderTreeBuilder] Move styleDidChange mutation logic to RenderTreeUpdater
+        https://bugs.webkit.org/show_bug.cgi?id=183273
+        <rdar://problem/38054892>
+
+        Reviewed by Antti Koivisto.
+
+        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):
+
 2018-03-12  Michael Catanzaro  <mcatanz...@igalia.com>
 
         [GTK] Crash in WebCore::PlatformDisplayWayland::~PlatformDisplayWayland

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderBlockFlow.cpp (230391 => 230392)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderBlockFlow.cpp	2018-04-09 08:08:50 UTC (rev 230391)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderBlockFlow.cpp	2018-04-09 10:52:15 UTC (rev 230392)
@@ -2020,10 +2020,6 @@
         parentBlock->markAllDescendantsWithFloatsForLayout();
         parentBlock->markSiblingsWithFloatsForLayout();
     }
-    // Fresh floats need to be reparented if they actually belong to the previous anonymous block.
-    // It copies the logic of RenderBlock::addChildIgnoringContinuation
-    if (oldStyle && noLongerAffectsParentBlock(*oldStyle) && style().isFloating() && previousSibling() && previousSibling()->isAnonymousBlock())
-        RenderTreeBuilder::current()->move(downcast<RenderBoxModelObject>(*parent()), downcast<RenderBoxModelObject>(*previousSibling()), *this, RenderTreeBuilder::NormalizeAfterInsertion::No);
 
     if (diff >= StyleDifferenceRepaint) {
         // FIXME: This could use a cheaper style-only test instead of SimpleLineLayout::canUseFor.

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderElement.cpp (230391 => 230392)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderElement.cpp	2018-04-09 08:08:50 UTC (rev 230391)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderElement.cpp	2018-04-09 10:52:15 UTC (rev 230392)
@@ -792,12 +792,6 @@
 }
 #endif
 
-bool RenderElement::noLongerAffectsParentBlock(const RenderStyle& oldStyle) const
-{
-    return parent() && parent()->isRenderBlock()
-        && ((!oldStyle.isFloating() && style().isFloating()) || (!oldStyle.hasOutOfFlowPosition() && style().hasOutOfFlowPosition()));
-}
-
 void RenderElement::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
 {
     updateFillImages(oldStyle ? &oldStyle->backgroundLayers() : nullptr, m_style.backgroundLayers());
@@ -806,21 +800,6 @@
     updateImage(oldStyle ? oldStyle->maskBoxImage().image() : nullptr, m_style.maskBoxImage().image());
     updateShapeImage(oldStyle ? oldStyle->shapeOutside() : nullptr, m_style.shapeOutside());
 
-    bool affectsParentBlock = oldStyle && (oldStyle->isFloating() || oldStyle->hasOutOfFlowPosition())
-        && !style().isFloating() && !style().hasOutOfFlowPosition()
-        && parent() && (parent()->isRenderBlockFlow() || parent()->isRenderInline());
-    if (affectsParentBlock) {
-        // We have gone from not affecting the inline status of the parent flow to suddenly
-        // having an impact. See if there is a mismatch between the parent flow's
-        // childrenInline() state and our state.
-        setInline(style().isDisplayInlineType());
-        if (isInline() != parent()->childrenInline())
-            RenderTreeBuilder::current()->childFlowStateChangesAndAffectsParentBlock(*this);
-    }
-
-    if (oldStyle && noLongerAffectsParentBlock(*oldStyle))
-        RenderTreeBuilder::current()->childFlowStateChangesAndNoLongerAffectsParentBlock(*this);
-
     SVGRenderSupport::styleChanged(*this, oldStyle);
 
     if (!m_parent)

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderElement.h (230391 => 230392)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderElement.h	2018-04-09 08:08:50 UTC (rev 230391)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderElement.h	2018-04-09 10:52:15 UTC (rev 230392)
@@ -282,8 +282,6 @@
     
     bool isVisibleInViewport() const;
 
-    bool noLongerAffectsParentBlock(const RenderStyle& oldStyle) const;
-
 private:
     RenderElement(ContainerNode&, RenderStyle&&, BaseTypeFlags);
     void node() const = delete;

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp (230391 => 230392)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp	2018-04-09 08:08:50 UTC (rev 230391)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp	2018-04-09 10:52:15 UTC (rev 230392)
@@ -513,6 +513,50 @@
     moveAllChildren(from, to, normalizeAfterInsertion);
 }
 
+void RenderTreeBuilder::normalizeTreeAfterStyleChange(RenderElement& renderer, RenderStyle& oldStyle)
+{
+    if (!renderer.parent())
+        return;
+
+    auto& parent = *renderer.parent();
+
+    bool wasFloating = oldStyle.isFloating();
+    bool wasOufOfFlowPositioned = oldStyle.hasOutOfFlowPosition();
+    bool isFloating = renderer.style().isFloating();
+    bool isOutOfFlowPositioned = renderer.style().hasOutOfFlowPosition();
+    bool startsAffectingParent = false;
+    bool noLongerAffectsParent = false;
+
+    if (is<RenderBlock>(parent))
+        noLongerAffectsParent = (!wasFloating && isFloating) || (!wasOufOfFlowPositioned && isOutOfFlowPositioned);
+
+    if (is<RenderBlockFlow>(parent) || is<RenderInline>(parent)) {
+        startsAffectingParent = (wasFloating || wasOufOfFlowPositioned) && !isFloating && !isOutOfFlowPositioned;
+        ASSERT(!startsAffectingParent || !noLongerAffectsParent);
+    }
+
+    if (startsAffectingParent) {
+        // We have gone from not affecting the inline status of the parent flow to suddenly
+        // having an impact. See if there is a mismatch between the parent flow's
+        // childrenInline() state and our state.
+        renderer.setInline(renderer.style().isDisplayInlineType());
+        if (renderer.isInline() != renderer.parent()->childrenInline())
+            childFlowStateChangesAndAffectsParentBlock(renderer);
+        return;
+    }
+
+    if (noLongerAffectsParent) {
+        childFlowStateChangesAndNoLongerAffectsParentBlock(renderer);
+
+        if (is<RenderBlockFlow>(renderer)) {
+            // Fresh floats need to be reparented if they actually belong to the previous anonymous block.
+            // It copies the logic of RenderBlock::addChildIgnoringContinuation
+            if (isFloating && renderer.previousSibling() && renderer.previousSibling()->isAnonymousBlock())
+                move(downcast<RenderBoxModelObject>(parent), downcast<RenderBoxModelObject>(*renderer.previousSibling()), renderer, RenderTreeBuilder::NormalizeAfterInsertion::No);
+        }
+    }
+}
+
 void RenderTreeBuilder::makeChildrenNonInline(RenderBlock& parent, RenderObject* insertionPoint)
 {
     // makeChildrenNonInline takes a block whose children are *all* inline and it

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilder.h (230391 => 230392)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilder.h	2018-04-09 08:08:50 UTC (rev 230391)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilder.h	2018-04-09 10:52:15 UTC (rev 230392)
@@ -54,15 +54,15 @@
 
     void updateAfterDescendants(RenderElement&);
     void destroyAndCleanUpAnonymousWrappers(RenderObject& child);
+    void normalizeTreeAfterStyleChange(RenderElement&, RenderStyle& oldStyle);
 
 #if ENABLE(FULLSCREEN_API)
     void createPlaceholderForFullScreen(RenderFullScreen&, std::unique_ptr<RenderStyle>, const LayoutRect&);
 #endif
 
+private:
     void childFlowStateChangesAndAffectsParentBlock(RenderElement& child);
     void childFlowStateChangesAndNoLongerAffectsParentBlock(RenderElement& child);
-
-private:
     void attachIgnoringContinuation(RenderElement& parent, RenderPtr<RenderObject>, RenderObject* beforeChild = nullptr);
     void attachToRenderGrid(RenderGrid& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild = nullptr);
     void attachToRenderElement(RenderElement& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild = nullptr);

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp (230391 => 230392)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp	2018-04-09 08:08:50 UTC (rev 230391)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp	2018-04-09 10:52:15 UTC (rev 230392)
@@ -294,6 +294,13 @@
     return false;
 }
 
+void RenderTreeUpdater::updateRendererStyle(RenderElement& renderer, RenderStyle&& newStyle, StyleDifference minimalStyleDifference)
+{
+    auto oldStyle = RenderStyle::clone(renderer.style());
+    renderer.setStyle(WTFMove(newStyle), minimalStyleDifference);
+    m_builder.normalizeTreeAfterStyleChange(renderer, oldStyle);
+}
+
 void RenderTreeUpdater::updateElementRenderer(Element& element, const Style::ElementUpdate& update)
 {
 #if PLATFORM(IOS)
@@ -335,19 +342,19 @@
     auto& renderer = *element.renderer();
 
     if (update.recompositeLayer) {
-        renderer.setStyle(RenderStyle::clone(*update.style), StyleDifferenceRecompositeLayer);
+        updateRendererStyle(renderer, RenderStyle::clone(*update.style), StyleDifferenceRecompositeLayer);
         return;
     }
 
     if (update.change == Style::NoChange) {
         if (pseudoStyleCacheIsInvalid(&renderer, update.style.get())) {
-            renderer.setStyle(RenderStyle::clone(*update.style), StyleDifferenceEqual);
+            updateRendererStyle(renderer, RenderStyle::clone(*update.style), StyleDifferenceEqual);
             return;
         }
         return;
     }
 
-    renderer.setStyle(RenderStyle::clone(*update.style), StyleDifferenceEqual);
+    updateRendererStyle(renderer, RenderStyle::clone(*update.style), StyleDifferenceEqual);
 }
 
 void RenderTreeUpdater::createRenderer(Element& element, RenderStyle&& style)

Modified: releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeUpdater.h (230391 => 230392)


--- releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeUpdater.h	2018-04-09 08:08:50 UTC (rev 230391)
+++ releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeUpdater.h	2018-04-09 10:52:15 UTC (rev 230392)
@@ -58,6 +58,7 @@
     void updateTextRenderer(Text&, const Style::TextUpdate*);
     void createTextRenderer(Text&, const Style::TextUpdate*);
     void updateElementRenderer(Element&, const Style::ElementUpdate&);
+    void updateRendererStyle(RenderElement&, RenderStyle&&, StyleDifference);
     void createRenderer(Element&, RenderStyle&&);
     void updateBeforeDescendants(Element&, const Style::ElementUpdates*);
     void updateAfterDescendants(Element&, const Style::ElementUpdates*);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to