Changeset 228238 in webkit
- Timestamp:
- Feb 7, 2018 11:52:45 AM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r228231 r228238 1 2018-02-07 Zalan Bujtas <zalan@apple.com> 2 3 [RenderTreeBuilder] Remove RenderElement::destroyLeftoverChildren. 4 https://bugs.webkit.org/show_bug.cgi?id=182518 5 <rdar://problem/37256035> 6 7 Reviewed by Antti Koivisto. 8 9 Remove leftover children before we call takeChild() on the parent (as opposed to when 10 we finally call destroy() on the parent). 11 This patch also explicitly destroys the top level pagination renderers. 12 13 Covered by existing tests. 14 15 * rendering/RenderElement.cpp: 16 (WebCore::RenderElement::removeAndDestroyChild): 17 (WebCore::RenderElement::destroyLeftoverChildren): Deleted. 18 * rendering/RenderElement.h: 19 * rendering/RenderObject.cpp: 20 (WebCore::RenderObject::destroy): 21 * rendering/updating/RenderTreeUpdater.cpp: 22 (WebCore::RenderTreeUpdater::tearDownRenderers): 23 (WebCore::RenderTreeUpdater::tearDownLeftoverPaginationRenderersIfNeeded): 24 * rendering/updating/RenderTreeUpdater.h: 25 1 26 2018-02-07 Daniel Bates <dabates@apple.com> 2 27 -
trunk/Source/WebCore/rendering/RenderElement.cpp
r228224 r228238 137 137 { 138 138 // Do not add any code here. Add it to willBeDestroyed() instead. 139 ASSERT(!m_firstChild); 139 140 } 140 141 … … 488 489 void RenderElement::removeAndDestroyChild(RenderTreeBuilder& builder, RenderObject& oldChild) 489 490 { 491 if (is<RenderElement>(oldChild)) { 492 auto& child = downcast<RenderElement>(oldChild); 493 while (child.firstChild()) { 494 auto& firstChild = *child.firstChild(); 495 if (auto* node = firstChild.node()) 496 node->setRenderer(nullptr); 497 child.removeAndDestroyChild(builder, firstChild); 498 } 499 } 490 500 auto toDestroy = takeChild(builder, oldChild); 491 }492 493 void RenderElement::destroyLeftoverChildren()494 {495 while (m_firstChild) {496 if (auto* node = m_firstChild->node())497 node->setRenderer(nullptr);498 removeAndDestroyChild(*RenderTreeBuilder::current(), *m_firstChild);499 }500 501 } 501 502 -
trunk/Source/WebCore/rendering/RenderElement.h
r228224 r228238 229 229 void setIsFirstLetter() { m_isFirstLetter = true; } 230 230 231 void destroyLeftoverChildren();232 231 RenderObject* attachRendererInternal(RenderPtr<RenderObject> child, RenderObject* beforeChild); 233 232 RenderPtr<RenderObject> detachRendererInternal(RenderObject&); -
trunk/Source/WebCore/rendering/RenderObject.cpp
r227977 r228238 1478 1478 RELEASE_ASSERT(!m_bitfields.beingDestroyed()); 1479 1479 1480 if (is<RenderElement>(*this))1481 downcast<RenderElement>(*this).destroyLeftoverChildren();1482 1483 1480 m_bitfields.setBeingDestroyed(true); 1484 1481 -
trunk/Source/WebCore/rendering/RenderView.cpp
r224546 r228238 48 48 #include "RenderMultiColumnSpannerPlaceholder.h" 49 49 #include "RenderQuote.h" 50 #include "RenderTreeBuilder.h" 50 51 #include "RenderWidget.h" 51 52 #include "ScrollbarTheme.h" … … 614 615 { 615 616 RenderBlockFlow::willBeDestroyed(); 617 // FIXME: This is a workaround for leftover content (see webkit.org/b/182547). 618 if (firstChild()) { 619 RenderTreeBuilder builder(*this); 620 while (firstChild()) 621 removeAndDestroyChild(builder, *firstChild()); 622 } 616 623 617 624 ASSERT_WITH_MESSAGE(m_rendererCount == 1, "All other renderers in this render tree should have been destroyed"); -
trunk/Source/WebCore/rendering/updating/RenderTreeUpdater.cpp
r227928 r228238 580 580 581 581 pop(0); 582 583 tearDownLeftoverPaginationRenderersIfNeeded(root); 582 584 } 583 585 … … 589 591 RenderTreeBuilder::current()->removeFromParentAndDestroyCleaningUpAnonymousWrappers(*renderer); 590 592 text.setRenderer(nullptr); 593 } 594 595 void RenderTreeUpdater::tearDownLeftoverPaginationRenderersIfNeeded(Element& root) 596 { 597 if (&root != root.document().documentElement()) 598 return; 599 for (auto* child = root.document().renderView()->firstChild(); child;) { 600 auto* nextSibling = child->nextSibling(); 601 if (is<RenderMultiColumnFlow>(*child) || is<RenderMultiColumnSet>(*child)) 602 RenderTreeBuilder::current()->removeFromParentAndDestroyCleaningUpAnonymousWrappers(*child); 603 child = nextSibling; 604 } 591 605 } 592 606 -
trunk/Source/WebCore/rendering/updating/RenderTreeUpdater.h
r227570 r228238 90 90 static void tearDownTextRenderer(Text&); 91 91 static void tearDownLeftoverShadowHostChildren(Element&); 92 static void tearDownLeftoverPaginationRenderersIfNeeded(Element&); 92 93 93 94 RenderView& renderView();
Note: See TracChangeset
for help on using the changeset viewer.