Changeset 226140 in webkit
- Timestamp:
- Dec 19, 2017 2:15:18 PM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r226138 r226140 1 2017-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 1 21 2017-12-19 Daniel Bates <dabates@apple.com> 2 22 -
trunk/Source/WebCore/rendering/RenderTableSection.cpp
r226007 r226140 124 124 void RenderTableSection::addChild(RenderTreeBuilder& builder, RenderPtr<RenderObject> child, RenderObject* beforeChild) 125 125 { 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 into147 // 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 163 126 if (beforeChild) 164 127 setNeedsCellRecalc(); -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp
r226127 r226140 68 68 } 69 69 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 70 80 if (is<RenderRubyRun>(parent)) { 71 81 rubyRunInsertChild(downcast<RenderRubyRun>(parent), WTFMove(child), beforeChild); -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilderTable.cpp
r226127 r226140 83 83 } 84 84 85 RenderElement& 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; 85 118 } 119 120 } -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilderTable.h
r226127 r226140 40 40 41 41 RenderElement& findOrCreateParentForChild(RenderTableRow& parent, const RenderObject& child, RenderObject*& beforeChild); 42 RenderElement& findOrCreateParentForChild(RenderTableSection& parent, const RenderObject& child, RenderObject*& beforeChild); 42 43 43 44 private:
Note: See TracChangeset
for help on using the changeset viewer.