diff options
author | Simon Fraser <simon.fraser@apple.com> | 2014-04-14 12:16:32 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-04-16 05:55:03 +0200 |
commit | 7b1f8c369100f57861ad8054d17a04da8b604203 (patch) | |
tree | 3f667df923823afe1ba27b416bf854398c66574d | |
parent | 8fb157f8b7822b62b2df5668f77a67b608b39267 (diff) | |
download | qtwebkit-7b1f8c369100f57861ad8054d17a04da8b604203.tar.gz |
Flash of garbage pixels when playing a show on Hulu
<https://webkit.org/b/119871>
Source/WebCore:
Reviewed by Tim Horton.
When starting a show on Hulu, there's a layer that gets marked as
opaque because it has a child RenderLayer whose background fills the
compositing layer. That child RenderLayer was recently position:fixed
but outside the viewport, so its viewportConstrainedNotCompositedReason
was set to a non-zero value.
However, we failed to clear the viewportConstrainedNotCompositedReason
when the layer became non-fixed. This caused painting the opaque
layer to bail in RenderLayer::paintLayer(), leaving garbage.
Test: compositing/contents-opaque/fixed-to-nonfixed.html
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::paintLayer): Add an assertion to catch this error in future.
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::updateBacking): Make sure we clear the
ViewportConstrainedNotCompositedReason if the layer is no longer fixed.
Change-Id: Ie1aa935b8271cd8cc3159f5337d483a77d74b8a0
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@154147 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Reviewed-by: Michael Bruning <michael.bruning@digia.com>
-rw-r--r-- | Source/WebCore/rendering/RenderLayer.cpp | 1 | ||||
-rw-r--r-- | Source/WebCore/rendering/RenderLayerCompositor.cpp | 3 |
2 files changed, 3 insertions, 1 deletions
diff --git a/Source/WebCore/rendering/RenderLayer.cpp b/Source/WebCore/rendering/RenderLayer.cpp index c378f18e6..2d0b56e79 100644 --- a/Source/WebCore/rendering/RenderLayer.cpp +++ b/Source/WebCore/rendering/RenderLayer.cpp @@ -3619,6 +3619,7 @@ void RenderLayer::paintLayer(GraphicsContext* context, const LayerPaintingInfo& } else if (viewportConstrainedNotCompositedReason() == NotCompositedForBoundsOutOfView) { // Don't paint out-of-view viewport constrained layers (when doing prepainting) because they will never be visible // unless their position or viewport size is changed. + ASSERT(renderer()->style()->position() == FixedPosition); return; } #endif diff --git a/Source/WebCore/rendering/RenderLayerCompositor.cpp b/Source/WebCore/rendering/RenderLayerCompositor.cpp index 6f1fd3e0b..784ebdc80 100644 --- a/Source/WebCore/rendering/RenderLayerCompositor.cpp +++ b/Source/WebCore/rendering/RenderLayerCompositor.cpp @@ -767,7 +767,8 @@ bool RenderLayerCompositor::updateBacking(RenderLayer* layer, CompositingChangeR if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator()) scrollingCoordinator->frameViewFixedObjectsDidChange(m_renderView->frameView()); } - } + } else + layer->setViewportConstrainedNotCompositedReason(RenderLayer::NoNotCompositedReason); if (layer->backing()) layer->backing()->updateDebugIndicators(m_showDebugBorders, m_showRepaintCounter); |