- Revision
- 144461
- Author
- [email protected]
- Date
- 2013-03-01 08:58:25 -0800 (Fri, 01 Mar 2013)
Log Message
[New Multicolumn] Change flow thread containment to be a state.
https://bugs.webkit.org/show_bug.cgi?id=111110
Change m_inRenderFlowThread from a single bit to an actual state. This
will let us track whether we're inside a multicolumn (in-flow) flow thread
or a named (out-of-flow) flow thread. In the former case, we're going to have
to do more work to maintain this state, but for now I've kept all the logic
the same just for the initial landing.
Reviewed by Andreas Kling.
* dom/NodeRenderingContext.cpp:
(WebCore::NodeRenderingContext::createRendererForElementIfNeeded):
(WebCore::NodeRenderingContext::createRendererForTextIfNeeded):
* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::clone):
* rendering/RenderFlowThread.cpp:
(WebCore::RenderFlowThread::RenderFlowThread):
* rendering/RenderInline.cpp:
(WebCore::RenderInline::clone):
* rendering/RenderMultiColumnFlowThread.cpp:
(WebCore::RenderMultiColumnFlowThread::RenderMultiColumnFlowThread):
* rendering/RenderObject.cpp:
(WebCore::RenderObject::setFlowThreadStateIncludingDescendants):
(WebCore::RenderObject::removeFromRenderFlowThreadRecursive):
* rendering/RenderObject.h:
(WebCore::RenderObject::setParent):
(RenderObject):
(WebCore::RenderObject::inRenderFlowThread):
(WebCore::RenderObject::flowThreadState):
(WebCore::RenderObject::setFlowThreadState):
(WebCore::RenderObject::RenderObjectBitfields::RenderObjectBitfields):
(RenderObjectBitfields):
(WebCore::RenderObject::RenderObjectBitfields::flowThreadState):
(WebCore::RenderObject::RenderObjectBitfields::setFlowThreadState):
* rendering/RenderView.cpp:
(WebCore::RenderView::addChild):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (144460 => 144461)
--- trunk/Source/WebCore/ChangeLog 2013-03-01 16:46:11 UTC (rev 144460)
+++ trunk/Source/WebCore/ChangeLog 2013-03-01 16:58:25 UTC (rev 144461)
@@ -1,3 +1,43 @@
+2013-03-01 David Hyatt <[email protected]>
+
+ [New Multicolumn] Change flow thread containment to be a state.
+ https://bugs.webkit.org/show_bug.cgi?id=111110
+
+ Change m_inRenderFlowThread from a single bit to an actual state. This
+ will let us track whether we're inside a multicolumn (in-flow) flow thread
+ or a named (out-of-flow) flow thread. In the former case, we're going to have
+ to do more work to maintain this state, but for now I've kept all the logic
+ the same just for the initial landing.
+
+ Reviewed by Andreas Kling.
+
+ * dom/NodeRenderingContext.cpp:
+ (WebCore::NodeRenderingContext::createRendererForElementIfNeeded):
+ (WebCore::NodeRenderingContext::createRendererForTextIfNeeded):
+ * rendering/RenderBlock.cpp:
+ (WebCore::RenderBlock::clone):
+ * rendering/RenderFlowThread.cpp:
+ (WebCore::RenderFlowThread::RenderFlowThread):
+ * rendering/RenderInline.cpp:
+ (WebCore::RenderInline::clone):
+ * rendering/RenderMultiColumnFlowThread.cpp:
+ (WebCore::RenderMultiColumnFlowThread::RenderMultiColumnFlowThread):
+ * rendering/RenderObject.cpp:
+ (WebCore::RenderObject::setFlowThreadStateIncludingDescendants):
+ (WebCore::RenderObject::removeFromRenderFlowThreadRecursive):
+ * rendering/RenderObject.h:
+ (WebCore::RenderObject::setParent):
+ (RenderObject):
+ (WebCore::RenderObject::inRenderFlowThread):
+ (WebCore::RenderObject::flowThreadState):
+ (WebCore::RenderObject::setFlowThreadState):
+ (WebCore::RenderObject::RenderObjectBitfields::RenderObjectBitfields):
+ (RenderObjectBitfields):
+ (WebCore::RenderObject::RenderObjectBitfields::flowThreadState):
+ (WebCore::RenderObject::RenderObjectBitfields::setFlowThreadState):
+ * rendering/RenderView.cpp:
+ (WebCore::RenderView::addChild):
+
2013-03-01 Jessie Berlin <[email protected]>
Build fix.
@@ -1327,7 +1367,7 @@
Removed initialization list values not needed anymore and reassigned
calls to m_boundFBO, m_boundTexture0 and m_activeTexture to m_state
respectives.
-
+
2013-02-28 David Hyatt <[email protected]>
Unreviewed build fix. A merge error led to a duplication of a single line.
Modified: trunk/Source/WebCore/dom/NodeRenderingContext.cpp (144460 => 144461)
--- trunk/Source/WebCore/dom/NodeRenderingContext.cpp 2013-03-01 16:46:11 UTC (rev 144460)
+++ trunk/Source/WebCore/dom/NodeRenderingContext.cpp 2013-03-01 16:58:25 UTC (rev 144461)
@@ -268,7 +268,7 @@
// Make sure the RenderObject already knows it is going to be added to a RenderFlowThread before we set the style
// for the first time. Otherwise code using inRenderFlowThread() in the styleWillChange and styleDidChange will fail.
- newRenderer->setInRenderFlowThread(parentRenderer->inRenderFlowThread());
+ newRenderer->setFlowThreadState(parentRenderer->flowThreadState());
element->setRenderer(newRenderer);
newRenderer->setAnimatableStyle(m_style.release()); // setAnimatableStyle() can depend on renderer() already being set.
@@ -314,7 +314,7 @@
// Make sure the RenderObject already knows it is going to be added to a RenderFlowThread before we set the style
// for the first time. Otherwise code using inRenderFlowThread() in the styleWillChange and styleDidChange will fail.
- newRenderer->setInRenderFlowThread(parentRenderer->inRenderFlowThread());
+ newRenderer->setFlowThreadState(parentRenderer->flowThreadState());
RenderObject* nextRenderer = this->nextRenderer();
textNode->setRenderer(newRenderer);
Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (144460 => 144461)
--- trunk/Source/WebCore/rendering/RenderBlock.cpp 2013-03-01 16:46:11 UTC (rev 144460)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp 2013-03-01 16:58:25 UTC (rev 144461)
@@ -591,7 +591,7 @@
// generated content added yet.
cloneBlock->setChildrenInline(cloneBlock->firstChild() ? cloneBlock->firstChild()->isInline() : childrenInline());
}
- cloneBlock->setInRenderFlowThread(inRenderFlowThread());
+ cloneBlock->setFlowThreadState(flowThreadState());
return cloneBlock;
}
Modified: trunk/Source/WebCore/rendering/RenderFlowThread.cpp (144460 => 144461)
--- trunk/Source/WebCore/rendering/RenderFlowThread.cpp 2013-03-01 16:46:11 UTC (rev 144460)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.cpp 2013-03-01 16:58:25 UTC (rev 144461)
@@ -59,7 +59,7 @@
, m_pageLogicalSizeChanged(false)
{
ASSERT(document->cssRegionsEnabled());
- setInRenderFlowThread();
+ setFlowThreadState(InsideOutOfFlowThread);
}
PassRefPtr<RenderStyle> RenderFlowThread::createFlowThreadStyle(RenderStyle* parentStyle)
Modified: trunk/Source/WebCore/rendering/RenderInline.cpp (144460 => 144461)
--- trunk/Source/WebCore/rendering/RenderInline.cpp 2013-03-01 16:46:11 UTC (rev 144460)
+++ trunk/Source/WebCore/rendering/RenderInline.cpp 2013-03-01 16:58:25 UTC (rev 144461)
@@ -335,7 +335,7 @@
{
RenderInline* cloneInline = new (renderArena()) RenderInline(node());
cloneInline->setStyle(style());
- cloneInline->setInRenderFlowThread(inRenderFlowThread());
+ cloneInline->setFlowThreadState(flowThreadState());
return cloneInline;
}
Modified: trunk/Source/WebCore/rendering/RenderMultiColumnFlowThread.cpp (144460 => 144461)
--- trunk/Source/WebCore/rendering/RenderMultiColumnFlowThread.cpp 2013-03-01 16:46:11 UTC (rev 144460)
+++ trunk/Source/WebCore/rendering/RenderMultiColumnFlowThread.cpp 2013-03-01 16:58:25 UTC (rev 144461)
@@ -33,6 +33,7 @@
RenderMultiColumnFlowThread::RenderMultiColumnFlowThread(Document* document)
: RenderFlowThread(document)
{
+ setFlowThreadState(InsideInFlowThread);
}
RenderMultiColumnFlowThread::~RenderMultiColumnFlowThread()
Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (144460 => 144461)
--- trunk/Source/WebCore/rendering/RenderObject.cpp 2013-03-01 16:46:11 UTC (rev 144460)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp 2013-03-01 16:58:25 UTC (rev 144461)
@@ -276,13 +276,13 @@
return node() && node()->renderer() == this && node()->hasTagName(marqueeTag);
}
-void RenderObject::setInRenderFlowThreadIncludingDescendants(bool b)
+void RenderObject::setFlowThreadStateIncludingDescendants(FlowThreadState state)
{
- setInRenderFlowThread(b);
+ setFlowThreadState(state);
for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
- ASSERT(b != child->inRenderFlowThread());
- child->setInRenderFlowThreadIncludingDescendants(b);
+ ASSERT(state != child->flowThreadState());
+ child->setFlowThreadStateIncludingDescendants(state);
}
}
@@ -2507,7 +2507,7 @@
child->removeFromRenderFlowThreadRecursive(renderFlowThread);
}
renderFlowThread->removeFlowChildInfo(this);
- setInRenderFlowThread(false);
+ setFlowThreadState(NotInsideFlowThread);
}
void RenderObject::destroyAndCleanupAnonymousWrappers()
Modified: trunk/Source/WebCore/rendering/RenderObject.h (144460 => 144461)
--- trunk/Source/WebCore/rendering/RenderObject.h 2013-03-01 16:46:11 UTC (rev 144460)
+++ trunk/Source/WebCore/rendering/RenderObject.h 2013-03-01 16:58:25 UTC (rev 144461)
@@ -264,11 +264,15 @@
void setParent(RenderObject* parent)
{
m_parent = parent;
- if (parent && parent->inRenderFlowThread() && !inRenderFlowThread())
- setInRenderFlowThreadIncludingDescendants(true);
- else if (!parent && inRenderFlowThread())
- setInRenderFlowThreadIncludingDescendants(false);
+
+ // Only update if our flow thread state is different from our new parent and if we're not a RenderFlowThread.
+ // A RenderFlowThread is always considered to be inside itself, so it never has to change its state
+ // in response to parent changes.
+ FlowThreadState newState = parent ? parent->flowThreadState() : NotInsideFlowThread;
+ if (newState != flowThreadState() && !isRenderFlowThread())
+ setFlowThreadStateIncludingDescendants(newState);
}
+
//////////////////////////////////////////
private:
#ifndef NDEBUG
@@ -432,11 +436,23 @@
}
}
- bool inRenderFlowThread() const { return m_bitfields.inRenderFlowThread(); }
- void setInRenderFlowThread(bool b = true) { m_bitfields.setInRenderFlowThread(b); }
+ enum FlowThreadState {
+ NotInsideFlowThread = 0,
+ InsideOutOfFlowThread = 1,
+ InsideInFlowThread = 2,
+ };
- void setInRenderFlowThreadIncludingDescendants(bool = true);
+ bool inRenderFlowThread() const
+ {
+ FlowThreadState state = flowThreadState();
+ return state != NotInsideFlowThread;
+ }
+ void setFlowThreadStateIncludingDescendants(FlowThreadState);
+
+ FlowThreadState flowThreadState() const { return m_bitfields.flowThreadState(); }
+ void setFlowThreadState(FlowThreadState state) { m_bitfields.setFlowThreadState(state); }
+
virtual bool requiresForcedStyleRecalcPropagation() const { return false; }
#if ENABLE(MATHML)
@@ -1043,6 +1059,7 @@
IsOutOfFlowPositioned = 2,
IsStickyPositioned = 3
};
+
public:
RenderObjectBitfields(Node* node)
: m_needsLayout(false)
@@ -1066,15 +1083,15 @@
, m_hasReflection(false)
, m_hasCounterNodeMap(false)
, m_everHadLayout(false)
- , m_inRenderFlowThread(false)
, m_childrenInline(false)
, m_hasColumns(false)
, m_positionedState(IsStaticlyPositioned)
, m_selectionState(SelectionNone)
+ , m_flowThreadState(NotInsideFlowThread)
{
}
- // 29 bits have been used here. There are three bits available.
+ // 30 bits have been used here. There are two bits available.
ADD_BOOLEAN_BITFIELD(needsLayout, NeedsLayout);
ADD_BOOLEAN_BITFIELD(needsPositionedMovementLayout, NeedsPositionedMovementLayout);
ADD_BOOLEAN_BITFIELD(normalChildNeedsLayout, NormalChildNeedsLayout);
@@ -1102,10 +1119,6 @@
ADD_BOOLEAN_BITFIELD(hasCounterNodeMap, HasCounterNodeMap);
ADD_BOOLEAN_BITFIELD(everHadLayout, EverHadLayout);
- // These bitfields are moved here from subclasses to pack them together.
- // from RenderFlowThread
- ADD_BOOLEAN_BITFIELD(inRenderFlowThread, InRenderFlowThread);
-
// from RenderBlock
ADD_BOOLEAN_BITFIELD(childrenInline, ChildrenInline);
ADD_BOOLEAN_BITFIELD(hasColumns, HasColumns);
@@ -1113,6 +1126,7 @@
private:
unsigned m_positionedState : 2; // PositionedState
unsigned m_selectionState : 3; // SelectionState
+ unsigned m_flowThreadState : 2; // FlowThreadState
public:
bool isOutOfFlowPositioned() const { return m_positionedState == IsOutOfFlowPositioned; }
@@ -1129,6 +1143,9 @@
ALWAYS_INLINE SelectionState selectionState() const { return static_cast<SelectionState>(m_selectionState); }
ALWAYS_INLINE void setSelectionState(SelectionState selectionState) { m_selectionState = selectionState; }
+
+ ALWAYS_INLINE FlowThreadState flowThreadState() const { return static_cast<FlowThreadState>(m_flowThreadState); }
+ ALWAYS_INLINE void setFlowThreadState(FlowThreadState flowThreadState) { m_flowThreadState = flowThreadState; }
};
#undef ADD_BOOLEAN_BITFIELD
Modified: trunk/Source/WebCore/rendering/RenderView.cpp (144460 => 144461)
--- trunk/Source/WebCore/rendering/RenderView.cpp 2013-03-01 16:46:11 UTC (rev 144460)
+++ trunk/Source/WebCore/rendering/RenderView.cpp 2013-03-01 16:58:25 UTC (rev 144461)
@@ -163,7 +163,7 @@
if (newChild && !newChild->isRenderFlowThread()) {
RenderBox* seamlessBox = enclosingSeamlessRenderer(document());
if (seamlessBox && seamlessBox->inRenderFlowThread())
- newChild->setInRenderFlowThread();
+ newChild->setFlowThreadState(seamlessBox->flowThreadState());
}
RenderBlock::addChild(newChild, beforeChild);
}