Changeset 208005 in webkit


Ignore:
Timestamp:
Oct 27, 2016 2:19:34 PM (8 years ago)
Author:
Alan Bujtas
Message:

RenderMultiColumnFlowThread::processPossibleSpannerDescendant should take RenderObject& instead of RenderObject*
https://bugs.webkit.org/show_bug.cgi?id=164072

Reviewed by Simon Fraser.

No change in functionality.

  • rendering/RenderFlowThread.h:
  • rendering/RenderMultiColumnFlowThread.cpp:

(WebCore::findSetRendering):
(WebCore::isValidColumnSpanner):
(WebCore::RenderMultiColumnFlowThread::processPossibleSpannerDescendant):
(WebCore::RenderMultiColumnFlowThread::flowThreadDescendantInserted):
(WebCore::RenderMultiColumnFlowThread::findSetRendering): Deleted.

  • rendering/RenderMultiColumnFlowThread.h:
  • rendering/RenderMultiColumnSet.cpp:

(WebCore::precedesRenderer):
(WebCore::RenderMultiColumnSet::containsRendererInFlowThread):

  • rendering/RenderMultiColumnSet.h:
  • rendering/RenderMultiColumnSpannerPlaceholder.cpp:

(WebCore::RenderMultiColumnSpannerPlaceholder::createAnonymous):
(WebCore::RenderMultiColumnSpannerPlaceholder::RenderMultiColumnSpannerPlaceholder):

  • rendering/RenderMultiColumnSpannerPlaceholder.h:
  • rendering/RenderObject.cpp:

(WebCore::RenderObject::insertedIntoTree):

Location:
trunk/Source/WebCore
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r208003 r208005  
     12016-10-27  Zalan Bujtas  <zalan@apple.com>
     2
     3        RenderMultiColumnFlowThread::processPossibleSpannerDescendant should take RenderObject& instead of RenderObject*
     4        https://bugs.webkit.org/show_bug.cgi?id=164072
     5
     6        Reviewed by Simon Fraser.
     7
     8        No change in functionality.
     9
     10        * rendering/RenderFlowThread.h:
     11        * rendering/RenderMultiColumnFlowThread.cpp:
     12        (WebCore::findSetRendering):
     13        (WebCore::isValidColumnSpanner):
     14        (WebCore::RenderMultiColumnFlowThread::processPossibleSpannerDescendant):
     15        (WebCore::RenderMultiColumnFlowThread::flowThreadDescendantInserted):
     16        (WebCore::RenderMultiColumnFlowThread::findSetRendering): Deleted.
     17        * rendering/RenderMultiColumnFlowThread.h:
     18        * rendering/RenderMultiColumnSet.cpp:
     19        (WebCore::precedesRenderer):
     20        (WebCore::RenderMultiColumnSet::containsRendererInFlowThread):
     21        * rendering/RenderMultiColumnSet.h:
     22        * rendering/RenderMultiColumnSpannerPlaceholder.cpp:
     23        (WebCore::RenderMultiColumnSpannerPlaceholder::createAnonymous):
     24        (WebCore::RenderMultiColumnSpannerPlaceholder::RenderMultiColumnSpannerPlaceholder):
     25        * rendering/RenderMultiColumnSpannerPlaceholder.h:
     26        * rendering/RenderObject.cpp:
     27        (WebCore::RenderObject::insertedIntoTree):
     28
    1292016-10-27  Brent Fulgham  <bfulgham@apple.com>
    230
  • trunk/Source/WebCore/rendering/RenderFlowThread.h

    r206049 r208005  
    9393    virtual RenderObject* resolveMovedChild(RenderObject* child) const { return child; }
    9494    // Called when a descendant of the flow thread has been inserted.
    95     virtual void flowThreadDescendantInserted(RenderObject*) { }
     95    virtual void flowThreadDescendantInserted(RenderObject&) { }
    9696    // Called when a sibling or descendant of the flow thread is about to be removed.
    9797    virtual void flowThreadRelativeWillBeRemoved(RenderObject*) { }
  • trunk/Source/WebCore/rendering/RenderMultiColumnFlowThread.cpp

    r207930 r208005  
    134134}
    135135
    136 RenderMultiColumnSet* RenderMultiColumnFlowThread::findSetRendering(RenderObject* renderer) const
    137 {
    138     for (RenderMultiColumnSet* multicolSet = firstMultiColumnSet(); multicolSet; multicolSet = multicolSet->nextSiblingMultiColumnSet()) {
     136static RenderMultiColumnSet* findSetRendering(const RenderMultiColumnFlowThread& flowThread, const RenderObject& renderer)
     137{
     138    // Find the set inside which the specified renderer would be rendered.
     139    for (auto* multicolSet = flowThread.firstMultiColumnSet(); multicolSet; multicolSet = multicolSet->nextSiblingMultiColumnSet()) {
    139140        if (multicolSet->containsRendererInFlowThread(renderer))
    140141            return multicolSet;
     
    234235}
    235236
    236 static bool isValidColumnSpanner(RenderMultiColumnFlowThread* flowThread, RenderObject* descendant)
     237static bool isValidColumnSpanner(const RenderMultiColumnFlowThread& flowThread, const RenderObject& descendant)
    237238{
    238239    // We assume that we're inside the flow thread. This function is not to be called otherwise.
    239     ASSERT(descendant->isDescendantOf(flowThread));
     240    ASSERT(descendant.isDescendantOf(&flowThread));
    240241
    241242    // First make sure that the renderer itself has the right properties for becoming a spanner.
    242     auto& style = descendant->style();
    243     if (style.columnSpan() != ColumnSpanAll || !is<RenderBox>(*descendant) || descendant->isFloatingOrOutOfFlowPositioned())
     243    auto& style = descendant.style();
     244    if (style.columnSpan() != ColumnSpanAll || !is<RenderBox>(descendant) || descendant.isFloatingOrOutOfFlowPositioned())
    244245        return false;
    245246
    246     RenderElement* container = descendant->parent();
     247    RenderElement* container = descendant.parent();
    247248    if (!is<RenderBlockFlow>(*container) || container->childrenInline()) {
    248249        // Needs to be block-level.
     
    251252   
    252253    // We need to have the flow thread as the containing block. A spanner cannot break out of the flow thread.
    253     RenderFlowThread* enclosingFlowThread = descendant->flowThreadContainingBlock();
    254     if (enclosingFlowThread != flowThread)
     254    RenderFlowThread* enclosingFlowThread = descendant.flowThreadContainingBlock();
     255    if (enclosingFlowThread != &flowThread)
    255256        return false;
    256257
    257258    // This looks like a spanner, but if we're inside something unbreakable, it's not to be treated as one.
    258     for (RenderBox* ancestor = downcast<RenderBox>(*descendant).containingBlock(); ancestor && !is<RenderView>(*ancestor); ancestor = ancestor->containingBlock()) {
     259    for (auto* ancestor = downcast<RenderBox>(descendant).containingBlock(); ancestor && !is<RenderView>(*ancestor); ancestor = ancestor->containingBlock()) {
    259260        if (ancestor->isRenderFlowThread()) {
    260261            // Don't allow any intervening non-multicol fragmentation contexts. The spec doesn't say
    261262            // anything about disallowing this, but it's just going to be too complicated to
    262263            // implement (not to mention specify behavior).
    263             return ancestor == flowThread;
    264         }
    265         ASSERT(ancestor->style().columnSpan() != ColumnSpanAll || !isValidColumnSpanner(flowThread, ancestor));
     264            return ancestor == &flowThread;
     265        }
     266        ASSERT(ancestor->style().columnSpan() != ColumnSpanAll || !isValidColumnSpanner(flowThread, *ancestor));
    266267        if (ancestor->isUnsplittableForPagination())
    267268            return false;
     
    295296}
    296297
    297 RenderObject* RenderMultiColumnFlowThread::processPossibleSpannerDescendant(RenderObject*& subtreeRoot, RenderObject* descendant)
     298RenderObject* RenderMultiColumnFlowThread::processPossibleSpannerDescendant(RenderObject*& subtreeRoot, RenderObject& descendant)
    298299{
    299300    RenderBlockFlow* multicolContainer = multiColumnBlockFlow();
    300     RenderObject* nextRendererInFlowThread = spannerPlacehoderCandidate(*descendant, *this);
     301    RenderObject* nextRendererInFlowThread = spannerPlacehoderCandidate(descendant, *this);
    301302    RenderObject* insertBeforeMulticolChild = nullptr;
    302     RenderObject* nextDescendant = descendant;
    303 
    304     if (isValidColumnSpanner(this, descendant)) {
     303    RenderObject* nextDescendant = &descendant;
     304
     305    if (isValidColumnSpanner(*this, descendant)) {
    305306        // This is a spanner (column-span:all). Such renderers are moved from where they would
    306307        // otherwise occur in the render tree to becoming a direct child of the multicol container,
     
    308309        // basically just relies on regular block layout done by the RenderBlockFlow that
    309310        // establishes the multicol container.
    310         RenderBlockFlow* container = downcast<RenderBlockFlow>(descendant->parent());
     311        RenderBlockFlow* container = downcast<RenderBlockFlow>(descendant.parent());
    311312        RenderMultiColumnSet* setToSplit = nullptr;
    312313        if (nextRendererInFlowThread) {
    313             setToSplit = findSetRendering(descendant);
     314            setToSplit = findSetRendering(*this, descendant);
    314315            if (setToSplit) {
    315316                setToSplit->setNeedsLayout();
     
    323324        // this placeholder serves as a break point for column sets, so that, when encountered, we
    324325        // end flowing one column set and move to the next one.
    325         RenderMultiColumnSpannerPlaceholder* placeholder = RenderMultiColumnSpannerPlaceholder::createAnonymous(this, downcast<RenderBox>(descendant), &container->style());
    326         container->addChild(placeholder, descendant->nextSibling());
    327         container->removeChild(*descendant);
     326        RenderMultiColumnSpannerPlaceholder* placeholder = RenderMultiColumnSpannerPlaceholder::createAnonymous(this,
     327            downcast<RenderBox>(descendant), &container->style());
     328        container->addChild(placeholder, descendant.nextSibling());
     329        container->removeChild(descendant);
    328330       
    329331        // This is a guard to stop an ancestor flow thread from processing the spanner.
    330332        gShiftingSpanner = true;
    331         multicolContainer->RenderBlock::addChild(descendant, insertBeforeMulticolChild);
     333        multicolContainer->RenderBlock::addChild(&descendant, insertBeforeMulticolChild);
    332334        gShiftingSpanner = false;
    333335       
     
    336338        // creation of column sets or anything like that. Continue at its original position in
    337339        // the tree, i.e. where the placeholder was just put.
    338         if (subtreeRoot == descendant)
     340        if (subtreeRoot == &descendant)
    339341            subtreeRoot = placeholder;
    340342        nextDescendant = placeholder;
     
    376378}
    377379
    378 void RenderMultiColumnFlowThread::flowThreadDescendantInserted(RenderObject* descendant)
    379 {
    380     if (gShiftingSpanner || m_beingEvacuated || descendant->isInFlowRenderFlowThread())
     380void RenderMultiColumnFlowThread::flowThreadDescendantInserted(RenderObject& newDescendant)
     381{
     382    if (gShiftingSpanner || m_beingEvacuated || newDescendant.isInFlowRenderFlowThread())
    381383        return;
    382     RenderObject* subtreeRoot = descendant;
    383     for (; descendant; descendant = (descendant ? descendant->nextInPreOrder(subtreeRoot) : nullptr)) {
     384    RenderObject* subtreeRoot = &newDescendant;
     385    for (auto* descendant = &newDescendant; descendant; descendant = (descendant ? descendant->nextInPreOrder(subtreeRoot) : nullptr)) {
    384386        if (is<RenderMultiColumnSpannerPlaceholder>(*descendant)) {
    385387            // A spanner's placeholder has been inserted. The actual spanner renderer is moved from
     
    407409                    subtreeRoot = spanner;
    408410                // Now we process the spanner.
    409                 descendant = processPossibleSpannerDescendant(subtreeRoot, spanner);
     411                descendant = processPossibleSpannerDescendant(subtreeRoot, *spanner);
    410412                continue;
    411413            }
     
    416418            continue;
    417419        }
    418        
    419         descendant = processPossibleSpannerDescendant(subtreeRoot, descendant);
     420        descendant = processPossibleSpannerDescendant(subtreeRoot, *descendant);
    420421    }
    421422}
  • trunk/Source/WebCore/rendering/RenderMultiColumnFlowThread.h

    r200041 r208005  
    5353
    5454    void layout() override;
    55 
    56     // Find the set inside which the specified renderer would be rendered.
    57     RenderMultiColumnSet* findSetRendering(RenderObject*) const;
    5855
    5956    // Populate the flow thread with what's currently its siblings. Called when a regular block
     
    117114    void willBeRemovedFromTree() override;
    118115    RenderObject* resolveMovedChild(RenderObject* child) const override;
    119     void flowThreadDescendantInserted(RenderObject*) override;
     116    void flowThreadDescendantInserted(RenderObject&) override;
    120117    void flowThreadRelativeWillBeRemoved(RenderObject*) override;
    121118    void flowThreadDescendantBoxLaidOut(RenderBox*) override;
     
    130127
    131128    void handleSpannerRemoval(RenderObject* spanner);
    132     RenderObject* processPossibleSpannerDescendant(RenderObject*& subtreeRoot, RenderObject* descendant);
     129    RenderObject* processPossibleSpannerDescendant(RenderObject*& subtreeRoot, RenderObject& descendant);
    133130   
    134131private:
  • trunk/Source/WebCore/rendering/RenderMultiColumnSet.cpp

    r200041 r208005  
    9292}
    9393
    94 static bool precedesRenderer(RenderObject* renderer, RenderObject* boundary)
     94static bool precedesRenderer(const RenderObject* renderer, const RenderObject* boundary)
    9595{
    9696    for (; renderer; renderer = renderer->nextInPreOrder()) {
     
    101101}
    102102
    103 bool RenderMultiColumnSet::containsRendererInFlowThread(RenderObject* renderer) const
     103bool RenderMultiColumnSet::containsRendererInFlowThread(const RenderObject& renderer) const
    104104{
    105105    if (!previousSiblingMultiColumnSet() && !nextSiblingMultiColumnSet()) {
    106106        // There is only one set. This is easy, then.
    107         return renderer->isDescendantOf(m_flowThread);
     107        return renderer.isDescendantOf(m_flowThread);
    108108    }
    109109
     
    114114
    115115    // This is SLOW! But luckily very uncommon.
    116     return precedesRenderer(firstRenderer, renderer) && precedesRenderer(renderer, lastRenderer);
     116    return precedesRenderer(firstRenderer, &renderer) && precedesRenderer(&renderer, lastRenderer);
    117117}
    118118
  • trunk/Source/WebCore/rendering/RenderMultiColumnSet.h

    r200041 r208005  
    6161
    6262    // Return true if the specified renderer (descendant of the flow thread) is inside this column set.
    63     bool containsRendererInFlowThread(RenderObject*) const;
     63    bool containsRendererInFlowThread(const RenderObject&) const;
    6464
    6565    void setLogicalTopInFlowThread(LayoutUnit);
  • trunk/Source/WebCore/rendering/RenderMultiColumnSpannerPlaceholder.cpp

    r200098 r208005  
    3535namespace WebCore {
    3636
    37 RenderMultiColumnSpannerPlaceholder* RenderMultiColumnSpannerPlaceholder::createAnonymous(RenderMultiColumnFlowThread* flowThread, RenderBox* spanner, const RenderStyle* parentStyle)
     37RenderMultiColumnSpannerPlaceholder* RenderMultiColumnSpannerPlaceholder::createAnonymous(RenderMultiColumnFlowThread* flowThread, RenderBox& spanner, const RenderStyle* parentStyle)
    3838{
    3939    auto newStyle = RenderStyle::createAnonymousStyleWithDisplay(*parentStyle, BLOCK);
     
    4444}
    4545
    46 RenderMultiColumnSpannerPlaceholder::RenderMultiColumnSpannerPlaceholder(RenderMultiColumnFlowThread* flowThread, RenderBox* spanner, RenderStyle&& style)
     46RenderMultiColumnSpannerPlaceholder::RenderMultiColumnSpannerPlaceholder(RenderMultiColumnFlowThread* flowThread, RenderBox& spanner, RenderStyle&& style)
    4747    : RenderBox(flowThread->document(), WTFMove(style), RenderBoxModelObjectFlag)
    48     , m_spanner(spanner)
     48    , m_spanner(&spanner)
    4949    , m_flowThread(flowThread)
    5050{
  • trunk/Source/WebCore/rendering/RenderMultiColumnSpannerPlaceholder.h

    r200098 r208005  
    3939class RenderMultiColumnSpannerPlaceholder final : public RenderBox {
    4040public:
    41     static RenderMultiColumnSpannerPlaceholder* createAnonymous(RenderMultiColumnFlowThread*, RenderBox* spanner, const RenderStyle* parentStyle);
     41    static RenderMultiColumnSpannerPlaceholder* createAnonymous(RenderMultiColumnFlowThread*, RenderBox& spanner, const RenderStyle* parentStyle);
    4242
    4343    RenderBox* spanner() const { return m_spanner; }
     
    4545
    4646private:
    47     RenderMultiColumnSpannerPlaceholder(RenderMultiColumnFlowThread*, RenderBox* spanner, RenderStyle&&);
     47    RenderMultiColumnSpannerPlaceholder(RenderMultiColumnFlowThread*, RenderBox& spanner, RenderStyle&&);
    4848    bool isRenderMultiColumnSpannerPlaceholder() const override { return true; }
    4949
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r207736 r208005  
    14221422
    14231423    if (RenderFlowThread* flowThread = flowThreadContainingBlock())
    1424         flowThread->flowThreadDescendantInserted(this);
     1424        flowThread->flowThreadDescendantInserted(*this);
    14251425}
    14261426
Note: See TracChangeset for help on using the changeset viewer.