summaryrefslogtreecommitdiff
path: root/Source/WebCore/page/Page.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-03-12 14:11:15 +0100
committerSimon Hausmann <simon.hausmann@nokia.com>2012-03-12 14:11:15 +0100
commitdd91e772430dc294e3bf478c119ef8d43c0a3358 (patch)
tree6f33ce4d5872a5691e0291eb45bf6ab373a5f567 /Source/WebCore/page/Page.cpp
parentad0d549d4cc13433f77c1ac8f0ab379c83d93f28 (diff)
downloadqtwebkit-dd91e772430dc294e3bf478c119ef8d43c0a3358.tar.gz
Imported WebKit commit 3db4eb1820ac8fb03065d7ea73a4d9db1e8fea1a (http://svn.webkit.org/repository/webkit/trunk@110422)
This includes build fixes for the latest qtbase/qtdeclarative as well as the final QML2 API.
Diffstat (limited to 'Source/WebCore/page/Page.cpp')
-rw-r--r--Source/WebCore/page/Page.cpp78
1 files changed, 63 insertions, 15 deletions
diff --git a/Source/WebCore/page/Page.cpp b/Source/WebCore/page/Page.cpp
index 1bad0a47b..7b6b9fe78 100644
--- a/Source/WebCore/page/Page.cpp
+++ b/Source/WebCore/page/Page.cpp
@@ -1009,28 +1009,45 @@ PageVisibilityState Page::visibilityState() const
}
#endif
+// FIXME: gPaintedObjectCounterThreshold is no longer used for calculating relevant repainted areas,
+// and it should be removed. For the time being, it is useful because it allows us to avoid doing
+// any of this work for ports that don't make sure of didNewFirstVisuallyNonEmptyLayout. We should
+// remove this when we resolve <rdar://problem/10791680> Need to merge didFirstVisuallyNonEmptyLayout
+// and didNewFirstVisuallyNonEmptyLayout
static uint64_t gPaintedObjectCounterThreshold = 0;
+// These are magical constants that might be tweaked over time.
+static double gMinimumPaintedAreaRatio = 0.1;
+static double gMaximumUnpaintedAreaRatio = 0.04;
+
void Page::setRelevantRepaintedObjectsCounterThreshold(uint64_t threshold)
{
gPaintedObjectCounterThreshold = threshold;
}
+bool Page::isCountingRelevantRepaintedObjects() const
+{
+ return m_isCountingRelevantRepaintedObjects && gPaintedObjectCounterThreshold > 0;
+}
+
void Page::startCountingRelevantRepaintedObjects()
{
m_isCountingRelevantRepaintedObjects = true;
- // Clear the HashSet in case we didn't hit the threshold last time.
- m_relevantPaintedRenderObjects.clear();
+ // Reset everything in case we didn't hit the threshold last time.
+ resetRelevantPaintedObjectCounter();
}
-void Page::addRelevantRepaintedObject(RenderObject* object, const IntRect& objectPaintRect)
+void Page::resetRelevantPaintedObjectCounter()
{
- if (!m_isCountingRelevantRepaintedObjects)
- return;
+ m_relevantUnpaintedRenderObjects.clear();
+ m_relevantPaintedRegion = Region();
+ m_relevantUnpaintedRegion = Region();
+}
- // We don't need to do anything if there is no counter threshold.
- if (!gPaintedObjectCounterThreshold)
+void Page::addRelevantRepaintedObject(RenderObject* object, const IntRect& objectPaintRect)
+{
+ if (!isCountingRelevantRepaintedObjects())
return;
// The objects are only relevant if they are being painted within the viewRect().
@@ -1039,25 +1056,56 @@ void Page::addRelevantRepaintedObject(RenderObject* object, const IntRect& objec
return;
}
- m_relevantPaintedRenderObjects.add(object);
+ // If this object was previously counted as an unpainted object, remove it from that HashSet
+ // and corresponding Region. FIXME: This doesn't do the right thing if the objects overlap.
+ if (m_relevantUnpaintedRenderObjects.contains(object)) {
+ m_relevantUnpaintedRenderObjects.remove(object);
+ m_relevantUnpaintedRegion.subtract(objectPaintRect);
+ }
+
+ m_relevantPaintedRegion.unite(objectPaintRect);
+
+ RenderView* view = object->view();
+ if (!view)
+ return;
+
+ float viewArea = view->viewRect().width() * view->viewRect().height();
+ float ratioOfViewThatIsPainted = m_relevantPaintedRegion.totalArea() / viewArea;
+ float ratioOfViewThatIsUnpainted = m_relevantUnpaintedRegion.totalArea() / viewArea;
- if (m_relevantPaintedRenderObjects.size() == static_cast<int>(gPaintedObjectCounterThreshold)) {
+ if (ratioOfViewThatIsPainted > gMinimumPaintedAreaRatio && ratioOfViewThatIsUnpainted < gMaximumUnpaintedAreaRatio) {
m_isCountingRelevantRepaintedObjects = false;
- m_relevantPaintedRenderObjects.clear();
+ resetRelevantPaintedObjectCounter();
if (Frame* frame = mainFrame())
frame->loader()->didNewFirstVisuallyNonEmptyLayout();
}
}
-void Page::provideSupplement(const AtomicString& name, PassOwnPtr<PageSupplement> supplement)
+void Page::addRelevantUnpaintedObject(RenderObject* object, const IntRect& objectPaintRect)
{
- ASSERT(!m_supplements.get(name.impl()));
- m_supplements.set(name.impl(), supplement);
+ if (!isCountingRelevantRepaintedObjects())
+ return;
+
+ // The objects are only relevant if they are being painted within the viewRect().
+ if (RenderView* view = object->view()) {
+ if (!objectPaintRect.intersects(pixelSnappedIntRect(view->viewRect())))
+ return;
+ }
+
+ m_relevantUnpaintedRenderObjects.add(object);
+ m_relevantUnpaintedRegion.unite(objectPaintRect);
+}
+
+void Page::suspendActiveDOMObjectsAndAnimations()
+{
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
+ frame->suspendActiveDOMObjectsAndAnimations();
}
-PageSupplement* Page::requireSupplement(const AtomicString& name)
+void Page::resumeActiveDOMObjectsAndAnimations()
{
- return m_supplements.get(name.impl());
+ for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
+ frame->resumeActiveDOMObjectsAndAnimations();
}
Page::PageClients::PageClients()