diff options
author | Allan Sandfeld Jensen <allan.jensen@digia.com> | 2013-09-13 12:51:20 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-09-19 20:50:05 +0200 |
commit | d441d6f39bb846989d95bcf5caf387b42414718d (patch) | |
tree | e367e64a75991c554930278175d403c072de6bb8 /Source/WebCore/rendering/FlowThreadController.cpp | |
parent | 0060b2994c07842f4c59de64b5e3e430525c4b90 (diff) | |
download | qtwebkit-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.cpp | 137 |
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 |