diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-03-12 14:11:15 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-03-12 14:11:15 +0100 |
commit | dd91e772430dc294e3bf478c119ef8d43c0a3358 (patch) | |
tree | 6f33ce4d5872a5691e0291eb45bf6ab373a5f567 /Source/WebCore/page/Page.cpp | |
parent | ad0d549d4cc13433f77c1ac8f0ab379c83d93f28 (diff) | |
download | qtwebkit-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.cpp | 78 |
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() |