summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/FlowThreadController.cpp
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@digia.com>2013-09-13 12:51:20 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-09-19 20:50:05 +0200
commitd441d6f39bb846989d95bcf5caf387b42414718d (patch)
treee367e64a75991c554930278175d403c072de6bb8 /Source/WebCore/rendering/FlowThreadController.cpp
parent0060b2994c07842f4c59de64b5e3e430525c4b90 (diff)
downloadqtwebkit-d441d6f39bb846989d95bcf5caf387b42414718d.tar.gz
Import Qt5x2 branch of QtWebkit for Qt 5.2
Importing a new snapshot of webkit. Change-Id: I2d01ad12cdc8af8cb015387641120a9d7ea5f10c Reviewed-by: Allan Sandfeld Jensen <allan.jensen@digia.com>
Diffstat (limited to 'Source/WebCore/rendering/FlowThreadController.cpp')
-rw-r--r--Source/WebCore/rendering/FlowThreadController.cpp137
1 files changed, 97 insertions, 40 deletions
diff --git a/Source/WebCore/rendering/FlowThreadController.cpp b/Source/WebCore/rendering/FlowThreadController.cpp
index 3759a43e1..e0f1c6713 100644
--- a/Source/WebCore/rendering/FlowThreadController.cpp
+++ b/Source/WebCore/rendering/FlowThreadController.cpp
@@ -49,7 +49,7 @@ FlowThreadController::FlowThreadController(RenderView* view)
: m_view(view)
, m_currentRenderFlowThread(0)
, m_isRenderNamedFlowThreadOrderDirty(false)
- , m_autoLogicalHeightRegionsCount(0)
+ , m_flowThreadsWithAutoLogicalHeightRegions(0)
{
}
@@ -74,7 +74,7 @@ RenderNamedFlowThread* FlowThreadController::ensureRenderFlowThreadWithName(cons
// Sanity check for the absence of a named flow in the "CREATED" state with the same name.
ASSERT(!namedFlows->flowByName(name));
- RenderNamedFlowThread* flowRenderer = new (m_view->renderArena()) RenderNamedFlowThread(m_view->document(), namedFlows->ensureFlowWithName(name));
+ RenderNamedFlowThread* flowRenderer = RenderNamedFlowThread::createAnonymous(m_view->document(), namedFlows->ensureFlowWithName(name));
flowRenderer->setStyle(RenderFlowThread::createFlowThreadStyle(m_view->style()));
m_renderNamedFlowThreadList->add(flowRenderer);
@@ -97,9 +97,39 @@ void FlowThreadController::styleDidChange()
void FlowThreadController::layoutRenderNamedFlowThreads()
{
- ASSERT(m_renderNamedFlowThreadList);
+ updateFlowThreadsChainIfNecessary();
+
+ for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter) {
+ RenderNamedFlowThread* flowRenderer = *iter;
+ flowRenderer->layoutIfNeeded();
+ }
+}
+
+void FlowThreadController::registerNamedFlowContentNode(Node* contentNode, RenderNamedFlowThread* namedFlow)
+{
+ ASSERT(contentNode && contentNode->isElementNode());
+ ASSERT(namedFlow);
+ ASSERT(!m_mapNamedFlowContentNodes.contains(contentNode));
+ ASSERT(!namedFlow->hasContentNode(contentNode));
+ m_mapNamedFlowContentNodes.add(contentNode, namedFlow);
+ namedFlow->registerNamedFlowContentNode(contentNode);
+}
+
+void FlowThreadController::unregisterNamedFlowContentNode(Node* contentNode)
+{
+ ASSERT(contentNode && contentNode->isElementNode());
+ HashMap<const Node*, RenderNamedFlowThread*>::iterator it = m_mapNamedFlowContentNodes.find(contentNode);
+ ASSERT(it != m_mapNamedFlowContentNodes.end());
+ ASSERT(it->value);
+ ASSERT(it->value->hasContentNode(contentNode));
+ it->value->unregisterNamedFlowContentNode(contentNode);
+ m_mapNamedFlowContentNodes.remove(contentNode);
+}
- ASSERT(isAutoLogicalHeightRegionsFlagConsistent());
+void FlowThreadController::updateFlowThreadsChainIfNecessary()
+{
+ ASSERT(m_renderNamedFlowThreadList);
+ ASSERT(isAutoLogicalHeightRegionsCountConsistent());
// Remove the left-over flow threads.
RenderNamedFlowThreadList toRemoveList;
@@ -131,63 +161,90 @@ void FlowThreadController::layoutRenderNamedFlowThreads()
m_renderNamedFlowThreadList->swap(sortedList);
setIsRenderNamedFlowThreadOrderDirty(false);
}
+}
+
+bool FlowThreadController::updateFlowThreadsNeedingLayout()
+{
+ bool needsTwoPassLayout = false;
for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter) {
RenderNamedFlowThread* flowRenderer = *iter;
- flowRenderer->layoutIfNeeded();
+ ASSERT(!flowRenderer->needsTwoPhasesLayout());
+ flowRenderer->setInConstrainedLayoutPhase(false);
+ if (flowRenderer->needsLayout() && flowRenderer->hasAutoLogicalHeightRegions())
+ needsTwoPassLayout = true;
}
-}
-void FlowThreadController::registerNamedFlowContentNode(Node* contentNode, RenderNamedFlowThread* namedFlow)
-{
- ASSERT(contentNode && contentNode->isElementNode());
- ASSERT(namedFlow);
- ASSERT(!m_mapNamedFlowContentNodes.contains(contentNode));
- ASSERT(!namedFlow->hasContentNode(contentNode));
- m_mapNamedFlowContentNodes.add(contentNode, namedFlow);
- namedFlow->registerNamedFlowContentNode(contentNode);
+ if (needsTwoPassLayout)
+ resetFlowThreadsWithAutoHeightRegions();
+
+ return needsTwoPassLayout;
}
-void FlowThreadController::unregisterNamedFlowContentNode(Node* contentNode)
+bool FlowThreadController::updateFlowThreadsNeedingTwoStepLayout()
{
- ASSERT(contentNode && contentNode->isElementNode());
- HashMap<Node*, RenderNamedFlowThread*>::iterator it = m_mapNamedFlowContentNodes.find(contentNode);
- ASSERT(it != m_mapNamedFlowContentNodes.end());
- ASSERT(it->value);
- ASSERT(it->value->hasContentNode(contentNode));
- it->value->unregisterNamedFlowContentNode(contentNode);
- m_mapNamedFlowContentNodes.remove(contentNode);
+ bool needsTwoPassLayout = false;
+
+ for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter) {
+ RenderNamedFlowThread* flowRenderer = *iter;
+ if (flowRenderer->needsTwoPhasesLayout()) {
+ needsTwoPassLayout = true;
+ break;
+ }
+ }
+
+ if (needsTwoPassLayout)
+ resetFlowThreadsWithAutoHeightRegions();
+
+ return needsTwoPassLayout;
}
-#ifndef NDEBUG
-bool FlowThreadController::isAutoLogicalHeightRegionsFlagConsistent() const
+void FlowThreadController::resetFlowThreadsWithAutoHeightRegions()
{
- if (!hasRenderNamedFlowThreads())
- return !hasAutoLogicalHeightRegions();
-
- // Count the number of auto height regions
- unsigned autoLogicalHeightRegions = 0;
for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter) {
RenderNamedFlowThread* flowRenderer = *iter;
- autoLogicalHeightRegions += flowRenderer->autoLogicalHeightRegionsCount();
+ if (flowRenderer->hasAutoLogicalHeightRegions()) {
+ flowRenderer->markAutoLogicalHeightRegionsForLayout();
+ flowRenderer->invalidateRegions();
+ }
}
+}
- return autoLogicalHeightRegions == m_autoLogicalHeightRegionsCount;
+void FlowThreadController::updateFlowThreadsIntoConstrainedPhase()
+{
+ // Walk the flow chain in reverse order to update the auto-height regions and compute correct sizes for the containing regions. Only after this we can
+ // set the flow in the constrained layout phase.
+ for (RenderNamedFlowThreadList::reverse_iterator iter = m_renderNamedFlowThreadList->rbegin(); iter != m_renderNamedFlowThreadList->rend(); ++iter) {
+ RenderNamedFlowThread* flowRenderer = *iter;
+ ASSERT(!flowRenderer->hasRegions() || flowRenderer->hasValidRegionInfo());
+ flowRenderer->layoutIfNeeded();
+ if (flowRenderer->hasAutoLogicalHeightRegions()) {
+ ASSERT(flowRenderer->needsTwoPhasesLayout());
+ flowRenderer->markAutoLogicalHeightRegionsForLayout();
+ }
+ flowRenderer->setInConstrainedLayoutPhase(true);
+ flowRenderer->clearNeedsTwoPhasesLayout();
+ }
}
-#endif
-void FlowThreadController::resetRegionsOverrideLogicalContentHeight()
+bool FlowThreadController::isContentNodeRegisteredWithAnyNamedFlow(const Node* contentNode) const
{
- ASSERT(m_view->normalLayoutPhase());
- for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter)
- (*iter)->resetRegionsOverrideLogicalContentHeight();
+ return m_mapNamedFlowContentNodes.contains(contentNode);
}
-void FlowThreadController::markAutoLogicalHeightRegionsForLayout()
+#ifndef NDEBUG
+bool FlowThreadController::isAutoLogicalHeightRegionsCountConsistent() const
{
- ASSERT(m_view->constrainedFlowThreadsLayoutPhase());
- for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter)
- (*iter)->markAutoLogicalHeightRegionsForLayout();
+ if (!hasRenderNamedFlowThreads())
+ return !hasFlowThreadsWithAutoLogicalHeightRegions();
+
+ for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter) {
+ if (!(*iter)->isAutoLogicalHeightRegionsCountConsistent())
+ return false;
+ }
+
+ return true;
}
+#endif
} // namespace WebCore