Title: [228593] trunk/Source/WebCore
Revision
228593
Author
[email protected]
Date
2018-02-16 18:20:24 -0800 (Fri, 16 Feb 2018)

Log Message

[RenderTreeBuilder] Move RenderBoxModelObject::moveChild*() to RenderTreeBuilder
https://bugs.webkit.org/show_bug.cgi?id=182896
<rdar://problem/37623051>

Reviewed by Antti Koivisto.

No change in functionality.

* rendering/RenderBlock.h:
(WebCore::RenderBlock::moveAllChildrenIncludingFloatsTo): Deleted.
* rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::styleDidChange):
(WebCore::RenderBlockFlow::moveAllChildrenIncludingFloatsTo): Deleted.
* rendering/RenderBlockFlow.h:
* rendering/RenderBoxModelObject.cpp:
(WebCore::RenderBoxModelObject::moveChildTo): Deleted.
(WebCore::RenderBoxModelObject::moveChildrenTo): Deleted.
(WebCore::RenderBoxModelObject::moveAllChildrenToInternal): Deleted.
* rendering/RenderBoxModelObject.h:
(WebCore::RenderBoxModelObject::moveChildTo): Deleted.
(WebCore::RenderBoxModelObject::moveAllChildrenTo): Deleted.
(WebCore::RenderBoxModelObject::moveChildrenTo): Deleted.
* rendering/updating/RenderTreeBuilder.cpp:
(WebCore::RenderTreeBuilder::moveChildTo):
(WebCore::RenderTreeBuilder::moveAllChildrenTo):
(WebCore::RenderTreeBuilder::moveChildrenTo):
(WebCore::RenderTreeBuilder::moveAllChildrenIncludingFloatsTo):
(WebCore::RenderTreeBuilder::makeChildrenNonInline):
(WebCore::RenderTreeBuilder::splitAnonymousBoxesAroundChild):
* rendering/updating/RenderTreeBuilder.h:
* rendering/updating/RenderTreeBuilderBlock.cpp:
(WebCore::moveAllChildrenToInternal):
(WebCore::RenderTreeBuilder::Block::removeLeftoverAnonymousBlock):
(WebCore::RenderTreeBuilder::Block::takeChild):
(WebCore::RenderTreeBuilder::Block::dropAnonymousBoxChild):
* rendering/updating/RenderTreeBuilderBlockFlow.cpp:
(WebCore::RenderTreeBuilder::BlockFlow::moveAllChildrenIncludingFloatsTo):
* rendering/updating/RenderTreeBuilderBlockFlow.h:
* rendering/updating/RenderTreeBuilderMultiColumn.cpp:
(WebCore::RenderTreeBuilder::MultiColumn::createFragmentedFlow):
(WebCore::RenderTreeBuilder::MultiColumn::destroyFragmentedFlow):
* rendering/updating/RenderTreeBuilderRuby.cpp:
(WebCore::RenderTreeBuilder::Ruby::moveInlineChildren):
(WebCore::RenderTreeBuilder::Ruby::moveBlockChildren):
(WebCore::RenderTreeBuilder::Ruby::takeChild):
* rendering/updating/RenderTreeBuilderTable.cpp:
(WebCore::RenderTreeBuilder::Table::collapseAndDestroyAnonymousSiblingRows):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (228592 => 228593)


--- trunk/Source/WebCore/ChangeLog	2018-02-17 02:13:59 UTC (rev 228592)
+++ trunk/Source/WebCore/ChangeLog	2018-02-17 02:20:24 UTC (rev 228593)
@@ -1,3 +1,53 @@
+2018-02-16  Zalan Bujtas  <[email protected]>
+
+        [RenderTreeBuilder] Move RenderBoxModelObject::moveChild*() to RenderTreeBuilder
+        https://bugs.webkit.org/show_bug.cgi?id=182896
+        <rdar://problem/37623051>
+
+        Reviewed by Antti Koivisto.
+
+        No change in functionality.
+
+        * rendering/RenderBlock.h:
+        (WebCore::RenderBlock::moveAllChildrenIncludingFloatsTo): Deleted.
+        * rendering/RenderBlockFlow.cpp:
+        (WebCore::RenderBlockFlow::styleDidChange):
+        (WebCore::RenderBlockFlow::moveAllChildrenIncludingFloatsTo): Deleted.
+        * rendering/RenderBlockFlow.h:
+        * rendering/RenderBoxModelObject.cpp:
+        (WebCore::RenderBoxModelObject::moveChildTo): Deleted.
+        (WebCore::RenderBoxModelObject::moveChildrenTo): Deleted.
+        (WebCore::RenderBoxModelObject::moveAllChildrenToInternal): Deleted.
+        * rendering/RenderBoxModelObject.h:
+        (WebCore::RenderBoxModelObject::moveChildTo): Deleted.
+        (WebCore::RenderBoxModelObject::moveAllChildrenTo): Deleted.
+        (WebCore::RenderBoxModelObject::moveChildrenTo): Deleted.
+        * rendering/updating/RenderTreeBuilder.cpp:
+        (WebCore::RenderTreeBuilder::moveChildTo):
+        (WebCore::RenderTreeBuilder::moveAllChildrenTo):
+        (WebCore::RenderTreeBuilder::moveChildrenTo):
+        (WebCore::RenderTreeBuilder::moveAllChildrenIncludingFloatsTo):
+        (WebCore::RenderTreeBuilder::makeChildrenNonInline):
+        (WebCore::RenderTreeBuilder::splitAnonymousBoxesAroundChild):
+        * rendering/updating/RenderTreeBuilder.h:
+        * rendering/updating/RenderTreeBuilderBlock.cpp:
+        (WebCore::moveAllChildrenToInternal):
+        (WebCore::RenderTreeBuilder::Block::removeLeftoverAnonymousBlock):
+        (WebCore::RenderTreeBuilder::Block::takeChild):
+        (WebCore::RenderTreeBuilder::Block::dropAnonymousBoxChild):
+        * rendering/updating/RenderTreeBuilderBlockFlow.cpp:
+        (WebCore::RenderTreeBuilder::BlockFlow::moveAllChildrenIncludingFloatsTo):
+        * rendering/updating/RenderTreeBuilderBlockFlow.h:
+        * rendering/updating/RenderTreeBuilderMultiColumn.cpp:
+        (WebCore::RenderTreeBuilder::MultiColumn::createFragmentedFlow):
+        (WebCore::RenderTreeBuilder::MultiColumn::destroyFragmentedFlow):
+        * rendering/updating/RenderTreeBuilderRuby.cpp:
+        (WebCore::RenderTreeBuilder::Ruby::moveInlineChildren):
+        (WebCore::RenderTreeBuilder::Ruby::moveBlockChildren):
+        (WebCore::RenderTreeBuilder::Ruby::takeChild):
+        * rendering/updating/RenderTreeBuilderTable.cpp:
+        (WebCore::RenderTreeBuilder::Table::collapseAndDestroyAnonymousSiblingRows):
+
 2018-02-16  Andy Estes  <[email protected]>
 
         [Cocoa] Stop using non-prefixed vDSP functions in 32-bit builds

Modified: trunk/Source/WebCore/rendering/RenderBlock.h (228592 => 228593)


--- trunk/Source/WebCore/rendering/RenderBlock.h	2018-02-17 02:13:59 UTC (rev 228592)
+++ trunk/Source/WebCore/rendering/RenderBlock.h	2018-02-17 02:20:24 UTC (rev 228593)
@@ -392,8 +392,6 @@
     void adjustBorderBoxRectForPainting(LayoutRect&) override;
     LayoutRect paintRectToClipOutFromBorder(const LayoutRect&) override;
     bool isInlineBlockOrInlineTable() const final { return isInline() && isReplaced(); }
-    // FIXME-BLOCKFLOW: Remove virtualizaion when all callers have moved to RenderBlockFlow
-    virtual void moveAllChildrenIncludingFloatsTo(RenderTreeBuilder& builder, RenderBlock& toBlock, RenderBoxModelObject::NormalizeAfterInsertion normalizeAfterInsertion) { moveAllChildrenTo(builder, &toBlock, normalizeAfterInsertion); }
 
 protected:
     virtual void addOverflowFromChildren();

Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.cpp (228592 => 228593)


--- trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2018-02-17 02:13:59 UTC (rev 228592)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2018-02-17 02:20:24 UTC (rev 228593)
@@ -2023,7 +2023,7 @@
     // Fresh floats need to be reparented if they actually belong to the previous anonymous block.
     // It copies the logic of RenderBlock::addChildIgnoringContinuation
     if (noLongerAffectsParentBlock() && style().isFloating() && previousSibling() && previousSibling()->isAnonymousBlock())
-        downcast<RenderBoxModelObject>(*parent()).moveChildTo(*RenderTreeBuilder::current(), &downcast<RenderBoxModelObject>(*previousSibling()), this, RenderBoxModelObject::NormalizeAfterInsertion::No);
+        RenderTreeBuilder::current()->moveChildTo(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.
@@ -2105,13 +2105,6 @@
     }
 }
 
-void RenderBlockFlow::moveAllChildrenIncludingFloatsTo(RenderTreeBuilder& builder, RenderBlock& toBlock, RenderBoxModelObject::NormalizeAfterInsertion normalizeAfterInsertion)
-{
-    auto& toBlockFlow = downcast<RenderBlockFlow>(toBlock);
-    moveAllChildrenTo(builder, &toBlockFlow, normalizeAfterInsertion);
-    addFloatsToNewParent(toBlockFlow);
-}
-
 void RenderBlockFlow::addOverflowFromFloats()
 {
     if (!m_floatingObjects)

Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.h (228592 => 228593)


--- trunk/Source/WebCore/rendering/RenderBlockFlow.h	2018-02-17 02:13:59 UTC (rev 228592)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.h	2018-02-17 02:20:24 UTC (rev 228593)
@@ -461,7 +461,7 @@
     // Called to lay out the legend for a fieldset or the ruby text of a ruby run. Also used by multi-column layout to handle
     // the flow thread child.
     void layoutExcludedChildren(bool relayoutChildren) override;
-    void moveAllChildrenIncludingFloatsTo(RenderTreeBuilder&, RenderBlock& toBlock, RenderBoxModelObject::NormalizeAfterInsertion) override;
+    void addOverflowFromFloats();
 
 private:
     bool recomputeLogicalWidthAndColumnWidth();
@@ -508,7 +508,6 @@
     bool hitTestFloats(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset) override;
     bool hitTestInlineChildren(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) override;
 
-    void addOverflowFromFloats();
     void addOverflowFromInlineChildren() override;
     
     void fitBorderToLinesIfNeeded(); // Shrink the box in which the border paints if border-fit is set.

Modified: trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp (228592 => 228593)


--- trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp	2018-02-17 02:13:59 UTC (rev 228592)
+++ trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp	2018-02-17 02:20:24 UTC (rev 228593)
@@ -2685,67 +2685,4 @@
         transformState.move(containerOffset.width(), containerOffset.height(), preserve3D ? TransformState::AccumulateTransform : TransformState::FlattenTransform);
 }
 
-void RenderBoxModelObject::moveChildTo(RenderTreeBuilder& builder, RenderBoxModelObject* toBoxModelObject, RenderObject* child, RenderObject* beforeChild, NormalizeAfterInsertion normalizeAfterInsertion)
-{
-    // We assume that callers have cleared their positioned objects list for child moves so the
-    // positioned renderer maps don't become stale. It would be too slow to do the map lookup on each call.
-    ASSERT(normalizeAfterInsertion == NormalizeAfterInsertion::No || !is<RenderBlock>(*this) || !downcast<RenderBlock>(*this).hasPositionedObjects());
-
-    ASSERT(this == child->parent());
-    ASSERT(!beforeChild || toBoxModelObject == beforeChild->parent());
-    if (normalizeAfterInsertion == NormalizeAfterInsertion::Yes && (toBoxModelObject->isRenderBlock() || toBoxModelObject->isRenderInline())) {
-        // Takes care of adding the new child correctly if toBlock and fromBlock
-        // have different kind of children (block vs inline).
-        auto childToMove = builder.takeChildFromRenderElement(*this, *child);
-        builder.insertChild(*toBoxModelObject, WTFMove(childToMove), beforeChild);
-    } else {
-        auto childToMove = builder.takeChildFromRenderElement(*this, *child);
-        builder.insertChildToRenderElementInternal(*toBoxModelObject, WTFMove(childToMove), beforeChild);
-    }
-}
-
-void RenderBoxModelObject::moveChildrenTo(RenderTreeBuilder& builder, RenderBoxModelObject* toBoxModelObject, RenderObject* startChild, RenderObject* endChild, RenderObject* beforeChild, NormalizeAfterInsertion normalizeAfterInsertion)
-{
-    // This condition is rarely hit since this function is usually called on
-    // anonymous blocks which can no longer carry positioned objects (see r120761)
-    // or when fullRemoveInsert is false.
-    if (normalizeAfterInsertion == NormalizeAfterInsertion::Yes && is<RenderBlock>(*this)) {
-        downcast<RenderBlock>(*this).removePositionedObjects(nullptr);
-        if (is<RenderBlockFlow>(*this))
-            downcast<RenderBlockFlow>(*this).removeFloatingObjects();
-    }
-
-    ASSERT(!beforeChild || toBoxModelObject == beforeChild->parent());
-    for (RenderObject* child = startChild; child && child != endChild; ) {
-        // Save our next sibling as moveChildTo will clear it.
-        RenderObject* nextSibling = child->nextSibling();
-        
-        // FIXME: This logic here fails to detect the first letter in certain cases
-        // and skips a valid sibling renderer (see webkit.org/b/163737).
-        // Check to make sure we're not saving the firstLetter as the nextSibling.
-        // When the |child| object will be moved, its firstLetter will be recreated,
-        // so saving it now in nextSibling would leave us with a stale object.
-        if (is<RenderTextFragment>(*child) && is<RenderText>(nextSibling)) {
-            RenderObject* firstLetterObj = nullptr;
-            if (RenderBlock* block = downcast<RenderTextFragment>(*child).blockForAccompanyingFirstLetter()) {
-                RenderElement* firstLetterContainer = nullptr;
-                block->getFirstLetter(firstLetterObj, firstLetterContainer, child);
-            }
-            
-            // This is the first letter, skip it.
-            if (firstLetterObj == nextSibling)
-                nextSibling = nextSibling->nextSibling();
-        }
-
-        moveChildTo(builder, toBoxModelObject, child, beforeChild, normalizeAfterInsertion);
-        child = nextSibling;
-    }
-}
-
-void RenderBoxModelObject::moveAllChildrenToInternal(RenderElement& newParent)
-{
-    while (firstChild())
-        newParent.attachRendererInternal(detachRendererInternal(*firstChild()), this);
-}
-
 } // namespace WebCore

Modified: trunk/Source/WebCore/rendering/RenderBoxModelObject.h (228592 => 228593)


--- trunk/Source/WebCore/rendering/RenderBoxModelObject.h	2018-02-17 02:13:59 UTC (rev 228592)
+++ trunk/Source/WebCore/rendering/RenderBoxModelObject.h	2018-02-17 02:20:24 UTC (rev 228593)
@@ -275,30 +275,6 @@
     void setFirstLetterRemainingText(RenderTextFragment&);
     void clearFirstLetterRemainingText();
 
-    // NormalizeAfterInsertion::Yes ensures that the destination subtree is consistent after the insertion (anonymous wrappers etc).
-    enum class NormalizeAfterInsertion { No, Yes };
-    void moveChildTo(RenderTreeBuilder&, RenderBoxModelObject* toBoxModelObject, RenderObject* child, RenderObject* beforeChild, NormalizeAfterInsertion);
-    void moveChildTo(RenderTreeBuilder& builder, RenderBoxModelObject* toBoxModelObject, RenderObject* child, NormalizeAfterInsertion normalizeAfterInsertion)
-    {
-        moveChildTo(builder, toBoxModelObject, child, nullptr, normalizeAfterInsertion);
-    }
-    void moveAllChildrenTo(RenderTreeBuilder& builder, RenderBoxModelObject* toBoxModelObject, NormalizeAfterInsertion normalizeAfterInsertion)
-    {
-        moveAllChildrenTo(builder, toBoxModelObject, nullptr, normalizeAfterInsertion);
-    }
-    void moveAllChildrenTo(RenderTreeBuilder& builder, RenderBoxModelObject* toBoxModelObject, RenderObject* beforeChild, NormalizeAfterInsertion normalizeAfterInsertion)
-    {
-        moveChildrenTo(builder, toBoxModelObject, firstChild(), nullptr, beforeChild, normalizeAfterInsertion);
-    }
-    void moveAllChildrenToInternal(RenderElement& newParent);
-    // Move all of the kids from |startChild| up to but excluding |endChild|. 0 can be passed as the |endChild| to denote
-    // that all the kids from |startChild| onwards should be moved.
-    void moveChildrenTo(RenderTreeBuilder& builder, RenderBoxModelObject* toBoxModelObject, RenderObject* startChild, RenderObject* endChild, NormalizeAfterInsertion normalizeAfterInsertion)
-    {
-        moveChildrenTo(builder, toBoxModelObject, startChild, endChild, nullptr, normalizeAfterInsertion);
-    }
-    void moveChildrenTo(RenderTreeBuilder&, RenderBoxModelObject* toBoxModelObject, RenderObject* startChild, RenderObject* endChild, RenderObject* beforeChild, NormalizeAfterInsertion);
-
     enum ScaleByEffectiveZoomOrNot { ScaleByEffectiveZoom, DoNotScaleByEffectiveZoom };
     LayoutSize calculateImageIntrinsicDimensions(StyleImage*, const LayoutSize& scaledPositioningAreaSize, ScaleByEffectiveZoomOrNot) const;
 

Modified: trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp (228592 => 228593)


--- trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp	2018-02-17 02:13:59 UTC (rev 228592)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp	2018-02-17 02:20:24 UTC (rev 228593)
@@ -46,6 +46,7 @@
 #include "RenderTableRow.h"
 #include "RenderTableSection.h"
 #include "RenderText.h"
+#include "RenderTextFragment.h"
 #include "RenderTreeBuilderBlock.h"
 #include "RenderTreeBuilderBlockFlow.h"
 #include "RenderTreeBuilderFirstLetter.h"
@@ -376,6 +377,92 @@
     newChild->setHasOutlineAutoAncestor();
 }
 
+void RenderTreeBuilder::moveChildTo(RenderBoxModelObject& from, RenderBoxModelObject* to, RenderObject* child, RenderObject* beforeChild, NormalizeAfterInsertion normalizeAfterInsertion)
+{
+    // We assume that callers have cleared their positioned objects list for child moves so the
+    // positioned renderer maps don't become stale. It would be too slow to do the map lookup on each call.
+    ASSERT(normalizeAfterInsertion == NormalizeAfterInsertion::No || !is<RenderBlock>(from) || !downcast<RenderBlock>(from).hasPositionedObjects());
+
+    ASSERT(&from == child->parent());
+    ASSERT(!beforeChild || to == beforeChild->parent());
+    if (normalizeAfterInsertion == NormalizeAfterInsertion::Yes && (to->isRenderBlock() || to->isRenderInline())) {
+        // Takes care of adding the new child correctly if toBlock and fromBlock
+        // have different kind of children (block vs inline).
+        auto childToMove = takeChildFromRenderElement(from, *child);
+        insertChild(*to, WTFMove(childToMove), beforeChild);
+    } else {
+        auto childToMove = takeChildFromRenderElement(from, *child);
+        insertChildToRenderElementInternal(*to, WTFMove(childToMove), beforeChild);
+    }
+}
+
+void RenderTreeBuilder::moveChildTo(RenderBoxModelObject& from, RenderBoxModelObject* to, RenderObject* child, NormalizeAfterInsertion normalizeAfterInsertion)
+{
+    moveChildTo(from, to, child, nullptr, normalizeAfterInsertion);
+}
+
+void RenderTreeBuilder::moveAllChildrenTo(RenderBoxModelObject& from, RenderBoxModelObject* to, NormalizeAfterInsertion normalizeAfterInsertion)
+{
+    moveAllChildrenTo(from, to, nullptr, normalizeAfterInsertion);
+}
+
+void RenderTreeBuilder::moveAllChildrenTo(RenderBoxModelObject& from, RenderBoxModelObject* to, RenderObject* beforeChild, NormalizeAfterInsertion normalizeAfterInsertion)
+{
+    moveChildrenTo(from, to, from.firstChild(), nullptr, beforeChild, normalizeAfterInsertion);
+}
+
+void RenderTreeBuilder::moveChildrenTo(RenderBoxModelObject& from, RenderBoxModelObject* to, RenderObject* startChild, RenderObject* endChild, NormalizeAfterInsertion normalizeAfterInsertion)
+{
+    moveChildrenTo(from, to, startChild, endChild, nullptr, normalizeAfterInsertion);
+}
+
+void RenderTreeBuilder::moveChildrenTo(RenderBoxModelObject& from, RenderBoxModelObject* to, RenderObject* startChild, RenderObject* endChild, RenderObject* beforeChild, NormalizeAfterInsertion normalizeAfterInsertion)
+{
+    // This condition is rarely hit since this function is usually called on
+    // anonymous blocks which can no longer carry positioned objects (see r120761)
+    // or when fullRemoveInsert is false.
+    if (normalizeAfterInsertion == NormalizeAfterInsertion::Yes && is<RenderBlock>(from)) {
+        downcast<RenderBlock>(from).removePositionedObjects(nullptr);
+        if (is<RenderBlockFlow>(from))
+            downcast<RenderBlockFlow>(from).removeFloatingObjects();
+    }
+
+    ASSERT(!beforeChild || to == beforeChild->parent());
+    for (RenderObject* child = startChild; child && child != endChild; ) {
+        // Save our next sibling as moveChildTo will clear it.
+        RenderObject* nextSibling = child->nextSibling();
+
+        // FIXME: This logic here fails to detect the first letter in certain cases
+        // and skips a valid sibling renderer (see webkit.org/b/163737).
+        // Check to make sure we're not saving the firstLetter as the nextSibling.
+        // When the |child| object will be moved, its firstLetter will be recreated,
+        // so saving it now in nextSibling would leave us with a stale object.
+        if (is<RenderTextFragment>(*child) && is<RenderText>(nextSibling)) {
+            RenderObject* firstLetterObj = nullptr;
+            if (RenderBlock* block = downcast<RenderTextFragment>(*child).blockForAccompanyingFirstLetter()) {
+                RenderElement* firstLetterContainer = nullptr;
+                block->getFirstLetter(firstLetterObj, firstLetterContainer, child);
+            }
+
+            // This is the first letter, skip it.
+            if (firstLetterObj == nextSibling)
+            nextSibling = nextSibling->nextSibling();
+        }
+
+        moveChildTo(from, to, child, beforeChild, normalizeAfterInsertion);
+        child = nextSibling;
+    }
+}
+
+void RenderTreeBuilder::moveAllChildrenIncludingFloatsTo(RenderBlock& from, RenderBlock& to, RenderTreeBuilder::NormalizeAfterInsertion normalizeAfterInsertion)
+{
+    if (is<RenderBlockFlow>(from)) {
+        blockFlowBuilder().moveAllChildrenIncludingFloatsTo(downcast<RenderBlockFlow>(from), to, normalizeAfterInsertion);
+        return;
+    }
+    moveAllChildrenTo(from, &to, normalizeAfterInsertion);
+}
+
 void RenderTreeBuilder::makeChildrenNonInline(RenderBlock& parent, RenderObject* insertionPoint)
 {
     // makeChildrenNonInline takes a block whose children are *all* inline and it
@@ -409,7 +496,7 @@
         auto newBlock = parent.createAnonymousBlock();
         auto& block = *newBlock;
         insertChildToRenderElementInternal(parent, WTFMove(newBlock), inlineRunStart);
-        parent.moveChildrenTo(*this, &block, inlineRunStart, child, RenderBoxModelObject::NormalizeAfterInsertion::No);
+        moveChildrenTo(parent, &block, inlineRunStart, child, RenderTreeBuilder::NormalizeAfterInsertion::No);
     }
 #ifndef NDEBUG
     for (RenderObject* c = parent.firstChild(); c; c = c->nextSibling())
@@ -438,7 +525,7 @@
             // See for example RenderTableCell:clippedOverflowRectForRepaint.
             markBoxForRelayoutAfterSplit(*parentBox);
             insertChildToRenderElementInternal(*parentBox, WTFMove(newPostBox), boxToSplit.nextSibling());
-            boxToSplit.moveChildrenTo(*this, &postBox, beforeChild, nullptr, RenderBoxModelObject::NormalizeAfterInsertion::Yes);
+            moveChildrenTo(boxToSplit, &postBox, beforeChild, nullptr, RenderTreeBuilder::NormalizeAfterInsertion::Yes);
 
             markBoxForRelayoutAfterSplit(boxToSplit);
             markBoxForRelayoutAfterSplit(postBox);

Modified: trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.h (228592 => 228593)


--- trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.h	2018-02-17 02:13:59 UTC (rev 228592)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.h	2018-02-17 02:20:24 UTC (rev 228593)
@@ -72,6 +72,17 @@
     void removeFromParentAndDestroyCleaningUpAnonymousWrappers(RenderObject& child);
     void multiColumnDescendantInserted(RenderMultiColumnFlow&, RenderObject& newDescendant);
 
+    // NormalizeAfterInsertion::Yes ensures that the destination subtree is consistent after the insertion (anonymous wrappers etc).
+    enum class NormalizeAfterInsertion { No, Yes };
+    void moveChildTo(RenderBoxModelObject& from, RenderBoxModelObject* to, RenderObject* child, RenderObject* beforeChild, NormalizeAfterInsertion);
+    void moveChildTo(RenderBoxModelObject& from, RenderBoxModelObject* to, RenderObject* child, NormalizeAfterInsertion);
+    void moveAllChildrenTo(RenderBoxModelObject& from, RenderBoxModelObject* to, NormalizeAfterInsertion);
+    void moveAllChildrenTo(RenderBoxModelObject& from, RenderBoxModelObject* to, RenderObject* beforeChild, NormalizeAfterInsertion);
+    // Move all of the kids from |startChild| up to but excluding |endChild|. 0 can be passed as the |endChild| to denote
+    // that all the kids from |startChild| onwards should be moved.
+    void moveChildrenTo(RenderBoxModelObject& from, RenderBoxModelObject* to, RenderObject* startChild, RenderObject* endChild, NormalizeAfterInsertion);
+    void moveChildrenTo(RenderBoxModelObject& from, RenderBoxModelObject* to, RenderObject* startChild, RenderObject* endChild, RenderObject* beforeChild, NormalizeAfterInsertion);
+
 private:
     class FirstLetter;
     class List;
@@ -92,6 +103,8 @@
     RenderPtr<RenderObject> takeChildFromRenderButton(RenderButton& parent, RenderObject& child);
     RenderPtr<RenderObject> takeChildFromRenderGrid(RenderGrid& parent, RenderObject& child);
 
+    void moveAllChildrenIncludingFloatsTo(RenderBlock& from, RenderBlock& toBlock, RenderTreeBuilder::NormalizeAfterInsertion);
+
     void insertChildToRenderGrid(RenderGrid& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild = nullptr);
     void insertChildToRenderElement(RenderElement& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild = nullptr);
 

Modified: trunk/Source/WebCore/rendering/updating/RenderTreeBuilderBlock.cpp (228592 => 228593)


--- trunk/Source/WebCore/rendering/updating/RenderTreeBuilderBlock.cpp	2018-02-17 02:13:59 UTC (rev 228592)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeBuilderBlock.cpp	2018-02-17 02:20:24 UTC (rev 228593)
@@ -36,6 +36,12 @@
 
 namespace WebCore {
 
+static void moveAllChildrenToInternal(RenderBoxModelObject& from, RenderElement& newParent)
+{
+    while (from.firstChild())
+        newParent.attachRendererInternal(from.detachRendererInternal(*from.firstChild()), &from);
+}
+
 static bool canDropAnonymousBlock(const RenderBlock& anonymousBlock)
 {
     if (anonymousBlock.beingDestroyed() || anonymousBlock.continuation())
@@ -260,7 +266,7 @@
         return;
 
     // FIXME: This should really just be a moveAllChilrenTo (see webkit.org/b/182495)
-    anonymousBlock.moveAllChildrenToInternal(*parent);
+    moveAllChildrenToInternal(anonymousBlock, *parent);
     auto toBeDestroyed = m_builder.takeChildFromRenderElement(*parent, anonymousBlock);
     // anonymousBlock is dead here.
 }
@@ -309,7 +315,7 @@
         } else {
             // Take all the children out of the |next| block and put them in
             // the |prev| block.
-            nextBlock.moveAllChildrenIncludingFloatsTo(m_builder, prevBlock, RenderBoxModelObject::NormalizeAfterInsertion::No);
+            m_builder.moveAllChildrenIncludingFloatsTo(nextBlock, prevBlock, RenderTreeBuilder::NormalizeAfterInsertion::No);
 
             // Delete the now-empty block's lines and nuke it.
             nextBlock.deleteLines();
@@ -361,7 +367,7 @@
     auto* nextSibling = child.nextSibling();
 
     auto toBeDeleted = m_builder.takeChildFromRenderElement(parent, child);
-    child.moveAllChildrenTo(m_builder, &parent, nextSibling, RenderBoxModelObject::NormalizeAfterInsertion::No);
+    m_builder.moveAllChildrenTo(child, &parent, nextSibling, RenderTreeBuilder::NormalizeAfterInsertion::No);
     // Delete the now-empty block's lines and nuke it.
     child.deleteLines();
 }

Modified: trunk/Source/WebCore/rendering/updating/RenderTreeBuilderBlockFlow.cpp (228592 => 228593)


--- trunk/Source/WebCore/rendering/updating/RenderTreeBuilderBlockFlow.cpp	2018-02-17 02:13:59 UTC (rev 228592)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeBuilderBlockFlow.cpp	2018-02-17 02:20:24 UTC (rev 228593)
@@ -45,6 +45,10 @@
     m_builder.blockBuilder().insertChild(parent, WTFMove(child), beforeChildOrPlaceholder);
 }
 
+void RenderTreeBuilder::BlockFlow::moveAllChildrenIncludingFloatsTo(RenderBlockFlow& from, RenderBlock& to, RenderTreeBuilder::NormalizeAfterInsertion normalizeAfterInsertion)
+{
+    m_builder.moveAllChildrenTo(from, &to, normalizeAfterInsertion);
+    from.addFloatsToNewParent(downcast<RenderBlockFlow>(to));
 }
 
-
+}

Modified: trunk/Source/WebCore/rendering/updating/RenderTreeBuilderBlockFlow.h (228592 => 228593)


--- trunk/Source/WebCore/rendering/updating/RenderTreeBuilderBlockFlow.h	2018-02-17 02:13:59 UTC (rev 228592)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeBuilderBlockFlow.h	2018-02-17 02:20:24 UTC (rev 228593)
@@ -34,9 +34,9 @@
     BlockFlow(RenderTreeBuilder&);
 
     void insertChild(RenderBlockFlow& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild);
+    void moveAllChildrenIncludingFloatsTo(RenderBlockFlow& from, RenderBlock& to, RenderTreeBuilder::NormalizeAfterInsertion);
 
 private:
-
     RenderTreeBuilder& m_builder;
 };
 

Modified: trunk/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.cpp (228592 => 228593)


--- trunk/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.cpp	2018-02-17 02:13:59 UTC (rev 228592)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.cpp	2018-02-17 02:20:24 UTC (rev 228593)
@@ -172,12 +172,12 @@
     m_builder.blockBuilder().insertChild(flow, WTFMove(newFragmentedFlow), nullptr);
 
     // Reparent children preceding the fragmented flow into the fragmented flow.
-    flow.moveChildrenTo(m_builder, &fragmentedFlow, flow.firstChild(), &fragmentedFlow, RenderBoxModelObject::NormalizeAfterInsertion::Yes);
+    m_builder.moveChildrenTo(flow, &fragmentedFlow, flow.firstChild(), &fragmentedFlow, RenderTreeBuilder::NormalizeAfterInsertion::Yes);
     if (flow.isFieldset()) {
         // Keep legends out of the flow thread.
         for (auto& box : childrenOfType<RenderBox>(fragmentedFlow)) {
             if (box.isLegend())
-                fragmentedFlow.moveChildTo(m_builder, &flow, &box, RenderBoxModelObject::NormalizeAfterInsertion::Yes);
+                m_builder.moveChildTo(fragmentedFlow, &flow, &box, RenderTreeBuilder::NormalizeAfterInsertion::Yes);
         }
     }
 
@@ -185,7 +185,7 @@
         // Keep the middle block out of the flow thread.
         for (auto& element : childrenOfType<RenderElement>(fragmentedFlow)) {
             if (!downcast<RenderLinesClampFlow>(fragmentedFlow).isChildAllowedInFragmentedFlow(flow, element))
-                fragmentedFlow.moveChildTo(m_builder, &flow, &element, RenderBoxModelObject::NormalizeAfterInsertion::Yes);
+                m_builder.moveChildTo(fragmentedFlow, &flow, &element, RenderTreeBuilder::NormalizeAfterInsertion::Yes);
         }
     }
 
@@ -215,7 +215,7 @@
         columnSet->removeFromParentAndDestroy(m_builder);
 
     flow.clearMultiColumnFlow();
-    multiColumnFlow.moveAllChildrenTo(m_builder, &flow, RenderBoxModelObject::NormalizeAfterInsertion::Yes);
+    m_builder.moveAllChildrenTo(multiColumnFlow, &flow, RenderTreeBuilder::NormalizeAfterInsertion::Yes);
     multiColumnFlow.removeFromParentAndDestroy(m_builder);
     for (auto& parentAndSpanner : parentAndSpannerList)
         m_builder.insertChild(*parentAndSpanner.first, WTFMove(parentAndSpanner.second));

Modified: trunk/Source/WebCore/rendering/updating/RenderTreeBuilderRuby.cpp (228592 => 228593)


--- trunk/Source/WebCore/rendering/updating/RenderTreeBuilderRuby.cpp	2018-02-17 02:13:59 UTC (rev 228592)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeBuilderRuby.cpp	2018-02-17 02:20:24 UTC (rev 228593)
@@ -143,7 +143,7 @@
         }
     }
     // Move our inline children into the target block we determined above.
-    from.moveChildrenTo(m_builder, toBlock, from.firstChild(), beforeChild, RenderBoxModelObject::NormalizeAfterInsertion::No);
+    m_builder.moveChildrenTo(from, toBlock, from.firstChild(), beforeChild, RenderTreeBuilder::NormalizeAfterInsertion::No);
 }
 
 void RenderTreeBuilder::Ruby::moveBlockChildren(RenderRubyBase& from, RenderRubyBase& to, RenderObject* beforeChild)
@@ -163,12 +163,12 @@
         && lastChildThere && lastChildThere->isAnonymousBlock() && lastChildThere->childrenInline()) {
         auto* anonBlockHere = downcast<RenderBlock>(firstChildHere);
         auto* anonBlockThere = downcast<RenderBlock>(lastChildThere);
-        anonBlockHere->moveAllChildrenTo(m_builder, anonBlockThere, RenderBoxModelObject::NormalizeAfterInsertion::Yes);
+        m_builder.moveAllChildrenTo(*anonBlockHere, anonBlockThere, RenderTreeBuilder::NormalizeAfterInsertion::Yes);
         anonBlockHere->deleteLines();
         anonBlockHere->removeFromParentAndDestroy(m_builder);
     }
     // Move all remaining children normally.
-    from.moveChildrenTo(m_builder, &to, from.firstChild(), beforeChild, RenderBoxModelObject::NormalizeAfterInsertion::No);
+    m_builder.moveChildrenTo(from, &to, from.firstChild(), beforeChild, RenderTreeBuilder::NormalizeAfterInsertion::No);
 }
 
 void RenderTreeBuilder::Ruby::moveChildren(RenderRubyBase& from, RenderRubyBase& to)
@@ -438,8 +438,8 @@
                 RenderRubyBase* rightBase = rightRun.rubyBase();
                 // Collect all children in a single base, then swap the bases.
                 moveChildren(*rightBase, *base);
-                parent.moveChildTo(m_builder, &rightRun, base, RenderBoxModelObject::NormalizeAfterInsertion::No);
-                rightRun.moveChildTo(m_builder, &parent, rightBase, RenderBoxModelObject::NormalizeAfterInsertion::No);
+                m_builder.moveChildTo(parent, &rightRun, base, RenderTreeBuilder::NormalizeAfterInsertion::No);
+                m_builder.moveChildTo(rightRun, &parent, rightBase, RenderTreeBuilder::NormalizeAfterInsertion::No);
                 // The now empty ruby base will be removed below.
                 ASSERT(!parent.rubyBase()->firstChild());
             }

Modified: trunk/Source/WebCore/rendering/updating/RenderTreeBuilderTable.cpp (228592 => 228593)


--- trunk/Source/WebCore/rendering/updating/RenderTreeBuilderTable.cpp	2018-02-17 02:13:59 UTC (rev 228592)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeBuilderTable.cpp	2018-02-17 02:20:24 UTC (rev 228593)
@@ -248,7 +248,7 @@
             currentRow = currentRow->nextRow();
             continue;
         }
-        currentRow->moveAllChildrenTo(m_builder, rowToInsertInto, RenderBoxModelObject::NormalizeAfterInsertion::No);
+        m_builder.moveAllChildrenTo(*currentRow, rowToInsertInto, RenderTreeBuilder::NormalizeAfterInsertion::No);
         auto toDestroy = m_builder.takeChild(*section, *currentRow);
         currentRow = currentRow->nextRow();
     }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to