diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/WebCore/rendering/FlowThreadController.cpp | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/WebCore/rendering/FlowThreadController.cpp')
-rw-r--r-- | Source/WebCore/rendering/FlowThreadController.cpp | 78 |
1 files changed, 55 insertions, 23 deletions
diff --git a/Source/WebCore/rendering/FlowThreadController.cpp b/Source/WebCore/rendering/FlowThreadController.cpp index 44b22bbe1..f69d3244c 100644 --- a/Source/WebCore/rendering/FlowThreadController.cpp +++ b/Source/WebCore/rendering/FlowThreadController.cpp @@ -40,8 +40,14 @@ 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) { @@ -54,20 +60,21 @@ FlowThreadController::~FlowThreadController() RenderNamedFlowThread& FlowThreadController::ensureRenderFlowThreadWithName(const AtomicString& name) { if (!m_renderNamedFlowThreadList) - m_renderNamedFlowThreadList = std::make_unique<RenderNamedFlowThreadList>(); + m_renderNamedFlowThreadList = adoptPtr(new RenderNamedFlowThreadList()); else { - for (auto& flowRenderer : *m_renderNamedFlowThreadList) { + for (auto iter = m_renderNamedFlowThreadList->begin(), end = m_renderNamedFlowThreadList->end(); iter != end; ++iter) { + RenderNamedFlowThread* flowRenderer = *iter; if (flowRenderer->flowThreadName() == name) return *flowRenderer; } } - NamedFlowCollection& namedFlows = m_view->document().namedFlows(); + 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)); + ASSERT(!namedFlows->flowByName(name)); - auto flowRenderer = new RenderNamedFlowThread(m_view->document(), RenderFlowThread::createFlowThreadStyle(&m_view->style()), namedFlows.ensureFlowWithName(name)); + auto flowRenderer = new RenderNamedFlowThread(m_view->document(), RenderFlowThread::createFlowThreadStyle(&m_view->style()), namedFlows->ensureFlowWithName(name)); flowRenderer->initializeStyle(); m_renderNamedFlowThreadList->add(flowRenderer); @@ -82,15 +89,20 @@ RenderNamedFlowThread& FlowThreadController::ensureRenderFlowThreadWithName(cons void FlowThreadController::styleDidChange() { RenderStyle& viewStyle = m_view->style(); - for (auto& flowRenderer : *m_renderNamedFlowThreadList) + for (auto iter = m_renderNamedFlowThreadList->begin(), end = m_renderNamedFlowThreadList->end(); iter != end; ++iter) { + RenderNamedFlowThread* flowRenderer = *iter; flowRenderer->setStyle(RenderFlowThread::createFlowThreadStyle(&viewStyle)); + } } void FlowThreadController::layoutRenderNamedFlowThreads() { updateFlowThreadsChainIfNecessary(); - for (auto& flowRenderer : *m_renderNamedFlowThreadList) + + for (auto iter = m_renderNamedFlowThreadList->begin(), end = m_renderNamedFlowThreadList->end(); iter != end; ++iter) { + RenderNamedFlowThread* flowRenderer = *iter; flowRenderer->layoutIfNeeded(); + } } void FlowThreadController::registerNamedFlowContentElement(Element& contentElement, RenderNamedFlowThread& namedFlow) @@ -118,7 +130,8 @@ void FlowThreadController::updateFlowThreadsChainIfNecessary() // Remove the left-over flow threads. RenderNamedFlowThreadList toRemoveList; - for (auto& flowRenderer : *m_renderNamedFlowThreadList) { + for (auto iter = m_renderNamedFlowThreadList->begin(), end = m_renderNamedFlowThreadList->end(); iter != end; ++iter) { + RenderNamedFlowThread* flowRenderer = *iter; if (flowRenderer->isMarkedForDestruction()) toRemoveList.add(flowRenderer); } @@ -126,7 +139,8 @@ void FlowThreadController::updateFlowThreadsChainIfNecessary() if (toRemoveList.size() > 0) setIsRenderNamedFlowThreadOrderDirty(true); - for (auto& flowRenderer : toRemoveList) { + for (auto iter = toRemoveList.begin(), end = toRemoveList.end(); iter != end; ++iter) { + RenderNamedFlowThread* flowRenderer = *iter; m_renderNamedFlowThreadList->remove(flowRenderer); flowRenderer->destroy(); } @@ -134,7 +148,8 @@ void FlowThreadController::updateFlowThreadsChainIfNecessary() if (isRenderNamedFlowThreadOrderDirty()) { // Arrange the thread list according to dependencies. RenderNamedFlowThreadList sortedList; - for (auto& flowRenderer : *m_renderNamedFlowThreadList) { + for (auto iter = m_renderNamedFlowThreadList->begin(), end = m_renderNamedFlowThreadList->end(); iter != end; ++iter) { + RenderNamedFlowThread* flowRenderer = *iter; if (sortedList.contains(flowRenderer)) continue; flowRenderer->pushDependencies(sortedList); @@ -149,7 +164,8 @@ bool FlowThreadController::updateFlowThreadsNeedingLayout() { bool needsTwoPassLayout = false; - for (auto& flowRenderer : *m_renderNamedFlowThreadList) { + for (auto iter = m_renderNamedFlowThreadList->begin(), end = m_renderNamedFlowThreadList->end(); iter != end; ++iter) { + RenderNamedFlowThread* flowRenderer = *iter; ASSERT(!flowRenderer->needsTwoPhasesLayout()); ASSERT(flowRenderer->inMeasureContentLayoutPhase()); if (flowRenderer->needsLayout() && flowRenderer->hasAutoLogicalHeightRegions()) @@ -166,7 +182,8 @@ bool FlowThreadController::updateFlowThreadsNeedingTwoStepLayout() { bool needsTwoPassLayout = false; - for (auto& flowRenderer : *m_renderNamedFlowThreadList) { + for (auto iter = m_renderNamedFlowThreadList->begin(), end = m_renderNamedFlowThreadList->end(); iter != end; ++iter) { + RenderNamedFlowThread* flowRenderer = *iter; if (flowRenderer->needsTwoPhasesLayout()) { needsTwoPassLayout = true; break; @@ -181,7 +198,8 @@ bool FlowThreadController::updateFlowThreadsNeedingTwoStepLayout() void FlowThreadController::resetFlowThreadsWithAutoHeightRegions() { - for (auto& flowRenderer : *m_renderNamedFlowThreadList) { + for (auto iter = m_renderNamedFlowThreadList->begin(), end = m_renderNamedFlowThreadList->end(); iter != end; ++iter) { + RenderNamedFlowThread* flowRenderer = *iter; if (flowRenderer->hasAutoLogicalHeightRegions()) { flowRenderer->markAutoLogicalHeightRegionsForLayout(); flowRenderer->invalidateRegions(); @@ -224,10 +242,10 @@ void FlowThreadController::updateFlowThreadsIntoOverflowPhase() void FlowThreadController::updateFlowThreadsIntoMeasureContentPhase() { - for (auto& flowRenderer : *m_renderNamedFlowThreadList) { + for (auto iter = m_renderNamedFlowThreadList->begin(), end = m_renderNamedFlowThreadList->end(); iter != end; ++iter) { + RenderNamedFlowThread* flowRenderer = *iter; ASSERT(flowRenderer->inFinalLayoutPhase()); - flowRenderer->dispatchNamedFlowEvents(); flowRenderer->setLayoutPhase(RenderFlowThread::LayoutPhaseMeasureContent); } } @@ -245,19 +263,31 @@ void FlowThreadController::updateFlowThreadsIntoFinalPhase() } } -void FlowThreadController::updateFlowThreadsLayerToRegionMappingsIfNeeded() +#if USE(ACCELERATED_COMPOSITING) +void FlowThreadController::updateRenderFlowThreadLayersIfNeeded() { - for (auto& flowRenderer : *m_renderNamedFlowThreadList) + // Walk the flow chain in reverse order because RenderRegions might become RenderLayers for the following flow threads. + for (auto iter = m_renderNamedFlowThreadList->rbegin(), end = m_renderNamedFlowThreadList->rend(); iter != end; ++iter) { + RenderNamedFlowThread* flowRenderer = *iter; flowRenderer->updateAllLayerToRegionMappingsIfNeeded(); + } +} +#endif + +bool FlowThreadController::isContentElementRegisteredWithAnyNamedFlow(const Element& contentElement) const +{ + return m_mapNamedFlowContentElement.contains(&contentElement); } void FlowThreadController::updateNamedFlowsLayerListsIfNeeded() { - for (auto& flowRenderer : *m_renderNamedFlowThreadList) + for (auto iter = m_renderNamedFlowThreadList->begin(), end = m_renderNamedFlowThreadList->end(); iter != end; ++iter) { + RenderNamedFlowThread* flowRenderer = *iter; flowRenderer->layer()->updateLayerListsIfNeeded(); + } } -static inline bool compareZIndexFlowThreadController(RenderLayer* first, RenderLayer* second) +static inline bool compareZIndex(RenderLayer* first, RenderLayer* second) { return first->zIndex() < second->zIndex(); } @@ -266,7 +296,9 @@ static inline bool compareZIndexFlowThreadController(RenderLayer* first, RenderL // These layers are painted and hit-tested starting from RenderView not from regions. void FlowThreadController::collectFixedPositionedLayers(Vector<RenderLayer*>& fixedPosLayers) const { - for (auto& flowRenderer : *m_renderNamedFlowThreadList) { + for (auto iter = m_renderNamedFlowThreadList->begin(), end = m_renderNamedFlowThreadList->end(); iter != end; ++iter) { + RenderNamedFlowThread* flowRenderer = *iter; + // If the named flow does not have any regions attached, a fixed element should not be // displayed even if the fixed element is positioned/sized by the viewport. if (!flowRenderer->hasRegions()) @@ -292,7 +324,7 @@ void FlowThreadController::collectFixedPositionedLayers(Vector<RenderLayer*>& fi } } - std::stable_sort(fixedPosLayers.begin(), fixedPosLayers.end(), compareZIndexFlowThreadController); + std::stable_sort(fixedPosLayers.begin(), fixedPosLayers.end(), compareZIndex); } #ifndef NDEBUG @@ -301,8 +333,8 @@ bool FlowThreadController::isAutoLogicalHeightRegionsCountConsistent() const if (!hasRenderNamedFlowThreads()) return !hasFlowThreadsWithAutoLogicalHeightRegions(); - for (auto& flowRenderer : *m_renderNamedFlowThreadList) { - if (!flowRenderer->isAutoLogicalHeightRegionsCountConsistent()) + for (auto iter = m_renderNamedFlowThreadList->begin(), end = m_renderNamedFlowThreadList->end(); iter != end; ++iter) { + if (!(*iter)->isAutoLogicalHeightRegionsCountConsistent()) return false; } |