Index: Source/WebCore/rendering/RenderLayerCompositor.cpp |
=================================================================== |
--- Source/WebCore/rendering/RenderLayerCompositor.cpp (revision 139983) |
+++ Source/WebCore/rendering/RenderLayerCompositor.cpp (working copy) |
@@ -454,7 +454,6 @@ |
CompositingState compState(updateRoot, m_compositingConsultsOverlap); |
bool layersChanged = false; |
bool saw3DTransform = false; |
- m_fixedPositionLayerNotCompositedReasonMap.clear(); |
if (m_compositingConsultsOverlap) { |
OverlapMap overlapTestRequestMap; |
computeCompositingRequirements(0, updateRoot, &overlapTestRequestMap, compState, layersChanged, saw3DTransform); |
@@ -550,8 +549,9 @@ |
bool RenderLayerCompositor::updateBacking(RenderLayer* layer, CompositingChangeRepaint shouldRepaint) |
{ |
bool layerChanged = false; |
+ RenderLayer::ViewportConstrainedNotCompositedReason viewportConstrainedNotCompositedReason = RenderLayer::NoNotCompositedReason; |
- if (needsToBeComposited(layer)) { |
+ if (needsToBeComposited(layer, &viewportConstrainedNotCompositedReason)) { |
enableCompositingMode(); |
if (!layer->backing()) { |
@@ -623,10 +623,17 @@ |
if (layerChanged) |
layer->clearClipRectsIncludingDescendants(PaintingClipRects); |
- // If a fixed position layer gained/lost a backing, the scrolling coordinator needs to recalculate whether it can do fast scrolling. |
- if (layerChanged && layer->renderer()->style()->position() == FixedPosition) { |
- if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator()) |
- scrollingCoordinator->frameViewFixedObjectsDidChange(m_renderView->frameView()); |
+ // If a fixed position layer gained/lost a backing or the reason not compositing it changed, |
+ // the scrolling coordinator needs to recalculate whether it can do fast scrolling. |
+ if (layer->renderer()->style()->position() == FixedPosition) { |
+ if (layer->viewportConstrainedNotCompositedReason() != viewportConstrainedNotCompositedReason) { |
+ layer->setViewportConstrainedNotCompositedReason(viewportConstrainedNotCompositedReason); |
+ layerChanged = true; |
+ } |
+ if (layerChanged) { |
+ if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator()) |
+ scrollingCoordinator->frameViewFixedObjectsDidChange(m_renderView->frameView()); |
+ } |
} |
if (layer->backing()) |
@@ -845,8 +852,7 @@ |
CompositingState childState(compositingState); |
childState.m_subtreeIsCompositing = false; |
- FixedPositionLayerNotCompositedReason fixedPositionLayerNotCompositedReason = NoReason; |
- bool willBeComposited = needsToBeComposited(layer, &fixedPositionLayerNotCompositedReason); |
+ bool willBeComposited = needsToBeComposited(layer); |
if (willBeComposited) { |
// Tell the parent it has compositing descendants. |
compositingState.m_subtreeIsCompositing = true; |
@@ -855,8 +861,7 @@ |
if (overlapMap) |
overlapMap->pushCompositingContainer(); |
- } else if (fixedPositionLayerNotCompositedReason != NoReason) |
- m_fixedPositionLayerNotCompositedReasonMap.set(layer, fixedPositionLayerNotCompositedReason); |
+ } |
#if !ASSERT_DISABLED |
LayerListMutationDetector mutationChecker(layer); |
@@ -1564,18 +1569,18 @@ |
return false; |
} |
-bool RenderLayerCompositor::needsToBeComposited(const RenderLayer* layer, FixedPositionLayerNotCompositedReason* fixedPositionLayerNotCompositedReason) const |
+bool RenderLayerCompositor::needsToBeComposited(const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason* viewportConstrainedNotCompositedReason) const |
{ |
if (!canBeComposited(layer)) |
return false; |
- return requiresCompositingLayer(layer, fixedPositionLayerNotCompositedReason) || layer->mustCompositeForIndirectReasons() || (inCompositingMode() && layer->isRootLayer()); |
+ return requiresCompositingLayer(layer, viewportConstrainedNotCompositedReason) || layer->mustCompositeForIndirectReasons() || (inCompositingMode() && layer->isRootLayer()); |
} |
// Note: this specifies whether the RL needs a compositing layer for intrinsic reasons. |
// Use needsToBeComposited() to determine if a RL actually needs a compositing layer. |
// static |
-bool RenderLayerCompositor::requiresCompositingLayer(const RenderLayer* layer, FixedPositionLayerNotCompositedReason* fixedPositionLayerNotCompositedReason) const |
+bool RenderLayerCompositor::requiresCompositingLayer(const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason* viewportConstrainedNotCompositedReason) const |
{ |
RenderObject* renderer = layer->renderer(); |
// The compositing state of a reflection should match that of its reflected layer. |
@@ -1593,7 +1598,7 @@ |
|| clipsCompositingDescendants(layer) |
|| requiresCompositingForAnimation(renderer) |
|| requiresCompositingForFilters(renderer) |
- || requiresCompositingForPosition(renderer, layer, fixedPositionLayerNotCompositedReason) |
+ || requiresCompositingForPosition(renderer, layer, viewportConstrainedNotCompositedReason) |
|| requiresCompositingForOverflowScrolling(layer) |
|| requiresCompositingForBlending(renderer); |
} |
@@ -1681,7 +1686,7 @@ |
return "filters"; |
if (requiresCompositingForPosition(renderer, layer)) |
- return "position: fixed"; |
+ return renderer->style()->position() == FixedPosition ? "position: fixed" : "position: sticky"; |
if (requiresCompositingForOverflowScrolling(layer)) |
return "-webkit-overflow-scrolling: touch"; |
@@ -1971,7 +1976,7 @@ |
#endif |
} |
-bool RenderLayerCompositor::requiresCompositingForPosition(RenderObject* renderer, const RenderLayer* layer, FixedPositionLayerNotCompositedReason* fixedPositionLayerNotCompositedReason) const |
+bool RenderLayerCompositor::requiresCompositingForPosition(RenderObject* renderer, const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason* viewportConstrainedNotCompositedReason) const |
{ |
// position:fixed elements that create their own stacking context (e.g. have an explicit z-index, |
// opacity, transform) can get their own composited layer. A stacking context is required otherwise |
@@ -1990,11 +1995,11 @@ |
return false; |
} |
- // Don't promote fixed position elements that are descendants of transformed elements. |
- // They will stay fixed wrt the transformed element rather than the enclosing frame. |
+ // Don't promote fixed position elements that are descendants of a non-view container, e.g. transformed elements. |
+ // They will stay fixed wrt the container rather than the enclosing frame. |
if (container != m_renderView) { |
- if (fixedPositionLayerNotCompositedReason) |
- *fixedPositionLayerNotCompositedReason = DescendantOfTransformedElement; |
+ if (viewportConstrainedNotCompositedReason) |
+ *viewportConstrainedNotCompositedReason = RenderLayer::NotCompositedForNonViewContainer; |
return false; |
} |
@@ -2005,8 +2010,8 @@ |
| RenderLayer::ExcludeHiddenDescendants | RenderLayer::DontConstrainForMask | RenderLayer::IncludeCompositedDescendants); |
layerBounds.scale(frameView->frame()->frameScaleFactor()); |
if (!viewBounds.intersects(enclosingIntRect(layerBounds))) { |
- if (fixedPositionLayerNotCompositedReason) |
- *fixedPositionLayerNotCompositedReason = LayerBoundsOutOfView; |
+ if (viewportConstrainedNotCompositedReason) |
+ *viewportConstrainedNotCompositedReason = RenderLayer::NotCompositedForBoundsOutOfView; |
return false; |
} |
} |