Changeset 228650 in webkit


Ignore:
Timestamp:
Feb 19, 2018 3:41:49 AM (6 years ago)
Author:
Carlos Garcia Campos
Message:

Merge r228224 - [RenderTreeBuilder] Move RenderBlock::removeLeftoverAnonymousBlock to RenderTreeBuilder
https://bugs.webkit.org/show_bug.cgi?id=182510
<rdar://problem/37250037>

Reviewed by Antti Koivisto.

Do not reinvent subtree reparenting.

Covered by existing tests.

  • rendering/RenderBlock.cpp:

(WebCore::RenderBlock::removeLeftoverAnonymousBlock): Deleted.

  • rendering/RenderBlock.h:
  • rendering/RenderBoxModelObject.cpp:

(WebCore::RenderBoxModelObject::moveAllChildrenToInternal):

  • rendering/RenderBoxModelObject.h:
  • rendering/RenderButton.h:
  • rendering/RenderElement.cpp:

(WebCore::RenderElement::detachRendererInternal):
(WebCore::RenderElement::attachRendererInternal):
(WebCore::RenderElement::insertChildInternal):
(WebCore::RenderElement::takeChildInternal):

  • rendering/RenderElement.h:
  • rendering/RenderRuby.h:
  • rendering/RenderRubyRun.h:
  • rendering/RenderTextControl.h:
  • rendering/updating/RenderTreeBuilderBlock.cpp:

(WebCore::RenderTreeBuilder::Block::insertChildIgnoringContinuation):
(WebCore::RenderTreeBuilder::Block::childBecameNonInline):
(WebCore::RenderTreeBuilder::Block::removeLeftoverAnonymousBlock):

  • rendering/updating/RenderTreeBuilderBlock.h:
Location:
releases/WebKitGTK/webkit-2.20/Source/WebCore
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/ChangeLog

    r228646 r228650  
     12018-02-07  Zalan Bujtas  <zalan@apple.com>
     2
     3        [RenderTreeBuilder] Move RenderBlock::removeLeftoverAnonymousBlock to RenderTreeBuilder
     4        https://bugs.webkit.org/show_bug.cgi?id=182510
     5        <rdar://problem/37250037>
     6
     7        Reviewed by Antti Koivisto.
     8
     9        Do not reinvent subtree reparenting.
     10
     11        Covered by existing tests.
     12
     13        * rendering/RenderBlock.cpp:
     14        (WebCore::RenderBlock::removeLeftoverAnonymousBlock): Deleted.
     15        * rendering/RenderBlock.h:
     16        * rendering/RenderBoxModelObject.cpp:
     17        (WebCore::RenderBoxModelObject::moveAllChildrenToInternal):
     18        * rendering/RenderBoxModelObject.h:
     19        * rendering/RenderButton.h:
     20        * rendering/RenderElement.cpp:
     21        (WebCore::RenderElement::detachRendererInternal):
     22        (WebCore::RenderElement::attachRendererInternal):
     23        (WebCore::RenderElement::insertChildInternal):
     24        (WebCore::RenderElement::takeChildInternal):
     25        * rendering/RenderElement.h:
     26        * rendering/RenderRuby.h:
     27        * rendering/RenderRubyRun.h:
     28        * rendering/RenderTextControl.h:
     29        * rendering/updating/RenderTreeBuilderBlock.cpp:
     30        (WebCore::RenderTreeBuilder::Block::insertChildIgnoringContinuation):
     31        (WebCore::RenderTreeBuilder::Block::childBecameNonInline):
     32        (WebCore::RenderTreeBuilder::Block::removeLeftoverAnonymousBlock):
     33        * rendering/updating/RenderTreeBuilderBlock.h:
     34
    1352018-02-06  Don Olmstead  <don.olmstead@sony.com>
    236
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderBlock.cpp

    r227977 r228650  
    483483}
    484484
    485 void RenderBlock::removeLeftoverAnonymousBlock(RenderBlock* child)
    486 {
    487     ASSERT(child->isAnonymousBlock());
    488     ASSERT(!child->childrenInline());
    489    
    490     if (child->continuation())
    491         return;
    492    
    493     RenderObject* firstAnChild = child->firstChild();
    494     RenderObject* lastAnChild = child->lastChild();
    495     if (firstAnChild) {
    496         RenderObject* o = firstAnChild;
    497         while (o) {
    498             o->setParent(this);
    499             o = o->nextSibling();
    500         }
    501         firstAnChild->setPreviousSibling(child->previousSibling());
    502         lastAnChild->setNextSibling(child->nextSibling());
    503         if (child->previousSibling())
    504             child->previousSibling()->setNextSibling(firstAnChild);
    505         if (child->nextSibling())
    506             child->nextSibling()->setPreviousSibling(lastAnChild);
    507            
    508         if (child == firstChild())
    509             setFirstChild(firstAnChild);
    510         if (child == lastChild())
    511             setLastChild(lastAnChild);
    512     } else {
    513         if (child == firstChild())
    514             setFirstChild(child->nextSibling());
    515         if (child == lastChild())
    516             setLastChild(child->previousSibling());
    517 
    518         if (child->previousSibling())
    519             child->previousSibling()->setNextSibling(child->nextSibling());
    520         if (child->nextSibling())
    521             child->nextSibling()->setPreviousSibling(child->previousSibling());
    522     }
    523 
    524     child->setFirstChild(nullptr);
    525     child->m_next = nullptr;
    526 
    527     // Remove all the information in the flow thread associated with the leftover anonymous block.
    528     child->resetFragmentedFlowStateOnRemoval();
    529 
    530     child->setParent(nullptr);
    531     child->setPreviousSibling(nullptr);
    532     child->setNextSibling(nullptr);
    533 
    534     child->destroy();
    535 }
    536 
    537485static bool canDropAnonymousBlock(const RenderBlock& anonymousBlock)
    538486{
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderBlock.h

    r227977 r228650  
    397397    LayoutRect paintRectToClipOutFromBorder(const LayoutRect&) override;
    398398    void addChildIgnoringContinuation(RenderTreeBuilder&, RenderPtr<RenderObject> newChild, RenderObject* beforeChild) override;
    399     virtual void removeLeftoverAnonymousBlock(RenderBlock* child);
    400399    bool isInlineBlockOrInlineTable() const final { return isInline() && isReplaced(); }
    401400
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderBoxModelObject.cpp

    r226007 r228650  
    27432743}
    27442744
     2745void RenderBoxModelObject::moveAllChildrenToInternal(RenderElement& newParent)
     2746{
     2747    while (firstChild())
     2748        newParent.attachRendererInternal(detachRendererInternal(*firstChild()), this);
     2749}
     2750
    27452751} // namespace WebCore
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderBoxModelObject.h

    r227791 r228650  
    291291        moveChildrenTo(toBoxModelObject, firstChild(), nullptr, beforeChild, normalizeAfterInsertion);
    292292    }
     293    void moveAllChildrenToInternal(RenderElement& newParent);
    293294    // Move all of the kids from |startChild| up to but excluding |endChild|. 0 can be passed as the |endChild| to denote
    294295    // that all the kids from |startChild| onwards should be moved.
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderButton.h

    r227977 r228650  
    4343
    4444    RenderPtr<RenderObject> takeChild(RenderTreeBuilder&, RenderObject&) override;
    45     void removeLeftoverAnonymousBlock(RenderBlock*) override { }
    4645    bool createsAnonymousWrapper() const override { return true; }
    4746
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderElement.cpp

    r227977 r228650  
    500500}
    501501
     502RenderObject* RenderElement::attachRendererInternal(RenderPtr<RenderObject> child, RenderObject* beforeChild)
     503{
     504    child->setParent(this);
     505
     506    if (m_firstChild == beforeChild)
     507        m_firstChild = child.get();
     508
     509    if (beforeChild) {
     510        auto* previousSibling = beforeChild->previousSibling();
     511        if (previousSibling)
     512            previousSibling->setNextSibling(child.get());
     513        child->setPreviousSibling(previousSibling);
     514        child->setNextSibling(beforeChild);
     515        beforeChild->setPreviousSibling(child.get());
     516        return child.release();
     517    }
     518    if (m_lastChild)
     519        m_lastChild->setNextSibling(child.get());
     520    child->setPreviousSibling(m_lastChild);
     521    m_lastChild = child.get();
     522    return child.release();
     523}
     524
     525RenderPtr<RenderObject> RenderElement::detachRendererInternal(RenderObject& renderer)
     526{
     527    auto* parent = renderer.parent();
     528    ASSERT(parent);
     529    auto* nextSibling = renderer.nextSibling();
     530
     531    if (renderer.previousSibling())
     532        renderer.previousSibling()->setNextSibling(nextSibling);
     533    if (nextSibling)
     534        nextSibling->setPreviousSibling(renderer.previousSibling());
     535
     536    if (parent->firstChild() == &renderer)
     537        parent->m_firstChild = nextSibling;
     538    if (parent->lastChild() == &renderer)
     539        parent->m_lastChild = renderer.previousSibling();
     540
     541    renderer.setPreviousSibling(nullptr);
     542    renderer.setNextSibling(nullptr);
     543    renderer.setParent(nullptr);
     544    return RenderPtr<RenderObject>(&renderer);
     545}
     546
    502547void RenderElement::insertChildInternal(RenderPtr<RenderObject> newChildPtr, RenderObject* beforeChild)
    503548{
     
    515560
    516561    // Take the ownership.
    517     auto* newChild = newChildPtr.release();
    518 
    519     newChild->setParent(this);
    520 
    521     if (m_firstChild == beforeChild)
    522         m_firstChild = newChild;
    523 
    524     if (beforeChild) {
    525         RenderObject* previousSibling = beforeChild->previousSibling();
    526         if (previousSibling)
    527             previousSibling->setNextSibling(newChild);
    528         newChild->setPreviousSibling(previousSibling);
    529         newChild->setNextSibling(beforeChild);
    530         beforeChild->setPreviousSibling(newChild);
    531     } else {
    532         if (lastChild())
    533             lastChild()->setNextSibling(newChild);
    534         newChild->setPreviousSibling(lastChild());
    535         m_lastChild = newChild;
    536     }
     562    auto* newChild = attachRendererInternal(WTFMove(newChildPtr), beforeChild);
    537563
    538564    newChild->initializeFragmentedFlowStateOnInsertion();
     
    600626    // This is needed to avoid race conditions where willBeRemovedFromTree would dirty the tree's structure
    601627    // and the code running here would force an untimely rebuilding, leaving |oldChild| dangling.
    602    
    603     RenderObject* nextSibling = oldChild.nextSibling();
    604 
    605     if (oldChild.previousSibling())
    606         oldChild.previousSibling()->setNextSibling(nextSibling);
    607     if (nextSibling)
    608         nextSibling->setPreviousSibling(oldChild.previousSibling());
    609 
    610     if (m_firstChild == &oldChild)
    611         m_firstChild = nextSibling;
    612     if (m_lastChild == &oldChild)
    613         m_lastChild = oldChild.previousSibling();
    614 
    615     oldChild.setPreviousSibling(nullptr);
    616     oldChild.setNextSibling(nullptr);
    617     oldChild.setParent(nullptr);
     628    auto childToTake = detachRendererInternal(oldChild);
    618629
    619630    // rendererRemovedFromTree walks the whole subtree. We can improve performance
    620631    // by skipping this step when destroying the entire tree.
    621     if (!renderTreeBeingDestroyed() && is<RenderElement>(oldChild))
    622         RenderCounter::rendererRemovedFromTree(downcast<RenderElement>(oldChild));
     632    if (!renderTreeBeingDestroyed() && is<RenderElement>(*childToTake))
     633        RenderCounter::rendererRemovedFromTree(downcast<RenderElement>(*childToTake));
    623634
    624635    if (!renderTreeBeingDestroyed()) {
     
    627638    }
    628639
    629     return RenderPtr<RenderObject>(&oldChild);
     640    return childToTake;
    630641}
    631642
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderElement.h

    r227977 r228650  
    230230
    231231    void destroyLeftoverChildren();
     232    RenderObject* attachRendererInternal(RenderPtr<RenderObject> child, RenderObject* beforeChild);
     233    RenderPtr<RenderObject> detachRendererInternal(RenderObject&);
    232234
    233235protected:
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderRuby.h

    r227977 r228650  
    8686    const char* renderName() const override { return "RenderRuby (block)"; }
    8787    bool createsAnonymousWrapper() const override { return true; }
    88     void removeLeftoverAnonymousBlock(RenderBlock*) override { ASSERT_NOT_REACHED(); }
    8988};
    9089
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderRubyRun.h

    r227977 r228650  
    7979    const char* renderName() const override { return "RenderRubyRun (anonymous)"; }
    8080    bool createsAnonymousWrapper() const override { return true; }
    81     void removeLeftoverAnonymousBlock(RenderBlock*) override { }
    8281
    8382private:
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderTextControl.h

    r224537 r228650  
    7575    void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const override;
    7676    void computePreferredLogicalWidths() override;
    77     void removeLeftoverAnonymousBlock(RenderBlock*) override { }
    7877    bool avoidsFloats() const override { return true; }
    7978    bool canHaveGeneratedChildren() const override { return false; }
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilderBlock.cpp

    r227791 r228650  
    2727#include "RenderTreeBuilderBlock.h"
    2828
     29#include "RenderButton.h"
    2930#include "RenderChildIterator.h"
    3031#include "RenderFullScreen.h"
     32#include "RenderRuby.h"
     33#include "RenderRubyRun.h"
     34#include "RenderTextControl.h"
    3135
    3236namespace WebCore {
     
    194198
    195199    if (madeBoxesNonInline && is<RenderBlock>(parent.parent()) && parent.isAnonymousBlock())
    196         downcast<RenderBlock>(*parent.parent()).removeLeftoverAnonymousBlock(&parent);
     200        removeLeftoverAnonymousBlock(parent);
    197201    // parent object may be dead here
    198202}
     
    202206    m_builder.makeChildrenNonInline(parent);
    203207    if (parent.isAnonymousBlock() && is<RenderBlock>(parent.parent()))
    204         downcast<RenderBlock>(*parent.parent()).removeLeftoverAnonymousBlock(&parent);
     208        removeLeftoverAnonymousBlock(parent);
    205209    // parent may be dead here
    206210}
    207211
    208 }
     212void RenderTreeBuilder::Block::removeLeftoverAnonymousBlock(RenderBlock& anonymousBlock)
     213{
     214    ASSERT(anonymousBlock.isAnonymousBlock());
     215    ASSERT(!anonymousBlock.childrenInline());
     216    ASSERT(anonymousBlock.parent());
     217
     218    if (anonymousBlock.continuation())
     219        return;
     220
     221    auto* parent = anonymousBlock.parent();
     222    if (is<RenderButton>(*parent) || is<RenderTextControl>(*parent) || is<RenderRubyAsBlock>(*parent) || is<RenderRubyRun>(*parent))
     223        return;
     224
     225    // FIXME: This should really just be a moveAllChilrenTo (see webkit.org/b/182495)
     226    anonymousBlock.moveAllChildrenToInternal(*parent);
     227    auto toBeDestroyed = parent->takeChildInternal(anonymousBlock);
     228    // anonymousBlock is dead here.
     229}
     230
     231}
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilderBlock.h

    r227791 r228650  
    4141private:
    4242    void insertChildToContinuation(RenderBlock& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild);
     43    void removeLeftoverAnonymousBlock(RenderBlock& anonymousBlock);
    4344
    4445    RenderTreeBuilder& m_builder;
Note: See TracChangeset for help on using the changeset viewer.