Chromium Code Reviews| Index: Source/core/rendering/RenderLayerCompositor.cpp |
| diff --git a/Source/core/rendering/RenderLayerCompositor.cpp b/Source/core/rendering/RenderLayerCompositor.cpp |
| index 09084ed814cd94e77220d8a4c2544b9a43907d86..26d8c846eb6560e214bb06873b9fc0af28fecf57 100644 |
| --- a/Source/core/rendering/RenderLayerCompositor.cpp |
| +++ b/Source/core/rendering/RenderLayerCompositor.cpp |
| @@ -1796,6 +1796,24 @@ bool RenderLayerCompositor::requiresCompositingForOutOfFlowClipping(const Render |
| return layer->compositorDrivenAcceleratedScrollingEnabled() && layer->isUnclippedDescendant(); |
| } |
| +static bool isViewportConstrainedFixedOrStickyLayer(const RenderLayer* layer) |
| +{ |
| + if (layer->renderer()->isStickyPositioned()) |
| + return !layer->enclosingOverflowClipLayer(false); |
| + |
| + if (layer->renderer()->style()->position() != FixedPosition) |
| + return false; |
| + |
| + for (const RenderLayerStackingNode* stackingContainer = layer->stackingNode(); stackingContainer; |
| + stackingContainer = stackingContainer->ancestorStackingContainerNode()) { |
| + if (stackingContainer->layer()->compositingState() != NotComposited |
|
Julien - ping for review
2014/01/06 17:22:07
The old code was checking stackingContainer->layer
shawnsingh
2014/01/06 20:02:48
Actually what ostap@ has done here is reasonable.
ostap
2014/01/08 01:46:40
The original code in webkit patch calls stackingCo
Julien - ping for review
2014/01/08 15:31:45
I stand corrected by Shawn. I was more comfortable
|
| + && stackingContainer->layer()->renderer()->style()->position() == FixedPosition) |
| + return false; |
| + } |
| + |
| + return true; |
| +} |
| + |
| 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, |
| @@ -1820,7 +1838,7 @@ bool RenderLayerCompositor::requiresCompositingForPosition(RenderObject* rendere |
| } |
| if (isSticky) |
| - return true; |
| + return isViewportConstrainedFixedOrStickyLayer(layer); |
| RenderObject* container = renderer->container(); |
| // If the renderer is not hooked up yet then we have to wait until it is. |
| @@ -2346,25 +2364,9 @@ bool RenderLayerCompositor::layerHas3DContent(const RenderLayer* layer) const |
| return false; |
| } |
| -static bool isRootmostFixedOrStickyLayer(RenderLayer* layer) |
| -{ |
| - if (layer->renderer()->isStickyPositioned()) |
| - return true; |
| - |
| - if (layer->renderer()->style()->position() != FixedPosition) |
| - return false; |
| - |
| - for (RenderLayerStackingNode* stackingContainerNode = layer->stackingNode()->ancestorStackingContainerNode(); stackingContainerNode; stackingContainerNode = stackingContainerNode->ancestorStackingContainerNode()) { |
| - if (stackingContainerNode->layer()->hasCompositedLayerMapping() && stackingContainerNode->layer()->renderer()->style()->position() == FixedPosition) |
| - return false; |
| - } |
| - |
| - return true; |
| -} |
| - |
| void RenderLayerCompositor::updateViewportConstraintStatus(RenderLayer* layer) |
| { |
| - if (isRootmostFixedOrStickyLayer(layer)) |
| + if (isViewportConstrainedFixedOrStickyLayer(layer)) |
| addViewportConstrainedLayer(layer); |
| else |
| removeViewportConstrainedLayer(layer); |
| @@ -2424,6 +2426,8 @@ FixedPositionViewportConstraints RenderLayerCompositor::computeFixedViewportCons |
| StickyPositionViewportConstraints RenderLayerCompositor::computeStickyViewportConstraints(RenderLayer* layer) const |
| { |
| ASSERT(layer->hasCompositedLayerMapping()); |
| + // We should never get here for stickies constrained by an enclosing clipping layer. |
| + ASSERT(!layer->enclosingOverflowClipLayer(false)); |
| FrameView* frameView = m_renderView->frameView(); |
| LayoutRect viewportRect = frameView->viewportConstrainedVisibleContentRect(); |