diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2012-10-17 16:21:14 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2012-10-17 16:21:14 +0200 |
commit | 8995b83bcbfbb68245f779b64e5517627c6cc6ea (patch) | |
tree | 17985605dab9263cc2444bd4d45f189e142cca7c /Source/WebCore/rendering/RenderNamedFlowThread.cpp | |
parent | b9c9652036d5e9f1e29c574f40bc73a35c81ace6 (diff) | |
download | qtwebkit-8995b83bcbfbb68245f779b64e5517627c6cc6ea.tar.gz |
Imported WebKit commit cf4f8fc6f19b0629f51860cb2d4b25e139d07e00 (http://svn.webkit.org/repository/webkit/trunk@131592)
New snapshot that includes the build fixes for Mac OS X 10.6 and earlier as well
as the previously cherry-picked changes
Diffstat (limited to 'Source/WebCore/rendering/RenderNamedFlowThread.cpp')
-rw-r--r-- | Source/WebCore/rendering/RenderNamedFlowThread.cpp | 58 |
1 files changed, 40 insertions, 18 deletions
diff --git a/Source/WebCore/rendering/RenderNamedFlowThread.cpp b/Source/WebCore/rendering/RenderNamedFlowThread.cpp index 264aeb497..26cad3dbc 100644 --- a/Source/WebCore/rendering/RenderNamedFlowThread.cpp +++ b/Source/WebCore/rendering/RenderNamedFlowThread.cpp @@ -142,7 +142,7 @@ bool RenderNamedFlowThread::dependsOn(RenderNamedFlowThread* otherRenderFlowThre RenderNamedFlowThreadCountedSet::const_iterator iterator = m_layoutBeforeThreadsSet.begin(); RenderNamedFlowThreadCountedSet::const_iterator end = m_layoutBeforeThreadsSet.end(); for (; iterator != end; ++iterator) { - const RenderNamedFlowThread* beforeFlowThread = (*iterator).first; + const RenderNamedFlowThread* beforeFlowThread = (*iterator).key; if (beforeFlowThread->dependsOn(otherRenderFlowThread)) return true; } @@ -201,24 +201,31 @@ static bool compareRenderRegions(const RenderRegion* firstRegion, const RenderRe return true; } -void RenderNamedFlowThread::addRegionToThread(RenderRegion* renderRegion) +// This helper function adds a region to a list preserving the order property of the list. +static void addRegionToList(RenderRegionList& regionList, RenderRegion* renderRegion) { - ASSERT(renderRegion); - if (m_regionList.isEmpty()) - m_regionList.add(renderRegion); + if (regionList.isEmpty()) + regionList.add(renderRegion); else { // Find the first region "greater" than renderRegion. - RenderRegionList::iterator it = m_regionList.begin(); - while (it != m_regionList.end() && !compareRenderRegions(renderRegion, *it)) + RenderRegionList::iterator it = regionList.begin(); + while (it != regionList.end() && !compareRenderRegions(renderRegion, *it)) ++it; - m_regionList.insertBefore(it, renderRegion); + regionList.insertBefore(it, renderRegion); } +} + +void RenderNamedFlowThread::addRegionToThread(RenderRegion* renderRegion) +{ + ASSERT(renderRegion); resetMarkForDestruction(); ASSERT(!renderRegion->isValid()); if (renderRegion->parentNamedFlowThread()) { if (renderRegion->parentNamedFlowThread()->dependsOn(this)) { + // The order of invalid regions is irrelevant. + m_invalidRegionList.add(renderRegion); // Register ourself to get a notification when the state changes. renderRegion->parentNamedFlowThread()->m_observerThreadsSet.add(this); return; @@ -228,6 +235,7 @@ void RenderNamedFlowThread::addRegionToThread(RenderRegion* renderRegion) } renderRegion->setIsValid(true); + addRegionToList(m_regionList, renderRegion); invalidateRegions(); } @@ -236,10 +244,11 @@ void RenderNamedFlowThread::removeRegionFromThread(RenderRegion* renderRegion) { ASSERT(renderRegion); m_regionRangeMap.clear(); - m_regionList.remove(renderRegion); if (renderRegion->parentNamedFlowThread()) { if (!renderRegion->isValid()) { + ASSERT(m_invalidRegionList.contains(renderRegion)); + m_invalidRegionList.remove(renderRegion); renderRegion->parentNamedFlowThread()->m_observerThreadsSet.remove(this); // No need to invalidate the regions rectangles. The removed region // was not taken into account. Just return here. @@ -248,6 +257,9 @@ void RenderNamedFlowThread::removeRegionFromThread(RenderRegion* renderRegion) removeDependencyOnFlowThread(renderRegion->parentNamedFlowThread()); } + ASSERT(m_regionList.contains(renderRegion)); + m_regionList.remove(renderRegion); + if (canBeDestroyed()) setMarkForDestruction(); @@ -260,19 +272,29 @@ void RenderNamedFlowThread::removeRegionFromThread(RenderRegion* renderRegion) void RenderNamedFlowThread::checkInvalidRegions() { - for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) { + Vector<RenderRegion*> newValidRegions; + for (RenderRegionList::iterator iter = m_invalidRegionList.begin(); iter != m_invalidRegionList.end(); ++iter) { RenderRegion* region = *iter; // The only reason a region would be invalid is because it has a parent flow thread. - ASSERT(region->isValid() || region->parentNamedFlowThread()); - if (region->isValid() || region->parentNamedFlowThread()->dependsOn(this)) + ASSERT(!region->isValid() && region->parentNamedFlowThread()); + if (region->parentNamedFlowThread()->dependsOn(this)) continue; + newValidRegions.append(region); + } + + for (Vector<RenderRegion*>::iterator iter = newValidRegions.begin(); iter != newValidRegions.end(); ++iter) { + RenderRegion* region = *iter; + m_invalidRegionList.remove(region); region->parentNamedFlowThread()->m_observerThreadsSet.remove(this); - addDependencyOnFlowThread(region->parentNamedFlowThread()); region->setIsValid(true); - invalidateRegions(); + addDependencyOnFlowThread(region->parentNamedFlowThread()); + addRegionToList(m_regionList, region); } + if (!newValidRegions.isEmpty()) + invalidateRegions(); + if (m_observerThreadsSet.isEmpty()) return; @@ -309,7 +331,7 @@ void RenderNamedFlowThread::removeDependencyOnFlowThread(RenderNamedFlowThread* void RenderNamedFlowThread::pushDependencies(RenderNamedFlowThreadList& list) { for (RenderNamedFlowThreadCountedSet::iterator iter = m_layoutBeforeThreadsSet.begin(); iter != m_layoutBeforeThreadsSet.end(); ++iter) { - RenderNamedFlowThread* flowThread = (*iter).first; + RenderNamedFlowThread* flowThread = (*iter).key; if (list.contains(flowThread)) continue; flowThread->pushDependencies(list); @@ -413,10 +435,10 @@ static bool isContainedInNodes(Vector<Node*> others, Node* node) static bool boxIntersectsRegion(LayoutUnit logicalTopForBox, LayoutUnit logicalBottomForBox, LayoutUnit logicalTopForRegion, LayoutUnit logicalBottomForRegion) { bool regionIsEmpty = logicalBottomForRegion != MAX_LAYOUT_UNIT && logicalTopForRegion != MIN_LAYOUT_UNIT - && (logicalBottomForRegion - logicalTopForRegion) <= 0; + && (logicalBottomForRegion - logicalTopForRegion) <= 0; return (logicalBottomForBox - logicalTopForBox) > 0 - && !regionIsEmpty - && logicalTopForBox < logicalBottomForRegion && logicalTopForRegion < logicalBottomForBox; + && !regionIsEmpty + && logicalTopForBox < logicalBottomForRegion && logicalTopForRegion < logicalBottomForBox; } void RenderNamedFlowThread::getRanges(Vector<RefPtr<Range> >& rangeObjects, const RenderRegion* region) const |