Skip to content

Commit

Permalink
Merge r228327 - [RenderTreeBuilder] Move multicolumn descendant/sibli…
Browse files Browse the repository at this point in the history
…ng removal logic to RenderTreeBuilder

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

Reviewed by Antti Koivisto.

No change in functionality

* rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::takeChild):
* rendering/RenderFragmentedFlow.h:
* rendering/RenderMultiColumnFlow.cpp:
(WebCore::RenderMultiColumnFlow::handleSpannerRemoval): Deleted.
(WebCore::RenderMultiColumnFlow::fragmentedFlowRelativeWillBeRemoved): Deleted.
* rendering/RenderMultiColumnFlow.h:
* rendering/updating/RenderTreeBuilder.cpp:
(WebCore::RenderTreeBuilder::multiColumnRelativeWillBeRemoved):
* rendering/updating/RenderTreeBuilder.h:
* rendering/updating/RenderTreeBuilderMultiColumn.cpp:
(WebCore::RenderTreeBuilder::MultiColumn::handleSpannerRemoval):
(WebCore::RenderTreeBuilder::MultiColumn::multiColumnRelativeWillBeRemoved):
* rendering/updating/RenderTreeBuilderMultiColumn.h:
  • Loading branch information
alanbaradlay authored and carlosgcampos committed Feb 19, 2018
1 parent 4a495e7 commit eff1ca3
Show file tree
Hide file tree
Showing 9 changed files with 73 additions and 46 deletions.
25 changes: 25 additions & 0 deletions Source/WebCore/ChangeLog
@@ -1,3 +1,28 @@
2018-02-09 Zalan Bujtas <zalan@apple.com>

[RenderTreeBuilder] Move multicolumn descendant/sibling removal logic to RenderTreeBuilder
https://bugs.webkit.org/show_bug.cgi?id=182628
<rdar://problem/37369528>

Reviewed by Antti Koivisto.

No change in functionality

* rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::takeChild):
* rendering/RenderFragmentedFlow.h:
* rendering/RenderMultiColumnFlow.cpp:
(WebCore::RenderMultiColumnFlow::handleSpannerRemoval): Deleted.
(WebCore::RenderMultiColumnFlow::fragmentedFlowRelativeWillBeRemoved): Deleted.
* rendering/RenderMultiColumnFlow.h:
* rendering/updating/RenderTreeBuilder.cpp:
(WebCore::RenderTreeBuilder::multiColumnRelativeWillBeRemoved):
* rendering/updating/RenderTreeBuilder.h:
* rendering/updating/RenderTreeBuilderMultiColumn.cpp:
(WebCore::RenderTreeBuilder::MultiColumn::handleSpannerRemoval):
(WebCore::RenderTreeBuilder::MultiColumn::multiColumnRelativeWillBeRemoved):
* rendering/updating/RenderTreeBuilderMultiColumn.h:

2018-02-08 Philippe Normand <pnormand@igalia.com>

[GStreamer][WebAudio] Winamp2-js woes
Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/rendering/RenderBlockFlow.cpp
Expand Up @@ -3852,9 +3852,9 @@ void RenderBlockFlow::addChild(RenderTreeBuilder& builder, RenderPtr<RenderObjec
RenderPtr<RenderObject> RenderBlockFlow::takeChild(RenderTreeBuilder& builder, RenderObject& oldChild)
{
if (!renderTreeBeingDestroyed()) {
RenderFragmentedFlow* fragmentedFlow = multiColumnFlow();
auto* fragmentedFlow = multiColumnFlow();
if (fragmentedFlow && fragmentedFlow != &oldChild)
fragmentedFlow->fragmentedFlowRelativeWillBeRemoved(oldChild);
builder.multiColumnRelativeWillBeRemoved(*fragmentedFlow, oldChild);
}
return RenderBlock::takeChild(builder, oldChild);
}
Expand Down
2 changes: 0 additions & 2 deletions Source/WebCore/rendering/RenderFragmentedFlow.h
Expand Up @@ -86,8 +86,6 @@ class RenderFragmentedFlow: public RenderBlockFlow {

virtual bool singleFragmentHasUniformLogicalHeight() const { return true; }

// Called when a sibling or descendant of the flow thread is about to be removed.
virtual void fragmentedFlowRelativeWillBeRemoved(RenderObject&) { }
// Called when a descendant box's layout is finished and it has been positioned within its container.
virtual void fragmentedFlowDescendantBoxLaidOut(RenderBox*) { }

Expand Down
39 changes: 0 additions & 39 deletions Source/WebCore/rendering/RenderMultiColumnFlow.cpp
Expand Up @@ -165,45 +165,6 @@ RenderPtr<RenderMultiColumnSet> RenderMultiColumnFlow::createMultiColumnSet(Rend
return createRenderer<RenderMultiColumnSet>(*this, WTFMove(style));
}

void RenderMultiColumnFlow::handleSpannerRemoval(RenderObject& spanner)
{
// The placeholder may already have been removed, but if it hasn't, do so now.
if (auto placeholder = spannerMap().take(&downcast<RenderBox>(spanner)))
placeholder->removeFromParentAndDestroy();

if (RenderObject* next = spanner.nextSibling()) {
if (RenderObject* previous = spanner.previousSibling()) {
if (previous->isRenderMultiColumnSet() && next->isRenderMultiColumnSet()) {
// Merge two sets that no longer will be separated by a spanner.
next->removeFromParentAndDestroy();
previous->setNeedsLayout();
}
}
}
}

void RenderMultiColumnFlow::fragmentedFlowRelativeWillBeRemoved(RenderObject& relative)
{
invalidateFragments();
if (is<RenderMultiColumnSpannerPlaceholder>(relative)) {
// Remove the map entry for this spanner, but leave the actual spanner renderer alone. Also
// keep the reference to the spanner, since the placeholder may be about to be re-inserted
// in the tree.
ASSERT(relative.isDescendantOf(this));
spannerMap().remove(downcast<RenderMultiColumnSpannerPlaceholder>(relative).spanner());
return;
}
if (relative.style().columnSpan() == ColumnSpanAll) {
if (relative.parent() != parent())
return; // not a valid spanner.

handleSpannerRemoval(relative);
}
// Note that we might end up with empty column sets if all column content is removed. That's no
// big deal though (and locating them would be expensive), and they will be found and re-used if
// content is added again later.
}

void RenderMultiColumnFlow::fragmentedFlowDescendantBoxLaidOut(RenderBox* descendant)
{
if (!is<RenderMultiColumnSpannerPlaceholder>(*descendant))
Expand Down
3 changes: 0 additions & 3 deletions Source/WebCore/rendering/RenderMultiColumnFlow.h
Expand Up @@ -107,7 +107,6 @@ class RenderMultiColumnFlow : public RenderFragmentedFlow {
const char* renderName() const override;
void addFragmentToThread(RenderFragmentContainer*) override;
void willBeRemovedFromTree() override;
void fragmentedFlowRelativeWillBeRemoved(RenderObject&) override;
void fragmentedFlowDescendantBoxLaidOut(RenderBox*) override;
LogicalExtentComputedValues computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop) const override;
LayoutUnit initialLogicalWidth() const override;
Expand All @@ -118,8 +117,6 @@ class RenderMultiColumnFlow : public RenderFragmentedFlow {
bool addForcedFragmentBreak(const RenderBlock*, LayoutUnit, RenderBox* breakChild, bool isBefore, LayoutUnit* offsetBreakAdjustment = 0) override;
bool isPageLogicalHeightKnown() const override;

void handleSpannerRemoval(RenderObject& spanner);

private:
std::unique_ptr<SpannerMap> m_spannerMap;

Expand Down
4 changes: 4 additions & 0 deletions Source/WebCore/rendering/updating/RenderTreeBuilder.cpp
Expand Up @@ -405,6 +405,10 @@ void RenderTreeBuilder::removeFromParentAndDestroyCleaningUpAnonymousWrappers(Re
removeFromParentAndDestroyCleaningUpAnonymousWrappers(destroyRootParent);
// WARNING: child is deleted here.
}
void RenderTreeBuilder::multiColumnRelativeWillBeRemoved(RenderMultiColumnFlow& flow, RenderObject& relative)
{
multiColumnBuilder().multiColumnRelativeWillBeRemoved(flow, relative);
}

void RenderTreeBuilder::insertChildToRenderInline(RenderInline& parent, RenderPtr<RenderObject> child, RenderObject* beforeChild)
{
Expand Down
1 change: 1 addition & 0 deletions Source/WebCore/rendering/updating/RenderTreeBuilder.h
Expand Up @@ -80,6 +80,7 @@ class RenderTreeBuilder {
RenderObject* resolveMovedChildForMultiColumnFlow(RenderFragmentedFlow& enclosingFragmentedFlow, RenderObject* beforeChild);
void removeFromParentAndDestroyCleaningUpAnonymousWrappers(RenderObject& child);
void multiColumnDescendantInserted(RenderMultiColumnFlow&, RenderObject& newDescendant);
void multiColumnRelativeWillBeRemoved(RenderMultiColumnFlow&, RenderObject& relative);

private:
class FirstLetter;
Expand Down
39 changes: 39 additions & 0 deletions Source/WebCore/rendering/updating/RenderTreeBuilderMultiColumn.cpp
Expand Up @@ -367,4 +367,43 @@ RenderObject* RenderTreeBuilder::MultiColumn::processPossibleSpannerDescendant(R
return nextDescendant;
}

void RenderTreeBuilder::MultiColumn::handleSpannerRemoval(RenderMultiColumnFlow& flow, RenderObject& spanner)
{
// The placeholder may already have been removed, but if it hasn't, do so now.
if (auto placeholder = flow.spannerMap().take(&downcast<RenderBox>(spanner)))
placeholder->removeFromParentAndDestroy();

if (auto* next = spanner.nextSibling()) {
if (auto* previous = spanner.previousSibling()) {
if (previous->isRenderMultiColumnSet() && next->isRenderMultiColumnSet()) {
// Merge two sets that no longer will be separated by a spanner.
next->removeFromParentAndDestroy();
previous->setNeedsLayout();
}
}
}
}

void RenderTreeBuilder::MultiColumn::multiColumnRelativeWillBeRemoved(RenderMultiColumnFlow& flow, RenderObject& relative)
{
flow.invalidateFragments();
if (is<RenderMultiColumnSpannerPlaceholder>(relative)) {
// Remove the map entry for this spanner, but leave the actual spanner renderer alone. Also
// keep the reference to the spanner, since the placeholder may be about to be re-inserted
// in the tree.
ASSERT(relative.isDescendantOf(&flow));
flow.spannerMap().remove(downcast<RenderMultiColumnSpannerPlaceholder>(relative).spanner());
return;
}
if (relative.style().columnSpan() == ColumnSpanAll) {
if (relative.parent() != flow.parent())
return; // not a valid spanner.

handleSpannerRemoval(flow, relative);
}
// Note that we might end up with empty column sets if all column content is removed. That's no
// big deal though (and locating them would be expensive), and they will be found and re-used if
// content is added again later.
}

}
Expand Up @@ -41,11 +41,13 @@ class RenderTreeBuilder::MultiColumn {
// location in the tree.
RenderObject* resolveMovedChild(RenderFragmentedFlow& enclosingFragmentedFlow, RenderObject* beforeChild);
void multiColumnDescendantInserted(RenderMultiColumnFlow&, RenderObject& newDescendant);
void multiColumnRelativeWillBeRemoved(RenderMultiColumnFlow&, RenderObject& relative);

private:
void createFragmentedFlow(RenderBlockFlow&);
void destroyFragmentedFlow(RenderBlockFlow&);
RenderObject* processPossibleSpannerDescendant(RenderMultiColumnFlow&, RenderObject*& subtreeRoot, RenderObject& descendant);
void handleSpannerRemoval(RenderMultiColumnFlow&, RenderObject& spanner);

RenderTreeBuilder& m_builder;
};
Expand Down

0 comments on commit eff1ca3

Please sign in to comment.