Chromium Code Reviews| 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/rendering/compositing/CompositingReasonFinder.h" | 6 #include "core/rendering/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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 42 bool CompositingReasonFinder::isMainFrame() const | 42 bool CompositingReasonFinder::isMainFrame() const |
| 43 { | 43 { |
| 44 // FIXME: LocalFrame::isMainFrame() is probably better. | 44 // FIXME: LocalFrame::isMainFrame() is probably better. |
| 45 return !m_renderView.document().ownerElement(); | 45 return !m_renderView.document().ownerElement(); |
| 46 } | 46 } |
| 47 | 47 |
| 48 CompositingReasons CompositingReasonFinder::directReasons(const RenderLayer* lay er) const | 48 CompositingReasons CompositingReasonFinder::directReasons(const RenderLayer* lay er) const |
| 49 { | 49 { |
| 50 ASSERT(potentialCompositingReasonsFromStyle(layer->renderer()) == layer->pot entialCompositingReasonsFromStyle()); | 50 ASSERT(potentialCompositingReasonsFromStyle(layer->renderer()) == layer->pot entialCompositingReasonsFromStyle()); |
| 51 CompositingReasons styleDeterminedDirectCompositingReasons = layer->potentia lCompositingReasonsFromStyle() & CompositingReasonComboAllDirectStyleDeterminedR easons; | 51 CompositingReasons styleDeterminedDirectCompositingReasons = layer->potentia lCompositingReasonsFromStyle() & CompositingReasonComboAllDirectStyleDeterminedR easons; |
| 52 | |
| 53 // Apply optimizations for scroll-blocks-on which require comparing style be tween objects. | |
| 54 if ((styleDeterminedDirectCompositingReasons & CompositingReasonScrollBlocks On) && !requiresCompositingForScrollBlocksOn(layer->renderer())) | |
| 55 styleDeterminedDirectCompositingReasons &= ~CompositingReasonScrollBlock sOn; | |
| 56 | |
| 52 return styleDeterminedDirectCompositingReasons | nonStyleDeterminedDirectRea sons(layer); | 57 return styleDeterminedDirectCompositingReasons | nonStyleDeterminedDirectRea sons(layer); |
| 53 } | 58 } |
| 54 | 59 |
| 55 // This information doesn't appear to be incorporated into CompositingReasons. | 60 // This information doesn't appear to be incorporated into CompositingReasons. |
| 56 bool CompositingReasonFinder::requiresCompositingForScrollableFrame() const | 61 bool CompositingReasonFinder::requiresCompositingForScrollableFrame() const |
| 57 { | 62 { |
| 58 // Need this done first to determine overflow. | 63 // Need this done first to determine overflow. |
| 59 ASSERT(!m_renderView.needsLayout()); | 64 ASSERT(!m_renderView.needsLayout()); |
| 60 if (isMainFrame()) | 65 if (isMainFrame()) |
| 61 return false; | 66 return false; |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 86 | 91 |
| 87 if (style->hasInlineTransform()) | 92 if (style->hasInlineTransform()) |
| 88 reasons |= CompositingReasonInlineTransform; | 93 reasons |= CompositingReasonInlineTransform; |
| 89 | 94 |
| 90 if (style->transformStyle3D() == TransformStyle3DPreserve3D) | 95 if (style->transformStyle3D() == TransformStyle3DPreserve3D) |
| 91 reasons |= CompositingReasonPreserve3DWith3DDescendants; | 96 reasons |= CompositingReasonPreserve3DWith3DDescendants; |
| 92 | 97 |
| 93 if (style->hasPerspective()) | 98 if (style->hasPerspective()) |
| 94 reasons |= CompositingReasonPerspectiveWith3DDescendants; | 99 reasons |= CompositingReasonPerspectiveWith3DDescendants; |
| 95 | 100 |
| 101 if (style->hasScrollBlocksOn() && !renderer->isDocumentElement()) | |
| 102 reasons |= CompositingReasonScrollBlocksOn; | |
| 103 | |
| 96 // If the implementation of createsGroup changes, we need to be aware of tha t in this part of code. | 104 // If the implementation of createsGroup changes, we need to be aware of tha t in this part of code. |
| 97 ASSERT((renderer->isTransparent() || renderer->hasMask() || renderer->hasFil ter() || style->hasBlendMode()) == renderer->createsGroup()); | 105 ASSERT((renderer->isTransparent() || renderer->hasMask() || renderer->hasFil ter() || style->hasBlendMode()) == renderer->createsGroup()); |
| 98 | 106 |
| 99 if (style->hasMask()) | 107 if (style->hasMask()) |
| 100 reasons |= CompositingReasonMaskWithCompositedDescendants; | 108 reasons |= CompositingReasonMaskWithCompositedDescendants; |
| 101 | 109 |
| 102 if (style->hasFilter()) | 110 if (style->hasFilter()) |
| 103 reasons |= CompositingReasonFilterWithCompositedDescendants; | 111 reasons |= CompositingReasonFilterWithCompositedDescendants; |
| 104 | 112 |
| 105 // See RenderLayer::updateTransform for an explanation of why we check both. | 113 // See RenderLayer::updateTransform for an explanation of why we check both. |
| 106 if (renderer->hasTransformRelatedProperty() && style->hasTransform()) | 114 if (renderer->hasTransformRelatedProperty() && style->hasTransform()) |
| 107 reasons |= CompositingReasonTransformWithCompositedDescendants; | 115 reasons |= CompositingReasonTransformWithCompositedDescendants; |
| 108 | 116 |
| 109 if (renderer->isTransparent()) | 117 if (renderer->isTransparent()) |
| 110 reasons |= CompositingReasonOpacityWithCompositedDescendants; | 118 reasons |= CompositingReasonOpacityWithCompositedDescendants; |
| 111 | 119 |
| 112 if (style->hasBlendMode()) | 120 if (style->hasBlendMode()) |
| 113 reasons |= CompositingReasonBlendingWithCompositedDescendants; | 121 reasons |= CompositingReasonBlendingWithCompositedDescendants; |
| 114 | 122 |
| 115 if (renderer->hasReflection()) | 123 if (renderer->hasReflection()) |
| 116 reasons |= CompositingReasonReflectionWithCompositedDescendants; | 124 reasons |= CompositingReasonReflectionWithCompositedDescendants; |
| 117 | 125 |
| 118 ASSERT(!(reasons & ~CompositingReasonComboAllStyleDeterminedReasons)); | 126 ASSERT(!(reasons & ~CompositingReasonComboAllStyleDeterminedReasons)); |
| 119 return reasons; | 127 return reasons; |
| 120 } | 128 } |
| 121 | 129 |
| 122 bool CompositingReasonFinder::requiresCompositingForTransform(RenderObject* rend erer) const | 130 bool CompositingReasonFinder::requiresCompositingForTransform(RenderObject* rend erer) const |
| 123 { | 131 { |
| 124 // Note that we ask the renderer if it has a transform, because the style ma y have transforms, | 132 // Note that we ask the renderer if it has a transform, because the style ma y have transforms, |
| 125 // but the renderer may be an inline that doesn't suppport them. | 133 // but the renderer may be an inline that doesn't support them. |
| 126 return renderer->hasTransformRelatedProperty() && renderer->style()->transfo rm().has3DOperation(); | 134 return renderer->hasTransformRelatedProperty() && renderer->style()->transfo rm().has3DOperation(); |
| 127 } | 135 } |
| 128 | 136 |
| 129 CompositingReasons CompositingReasonFinder::nonStyleDeterminedDirectReasons(cons t RenderLayer* layer) const | 137 CompositingReasons CompositingReasonFinder::nonStyleDeterminedDirectReasons(cons t RenderLayer* layer) const |
| 130 { | 138 { |
| 131 CompositingReasons directReasons = CompositingReasonNone; | 139 CompositingReasons directReasons = CompositingReasonNone; |
| 132 RenderObject* renderer = layer->renderer(); | 140 RenderObject* renderer = layer->renderer(); |
| 133 | 141 |
| 134 if (hasOverflowScrollTrigger()) { | 142 if (hasOverflowScrollTrigger()) { |
| 135 if (layer->clipParent()) | 143 if (layer->clipParent()) |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 163 | 171 |
| 164 bool CompositingReasonFinder::requiresCompositingForPositionFixed(const RenderLa yer* layer) const | 172 bool CompositingReasonFinder::requiresCompositingForPositionFixed(const RenderLa yer* layer) const |
| 165 { | 173 { |
| 166 if (!(m_compositingTriggers & ViewportConstrainedPositionedTrigger)) | 174 if (!(m_compositingTriggers & ViewportConstrainedPositionedTrigger)) |
| 167 return false; | 175 return false; |
| 168 // Don't promote fixed position elements that are descendants of a non-view container, e.g. transformed elements. | 176 // Don't promote fixed position elements that are descendants of a non-view container, e.g. transformed elements. |
| 169 // They will stay fixed wrt the container rather than the enclosing frame. | 177 // They will stay fixed wrt the container rather than the enclosing frame. |
| 170 return layer->scrollsWithViewport() && m_renderView.frameView()->isScrollabl e(); | 178 return layer->scrollsWithViewport() && m_renderView.frameView()->isScrollabl e(); |
| 171 } | 179 } |
| 172 | 180 |
| 181 bool CompositingReasonFinder::requiresCompositingForScrollBlocksOn(const RenderO bject* renderer) const | |
| 182 { | |
| 183 // Note that the other requires* functions run at RenderObject::styleDidChan ge time and so can rely | |
| 184 // only on the style of their object. This function runs at CompositingRequ irementsUpdater::update | |
| 185 // time, and so can consider the style of other objects. | |
| 186 RenderStyle* style = renderer->style(); | |
| 187 | |
| 188 // We should only get here by CompositingReasonScrollBlocksOn being a potent ial compositing reason. | |
| 189 ASSERT(style->hasScrollBlocksOn() && !renderer->isDocumentElement()); | |
| 190 | |
| 191 // scroll-blocks-on style is propagated from the document element to the doc ument. | |
| 192 ASSERT(!renderer->isRenderView() | |
| 193 || !renderer->document().documentElement() | |
| 194 || !renderer->document().documentElement()->renderer() | |
| 195 || renderer->document().documentElement()->renderer()->style()->scrollBl ocksOn() == style->scrollBlocksOn()); | |
| 196 | |
| 197 // Ensure iframes don't get composited unnecessarily. | |
| 198 if (renderer->isRenderView()) { | |
| 199 if (const FrameView* parentFrame = toRenderView(renderer)->frameView()-> parentFrameView()) { | |
| 200 if (const RenderView* parentRenderer = parentFrame->renderView()) { | |
|
Ian Vollick
2015/01/06 04:13:51
I'm a bit confused by this, but I'm sure it's just
Rick Byers
2015/01/08 21:08:11
It's the union of all bits set in the containing b
Ian Vollick
2015/01/09 15:17:33
Got it. Thank you for the detailed comment; it rea
| |
| 201 // Does this frame contain only blocks-on bits already present i n the parent frame? | |
|
skobes
2015/01/07 18:49:24
What happens if we have fewer blocks-on bits than
Rick Byers
2015/01/08 21:08:11
No, see the doc and CC side of the patch. Since t
| |
| 202 if (!(style->scrollBlocksOn() & ~parentRenderer->style()->scroll BlocksOn())) | |
| 203 return false; | |
| 204 } | |
| 205 } | |
| 206 return true; | |
| 207 } | |
| 208 | |
| 209 // NOTE: Really I only need a new layer if this object contains additional b its from those | |
| 210 // set by all objects in it's containing block chain. Such an optimization would avoid layer | |
| 211 // explosion in pathological cases like '*' rules. We could consider tracki ng the current | |
| 212 // state in CompositingRequirementsUpdater::update or perhaps just apply som e simpler | |
| 213 // optimizations here (like testing only against our direct containing block ). | |
| 214 | |
| 215 return true; | |
| 173 } | 216 } |
| 217 | |
| 218 } | |
| OLD | NEW |