summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/FlowThreadController.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/WebCore/rendering/FlowThreadController.cpp
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-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.cpp78
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;
}