Changeset 228685 in webkit


Ignore:
Timestamp:
Feb 19, 2018 7:51:54 AM (6 years ago)
Author:
Carlos Garcia Campos
Message:

Merge r228327 - [RenderTreeBuilder] Move multicolumn descendant/sibling removal logic to RenderTreeBuilder
https://bugs.webkit.org/show_bug.cgi?id=182628
<rdar://problem/37369528>

Reviewed by Antti Koivisto.

No change in functionality

  • rendering/RenderBlockFlow.cpp:

(WebCore::RenderBlockFlow::takeChild):

  • rendering/RenderFragmentedFlow.h:
  • rendering/RenderMultiColumnFlow.cpp:

(WebCore::RenderMultiColumnFlow::handleSpannerRemoval): Deleted.
(WebCore::RenderMultiColumnFlow::fragmentedFlowRelativeWillBeRemoved): Deleted.

  • rendering/RenderMultiColumnFlow.h:
  • rendering/updating/RenderTreeBuilder.cpp:

(WebCore::RenderTreeBuilder::multiColumnRelativeWillBeRemoved):

  • rendering/updating/RenderTreeBuilder.h:
  • rendering/updating/RenderTreeBuilderMultiColumn.cpp:

(WebCore::RenderTreeBuilder::MultiColumn::handleSpannerRemoval):
(WebCore::RenderTreeBuilder::MultiColumn::multiColumnRelativeWillBeRemoved):

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

Legend:

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

    r228684 r228685  
     12018-02-09  Zalan Bujtas  <zalan@apple.com>
     2
     3        [RenderTreeBuilder] Move multicolumn descendant/sibling removal logic to RenderTreeBuilder
     4        https://bugs.webkit.org/show_bug.cgi?id=182628
     5        <rdar://problem/37369528>
     6
     7        Reviewed by Antti Koivisto.
     8
     9        No change in functionality
     10
     11        * rendering/RenderBlockFlow.cpp:
     12        (WebCore::RenderBlockFlow::takeChild):
     13        * rendering/RenderFragmentedFlow.h:
     14        * rendering/RenderMultiColumnFlow.cpp:
     15        (WebCore::RenderMultiColumnFlow::handleSpannerRemoval): Deleted.
     16        (WebCore::RenderMultiColumnFlow::fragmentedFlowRelativeWillBeRemoved): Deleted.
     17        * rendering/RenderMultiColumnFlow.h:
     18        * rendering/updating/RenderTreeBuilder.cpp:
     19        (WebCore::RenderTreeBuilder::multiColumnRelativeWillBeRemoved):
     20        * rendering/updating/RenderTreeBuilder.h:
     21        * rendering/updating/RenderTreeBuilderMultiColumn.cpp:
     22        (WebCore::RenderTreeBuilder::MultiColumn::handleSpannerRemoval):
     23        (WebCore::RenderTreeBuilder::MultiColumn::multiColumnRelativeWillBeRemoved):
     24        * rendering/updating/RenderTreeBuilderMultiColumn.h:
     25
    1262018-02-08  Philippe Normand  <pnormand@igalia.com>
    227
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderBlockFlow.cpp

    r228668 r228685  
    38533853{
    38543854    if (!renderTreeBeingDestroyed()) {
    3855         RenderFragmentedFlow* fragmentedFlow = multiColumnFlow();
     3855        auto* fragmentedFlow = multiColumnFlow();
    38563856        if (fragmentedFlow && fragmentedFlow != &oldChild)
    3857             fragmentedFlow->fragmentedFlowRelativeWillBeRemoved(oldChild);
     3857            builder.multiColumnRelativeWillBeRemoved(*fragmentedFlow, oldChild);
    38583858    }
    38593859    return RenderBlock::takeChild(builder, oldChild);
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderFragmentedFlow.h

    r228682 r228685  
    8787    virtual bool singleFragmentHasUniformLogicalHeight() const { return true; }
    8888   
    89     // Called when a sibling or descendant of the flow thread is about to be removed.
    90     virtual void fragmentedFlowRelativeWillBeRemoved(RenderObject&) { }
    9189    // Called when a descendant box's layout is finished and it has been positioned within its container.
    9290    virtual void fragmentedFlowDescendantBoxLaidOut(RenderBox*) { }
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderMultiColumnFlow.cpp

    r228682 r228685  
    166166}
    167167
    168 void RenderMultiColumnFlow::handleSpannerRemoval(RenderObject& spanner)
    169 {
    170     // The placeholder may already have been removed, but if it hasn't, do so now.
    171     if (auto placeholder = spannerMap().take(&downcast<RenderBox>(spanner)))
    172         placeholder->removeFromParentAndDestroy();
    173 
    174     if (RenderObject* next = spanner.nextSibling()) {
    175         if (RenderObject* previous = spanner.previousSibling()) {
    176             if (previous->isRenderMultiColumnSet() && next->isRenderMultiColumnSet()) {
    177                 // Merge two sets that no longer will be separated by a spanner.
    178                 next->removeFromParentAndDestroy();
    179                 previous->setNeedsLayout();
    180             }
    181         }
    182     }
    183 }
    184 
    185 void RenderMultiColumnFlow::fragmentedFlowRelativeWillBeRemoved(RenderObject& relative)
    186 {
    187     invalidateFragments();
    188     if (is<RenderMultiColumnSpannerPlaceholder>(relative)) {
    189         // Remove the map entry for this spanner, but leave the actual spanner renderer alone. Also
    190         // keep the reference to the spanner, since the placeholder may be about to be re-inserted
    191         // in the tree.
    192         ASSERT(relative.isDescendantOf(this));
    193         spannerMap().remove(downcast<RenderMultiColumnSpannerPlaceholder>(relative).spanner());
    194         return;
    195     }
    196     if (relative.style().columnSpan() == ColumnSpanAll) {
    197         if (relative.parent() != parent())
    198             return; // not a valid spanner.
    199        
    200         handleSpannerRemoval(relative);
    201     }
    202     // Note that we might end up with empty column sets if all column content is removed. That's no
    203     // big deal though (and locating them would be expensive), and they will be found and re-used if
    204     // content is added again later.
    205 }
    206 
    207168void RenderMultiColumnFlow::fragmentedFlowDescendantBoxLaidOut(RenderBox* descendant)
    208169{
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderMultiColumnFlow.h

    r228682 r228685  
    108108    void addFragmentToThread(RenderFragmentContainer*) override;
    109109    void willBeRemovedFromTree() override;
    110     void fragmentedFlowRelativeWillBeRemoved(RenderObject&) override;
    111110    void fragmentedFlowDescendantBoxLaidOut(RenderBox*) override;
    112111    LogicalExtentComputedValues computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop) const override;
     
    118117    bool addForcedFragmentBreak(const RenderBlock*, LayoutUnit, RenderBox* breakChild, bool isBefore, LayoutUnit* offsetBreakAdjustment = 0) override;
    119118    bool isPageLogicalHeightKnown() const override;
    120 
    121     void handleSpannerRemoval(RenderObject& spanner);
    122119
    123120private:
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp

    r228682 r228685  
    406406    // WARNING: child is deleted here.
    407407}
     408void RenderTreeBuilder::multiColumnRelativeWillBeRemoved(RenderMultiColumnFlow& flow, RenderObject& relative)
     409{
     410    multiColumnBuilder().multiColumnRelativeWillBeRemoved(flow, relative);
     411}
    408412
    409413void RenderTreeBuilder::insertChildToRenderInline(RenderInline& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild)
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilder.h

    r228682 r228685  
    8181    void removeFromParentAndDestroyCleaningUpAnonymousWrappers(RenderObject& child);
    8282    void multiColumnDescendantInserted(RenderMultiColumnFlow&, RenderObject& newDescendant);
     83    void multiColumnRelativeWillBeRemoved(RenderMultiColumnFlow&, RenderObject& relative);
    8384
    8485private:
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.cpp

    r228682 r228685  
    368368}
    369369
    370 }
     370void RenderTreeBuilder::MultiColumn::handleSpannerRemoval(RenderMultiColumnFlow& flow, RenderObject& spanner)
     371{
     372    // The placeholder may already have been removed, but if it hasn't, do so now.
     373    if (auto placeholder = flow.spannerMap().take(&downcast<RenderBox>(spanner)))
     374        placeholder->removeFromParentAndDestroy();
     375
     376    if (auto* next = spanner.nextSibling()) {
     377        if (auto* previous = spanner.previousSibling()) {
     378            if (previous->isRenderMultiColumnSet() && next->isRenderMultiColumnSet()) {
     379                // Merge two sets that no longer will be separated by a spanner.
     380                next->removeFromParentAndDestroy();
     381                previous->setNeedsLayout();
     382            }
     383        }
     384    }
     385}
     386
     387void RenderTreeBuilder::MultiColumn::multiColumnRelativeWillBeRemoved(RenderMultiColumnFlow& flow, RenderObject& relative)
     388{
     389    flow.invalidateFragments();
     390    if (is<RenderMultiColumnSpannerPlaceholder>(relative)) {
     391        // Remove the map entry for this spanner, but leave the actual spanner renderer alone. Also
     392        // keep the reference to the spanner, since the placeholder may be about to be re-inserted
     393        // in the tree.
     394        ASSERT(relative.isDescendantOf(&flow));
     395        flow.spannerMap().remove(downcast<RenderMultiColumnSpannerPlaceholder>(relative).spanner());
     396        return;
     397    }
     398    if (relative.style().columnSpan() == ColumnSpanAll) {
     399        if (relative.parent() != flow.parent())
     400            return; // not a valid spanner.
     401
     402        handleSpannerRemoval(flow, relative);
     403    }
     404    // Note that we might end up with empty column sets if all column content is removed. That's no
     405    // big deal though (and locating them would be expensive), and they will be found and re-used if
     406    // content is added again later.
     407}
     408
     409}
  • releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.h

    r228682 r228685  
    4242    RenderObject* resolveMovedChild(RenderFragmentedFlow& enclosingFragmentedFlow, RenderObject* beforeChild);
    4343    void multiColumnDescendantInserted(RenderMultiColumnFlow&, RenderObject& newDescendant);
     44    void multiColumnRelativeWillBeRemoved(RenderMultiColumnFlow&, RenderObject& relative);
    4445
    4546private:
     
    4748    void destroyFragmentedFlow(RenderBlockFlow&);
    4849    RenderObject* processPossibleSpannerDescendant(RenderMultiColumnFlow&, RenderObject*& subtreeRoot, RenderObject& descendant);
     50    void handleSpannerRemoval(RenderMultiColumnFlow&, RenderObject& spanner);
    4951
    5052    RenderTreeBuilder& m_builder;
Note: See TracChangeset for help on using the changeset viewer.