| Index: Source/core/rendering/RenderLayerCompositor.cpp
|
| diff --git a/Source/core/rendering/RenderLayerCompositor.cpp b/Source/core/rendering/RenderLayerCompositor.cpp
|
| index bb93c6eb480d901cbe35045fb0e4846cd4ab1d8d..eb6fe5bd2901a38bc52237eee4a20877d9f859f8 100644
|
| --- a/Source/core/rendering/RenderLayerCompositor.cpp
|
| +++ b/Source/core/rendering/RenderLayerCompositor.cpp
|
| @@ -658,7 +658,7 @@ void RenderLayerCompositor::repaintOnCompositingChange(RenderLayer* layer)
|
| // This method assumes that layout is up-to-date, unlike repaintOnCompositingChange().
|
| void RenderLayerCompositor::repaintInCompositedAncestor(RenderLayer* layer, const LayoutRect& rect)
|
| {
|
| - RenderLayer* compositedAncestor = layer->enclosingCompositingLayerForRepaint(false /*exclude self*/);
|
| + RenderLayer* compositedAncestor = layer->enclosingCompositingLayerForRepaint(ExcludeSelf);
|
| if (compositedAncestor) {
|
| // FIXME: make sure repaintRect is computed correctly for squashed scenario
|
| LayoutPoint offset;
|
| @@ -1905,6 +1905,24 @@ bool RenderLayerCompositor::requiresCompositingForOutOfFlowClipping(const Render
|
| return layer->compositorDrivenAcceleratedScrollingEnabled() && layer->isUnclippedDescendant();
|
| }
|
|
|
| +static bool isViewportConstrainedFixedOrStickyLayer(const RenderLayer* layer)
|
| +{
|
| + if (layer->renderer()->isStickyPositioned())
|
| + return !layer->enclosingOverflowClipLayer(ExcludeSelf);
|
| +
|
| + if (layer->renderer()->style()->position() != FixedPosition)
|
| + return false;
|
| +
|
| + for (const RenderLayerStackingNode* stackingContainer = layer->stackingNode(); stackingContainer;
|
| + stackingContainer = stackingContainer->ancestorStackingContainerNode()) {
|
| + if (stackingContainer->layer()->compositingState() != NotComposited
|
| + && 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,
|
| @@ -1929,7 +1947,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.
|
| @@ -2450,25 +2468,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);
|
| @@ -2528,6 +2530,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(ExcludeSelf));
|
|
|
| FrameView* frameView = m_renderView->frameView();
|
| LayoutRect viewportRect = frameView->viewportConstrainedVisibleContentRect();
|
|
|