Changeset 228650 in webkit
- Timestamp:
- Feb 19, 2018 3:41:49 AM (6 years ago)
- Location:
- releases/WebKitGTK/webkit-2.20/Source/WebCore
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
releases/WebKitGTK/webkit-2.20/Source/WebCore/ChangeLog
r228646 r228650 1 2018-02-07 Zalan Bujtas <zalan@apple.com> 2 3 [RenderTreeBuilder] Move RenderBlock::removeLeftoverAnonymousBlock to RenderTreeBuilder 4 https://bugs.webkit.org/show_bug.cgi?id=182510 5 <rdar://problem/37250037> 6 7 Reviewed by Antti Koivisto. 8 9 Do not reinvent subtree reparenting. 10 11 Covered by existing tests. 12 13 * rendering/RenderBlock.cpp: 14 (WebCore::RenderBlock::removeLeftoverAnonymousBlock): Deleted. 15 * rendering/RenderBlock.h: 16 * rendering/RenderBoxModelObject.cpp: 17 (WebCore::RenderBoxModelObject::moveAllChildrenToInternal): 18 * rendering/RenderBoxModelObject.h: 19 * rendering/RenderButton.h: 20 * rendering/RenderElement.cpp: 21 (WebCore::RenderElement::detachRendererInternal): 22 (WebCore::RenderElement::attachRendererInternal): 23 (WebCore::RenderElement::insertChildInternal): 24 (WebCore::RenderElement::takeChildInternal): 25 * rendering/RenderElement.h: 26 * rendering/RenderRuby.h: 27 * rendering/RenderRubyRun.h: 28 * rendering/RenderTextControl.h: 29 * rendering/updating/RenderTreeBuilderBlock.cpp: 30 (WebCore::RenderTreeBuilder::Block::insertChildIgnoringContinuation): 31 (WebCore::RenderTreeBuilder::Block::childBecameNonInline): 32 (WebCore::RenderTreeBuilder::Block::removeLeftoverAnonymousBlock): 33 * rendering/updating/RenderTreeBuilderBlock.h: 34 1 35 2018-02-06 Don Olmstead <don.olmstead@sony.com> 2 36 -
releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderBlock.cpp
r227977 r228650 483 483 } 484 484 485 void RenderBlock::removeLeftoverAnonymousBlock(RenderBlock* child)486 {487 ASSERT(child->isAnonymousBlock());488 ASSERT(!child->childrenInline());489 490 if (child->continuation())491 return;492 493 RenderObject* firstAnChild = child->firstChild();494 RenderObject* lastAnChild = child->lastChild();495 if (firstAnChild) {496 RenderObject* o = firstAnChild;497 while (o) {498 o->setParent(this);499 o = o->nextSibling();500 }501 firstAnChild->setPreviousSibling(child->previousSibling());502 lastAnChild->setNextSibling(child->nextSibling());503 if (child->previousSibling())504 child->previousSibling()->setNextSibling(firstAnChild);505 if (child->nextSibling())506 child->nextSibling()->setPreviousSibling(lastAnChild);507 508 if (child == firstChild())509 setFirstChild(firstAnChild);510 if (child == lastChild())511 setLastChild(lastAnChild);512 } else {513 if (child == firstChild())514 setFirstChild(child->nextSibling());515 if (child == lastChild())516 setLastChild(child->previousSibling());517 518 if (child->previousSibling())519 child->previousSibling()->setNextSibling(child->nextSibling());520 if (child->nextSibling())521 child->nextSibling()->setPreviousSibling(child->previousSibling());522 }523 524 child->setFirstChild(nullptr);525 child->m_next = nullptr;526 527 // Remove all the information in the flow thread associated with the leftover anonymous block.528 child->resetFragmentedFlowStateOnRemoval();529 530 child->setParent(nullptr);531 child->setPreviousSibling(nullptr);532 child->setNextSibling(nullptr);533 534 child->destroy();535 }536 537 485 static bool canDropAnonymousBlock(const RenderBlock& anonymousBlock) 538 486 { -
releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderBlock.h
r227977 r228650 397 397 LayoutRect paintRectToClipOutFromBorder(const LayoutRect&) override; 398 398 void addChildIgnoringContinuation(RenderTreeBuilder&, RenderPtr<RenderObject> newChild, RenderObject* beforeChild) override; 399 virtual void removeLeftoverAnonymousBlock(RenderBlock* child);400 399 bool isInlineBlockOrInlineTable() const final { return isInline() && isReplaced(); } 401 400 -
releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderBoxModelObject.cpp
r226007 r228650 2743 2743 } 2744 2744 2745 void RenderBoxModelObject::moveAllChildrenToInternal(RenderElement& newParent) 2746 { 2747 while (firstChild()) 2748 newParent.attachRendererInternal(detachRendererInternal(*firstChild()), this); 2749 } 2750 2745 2751 } // namespace WebCore -
releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderBoxModelObject.h
r227791 r228650 291 291 moveChildrenTo(toBoxModelObject, firstChild(), nullptr, beforeChild, normalizeAfterInsertion); 292 292 } 293 void moveAllChildrenToInternal(RenderElement& newParent); 293 294 // Move all of the kids from |startChild| up to but excluding |endChild|. 0 can be passed as the |endChild| to denote 294 295 // that all the kids from |startChild| onwards should be moved. -
releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderButton.h
r227977 r228650 43 43 44 44 RenderPtr<RenderObject> takeChild(RenderTreeBuilder&, RenderObject&) override; 45 void removeLeftoverAnonymousBlock(RenderBlock*) override { }46 45 bool createsAnonymousWrapper() const override { return true; } 47 46 -
releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderElement.cpp
r227977 r228650 500 500 } 501 501 502 RenderObject* RenderElement::attachRendererInternal(RenderPtr<RenderObject> child, RenderObject* beforeChild) 503 { 504 child->setParent(this); 505 506 if (m_firstChild == beforeChild) 507 m_firstChild = child.get(); 508 509 if (beforeChild) { 510 auto* previousSibling = beforeChild->previousSibling(); 511 if (previousSibling) 512 previousSibling->setNextSibling(child.get()); 513 child->setPreviousSibling(previousSibling); 514 child->setNextSibling(beforeChild); 515 beforeChild->setPreviousSibling(child.get()); 516 return child.release(); 517 } 518 if (m_lastChild) 519 m_lastChild->setNextSibling(child.get()); 520 child->setPreviousSibling(m_lastChild); 521 m_lastChild = child.get(); 522 return child.release(); 523 } 524 525 RenderPtr<RenderObject> RenderElement::detachRendererInternal(RenderObject& renderer) 526 { 527 auto* parent = renderer.parent(); 528 ASSERT(parent); 529 auto* nextSibling = renderer.nextSibling(); 530 531 if (renderer.previousSibling()) 532 renderer.previousSibling()->setNextSibling(nextSibling); 533 if (nextSibling) 534 nextSibling->setPreviousSibling(renderer.previousSibling()); 535 536 if (parent->firstChild() == &renderer) 537 parent->m_firstChild = nextSibling; 538 if (parent->lastChild() == &renderer) 539 parent->m_lastChild = renderer.previousSibling(); 540 541 renderer.setPreviousSibling(nullptr); 542 renderer.setNextSibling(nullptr); 543 renderer.setParent(nullptr); 544 return RenderPtr<RenderObject>(&renderer); 545 } 546 502 547 void RenderElement::insertChildInternal(RenderPtr<RenderObject> newChildPtr, RenderObject* beforeChild) 503 548 { … … 515 560 516 561 // Take the ownership. 517 auto* newChild = newChildPtr.release(); 518 519 newChild->setParent(this); 520 521 if (m_firstChild == beforeChild) 522 m_firstChild = newChild; 523 524 if (beforeChild) { 525 RenderObject* previousSibling = beforeChild->previousSibling(); 526 if (previousSibling) 527 previousSibling->setNextSibling(newChild); 528 newChild->setPreviousSibling(previousSibling); 529 newChild->setNextSibling(beforeChild); 530 beforeChild->setPreviousSibling(newChild); 531 } else { 532 if (lastChild()) 533 lastChild()->setNextSibling(newChild); 534 newChild->setPreviousSibling(lastChild()); 535 m_lastChild = newChild; 536 } 562 auto* newChild = attachRendererInternal(WTFMove(newChildPtr), beforeChild); 537 563 538 564 newChild->initializeFragmentedFlowStateOnInsertion(); … … 600 626 // This is needed to avoid race conditions where willBeRemovedFromTree would dirty the tree's structure 601 627 // and the code running here would force an untimely rebuilding, leaving |oldChild| dangling. 602 603 RenderObject* nextSibling = oldChild.nextSibling(); 604 605 if (oldChild.previousSibling()) 606 oldChild.previousSibling()->setNextSibling(nextSibling); 607 if (nextSibling) 608 nextSibling->setPreviousSibling(oldChild.previousSibling()); 609 610 if (m_firstChild == &oldChild) 611 m_firstChild = nextSibling; 612 if (m_lastChild == &oldChild) 613 m_lastChild = oldChild.previousSibling(); 614 615 oldChild.setPreviousSibling(nullptr); 616 oldChild.setNextSibling(nullptr); 617 oldChild.setParent(nullptr); 628 auto childToTake = detachRendererInternal(oldChild); 618 629 619 630 // rendererRemovedFromTree walks the whole subtree. We can improve performance 620 631 // by skipping this step when destroying the entire tree. 621 if (!renderTreeBeingDestroyed() && is<RenderElement>( oldChild))622 RenderCounter::rendererRemovedFromTree(downcast<RenderElement>( oldChild));632 if (!renderTreeBeingDestroyed() && is<RenderElement>(*childToTake)) 633 RenderCounter::rendererRemovedFromTree(downcast<RenderElement>(*childToTake)); 623 634 624 635 if (!renderTreeBeingDestroyed()) { … … 627 638 } 628 639 629 return RenderPtr<RenderObject>(&oldChild);640 return childToTake; 630 641 } 631 642 -
releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderElement.h
r227977 r228650 230 230 231 231 void destroyLeftoverChildren(); 232 RenderObject* attachRendererInternal(RenderPtr<RenderObject> child, RenderObject* beforeChild); 233 RenderPtr<RenderObject> detachRendererInternal(RenderObject&); 232 234 233 235 protected: -
releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderRuby.h
r227977 r228650 86 86 const char* renderName() const override { return "RenderRuby (block)"; } 87 87 bool createsAnonymousWrapper() const override { return true; } 88 void removeLeftoverAnonymousBlock(RenderBlock*) override { ASSERT_NOT_REACHED(); }89 88 }; 90 89 -
releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderRubyRun.h
r227977 r228650 79 79 const char* renderName() const override { return "RenderRubyRun (anonymous)"; } 80 80 bool createsAnonymousWrapper() const override { return true; } 81 void removeLeftoverAnonymousBlock(RenderBlock*) override { }82 81 83 82 private: -
releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/RenderTextControl.h
r224537 r228650 75 75 void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const override; 76 76 void computePreferredLogicalWidths() override; 77 void removeLeftoverAnonymousBlock(RenderBlock*) override { }78 77 bool avoidsFloats() const override { return true; } 79 78 bool canHaveGeneratedChildren() const override { return false; } -
releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilderBlock.cpp
r227791 r228650 27 27 #include "RenderTreeBuilderBlock.h" 28 28 29 #include "RenderButton.h" 29 30 #include "RenderChildIterator.h" 30 31 #include "RenderFullScreen.h" 32 #include "RenderRuby.h" 33 #include "RenderRubyRun.h" 34 #include "RenderTextControl.h" 31 35 32 36 namespace WebCore { … … 194 198 195 199 if (madeBoxesNonInline && is<RenderBlock>(parent.parent()) && parent.isAnonymousBlock()) 196 downcast<RenderBlock>(*parent.parent()).removeLeftoverAnonymousBlock(&parent);200 removeLeftoverAnonymousBlock(parent); 197 201 // parent object may be dead here 198 202 } … … 202 206 m_builder.makeChildrenNonInline(parent); 203 207 if (parent.isAnonymousBlock() && is<RenderBlock>(parent.parent())) 204 downcast<RenderBlock>(*parent.parent()).removeLeftoverAnonymousBlock(&parent);208 removeLeftoverAnonymousBlock(parent); 205 209 // parent may be dead here 206 210 } 207 211 208 } 212 void RenderTreeBuilder::Block::removeLeftoverAnonymousBlock(RenderBlock& anonymousBlock) 213 { 214 ASSERT(anonymousBlock.isAnonymousBlock()); 215 ASSERT(!anonymousBlock.childrenInline()); 216 ASSERT(anonymousBlock.parent()); 217 218 if (anonymousBlock.continuation()) 219 return; 220 221 auto* parent = anonymousBlock.parent(); 222 if (is<RenderButton>(*parent) || is<RenderTextControl>(*parent) || is<RenderRubyAsBlock>(*parent) || is<RenderRubyRun>(*parent)) 223 return; 224 225 // FIXME: This should really just be a moveAllChilrenTo (see webkit.org/b/182495) 226 anonymousBlock.moveAllChildrenToInternal(*parent); 227 auto toBeDestroyed = parent->takeChildInternal(anonymousBlock); 228 // anonymousBlock is dead here. 229 } 230 231 } -
releases/WebKitGTK/webkit-2.20/Source/WebCore/rendering/updating/RenderTreeBuilderBlock.h
r227791 r228650 41 41 private: 42 42 void insertChildToContinuation(RenderBlock& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild); 43 void removeLeftoverAnonymousBlock(RenderBlock& anonymousBlock); 43 44 44 45 RenderTreeBuilder& m_builder;
Note: See TracChangeset
for help on using the changeset viewer.