Changeset 226140 in webkit


Ignore:
Timestamp:
Dec 19, 2017 2:15:18 PM (6 years ago)
Author:
Alan Bujtas
Message:

[RenderTreeBuilder] Move finding-the-parent/creating-wrapper logic from RenderTableSection::addChild to RenderTreeBuilder
https://bugs.webkit.org/show_bug.cgi?id=180994
<rdar://problem/36139222>

Reviewed by Antti Koivisto.

This is in preparation for removing all tree mutation from renderering code.

Covered by existing tests.

  • rendering/RenderTableSection.cpp:

(WebCore::RenderTableSection::addChild):

  • rendering/updating/RenderTreeBuilder.cpp:

(WebCore::RenderTreeBuilder::insertChild):

  • rendering/updating/RenderTreeBuilderTable.cpp:

(WebCore::RenderTreeBuilder::Table::findOrCreateParentForChild):

  • rendering/updating/RenderTreeBuilderTable.h:
Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r226138 r226140  
     12017-12-19  Zalan Bujtas  <zalan@apple.com>
     2
     3        [RenderTreeBuilder] Move finding-the-parent/creating-wrapper logic from RenderTableSection::addChild to RenderTreeBuilder
     4        https://bugs.webkit.org/show_bug.cgi?id=180994
     5        <rdar://problem/36139222>
     6
     7        Reviewed by Antti Koivisto.
     8
     9        This is in preparation for removing all tree mutation from renderering code.
     10
     11        Covered by existing tests.
     12
     13        * rendering/RenderTableSection.cpp:
     14        (WebCore::RenderTableSection::addChild):
     15        * rendering/updating/RenderTreeBuilder.cpp:
     16        (WebCore::RenderTreeBuilder::insertChild):
     17        * rendering/updating/RenderTreeBuilderTable.cpp:
     18        (WebCore::RenderTreeBuilder::Table::findOrCreateParentForChild):
     19        * rendering/updating/RenderTreeBuilderTable.h:
     20
    1212017-12-19  Daniel Bates  <dabates@apple.com>
    222
  • trunk/Source/WebCore/rendering/RenderTableSection.cpp

    r226007 r226140  
    124124void RenderTableSection::addChild(RenderTreeBuilder& builder, RenderPtr<RenderObject> child, RenderObject* beforeChild)
    125125{
    126     if (!is<RenderTableRow>(*child)) {
    127         RenderObject* last = beforeChild;
    128         if (!last)
    129             last = lastRow();
    130         if (is<RenderTableRow>(last) && last->isAnonymous() && !last->isBeforeOrAfterContent()) {
    131             RenderTableRow& row = downcast<RenderTableRow>(*last);
    132             if (beforeChild == &row)
    133                 beforeChild = row.firstCell();
    134             builder.insertChild(row, WTFMove(child), beforeChild);
    135             return;
    136         }
    137 
    138         if (beforeChild && !beforeChild->isAnonymous() && beforeChild->parent() == this) {
    139             RenderObject* row = beforeChild->previousSibling();
    140             if (is<RenderTableRow>(row) && row->isAnonymous()) {
    141                 builder.insertChild(downcast<RenderTableRow>(*row), WTFMove(child));
    142                 return;
    143             }
    144         }
    145 
    146         // If beforeChild is inside an anonymous cell/row, insert into the cell or into
    147         // the anonymous row containing it, if there is one.
    148         RenderObject* lastBox = last;
    149         while (lastBox && lastBox->parent()->isAnonymous() && !is<RenderTableRow>(*lastBox))
    150             lastBox = lastBox->parent();
    151         if (is<RenderTableRow>(lastBox) && lastBox->isAnonymous() && !lastBox->isBeforeOrAfterContent()) {
    152             builder.insertChild(downcast<RenderTableRow>(*lastBox), WTFMove(child), beforeChild);
    153             return;
    154         }
    155 
    156         auto newRow = RenderTableRow::createAnonymousWithParentRenderer(*this);
    157         auto& row = *newRow;
    158         builder.insertChild(*this, WTFMove(newRow), beforeChild);
    159         builder.insertChild(row, WTFMove(child));
    160         return;
    161     }
    162 
    163126    if (beforeChild)
    164127        setNeedsCellRecalc();
  • trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp

    r226127 r226140  
    6868    }
    6969
     70    if (is<RenderTableSection>(parent)) {
     71        auto& parentCandidate = m_tableBuilder->findOrCreateParentForChild(downcast<RenderTableSection>(parent), *child, beforeChild);
     72        if (&parent != &parentCandidate) {
     73            insertChild(parentCandidate, WTFMove(child), beforeChild);
     74            return;
     75        }
     76        parent.addChild(*this, WTFMove(child), beforeChild);
     77        return;
     78    }
     79
    7080    if (is<RenderRubyRun>(parent)) {
    7181        rubyRunInsertChild(downcast<RenderRubyRun>(parent), WTFMove(child), beforeChild);
  • trunk/Source/WebCore/rendering/updating/RenderTreeBuilderTable.cpp

    r226127 r226140  
    8383}
    8484
     85RenderElement& RenderTreeBuilder::Table::findOrCreateParentForChild(RenderTableSection& parent, const RenderObject& child, RenderObject*& beforeChild)
     86{
     87    if (is<RenderTableRow>(child))
     88        return parent;
     89
     90    auto* lastChild = beforeChild ? beforeChild : parent.lastRow();
     91    if (is<RenderTableRow>(lastChild) && lastChild->isAnonymous() && !lastChild->isBeforeOrAfterContent()) {
     92        if (beforeChild == lastChild)
     93            beforeChild = downcast<RenderTableRow>(*lastChild).firstCell();
     94        return downcast<RenderElement>(*lastChild);
     95    }
     96
     97    if (beforeChild && !beforeChild->isAnonymous() && beforeChild->parent() == &parent) {
     98        auto* row = beforeChild->previousSibling();
     99        if (is<RenderTableRow>(row) && row->isAnonymous()) {
     100            beforeChild = nullptr;
     101            return downcast<RenderElement>(*row);
     102        }
     103    }
     104
     105    // If beforeChild is inside an anonymous cell/row, insert into the cell or into
     106    // the anonymous row containing it, if there is one.
     107    auto* parentCandidate = lastChild;
     108    while (parentCandidate && parentCandidate->parent()->isAnonymous() && !is<RenderTableRow>(*parentCandidate))
     109        parentCandidate = parentCandidate->parent();
     110    if (is<RenderTableRow>(parentCandidate) && parentCandidate->isAnonymous() && !parentCandidate->isBeforeOrAfterContent())
     111        return downcast<RenderElement>(*parentCandidate);
     112
     113    auto newRow = RenderTableRow::createAnonymousWithParentRenderer(parent);
     114    auto& row = *newRow;
     115    m_builder.insertChild(parent, WTFMove(newRow), beforeChild);
     116    beforeChild = nullptr;
     117    return row;
    85118}
     119
     120}
  • trunk/Source/WebCore/rendering/updating/RenderTreeBuilderTable.h

    r226127 r226140  
    4040
    4141    RenderElement& findOrCreateParentForChild(RenderTableRow& parent, const RenderObject& child, RenderObject*& beforeChild);
     42    RenderElement& findOrCreateParentForChild(RenderTableSection& parent, const RenderObject& child, RenderObject*& beforeChild);
    4243
    4344private:
Note: See TracChangeset for help on using the changeset viewer.