Chromium Code Reviews| 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 |