Skip to content

Commit

Permalink
Merge r228345 - [RenderTreeBuilder] Move RenderRubyRun::takeChild mut…
Browse files Browse the repository at this point in the history
…ation to a RenderTreeBuilder

https://bugs.webkit.org/show_bug.cgi?id=182655
<rdar://problem/37406801>

Reviewed by Simon Fraser.

No change in functionality.

* rendering/RenderRubyRun.cpp:
(WebCore::RenderRubyRun::takeChild):
* rendering/updating/RenderTreeBuilder.cpp:
(WebCore::RenderTreeBuilder::takeChildFromRenderRubyRun):
* rendering/updating/RenderTreeBuilder.h:
* rendering/updating/RenderTreeBuilderRuby.cpp:
(WebCore::RenderTreeBuilder::Ruby::takeChild):
* rendering/updating/RenderTreeBuilderRuby.h:
  • Loading branch information
alanbaradlay authored and carlosgcampos committed Feb 19, 2018
1 parent 78ebebc commit d536a97
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 34 deletions.
19 changes: 19 additions & 0 deletions Source/WebCore/ChangeLog
@@ -1,3 +1,22 @@
2018-02-09 Zalan Bujtas <zalan@apple.com>

[RenderTreeBuilder] Move RenderRubyRun::takeChild mutation to a RenderTreeBuilder
https://bugs.webkit.org/show_bug.cgi?id=182655
<rdar://problem/37406801>

Reviewed by Simon Fraser.

No change in functionality.

* rendering/RenderRubyRun.cpp:
(WebCore::RenderRubyRun::takeChild):
* rendering/updating/RenderTreeBuilder.cpp:
(WebCore::RenderTreeBuilder::takeChildFromRenderRubyRun):
* rendering/updating/RenderTreeBuilder.h:
* rendering/updating/RenderTreeBuilderRuby.cpp:
(WebCore::RenderTreeBuilder::Ruby::takeChild):
* rendering/updating/RenderTreeBuilderRuby.h:

2018-02-09 Zalan Bujtas <zalan@apple.com>

[RenderTreeBuilder] Move RenderRubyAsInline/AsBlock::takeChild mutation to a RenderTreeBuilder
Expand Down
33 changes: 1 addition & 32 deletions Source/WebCore/rendering/RenderRubyRun.cpp
Expand Up @@ -99,38 +99,7 @@ bool RenderRubyRun::isChildAllowed(const RenderObject& child, const RenderStyle&

RenderPtr<RenderObject> RenderRubyRun::takeChild(RenderTreeBuilder& builder, RenderObject& child)
{
// If the child is a ruby text, then merge the ruby base with the base of
// the right sibling run, if possible.
if (!beingDestroyed() && !renderTreeBeingDestroyed() && child.isRubyText()) {
RenderRubyBase* base = rubyBase();
RenderObject* rightNeighbour = nextSibling();
if (base && is<RenderRubyRun>(rightNeighbour)) {
// Ruby run without a base can happen only at the first run.
RenderRubyRun& rightRun = downcast<RenderRubyRun>(*rightNeighbour);
if (rightRun.hasRubyBase()) {
RenderRubyBase* rightBase = rightRun.rubyBase();
// Collect all children in a single base, then swap the bases.
builder.moveRubyChildren(*rightBase, *base);
moveChildTo(builder, &rightRun, base, RenderBoxModelObject::NormalizeAfterInsertion::No);
rightRun.moveChildTo(builder, this, rightBase, RenderBoxModelObject::NormalizeAfterInsertion::No);
// The now empty ruby base will be removed below.
ASSERT(!rubyBase()->firstChild());
}
}
}

auto takenChild = RenderBlockFlow::takeChild(builder, child);

if (!beingDestroyed() && !renderTreeBeingDestroyed()) {
// Check if our base (if any) is now empty. If so, destroy it.
RenderBlock* base = rubyBase();
if (base && !base->firstChild()) {
auto takenBase = RenderBlockFlow::takeChild(builder, *base);
base->deleteLines();
}
}

return takenChild;
return builder.takeChildFromRenderRubyRun(*this, child);
}

RenderPtr<RenderRubyBase> RenderRubyRun::createRubyBase() const
Expand Down
5 changes: 5 additions & 0 deletions Source/WebCore/rendering/updating/RenderTreeBuilder.cpp
Expand Up @@ -480,6 +480,11 @@ RenderPtr<RenderObject> RenderTreeBuilder::takeChildFromRenderRubyAsBlock(Render
return rubyBuilder().takeChild(parent, child);
}

RenderPtr<RenderObject> RenderTreeBuilder::takeChildFromRenderRubyRun(RenderRubyRun& parent, RenderObject& child)
{
return rubyBuilder().takeChild(parent, child);
}

void RenderTreeBuilder::updateAfterDescendants(RenderElement& renderer)
{
if (is<RenderBlock>(renderer))
Expand Down
1 change: 1 addition & 0 deletions Source/WebCore/rendering/updating/RenderTreeBuilder.h
Expand Up @@ -75,6 +75,7 @@ class RenderTreeBuilder {

RenderPtr<RenderObject> takeChildFromRenderRubyAsInline(RenderRubyAsInline& parent, RenderObject& child);
RenderPtr<RenderObject> takeChildFromRenderRubyAsBlock(RenderRubyAsBlock& parent, RenderObject& child);
RenderPtr<RenderObject> takeChildFromRenderRubyRun(RenderRubyRun& parent, RenderObject& child);

bool childRequiresTable(const RenderElement& parent, const RenderObject& child);
void makeChildrenNonInline(RenderBlock& parent, RenderObject* insertionPoint = nullptr);
Expand Down
35 changes: 35 additions & 0 deletions Source/WebCore/rendering/updating/RenderTreeBuilderRuby.cpp
Expand Up @@ -420,4 +420,39 @@ RenderPtr<RenderObject> RenderTreeBuilder::Ruby::takeChild(RenderRubyAsBlock& pa
return findRubyRunParent(child).takeChild(m_builder, child);
}

RenderPtr<RenderObject> RenderTreeBuilder::Ruby::takeChild(RenderRubyRun& parent, RenderObject& child)
{
// If the child is a ruby text, then merge the ruby base with the base of
// the right sibling run, if possible.
if (!parent.beingDestroyed() && !parent.renderTreeBeingDestroyed() && child.isRubyText()) {
RenderRubyBase* base = parent.rubyBase();
RenderObject* rightNeighbour = parent.nextSibling();
if (base && is<RenderRubyRun>(rightNeighbour)) {
// Ruby run without a base can happen only at the first run.
RenderRubyRun& rightRun = downcast<RenderRubyRun>(*rightNeighbour);
if (rightRun.hasRubyBase()) {
RenderRubyBase* rightBase = rightRun.rubyBase();
// Collect all children in a single base, then swap the bases.
m_builder.moveRubyChildren(*rightBase, *base);
parent.moveChildTo(m_builder, &rightRun, base, RenderBoxModelObject::NormalizeAfterInsertion::No);
rightRun.moveChildTo(m_builder, &parent, rightBase, RenderBoxModelObject::NormalizeAfterInsertion::No);
// The now empty ruby base will be removed below.
ASSERT(!parent.rubyBase()->firstChild());
}
}
}

auto takenChild = parent.RenderBlockFlow::takeChild(m_builder, child);

if (!parent.beingDestroyed() && !parent.renderTreeBeingDestroyed()) {
// Check if our base (if any) is now empty. If so, destroy it.
RenderBlock* base = parent.rubyBase();
if (base && !base->firstChild()) {
auto takenBase = parent.RenderBlockFlow::takeChild(m_builder, *base);
base->deleteLines();
}
}
return takenChild;
}

}
5 changes: 3 additions & 2 deletions Source/WebCore/rendering/updating/RenderTreeBuilderRuby.h
Expand Up @@ -44,12 +44,13 @@ class RenderTreeBuilder::Ruby {
void insertChild(RenderRubyRun& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild);
RenderPtr<RenderObject> takeChild(RenderRubyAsInline& parent, RenderObject& child);
RenderPtr<RenderObject> takeChild(RenderRubyAsBlock& parent, RenderObject& child);
RenderPtr<RenderObject> takeChild(RenderRubyRun& parent, RenderObject& child);

void moveChildren(RenderRubyBase& from, RenderRubyBase& to);

RenderElement& findOrCreateParentForChild(RenderRubyAsBlock& parent, const RenderObject& child, RenderObject*& beforeChild);
RenderElement& findOrCreateParentForChild(RenderRubyAsInline& parent, const RenderObject& child, RenderObject*& beforeChild);

void moveChildren(RenderRubyBase& from, RenderRubyBase& to);

private:
void moveInlineChildren(RenderRubyBase& from, RenderRubyBase& to, RenderObject* beforeChild);
void moveBlockChildren(RenderRubyBase& from, RenderRubyBase& to, RenderObject* beforeChild);
Expand Down

0 comments on commit d536a97

Please sign in to comment.