Diff
Modified: trunk/Source/WebCore/ChangeLog (226139 => 226140)
--- trunk/Source/WebCore/ChangeLog 2017-12-19 21:51:27 UTC (rev 226139)
+++ trunk/Source/WebCore/ChangeLog 2017-12-19 22:15:18 UTC (rev 226140)
@@ -1,3 +1,23 @@
+2017-12-19 Zalan Bujtas <[email protected]>
+
+ [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:
+
2017-12-19 Daniel Bates <[email protected]>
Implement InlineTextBox painting using marker subranges
Modified: trunk/Source/WebCore/rendering/RenderTableSection.cpp (226139 => 226140)
--- trunk/Source/WebCore/rendering/RenderTableSection.cpp 2017-12-19 21:51:27 UTC (rev 226139)
+++ trunk/Source/WebCore/rendering/RenderTableSection.cpp 2017-12-19 22:15:18 UTC (rev 226140)
@@ -123,43 +123,6 @@
void RenderTableSection::addChild(RenderTreeBuilder& builder, RenderPtr<RenderObject> child, RenderObject* beforeChild)
{
- if (!is<RenderTableRow>(*child)) {
- RenderObject* last = beforeChild;
- if (!last)
- last = lastRow();
- if (is<RenderTableRow>(last) && last->isAnonymous() && !last->isBeforeOrAfterContent()) {
- RenderTableRow& row = downcast<RenderTableRow>(*last);
- if (beforeChild == &row)
- beforeChild = row.firstCell();
- builder.insertChild(row, WTFMove(child), beforeChild);
- return;
- }
-
- if (beforeChild && !beforeChild->isAnonymous() && beforeChild->parent() == this) {
- RenderObject* row = beforeChild->previousSibling();
- if (is<RenderTableRow>(row) && row->isAnonymous()) {
- builder.insertChild(downcast<RenderTableRow>(*row), WTFMove(child));
- return;
- }
- }
-
- // If beforeChild is inside an anonymous cell/row, insert into the cell or into
- // the anonymous row containing it, if there is one.
- RenderObject* lastBox = last;
- while (lastBox && lastBox->parent()->isAnonymous() && !is<RenderTableRow>(*lastBox))
- lastBox = lastBox->parent();
- if (is<RenderTableRow>(lastBox) && lastBox->isAnonymous() && !lastBox->isBeforeOrAfterContent()) {
- builder.insertChild(downcast<RenderTableRow>(*lastBox), WTFMove(child), beforeChild);
- return;
- }
-
- auto newRow = RenderTableRow::createAnonymousWithParentRenderer(*this);
- auto& row = *newRow;
- builder.insertChild(*this, WTFMove(newRow), beforeChild);
- builder.insertChild(row, WTFMove(child));
- return;
- }
-
if (beforeChild)
setNeedsCellRecalc();
Modified: trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp (226139 => 226140)
--- trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp 2017-12-19 21:51:27 UTC (rev 226139)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp 2017-12-19 22:15:18 UTC (rev 226140)
@@ -67,6 +67,16 @@
return;
}
+ if (is<RenderTableSection>(parent)) {
+ auto& parentCandidate = m_tableBuilder->findOrCreateParentForChild(downcast<RenderTableSection>(parent), *child, beforeChild);
+ if (&parent != &parentCandidate) {
+ insertChild(parentCandidate, WTFMove(child), beforeChild);
+ return;
+ }
+ parent.addChild(*this, WTFMove(child), beforeChild);
+ return;
+ }
+
if (is<RenderRubyRun>(parent)) {
rubyRunInsertChild(downcast<RenderRubyRun>(parent), WTFMove(child), beforeChild);
return;
Modified: trunk/Source/WebCore/rendering/updating/RenderTreeBuilderTable.cpp (226139 => 226140)
--- trunk/Source/WebCore/rendering/updating/RenderTreeBuilderTable.cpp 2017-12-19 21:51:27 UTC (rev 226139)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeBuilderTable.cpp 2017-12-19 22:15:18 UTC (rev 226140)
@@ -82,4 +82,39 @@
return cell;
}
+RenderElement& RenderTreeBuilder::Table::findOrCreateParentForChild(RenderTableSection& parent, const RenderObject& child, RenderObject*& beforeChild)
+{
+ if (is<RenderTableRow>(child))
+ return parent;
+
+ auto* lastChild = beforeChild ? beforeChild : parent.lastRow();
+ if (is<RenderTableRow>(lastChild) && lastChild->isAnonymous() && !lastChild->isBeforeOrAfterContent()) {
+ if (beforeChild == lastChild)
+ beforeChild = downcast<RenderTableRow>(*lastChild).firstCell();
+ return downcast<RenderElement>(*lastChild);
+ }
+
+ if (beforeChild && !beforeChild->isAnonymous() && beforeChild->parent() == &parent) {
+ auto* row = beforeChild->previousSibling();
+ if (is<RenderTableRow>(row) && row->isAnonymous()) {
+ beforeChild = nullptr;
+ return downcast<RenderElement>(*row);
+ }
+ }
+
+ // If beforeChild is inside an anonymous cell/row, insert into the cell or into
+ // the anonymous row containing it, if there is one.
+ auto* parentCandidate = lastChild;
+ while (parentCandidate && parentCandidate->parent()->isAnonymous() && !is<RenderTableRow>(*parentCandidate))
+ parentCandidate = parentCandidate->parent();
+ if (is<RenderTableRow>(parentCandidate) && parentCandidate->isAnonymous() && !parentCandidate->isBeforeOrAfterContent())
+ return downcast<RenderElement>(*parentCandidate);
+
+ auto newRow = RenderTableRow::createAnonymousWithParentRenderer(parent);
+ auto& row = *newRow;
+ m_builder.insertChild(parent, WTFMove(newRow), beforeChild);
+ beforeChild = nullptr;
+ return row;
}
+
+}
Modified: trunk/Source/WebCore/rendering/updating/RenderTreeBuilderTable.h (226139 => 226140)
--- trunk/Source/WebCore/rendering/updating/RenderTreeBuilderTable.h 2017-12-19 21:51:27 UTC (rev 226139)
+++ trunk/Source/WebCore/rendering/updating/RenderTreeBuilderTable.h 2017-12-19 22:15:18 UTC (rev 226140)
@@ -39,6 +39,7 @@
Table(RenderTreeBuilder&);
RenderElement& findOrCreateParentForChild(RenderTableRow& parent, const RenderObject& child, RenderObject*& beforeChild);
+ RenderElement& findOrCreateParentForChild(RenderTableSection& parent, const RenderObject& child, RenderObject*& beforeChild);
private:
RenderTreeBuilder& m_builder;