Chromium Code Reviews| Index: Source/core/rendering/compositing/RenderLayerCompositor.cpp |
| diff --git a/Source/core/rendering/compositing/RenderLayerCompositor.cpp b/Source/core/rendering/compositing/RenderLayerCompositor.cpp |
| index 64df81d2b4c215ae7469d759b33ef69c73e40ba9..5400138feb6053e65513c53cbba994dffe8b14cf 100644 |
| --- a/Source/core/rendering/compositing/RenderLayerCompositor.cpp |
| +++ b/Source/core/rendering/compositing/RenderLayerCompositor.cpp |
| @@ -76,6 +76,34 @@ namespace WebCore { |
| using namespace HTMLNames; |
| +class DeprecatedDirtyCompositingDuringCompositingUpdate { |
| + WTF_MAKE_NONCOPYABLE(DeprecatedDirtyCompositingDuringCompositingUpdate); |
| +public: |
| + DeprecatedDirtyCompositingDuringCompositingUpdate(DocumentLifecycle& lifecycle) |
| + : m_lifecycle(lifecycle) |
| + , m_deprecatedTransition(lifecycle.state(), DocumentLifecycle::LayoutClean) |
| + , m_originalState(lifecycle.state()) |
| + { |
| + } |
| + |
| + ~DeprecatedDirtyCompositingDuringCompositingUpdate() |
| + { |
| + if (m_originalState != DocumentLifecycle::InCompositingUpdate) |
| + return; |
| + if (m_lifecycle.state() != m_originalState) { |
| + // FIXME: It's crazy that we can trigger a style recalc from inside |
| + // the compositing update, but that happens in compositing/visibility/hidden-iframe.html. |
|
esprehn
2014/04/09 21:32:25
This is scheduleLayerUpdate() at work.
abarth-chromium
2014/04/09 21:41:26
Craziness.
|
| + ASSERT(m_lifecycle.state() == DocumentLifecycle::LayoutClean || m_lifecycle.state() == DocumentLifecycle::UpdatePending); |
| + m_lifecycle.advanceTo(m_originalState); |
| + } |
| + } |
| + |
| +private: |
| + DocumentLifecycle& m_lifecycle; |
| + DocumentLifecycle::DeprecatedTransition m_deprecatedTransition; |
| + DocumentLifecycle::State m_originalState; |
| +}; |
| + |
| RenderLayerCompositor::RenderLayerCompositor(RenderView& renderView) |
| : m_renderView(renderView) |
| , m_compositingReasonFinder(renderView) |
| @@ -180,7 +208,10 @@ void RenderLayerCompositor::setCompositingLayersNeedRebuild() |
| // FIXME: crbug,com/332248 ideally this could be merged with setNeedsCompositingUpdate(). |
| if (inCompositingMode()) |
| m_compositingLayersNeedRebuild = true; |
| + if (!lifecycle().isActive()) |
| + return; |
| page()->animator().scheduleVisualUpdate(); |
| + lifecycle().ensureStateAtMost(DocumentLifecycle::LayoutClean); |
| } |
| void RenderLayerCompositor::updateCompositingRequirementsState() |
| @@ -264,7 +295,9 @@ void RenderLayerCompositor::setNeedsCompositingUpdate(CompositingUpdateType upda |
| return; |
| m_pendingUpdateType = std::max(m_pendingUpdateType, updateType); |
| + |
| page()->animator().scheduleVisualUpdate(); |
| + lifecycle().ensureStateAtMost(DocumentLifecycle::LayoutClean); |
| } |
| void RenderLayerCompositor::scheduleAnimationIfNeeded() |
| @@ -433,7 +466,10 @@ bool RenderLayerCompositor::allocateOrClearCompositedLayerMapping(RenderLayer* l |
| switch (compositedLayerUpdate) { |
| case AllocateOwnCompositedLayerMapping: |
| ASSERT(!layer->hasCompositedLayerMapping()); |
| - enableCompositingMode(); |
| + { |
| + DeprecatedDirtyCompositingDuringCompositingUpdate marker(lifecycle()); |
| + enableCompositingMode(); |
| + } |
| // If we need to repaint, do so before allocating the compositedLayerMapping |
| repaintOnCompositingChange(layer); |