| Index: Source/core/rendering/FlowThreadController.cpp
|
| diff --git a/Source/core/rendering/FlowThreadController.cpp b/Source/core/rendering/FlowThreadController.cpp
|
| index 521085ee453988c1665cab50878afd2af3e40638..59e5cf1cbf641e1a5040304f5364f9b177a28267 100644
|
| --- a/Source/core/rendering/FlowThreadController.cpp
|
| +++ b/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
|
|
|