summaryrefslogtreecommitdiff
path: root/Source/WebCore/rendering/RenderNamedFlowThread.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-10-17 16:21:14 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2012-10-17 16:21:14 +0200
commit8995b83bcbfbb68245f779b64e5517627c6cc6ea (patch)
tree17985605dab9263cc2444bd4d45f189e142cca7c /Source/WebCore/rendering/RenderNamedFlowThread.cpp
parentb9c9652036d5e9f1e29c574f40bc73a35c81ace6 (diff)
downloadqtwebkit-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.cpp58
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