| 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 { | 43 { |
| 44 // FIXME: LocalFrame::isMainFrame() is probably better. | 44 // FIXME: LocalFrame::isMainFrame() is probably better. |
| 45 return !m_layoutView.document().ownerElement(); | 45 return !m_layoutView.document().ownerElement(); |
| 46 } | 46 } |
| 47 | 47 |
| 48 CompositingReasons CompositingReasonFinder::directReasons(const Layer* layer) co
nst | 48 CompositingReasons CompositingReasonFinder::directReasons(const Layer* layer) co
nst |
| 49 { | 49 { |
| 50 if (RuntimeEnabledFeatures::slimmingPaintCompositorLayerizationEnabled()) | 50 if (RuntimeEnabledFeatures::slimmingPaintCompositorLayerizationEnabled()) |
| 51 return CompositingReasonNone; | 51 return CompositingReasonNone; |
| 52 | 52 |
| 53 ASSERT(potentialCompositingReasonsFromStyle(layer->renderer()) == layer->pot
entialCompositingReasonsFromStyle()); | 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. | 56 // Apply optimizations for scroll-blocks-on which require comparing style be
tween objects. |
| 57 if ((styleDeterminedDirectCompositingReasons & CompositingReasonScrollBlocks
On) && !requiresCompositingForScrollBlocksOn(layer->renderer())) | 57 if ((styleDeterminedDirectCompositingReasons & CompositingReasonScrollBlocks
On) && !requiresCompositingForScrollBlocksOn(layer->layoutObject())) |
| 58 styleDeterminedDirectCompositingReasons &= ~CompositingReasonScrollBlock
sOn; | 58 styleDeterminedDirectCompositingReasons &= ~CompositingReasonScrollBlock
sOn; |
| 59 | 59 |
| 60 return styleDeterminedDirectCompositingReasons | nonStyleDeterminedDirectRea
sons(layer); | 60 return styleDeterminedDirectCompositingReasons | nonStyleDeterminedDirectRea
sons(layer); |
| 61 } | 61 } |
| 62 | 62 |
| 63 // This information doesn't appear to be incorporated into CompositingReasons. | 63 // This information doesn't appear to be incorporated into CompositingReasons. |
| 64 bool CompositingReasonFinder::requiresCompositingForScrollableFrame() const | 64 bool CompositingReasonFinder::requiresCompositingForScrollableFrame() const |
| 65 { | 65 { |
| 66 // Need this done first to determine overflow. | 66 // Need this done first to determine overflow. |
| 67 ASSERT(!m_layoutView.needsLayout()); | 67 ASSERT(!m_layoutView.needsLayout()); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 bool CompositingReasonFinder::requiresCompositingForTransform(LayoutObject* rend
erer) const | 139 bool CompositingReasonFinder::requiresCompositingForTransform(LayoutObject* rend
erer) const |
| 140 { | 140 { |
| 141 // Note that we ask the renderer if it has a transform, because the style ma
y have transforms, | 141 // Note that we ask the renderer if it has a transform, because the style ma
y have transforms, |
| 142 // but the renderer may be an inline that doesn't support them. | 142 // but the renderer may be an inline that doesn't support them. |
| 143 return renderer->hasTransformRelatedProperty() && renderer->style()->transfo
rm().has3DOperation(); | 143 return renderer->hasTransformRelatedProperty() && renderer->style()->transfo
rm().has3DOperation(); |
| 144 } | 144 } |
| 145 | 145 |
| 146 CompositingReasons CompositingReasonFinder::nonStyleDeterminedDirectReasons(cons
t Layer* layer) const | 146 CompositingReasons CompositingReasonFinder::nonStyleDeterminedDirectReasons(cons
t Layer* layer) const |
| 147 { | 147 { |
| 148 CompositingReasons directReasons = CompositingReasonNone; | 148 CompositingReasons directReasons = CompositingReasonNone; |
| 149 LayoutObject* renderer = layer->renderer(); | 149 LayoutObject* renderer = layer->layoutObject(); |
| 150 | 150 |
| 151 if (hasOverflowScrollTrigger()) { | 151 if (hasOverflowScrollTrigger()) { |
| 152 if (layer->clipParent()) | 152 if (layer->clipParent()) |
| 153 directReasons |= CompositingReasonOutOfFlowClipping; | 153 directReasons |= CompositingReasonOutOfFlowClipping; |
| 154 | 154 |
| 155 if (layer->needsCompositedScrolling()) | 155 if (layer->needsCompositedScrolling()) |
| 156 directReasons |= CompositingReasonOverflowScrollingTouch; | 156 directReasons |= CompositingReasonOverflowScrollingTouch; |
| 157 } | 157 } |
| 158 | 158 |
| 159 // Composite |layer| if it is inside of an ancestor scrolling layer, but tha
t | 159 // Composite |layer| if it is inside of an ancestor scrolling layer, but tha
t |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 // only on the style of their object. This function runs at CompositingRequ
irementsUpdater::update | 196 // only on the style of their object. This function runs at CompositingRequ
irementsUpdater::update |
| 197 // time, and so can consider the style of other objects. | 197 // time, and so can consider the style of other objects. |
| 198 const LayoutStyle& style = renderer->styleRef(); | 198 const LayoutStyle& style = renderer->styleRef(); |
| 199 | 199 |
| 200 // We should only get here by CompositingReasonScrollBlocksOn being a potent
ial compositing reason. | 200 // We should only get here by CompositingReasonScrollBlocksOn being a potent
ial compositing reason. |
| 201 ASSERT(style.hasScrollBlocksOn() && !renderer->isDocumentElement()); | 201 ASSERT(style.hasScrollBlocksOn() && !renderer->isDocumentElement()); |
| 202 | 202 |
| 203 // scroll-blocks-on style is propagated from the document element to the doc
ument. | 203 // scroll-blocks-on style is propagated from the document element to the doc
ument. |
| 204 ASSERT(!renderer->isLayoutView() | 204 ASSERT(!renderer->isLayoutView() |
| 205 || !renderer->document().documentElement() | 205 || !renderer->document().documentElement() |
| 206 || !renderer->document().documentElement()->renderer() | 206 || !renderer->document().documentElement()->layoutObject() |
| 207 || renderer->document().documentElement()->renderer()->style()->scrollBl
ocksOn() == style.scrollBlocksOn()); | 207 || renderer->document().documentElement()->layoutObject()->style()->scro
llBlocksOn() == style.scrollBlocksOn()); |
| 208 | 208 |
| 209 // When a scroll occurs, it's the union of all bits set on the target elemen
t's containing block | 209 // When a scroll occurs, it's the union of all bits set on the target elemen
t's containing block |
| 210 // chain that determines the behavior. Thus we really only need a new layer
if this object contains | 210 // chain that determines the behavior. Thus we really only need a new layer
if this object contains |
| 211 // additional bits from those set by all objects in it's containing block ch
ain. But determining | 211 // additional bits from those set by all objects in it's containing block ch
ain. But determining |
| 212 // this fully is probably more expensive than it's worth. Instead we just h
ave fast-paths here for | 212 // this fully is probably more expensive than it's worth. Instead we just h
ave fast-paths here for |
| 213 // the most common cases of unnecessary layer creation. | 213 // the most common cases of unnecessary layer creation. |
| 214 // Optimizing this fully would avoid layer explosion in pathological cases l
ike '*' rules. | 214 // Optimizing this fully would avoid layer explosion in pathological cases l
ike '*' rules. |
| 215 // We could consider tracking the current state in CompositingRequirementsUp
dater::update. | 215 // We could consider tracking the current state in CompositingRequirementsUp
dater::update. |
| 216 | 216 |
| 217 // Ensure iframes don't get composited when they require no more blocking th
an their parent. | 217 // Ensure iframes don't get composited when they require no more blocking th
an their parent. |
| 218 if (renderer->isLayoutView()) { | 218 if (renderer->isLayoutView()) { |
| 219 if (const FrameView* parentFrame = toLayoutView(renderer)->frameView()->
parentFrameView()) { | 219 if (const FrameView* parentFrame = toLayoutView(renderer)->frameView()->
parentFrameView()) { |
| 220 if (const LayoutView* parentRenderer = parentFrame->layoutView()) { | 220 if (const LayoutView* parentRenderer = parentFrame->layoutView()) { |
| 221 // Does this frame contain only blocks-on bits already present i
n the parent frame? | 221 // Does this frame contain only blocks-on bits already present i
n the parent frame? |
| 222 if (!(style.scrollBlocksOn() & ~parentRenderer->style()->scrollB
locksOn())) | 222 if (!(style.scrollBlocksOn() & ~parentRenderer->style()->scrollB
locksOn())) |
| 223 return false; | 223 return false; |
| 224 } | 224 } |
| 225 } else { | 225 } else { |
| 226 // The root frame will either always already be composited, or compo
siting will be disabled. | 226 // The root frame will either always already be composited, or compo
siting will be disabled. |
| 227 // Either way, we don't need to require compositing for scroll block
s on. This avoids | 227 // Either way, we don't need to require compositing for scroll block
s on. This avoids |
| 228 // enabling compositing by default, and avoids cluttering the root l
ayers compositing reasons. | 228 // enabling compositing by default, and avoids cluttering the root l
ayers compositing reasons. |
| 229 return false; | 229 return false; |
| 230 } | 230 } |
| 231 } | 231 } |
| 232 | 232 |
| 233 return true; | 233 return true; |
| 234 } | 234 } |
| 235 | 235 |
| 236 } | 236 } |
| OLD | NEW |