| Index: Source/core/rendering/FlowThreadController.cpp
|
| diff --git a/Source/core/rendering/FlowThreadController.cpp b/Source/core/rendering/FlowThreadController.cpp
|
| deleted file mode 100644
|
| index 521085ee453988c1665cab50878afd2af3e40638..0000000000000000000000000000000000000000
|
| --- a/Source/core/rendering/FlowThreadController.cpp
|
| +++ /dev/null
|
| @@ -1,248 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions
|
| - * are met:
|
| - *
|
| - * 1. Redistributions of source code must retain the above
|
| - * copyright notice, this list of conditions and the following
|
| - * disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above
|
| - * copyright notice, this list of conditions and the following
|
| - * disclaimer in the documentation and/or other materials
|
| - * provided with the distribution.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY
|
| - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
| - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
| - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
|
| - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
| - * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
| - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
| - * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
| - * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
| - * SUCH DAMAGE.
|
| - */
|
| -
|
| -#include "config.h"
|
| -
|
| -#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()
|
| -{
|
| - 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();
|
| - }
|
| -}
|
| -
|
| -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_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
|
|
|