| OLD | NEW | 
|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "core/layout/compositing/CompositingReasonFinder.h" | 5 #include "core/layout/compositing/CompositingReasonFinder.h" | 
| 6 | 6 | 
| 7 #include "core/CSSPropertyNames.h" | 7 #include "core/CSSPropertyNames.h" | 
| 8 #include "core/dom/Document.h" | 8 #include "core/dom/Document.h" | 
| 9 #include "core/frame/FrameView.h" | 9 #include "core/frame/FrameView.h" | 
| 10 #include "core/frame/Settings.h" | 10 #include "core/frame/Settings.h" | 
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 67 CompositingReasons | 67 CompositingReasons | 
| 68 CompositingReasonFinder::potentialCompositingReasonsFromStyle( | 68 CompositingReasonFinder::potentialCompositingReasonsFromStyle( | 
| 69     LayoutObject* layoutObject) const { | 69     LayoutObject* layoutObject) const { | 
| 70   if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) | 70   if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) | 
| 71     return CompositingReasonNone; | 71     return CompositingReasonNone; | 
| 72 | 72 | 
| 73   CompositingReasons reasons = CompositingReasonNone; | 73   CompositingReasons reasons = CompositingReasonNone; | 
| 74 | 74 | 
| 75   const ComputedStyle& style = layoutObject->styleRef(); | 75   const ComputedStyle& style = layoutObject->styleRef(); | 
| 76 | 76 | 
| 77   if (requiresCompositingForTransform(layoutObject)) | 77   if (requiresCompositingForTransform(*layoutObject)) | 
| 78     reasons |= CompositingReason3DTransform; | 78     reasons |= CompositingReason3DTransform; | 
| 79 | 79 | 
| 80   if (style.backfaceVisibility() == BackfaceVisibilityHidden) | 80   if (style.backfaceVisibility() == BackfaceVisibilityHidden) | 
| 81     reasons |= CompositingReasonBackfaceVisibilityHidden; | 81     reasons |= CompositingReasonBackfaceVisibilityHidden; | 
| 82 | 82 | 
| 83   if (requiresCompositingForAnimation(style)) | 83   if (requiresCompositingForAnimation(style)) | 
| 84     reasons |= CompositingReasonActiveAnimation; | 84     reasons |= CompositingReasonActiveAnimation; | 
| 85 | 85 | 
| 86   if (style.hasWillChangeCompositingHint() && | 86   if (style.hasWillChangeCompositingHint() && | 
| 87       !style.subtreeWillChangeContents()) | 87       !style.subtreeWillChangeContents()) | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 125     reasons |= CompositingReasonBlendingWithCompositedDescendants; | 125     reasons |= CompositingReasonBlendingWithCompositedDescendants; | 
| 126 | 126 | 
| 127   if (layoutObject->hasReflection()) | 127   if (layoutObject->hasReflection()) | 
| 128     reasons |= CompositingReasonReflectionWithCompositedDescendants; | 128     reasons |= CompositingReasonReflectionWithCompositedDescendants; | 
| 129 | 129 | 
| 130   DCHECK(!(reasons & ~CompositingReasonComboAllStyleDeterminedReasons)); | 130   DCHECK(!(reasons & ~CompositingReasonComboAllStyleDeterminedReasons)); | 
| 131   return reasons; | 131   return reasons; | 
| 132 } | 132 } | 
| 133 | 133 | 
| 134 bool CompositingReasonFinder::requiresCompositingForTransform( | 134 bool CompositingReasonFinder::requiresCompositingForTransform( | 
| 135     LayoutObject* layoutObject) const { | 135     const LayoutObject& layoutObject) { | 
| 136   // Note that we ask the layoutObject if it has a transform, because the style | 136   // Note that we ask the layoutObject if it has a transform, because the style | 
| 137   // may have transforms, but the layoutObject may be an inline that doesn't | 137   // may have transforms, but the layoutObject may be an inline that doesn't | 
| 138   // support them. | 138   // support them. | 
| 139   return layoutObject->hasTransformRelatedProperty() && | 139   return layoutObject.hasTransformRelatedProperty() && | 
| 140          layoutObject->style()->has3DTransform(); | 140          layoutObject.styleRef().has3DTransform(); | 
| 141 } | 141 } | 
| 142 | 142 | 
| 143 CompositingReasons CompositingReasonFinder::nonStyleDeterminedDirectReasons( | 143 CompositingReasons CompositingReasonFinder::nonStyleDeterminedDirectReasons( | 
| 144     const PaintLayer* layer) const { | 144     const PaintLayer* layer) const { | 
| 145   CompositingReasons directReasons = CompositingReasonNone; | 145   CompositingReasons directReasons = CompositingReasonNone; | 
| 146   LayoutObject* layoutObject = layer->layoutObject(); | 146   LayoutObject* layoutObject = layer->layoutObject(); | 
| 147 | 147 | 
| 148   if (m_compositingTriggers & OverflowScrollTrigger && layer->clipParent()) | 148   if (m_compositingTriggers & OverflowScrollTrigger && layer->clipParent()) | 
| 149     directReasons |= CompositingReasonOutOfFlowClipping; | 149     directReasons |= CompositingReasonOutOfFlowClipping; | 
| 150 | 150 | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 164   if (requiresCompositingForScrollDependentPosition(layer)) | 164   if (requiresCompositingForScrollDependentPosition(layer)) | 
| 165     directReasons |= CompositingReasonScrollDependentPosition; | 165     directReasons |= CompositingReasonScrollDependentPosition; | 
| 166 | 166 | 
| 167   directReasons |= layoutObject->additionalCompositingReasons(); | 167   directReasons |= layoutObject->additionalCompositingReasons(); | 
| 168 | 168 | 
| 169   DCHECK(!(directReasons & CompositingReasonComboAllStyleDeterminedReasons)); | 169   DCHECK(!(directReasons & CompositingReasonComboAllStyleDeterminedReasons)); | 
| 170   return directReasons; | 170   return directReasons; | 
| 171 } | 171 } | 
| 172 | 172 | 
| 173 bool CompositingReasonFinder::requiresCompositingForAnimation( | 173 bool CompositingReasonFinder::requiresCompositingForAnimation( | 
| 174     const ComputedStyle& style) const { | 174     const ComputedStyle& style) { | 
| 175   if (style.subtreeWillChangeContents()) | 175   if (style.subtreeWillChangeContents()) | 
| 176     return style.isRunningAnimationOnCompositor(); | 176     return style.isRunningAnimationOnCompositor(); | 
| 177 | 177 | 
| 178   return style.shouldCompositeForCurrentAnimations(); | 178   return style.shouldCompositeForCurrentAnimations(); | 
| 179 } | 179 } | 
| 180 | 180 | 
| 181 bool CompositingReasonFinder::requiresCompositingForScrollDependentPosition( | 181 bool CompositingReasonFinder::requiresCompositingForScrollDependentPosition( | 
| 182     const PaintLayer* layer) const { | 182     const PaintLayer* layer) const { | 
| 183   if (layer->layoutObject()->style()->position() != FixedPosition && | 183   if (layer->layoutObject()->style()->position() != FixedPosition && | 
| 184       layer->layoutObject()->style()->position() != StickyPosition) | 184       layer->layoutObject()->style()->position() != StickyPosition) | 
| 185     return false; | 185     return false; | 
| 186 | 186 | 
| 187   if (!(m_compositingTriggers & ViewportConstrainedPositionedTrigger) && | 187   if (!(m_compositingTriggers & ViewportConstrainedPositionedTrigger) && | 
| 188       (!RuntimeEnabledFeatures::compositeOpaqueFixedPositionEnabled() || | 188       (!RuntimeEnabledFeatures::compositeOpaqueFixedPositionEnabled() || | 
| 189        !layer->backgroundIsKnownToBeOpaqueInRect( | 189        !layer->backgroundIsKnownToBeOpaqueInRect( | 
| 190            LayoutRect(layer->boundingBoxForCompositing())) || | 190            LayoutRect(layer->boundingBoxForCompositing())) || | 
| 191        layer->compositesWithTransform() || layer->compositesWithOpacity())) { | 191        layer->compositesWithTransform() || layer->compositesWithOpacity())) { | 
| 192     return false; | 192     return false; | 
| 193   } | 193   } | 
| 194   // Don't promote fixed position elements that are descendants of a non-view | 194   // Don't promote fixed position elements that are descendants of a non-view | 
| 195   // container, e.g. transformed elements.  They will stay fixed wrt the | 195   // container, e.g. transformed elements.  They will stay fixed wrt the | 
| 196   // container rather than the enclosing frame. | 196   // container rather than the enclosing frame. | 
| 197   if (layer->sticksToViewport()) | 197   if (layer->sticksToViewport()) | 
| 198     return m_layoutView.frameView()->isScrollable(); | 198     return m_layoutView.frameView()->isScrollable(); | 
| 199   return layer->layoutObject()->style()->position() == StickyPosition && | 199   return layer->layoutObject()->style()->position() == StickyPosition && | 
| 200          layer->ancestorOverflowLayer()->scrollsOverflow(); | 200          layer->ancestorOverflowLayer()->scrollsOverflow(); | 
| 201 } | 201 } | 
| 202 | 202 | 
| 203 }  // namespace blink | 203 }  // namespace blink | 
| OLD | NEW | 
|---|