diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/rendering/FlowThreadController.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/core/rendering/FlowThreadController.cpp | 210 |
1 files changed, 4 insertions, 206 deletions
diff --git a/chromium/third_party/WebKit/Source/core/rendering/FlowThreadController.cpp b/chromium/third_party/WebKit/Source/core/rendering/FlowThreadController.cpp index 521085ee453..59e5cf1cbf6 100644 --- a/chromium/third_party/WebKit/Source/core/rendering/FlowThreadController.cpp +++ b/chromium/third_party/WebKit/Source/core/rendering/FlowThreadController.cpp @@ -31,218 +31,16 @@ #include "core/rendering/FlowThreadController.h" -#include "core/dom/NamedFlowCollection.h" -#include "core/rendering/RenderFlowThread.h" -#include "core/rendering/RenderNamedFlowThread.h" -#include "wtf/text/AtomicString.h" - namespace WebCore { -PassOwnPtr<FlowThreadController> FlowThreadController::create(RenderView* view) -{ - return adoptPtr(new FlowThreadController(view)); -} - -FlowThreadController::FlowThreadController(RenderView* view) - : m_view(view) - , m_currentRenderFlowThread(0) - , m_isRenderNamedFlowThreadOrderDirty(false) - , m_flowThreadsWithAutoLogicalHeightRegions(0) -{ -} - -FlowThreadController::~FlowThreadController() -{ -} - -RenderNamedFlowThread* FlowThreadController::ensureRenderFlowThreadWithName(const AtomicString& name) -{ - if (!m_renderNamedFlowThreadList) - m_renderNamedFlowThreadList = adoptPtr(new RenderNamedFlowThreadList()); - else { - for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter) { - RenderNamedFlowThread* flowRenderer = *iter; - if (flowRenderer->flowThreadName() == name) - return flowRenderer; - } - } - - NamedFlowCollection* namedFlows = m_view->document().namedFlows(); - - // Sanity check for the absence of a named flow in the "CREATED" state with the same name. - ASSERT(!namedFlows->flowByName(name)); - - RenderNamedFlowThread* flowRenderer = RenderNamedFlowThread::createAnonymous(&m_view->document(), namedFlows->ensureFlowWithName(name)); - flowRenderer->setStyle(RenderFlowThread::createFlowThreadStyle(m_view->style())); - m_renderNamedFlowThreadList->add(flowRenderer); - - // Keep the flow renderer as a child of RenderView. - m_view->addChild(flowRenderer); - - setIsRenderNamedFlowThreadOrderDirty(true); - - return flowRenderer; -} - -void FlowThreadController::styleDidChange() +PassOwnPtr<FlowThreadController> FlowThreadController::create() { - RenderStyle* viewStyle = m_view->style(); - for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter) { - RenderNamedFlowThread* flowRenderer = *iter; - flowRenderer->setStyle(RenderFlowThread::createFlowThreadStyle(viewStyle)); - } -} - -void FlowThreadController::layoutRenderNamedFlowThreads() -{ - updateFlowThreadsChainIfNecessary(); - - for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter) { - RenderNamedFlowThread* flowRenderer = *iter; - flowRenderer->layoutIfNeeded(); - } + return adoptPtr(new FlowThreadController); } -void FlowThreadController::registerNamedFlowContentNode(Node* contentNode, RenderNamedFlowThread* namedFlow) +FlowThreadController::FlowThreadController() + : m_currentRenderFlowThread(0) { - 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_WITH_SECURITY_IMPLICATION(it != m_mapNamedFlowContentNodes.end()); - ASSERT(it->value); - ASSERT(it->value->hasContentNode(contentNode)); - it->value->unregisterNamedFlowContentNode(contentNode); - m_mapNamedFlowContentNodes.remove(contentNode); -} - -void FlowThreadController::updateFlowThreadsChainIfNecessary() -{ - ASSERT(m_renderNamedFlowThreadList); - ASSERT(isAutoLogicalHeightRegionsCountConsistent()); - - // Remove the left-over flow threads. - RenderNamedFlowThreadList toRemoveList; - for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter) { - RenderNamedFlowThread* flowRenderer = *iter; - if (flowRenderer->isMarkedForDestruction()) - toRemoveList.add(flowRenderer); - } - - if (toRemoveList.size() > 0) - setIsRenderNamedFlowThreadOrderDirty(true); - - for (RenderNamedFlowThreadList::iterator iter = toRemoveList.begin(); iter != toRemoveList.end(); ++iter) { - RenderNamedFlowThread* flowRenderer = *iter; - m_renderNamedFlowThreadList->remove(flowRenderer); - flowRenderer->destroy(); - } - - if (isRenderNamedFlowThreadOrderDirty()) { - // Arrange the thread list according to dependencies. - RenderNamedFlowThreadList sortedList; - for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter) { - RenderNamedFlowThread* flowRenderer = *iter; - if (sortedList.contains(flowRenderer)) - continue; - flowRenderer->pushDependencies(sortedList); - sortedList.add(flowRenderer); - } - 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; - ASSERT(!flowRenderer->needsTwoPhasesLayout()); - flowRenderer->setInConstrainedLayoutPhase(false); - if (flowRenderer->needsLayout() && flowRenderer->hasAutoLogicalHeightRegions()) - needsTwoPassLayout = true; - } - - if (needsTwoPassLayout) - resetFlowThreadsWithAutoHeightRegions(); - - return needsTwoPassLayout; -} - -bool FlowThreadController::updateFlowThreadsNeedingTwoStepLayout() -{ - 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; -} - -void FlowThreadController::resetFlowThreadsWithAutoHeightRegions() -{ - for (RenderNamedFlowThreadList::iterator iter = m_renderNamedFlowThreadList->begin(); iter != m_renderNamedFlowThreadList->end(); ++iter) { - RenderNamedFlowThread* flowRenderer = *iter; - if (flowRenderer->hasAutoLogicalHeightRegions()) { - flowRenderer->markAutoLogicalHeightRegionsForLayout(); - flowRenderer->invalidateRegions(); - } - } -} - -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(); - } -} - -bool FlowThreadController::isContentNodeRegisteredWithAnyNamedFlow(const Node* contentNode) const -{ - return m_mapNamedFlowContentNodes.contains(contentNode); -} - -#ifndef NDEBUG -bool FlowThreadController::isAutoLogicalHeightRegionsCountConsistent() const -{ - 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 |