Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(139)

Unified Diff: Source/WebCore/rendering/RenderView.cpp

Issue 13913013: Only update composited scrolling state when necessary (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: . Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/WebCore/rendering/RenderView.cpp
diff --git a/Source/WebCore/rendering/RenderView.cpp b/Source/WebCore/rendering/RenderView.cpp
index 95c9717d1b124c324aab9ce1bdc46fb7d233ac2b..2cfa55531b7be9fe9d42a5c3e719c1a822f138c7 100644
--- a/Source/WebCore/rendering/RenderView.cpp
+++ b/Source/WebCore/rendering/RenderView.cpp
@@ -63,6 +63,7 @@ RenderView::RenderView(Document* document)
, m_pageLogicalHeightChanged(false)
, m_layoutState(0)
, m_layoutStateDisableCount(0)
+ , m_scopedCompositedScrollingUpdatersCount(0)
, m_renderQuoteHead(0)
, m_renderCounterCount(0)
{
@@ -147,6 +148,12 @@ static RenderBox* enclosingSeamlessRenderer(Document* doc)
return ownerElement->renderBox();
}
+void RenderView::cancelScheduledCompositedScrollingUpdatesForLayer(RenderLayer* layer)
+{
+ m_pendingContiguityUpdates.remove(layer);
+ m_pendingCompositedScrollingUpdates.remove(layer);
+}
+
void RenderView::addChild(RenderObject* newChild, RenderObject* beforeChild)
{
// Seamless iframes are considered part of an enclosing render flow thread from the parent document. This is necessary for them to look
@@ -1172,4 +1179,59 @@ FragmentationDisabler::~FragmentationDisabler()
m_root->setFlowThreadStateIncludingDescendants(m_flowThreadState);
}
+ScopedCompositedScrollingUpdater::ScopedCompositedScrollingUpdater(RenderView* renderView)
+ : m_renderView(renderView)
+{
+ if (m_renderView)
Julien - ping for review 2013/04/09 21:06:43 Cannot be NULL per your explanation.
+ m_renderView->m_scopedCompositedScrollingUpdatersCount++;
+}
+
+ScopedCompositedScrollingUpdater::ScopedCompositedScrollingUpdater(RenderLayer* layer, CompositedScrollingUpdateMode mode)
+ : m_renderView(0)
+{
+ if (!layer || !layer->acceleratedCompositingForOverflowScrollEnabled())
+ return;
+
+ m_renderView = layer->renderer()->view();
+ m_renderView->m_scopedCompositedScrollingUpdatersCount++;
+
+ if (mode == UpdateNeedsCompositedScrolling)
+ m_renderView->m_pendingCompositedScrollingUpdates.add(layer);
+ else if (mode == UpdateDescendantsAreContiguousInStackingOrder)
+ m_renderView->m_pendingContiguityUpdates.add(layer);
+}
+
+ScopedCompositedScrollingUpdater::~ScopedCompositedScrollingUpdater()
+{
+ if (!m_renderView)
Julien - ping for review 2013/04/09 21:06:43 Cannot be NULL per your explanation.
+ return;
+
+ m_renderView->m_scopedCompositedScrollingUpdatersCount--;
+ ASSERT(m_renderView->m_scopedCompositedScrollingUpdatersCount >= 0);
+ if (!m_renderView->m_scopedCompositedScrollingUpdatersCount) {
Julien - ping for review 2013/04/09 21:06:43 Early return.
+ HashSet<RenderLayer*> pendingCompositedScrollingUpdates = m_renderView->m_pendingCompositedScrollingUpdates;
+ m_renderView->m_pendingCompositedScrollingUpdates.clear();
+
+ HashSet<RenderLayer*> pendingContiguityUpdates = m_renderView->m_pendingContiguityUpdates;
+ m_renderView->m_pendingContiguityUpdates.clear();
+
+ if (!pendingContiguityUpdates.isEmpty()) {
Julien - ping for review 2013/04/09 21:06:43 I don't think we need an isEmpty check as the iter
+ HashSet<RenderLayer*> stackingContexts;
+ for (HashSet<RenderLayer*>::iterator iter = pendingContiguityUpdates.begin(); iter != pendingContiguityUpdates.end(); ++iter) {
+ if (RenderLayer* stackingContext = (*iter)->enclosingStackingContext())
+ stackingContexts.add(stackingContext);
+ }
+ for (HashSet<RenderLayer*>::iterator iter = stackingContexts.begin(); iter != stackingContexts.end(); ++iter) {
+ (*iter)->updateLayerListsIfNeeded();
+ (*iter)->updateDescendantsAreContiguousInStackingOrder();
+ }
+ }
+
+ if (!pendingCompositedScrollingUpdates.isEmpty()) {
Julien - ping for review 2013/04/09 21:06:43 Same comment.
+ for (HashSet<RenderLayer*>::iterator iter = pendingCompositedScrollingUpdates.begin(); iter != pendingCompositedScrollingUpdates.end(); ++iter)
+ (*iter)->updateNeedsCompositedScrolling();
+ }
+ }
Julien - ping for review 2013/04/09 21:06:43 You do store the HashSet into local variables and
+}
+
} // namespace WebCore
« Source/WebCore/rendering/RenderView.h ('K') | « Source/WebCore/rendering/RenderView.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698