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 |