| 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 "config.h" | 5 #include "config.h" |
| 6 #include "core/layout/compositing/CompositingReasonFinder.h" | 6 #include "core/layout/compositing/CompositingReasonFinder.h" |
| 7 | 7 |
| 8 #include "core/CSSPropertyNames.h" | 8 #include "core/CSSPropertyNames.h" |
| 9 #include "core/dom/Document.h" | 9 #include "core/dom/Document.h" |
| 10 #include "core/frame/FrameView.h" | 10 #include "core/frame/FrameView.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 } | 46 } |
| 47 | 47 |
| 48 CompositingReasons CompositingReasonFinder::directReasons(const DeprecatedPaintL
ayer* layer) const | 48 CompositingReasons CompositingReasonFinder::directReasons(const DeprecatedPaintL
ayer* layer) const |
| 49 { | 49 { |
| 50 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) | 50 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) |
| 51 return CompositingReasonNone; | 51 return CompositingReasonNone; |
| 52 | 52 |
| 53 ASSERT(potentialCompositingReasonsFromStyle(layer->layoutObject()) == layer-
>potentialCompositingReasonsFromStyle()); | 53 ASSERT(potentialCompositingReasonsFromStyle(layer->layoutObject()) == layer-
>potentialCompositingReasonsFromStyle()); |
| 54 CompositingReasons styleDeterminedDirectCompositingReasons = layer->potentia
lCompositingReasonsFromStyle() & CompositingReasonComboAllDirectStyleDeterminedR
easons; | 54 CompositingReasons styleDeterminedDirectCompositingReasons = layer->potentia
lCompositingReasonsFromStyle() & CompositingReasonComboAllDirectStyleDeterminedR
easons; |
| 55 | 55 |
| 56 // Apply optimizations for scroll-blocks-on which require comparing style be
tween objects. | |
| 57 if ((styleDeterminedDirectCompositingReasons & CompositingReasonScrollBlocks
On) && !requiresCompositingForScrollBlocksOn(layer->layoutObject())) | |
| 58 styleDeterminedDirectCompositingReasons &= ~CompositingReasonScrollBlock
sOn; | |
| 59 | |
| 60 return styleDeterminedDirectCompositingReasons | nonStyleDeterminedDirectRea
sons(layer); | 56 return styleDeterminedDirectCompositingReasons | nonStyleDeterminedDirectRea
sons(layer); |
| 61 } | 57 } |
| 62 | 58 |
| 63 // This information doesn't appear to be incorporated into CompositingReasons. | 59 // This information doesn't appear to be incorporated into CompositingReasons. |
| 64 bool CompositingReasonFinder::requiresCompositingForScrollableFrame() const | 60 bool CompositingReasonFinder::requiresCompositingForScrollableFrame() const |
| 65 { | 61 { |
| 66 // Need this done first to determine overflow. | 62 // Need this done first to determine overflow. |
| 67 ASSERT(!m_layoutView.needsLayout()); | 63 ASSERT(!m_layoutView.needsLayout()); |
| 68 if (isMainFrame()) | 64 if (isMainFrame()) |
| 69 return false; | 65 return false; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 97 | 93 |
| 98 if (style.hasInlineTransform()) | 94 if (style.hasInlineTransform()) |
| 99 reasons |= CompositingReasonInlineTransform; | 95 reasons |= CompositingReasonInlineTransform; |
| 100 | 96 |
| 101 if (style.transformStyle3D() == TransformStyle3DPreserve3D) | 97 if (style.transformStyle3D() == TransformStyle3DPreserve3D) |
| 102 reasons |= CompositingReasonPreserve3DWith3DDescendants; | 98 reasons |= CompositingReasonPreserve3DWith3DDescendants; |
| 103 | 99 |
| 104 if (style.hasPerspective()) | 100 if (style.hasPerspective()) |
| 105 reasons |= CompositingReasonPerspectiveWith3DDescendants; | 101 reasons |= CompositingReasonPerspectiveWith3DDescendants; |
| 106 | 102 |
| 107 // Ignore scroll-blocks-on on the document element, because it will get prop
agated to | |
| 108 // the LayoutView (by Document::inheritHtmlAndBodyElementStyles) and we don'
t want to | |
| 109 // create two composited layers. | |
| 110 if (style.hasScrollBlocksOn() && !layoutObject->isDocumentElement()) | |
| 111 reasons |= CompositingReasonScrollBlocksOn; | |
| 112 | |
| 113 if (style.hasCompositorProxy()) | 103 if (style.hasCompositorProxy()) |
| 114 reasons |= CompositingReasonCompositorProxy; | 104 reasons |= CompositingReasonCompositorProxy; |
| 115 | 105 |
| 116 // If the implementation of createsGroup changes, we need to be aware of tha
t in this part of code. | 106 // If the implementation of createsGroup changes, we need to be aware of tha
t in this part of code. |
| 117 ASSERT((layoutObject->isTransparent() || layoutObject->hasMask() || layoutOb
ject->hasFilter() || style.hasBlendMode()) == layoutObject->createsGroup()); | 107 ASSERT((layoutObject->isTransparent() || layoutObject->hasMask() || layoutOb
ject->hasFilter() || style.hasBlendMode()) == layoutObject->createsGroup()); |
| 118 | 108 |
| 119 if (style.hasMask()) | 109 if (style.hasMask()) |
| 120 reasons |= CompositingReasonMaskWithCompositedDescendants; | 110 reasons |= CompositingReasonMaskWithCompositedDescendants; |
| 121 | 111 |
| 122 if (style.hasFilter()) | 112 if (style.hasFilter()) |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 | 176 |
| 187 bool CompositingReasonFinder::requiresCompositingForPositionFixed(const Deprecat
edPaintLayer* layer) const | 177 bool CompositingReasonFinder::requiresCompositingForPositionFixed(const Deprecat
edPaintLayer* layer) const |
| 188 { | 178 { |
| 189 if (!(m_compositingTriggers & ViewportConstrainedPositionedTrigger)) | 179 if (!(m_compositingTriggers & ViewportConstrainedPositionedTrigger)) |
| 190 return false; | 180 return false; |
| 191 // Don't promote fixed position elements that are descendants of a non-view
container, e.g. transformed elements. | 181 // Don't promote fixed position elements that are descendants of a non-view
container, e.g. transformed elements. |
| 192 // They will stay fixed wrt the container rather than the enclosing frame. | 182 // They will stay fixed wrt the container rather than the enclosing frame. |
| 193 return layer->scrollsWithViewport() && m_layoutView.frameView()->isScrollabl
e(); | 183 return layer->scrollsWithViewport() && m_layoutView.frameView()->isScrollabl
e(); |
| 194 } | 184 } |
| 195 | 185 |
| 196 bool CompositingReasonFinder::requiresCompositingForScrollBlocksOn(const LayoutO
bject* layoutObject) const | |
| 197 { | |
| 198 // Note that the other requires* functions run at LayoutObject::styleDidChan
ge time and so can rely | |
| 199 // only on the style of their object. This function runs at CompositingRequ
irementsUpdater::update | |
| 200 // time, and so can consider the style of other objects. | |
| 201 const ComputedStyle& style = layoutObject->styleRef(); | |
| 202 | |
| 203 // We should only get here by CompositingReasonScrollBlocksOn being a potent
ial compositing reason. | |
| 204 ASSERT(style.hasScrollBlocksOn() && !layoutObject->isDocumentElement()); | |
| 205 | |
| 206 // scroll-blocks-on style is propagated from the document element to the doc
ument. | |
| 207 ASSERT(!layoutObject->isLayoutView() | |
| 208 || !layoutObject->document().documentElement() | |
| 209 || !layoutObject->document().documentElement()->layoutObject() | |
| 210 || layoutObject->document().documentElement()->layoutObject()->style()->
scrollBlocksOn() == style.scrollBlocksOn()); | |
| 211 | |
| 212 // When a scroll occurs, it's the union of all bits set on the target elemen
t's containing block | |
| 213 // chain that determines the behavior. Thus we really only need a new layer
if this object contains | |
| 214 // additional bits from those set by all objects in it's containing block ch
ain. But determining | |
| 215 // this fully is probably more expensive than it's worth. Instead we just h
ave fast-paths here for | |
| 216 // the most common cases of unnecessary layer creation. | |
| 217 // Optimizing this fully would avoid layer explosion in pathological cases l
ike '*' rules. | |
| 218 // We could consider tracking the current state in CompositingRequirementsUp
dater::update. | |
| 219 | |
| 220 // Ensure iframes don't get composited when they require no more blocking th
an their parent. | |
| 221 if (layoutObject->isLayoutView()) { | |
| 222 if (const FrameView* parentFrame = toLayoutView(layoutObject)->frameView
()->parentFrameView()) { | |
| 223 if (const LayoutView* parentLayoutObject = parentFrame->layoutView()
) { | |
| 224 // Does this frame contain only blocks-on bits already present i
n the parent frame? | |
| 225 if (!(style.scrollBlocksOn() & ~parentLayoutObject->style()->scr
ollBlocksOn())) | |
| 226 return false; | |
| 227 } | |
| 228 } else { | |
| 229 // The root frame will either always already be composited, or compo
siting will be disabled. | |
| 230 // Either way, we don't need to require compositing for scroll block
s on. This avoids | |
| 231 // enabling compositing by default, and avoids cluttering the root l
ayers compositing reasons. | |
| 232 return false; | |
| 233 } | |
| 234 } | |
| 235 | |
| 236 return true; | |
| 237 } | 186 } |
| 238 | |
| 239 } | |
| OLD | NEW |