Changeset 228327 in webkit
- Timestamp:
- Feb 9, 2018 10:31:29 AM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r228326 r228327 1 2018-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 1 26 2018-02-09 Youenn Fablet <youenn@apple.com> 2 27 -
trunk/Source/WebCore/rendering/RenderBlockFlow.cpp
r228284 r228327 3853 3853 { 3854 3854 if (!renderTreeBeingDestroyed()) { 3855 RenderFragmentedFlow* fragmentedFlow = multiColumnFlow();3855 auto* fragmentedFlow = multiColumnFlow(); 3856 3856 if (fragmentedFlow && fragmentedFlow != &oldChild) 3857 fragmentedFlow->fragmentedFlowRelativeWillBeRemoved(oldChild);3857 builder.multiColumnRelativeWillBeRemoved(*fragmentedFlow, oldChild); 3858 3858 } 3859 3859 return RenderBlock::takeChild(builder, oldChild); -
trunk/Source/WebCore/rendering/RenderFragmentedFlow.h
r228320 r228327 87 87 virtual bool singleFragmentHasUniformLogicalHeight() const { return true; } 88 88 89 // Called when a sibling or descendant of the flow thread is about to be removed.90 virtual void fragmentedFlowRelativeWillBeRemoved(RenderObject&) { }91 89 // Called when a descendant box's layout is finished and it has been positioned within its container. 92 90 virtual void fragmentedFlowDescendantBoxLaidOut(RenderBox*) { } -
trunk/Source/WebCore/rendering/RenderMultiColumnFlow.cpp
r228320 r228327 166 166 } 167 167 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. Also190 // keep the reference to the spanner, since the placeholder may be about to be re-inserted191 // 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 no203 // big deal though (and locating them would be expensive), and they will be found and re-used if204 // content is added again later.205 }206 207 168 void RenderMultiColumnFlow::fragmentedFlowDescendantBoxLaidOut(RenderBox* descendant) 208 169 { -
trunk/Source/WebCore/rendering/RenderMultiColumnFlow.h
r228320 r228327 108 108 void addFragmentToThread(RenderFragmentContainer*) override; 109 109 void willBeRemovedFromTree() override; 110 void fragmentedFlowRelativeWillBeRemoved(RenderObject&) override;111 110 void fragmentedFlowDescendantBoxLaidOut(RenderBox*) override; 112 111 LogicalExtentComputedValues computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop) const override; … … 118 117 bool addForcedFragmentBreak(const RenderBlock*, LayoutUnit, RenderBox* breakChild, bool isBefore, LayoutUnit* offsetBreakAdjustment = 0) override; 119 118 bool isPageLogicalHeightKnown() const override; 120 121 void handleSpannerRemoval(RenderObject& spanner);122 119 123 120 private: -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp
r228320 r228327 406 406 // WARNING: child is deleted here. 407 407 } 408 void RenderTreeBuilder::multiColumnRelativeWillBeRemoved(RenderMultiColumnFlow& flow, RenderObject& relative) 409 { 410 multiColumnBuilder().multiColumnRelativeWillBeRemoved(flow, relative); 411 } 408 412 409 413 void RenderTreeBuilder::insertChildToRenderInline(RenderInline& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild) -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.h
r228320 r228327 81 81 void removeFromParentAndDestroyCleaningUpAnonymousWrappers(RenderObject& child); 82 82 void multiColumnDescendantInserted(RenderMultiColumnFlow&, RenderObject& newDescendant); 83 void multiColumnRelativeWillBeRemoved(RenderMultiColumnFlow&, RenderObject& relative); 83 84 84 85 private: -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.cpp
r228320 r228327 368 368 } 369 369 370 } 370 void 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 387 void 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 } -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.h
r228320 r228327 42 42 RenderObject* resolveMovedChild(RenderFragmentedFlow& enclosingFragmentedFlow, RenderObject* beforeChild); 43 43 void multiColumnDescendantInserted(RenderMultiColumnFlow&, RenderObject& newDescendant); 44 void multiColumnRelativeWillBeRemoved(RenderMultiColumnFlow&, RenderObject& relative); 44 45 45 46 private: … … 47 48 void destroyFragmentedFlow(RenderBlockFlow&); 48 49 RenderObject* processPossibleSpannerDescendant(RenderMultiColumnFlow&, RenderObject*& subtreeRoot, RenderObject& descendant); 50 void handleSpannerRemoval(RenderMultiColumnFlow&, RenderObject& spanner); 49 51 50 52 RenderTreeBuilder& m_builder;
Note: See TracChangeset
for help on using the changeset viewer.