Changeset 228345 in webkit
- Timestamp:
- Feb 9, 2018 4:45:25 PM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r228342 r228345 1 2018-02-09 Zalan Bujtas <zalan@apple.com> 2 3 [RenderTreeBuilder] Move RenderRubyRun::takeChild mutation to a RenderTreeBuilder 4 https://bugs.webkit.org/show_bug.cgi?id=182655 5 <rdar://problem/37406801> 6 7 Reviewed by Simon Fraser. 8 9 No change in functionality. 10 11 * rendering/RenderRubyRun.cpp: 12 (WebCore::RenderRubyRun::takeChild): 13 * rendering/updating/RenderTreeBuilder.cpp: 14 (WebCore::RenderTreeBuilder::takeChildFromRenderRubyRun): 15 * rendering/updating/RenderTreeBuilder.h: 16 * rendering/updating/RenderTreeBuilderRuby.cpp: 17 (WebCore::RenderTreeBuilder::Ruby::takeChild): 18 * rendering/updating/RenderTreeBuilderRuby.h: 19 1 20 2018-02-09 Andy Estes <aestes@apple.com> 2 21 -
trunk/Source/WebCore/rendering/RenderRubyRun.cpp
r228289 r228345 100 100 RenderPtr<RenderObject> RenderRubyRun::takeChild(RenderTreeBuilder& builder, RenderObject& child) 101 101 { 102 // If the child is a ruby text, then merge the ruby base with the base of 103 // the right sibling run, if possible. 104 if (!beingDestroyed() && !renderTreeBeingDestroyed() && child.isRubyText()) { 105 RenderRubyBase* base = rubyBase(); 106 RenderObject* rightNeighbour = nextSibling(); 107 if (base && is<RenderRubyRun>(rightNeighbour)) { 108 // Ruby run without a base can happen only at the first run. 109 RenderRubyRun& rightRun = downcast<RenderRubyRun>(*rightNeighbour); 110 if (rightRun.hasRubyBase()) { 111 RenderRubyBase* rightBase = rightRun.rubyBase(); 112 // Collect all children in a single base, then swap the bases. 113 builder.moveRubyChildren(*rightBase, *base); 114 moveChildTo(builder, &rightRun, base, RenderBoxModelObject::NormalizeAfterInsertion::No); 115 rightRun.moveChildTo(builder, this, rightBase, RenderBoxModelObject::NormalizeAfterInsertion::No); 116 // The now empty ruby base will be removed below. 117 ASSERT(!rubyBase()->firstChild()); 118 } 119 } 120 } 121 122 auto takenChild = RenderBlockFlow::takeChild(builder, child); 123 124 if (!beingDestroyed() && !renderTreeBeingDestroyed()) { 125 // Check if our base (if any) is now empty. If so, destroy it. 126 RenderBlock* base = rubyBase(); 127 if (base && !base->firstChild()) { 128 auto takenBase = RenderBlockFlow::takeChild(builder, *base); 129 base->deleteLines(); 130 } 131 } 132 133 return takenChild; 102 return builder.takeChildFromRenderRubyRun(*this, child); 134 103 } 135 104 -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.cpp
r228339 r228345 481 481 } 482 482 483 RenderPtr<RenderObject> RenderTreeBuilder::takeChildFromRenderRubyRun(RenderRubyRun& parent, RenderObject& child) 484 { 485 return rubyBuilder().takeChild(parent, child); 486 } 487 483 488 void RenderTreeBuilder::updateAfterDescendants(RenderElement& renderer) 484 489 { -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilder.h
r228339 r228345 76 76 RenderPtr<RenderObject> takeChildFromRenderRubyAsInline(RenderRubyAsInline& parent, RenderObject& child); 77 77 RenderPtr<RenderObject> takeChildFromRenderRubyAsBlock(RenderRubyAsBlock& parent, RenderObject& child); 78 RenderPtr<RenderObject> takeChildFromRenderRubyRun(RenderRubyRun& parent, RenderObject& child); 78 79 79 80 bool childRequiresTable(const RenderElement& parent, const RenderObject& child); -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilderRuby.cpp
r228339 r228345 421 421 } 422 422 423 } 423 RenderPtr<RenderObject> RenderTreeBuilder::Ruby::takeChild(RenderRubyRun& parent, RenderObject& child) 424 { 425 // If the child is a ruby text, then merge the ruby base with the base of 426 // the right sibling run, if possible. 427 if (!parent.beingDestroyed() && !parent.renderTreeBeingDestroyed() && child.isRubyText()) { 428 RenderRubyBase* base = parent.rubyBase(); 429 RenderObject* rightNeighbour = parent.nextSibling(); 430 if (base && is<RenderRubyRun>(rightNeighbour)) { 431 // Ruby run without a base can happen only at the first run. 432 RenderRubyRun& rightRun = downcast<RenderRubyRun>(*rightNeighbour); 433 if (rightRun.hasRubyBase()) { 434 RenderRubyBase* rightBase = rightRun.rubyBase(); 435 // Collect all children in a single base, then swap the bases. 436 m_builder.moveRubyChildren(*rightBase, *base); 437 parent.moveChildTo(m_builder, &rightRun, base, RenderBoxModelObject::NormalizeAfterInsertion::No); 438 rightRun.moveChildTo(m_builder, &parent, rightBase, RenderBoxModelObject::NormalizeAfterInsertion::No); 439 // The now empty ruby base will be removed below. 440 ASSERT(!parent.rubyBase()->firstChild()); 441 } 442 } 443 } 444 445 auto takenChild = parent.RenderBlockFlow::takeChild(m_builder, child); 446 447 if (!parent.beingDestroyed() && !parent.renderTreeBeingDestroyed()) { 448 // Check if our base (if any) is now empty. If so, destroy it. 449 RenderBlock* base = parent.rubyBase(); 450 if (base && !base->firstChild()) { 451 auto takenBase = parent.RenderBlockFlow::takeChild(m_builder, *base); 452 base->deleteLines(); 453 } 454 } 455 return takenChild; 456 } 457 458 } -
trunk/Source/WebCore/rendering/updating/RenderTreeBuilderRuby.h
r228339 r228345 45 45 RenderPtr<RenderObject> takeChild(RenderRubyAsInline& parent, RenderObject& child); 46 46 RenderPtr<RenderObject> takeChild(RenderRubyAsBlock& parent, RenderObject& child); 47 RenderPtr<RenderObject> takeChild(RenderRubyRun& parent, RenderObject& child); 48 49 void moveChildren(RenderRubyBase& from, RenderRubyBase& to); 47 50 48 51 RenderElement& findOrCreateParentForChild(RenderRubyAsBlock& parent, const RenderObject& child, RenderObject*& beforeChild); 49 52 RenderElement& findOrCreateParentForChild(RenderRubyAsInline& parent, const RenderObject& child, RenderObject*& beforeChild); 50 51 void moveChildren(RenderRubyBase& from, RenderRubyBase& to);52 53 53 54 private:
Note: See TracChangeset
for help on using the changeset viewer.