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 "CSSPropertyNames.h" | 8 #include "CSSPropertyNames.h" |
9 #include "HTMLNames.h" | 9 #include "HTMLNames.h" |
10 #include "core/frame/FrameView.h" | 10 #include "core/frame/FrameView.h" |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 if (requiresCompositingForOutOfFlowClipping(layer)) | 180 if (requiresCompositingForOutOfFlowClipping(layer)) |
181 directReasons |= CompositingReasonOutOfFlowClipping; | 181 directReasons |= CompositingReasonOutOfFlowClipping; |
182 | 182 |
183 if (requiresCompositingForOverflowScrollingParent(layer)) | 183 if (requiresCompositingForOverflowScrollingParent(layer)) |
184 directReasons |= CompositingReasonOverflowScrollingParent; | 184 directReasons |= CompositingReasonOverflowScrollingParent; |
185 } | 185 } |
186 | 186 |
187 if (requiresCompositingForOverflowScrolling(layer)) | 187 if (requiresCompositingForOverflowScrolling(layer)) |
188 directReasons |= CompositingReasonOverflowScrollingTouch; | 188 directReasons |= CompositingReasonOverflowScrollingTouch; |
189 | 189 |
190 if (requiresCompositingForPosition(renderer, layer, 0, needToRecomputeCompos
itingRequirements)) | 190 if (requiresCompositingForPositionSticky(renderer, layer)) |
191 directReasons |= renderer->style()->position() == FixedPosition ? Compos
itingReasonPositionFixed : CompositingReasonPositionSticky; | 191 directReasons |= CompositingReasonPositionSticky; |
| 192 |
| 193 if (requiresCompositingForPositionFixed(renderer, layer, 0, needToRecomputeC
ompositingRequirements)) |
| 194 directReasons |= CompositingReasonPositionFixed; |
192 | 195 |
193 directReasons |= renderer->additionalCompositingReasons(m_compositingTrigger
s); | 196 directReasons |= renderer->additionalCompositingReasons(m_compositingTrigger
s); |
194 | 197 |
195 ASSERT(!(directReasons & CompositingReasonComboAllStyleDeterminedReasons)); | 198 ASSERT(!(directReasons & CompositingReasonComboAllStyleDeterminedReasons)); |
196 return directReasons; | 199 return directReasons; |
197 } | 200 } |
198 | 201 |
199 bool CompositingReasonFinder::requiresCompositingForAnimation(RenderObject* rend
erer) const | 202 bool CompositingReasonFinder::requiresCompositingForAnimation(RenderObject* rend
erer) const |
200 { | 203 { |
201 if (!(m_compositingTriggers & AnimationTrigger)) | 204 if (!(m_compositingTriggers & AnimationTrigger)) |
(...skipping 12 matching lines...) Expand all Loading... |
214 if (!hasOverflowScrollTrigger()) | 217 if (!hasOverflowScrollTrigger()) |
215 return false; | 218 return false; |
216 return layer->scrollParent(); | 219 return layer->scrollParent(); |
217 } | 220 } |
218 | 221 |
219 bool CompositingReasonFinder::requiresCompositingForOverflowScrolling(const Rend
erLayer* layer) const | 222 bool CompositingReasonFinder::requiresCompositingForOverflowScrolling(const Rend
erLayer* layer) const |
220 { | 223 { |
221 return layer->needsCompositedScrolling(); | 224 return layer->needsCompositedScrolling(); |
222 } | 225 } |
223 | 226 |
| 227 static bool isViewportConstrainedStickyLayer(const RenderLayer* layer) |
| 228 { |
| 229 ASSERT(layer->renderer()->isStickyPositioned()); |
| 230 return !layer->enclosingOverflowClipLayer(ExcludeSelf); |
| 231 } |
| 232 |
224 bool CompositingReasonFinder::isViewportConstrainedFixedOrStickyLayer(const Rend
erLayer* layer) | 233 bool CompositingReasonFinder::isViewportConstrainedFixedOrStickyLayer(const Rend
erLayer* layer) |
225 { | 234 { |
226 if (layer->renderer()->isStickyPositioned()) | 235 if (layer->renderer()->isStickyPositioned()) |
227 return !layer->enclosingOverflowClipLayer(ExcludeSelf); | 236 return isViewportConstrainedStickyLayer(layer); |
228 | 237 |
229 if (layer->renderer()->style()->position() != FixedPosition) | 238 if (layer->renderer()->style()->position() != FixedPosition) |
230 return false; | 239 return false; |
231 | 240 |
232 for (const RenderLayerStackingNode* stackingContainer = layer->stackingNode(
); stackingContainer; | 241 for (const RenderLayerStackingNode* stackingContainer = layer->stackingNode(
); stackingContainer; |
233 stackingContainer = stackingContainer->ancestorStackingContainerNode())
{ | 242 stackingContainer = stackingContainer->ancestorStackingContainerNode())
{ |
234 if (stackingContainer->layer()->compositingState() != NotComposited | 243 if (stackingContainer->layer()->compositingState() != NotComposited |
235 && stackingContainer->layer()->renderer()->style()->position() == Fi
xedPosition) | 244 && stackingContainer->layer()->renderer()->style()->position() == Fi
xedPosition) |
236 return false; | 245 return false; |
237 } | 246 } |
238 | 247 |
239 return true; | 248 return true; |
240 } | 249 } |
241 | 250 |
242 bool CompositingReasonFinder::requiresCompositingForPosition(RenderObject* rende
rer, const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReas
on* viewportConstrainedNotCompositedReason, bool* needToRecomputeCompositingRequ
irements) const | 251 bool CompositingReasonFinder::requiresCompositingForPosition(RenderObject* rende
rer, const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReas
on* viewportConstrainedNotCompositedReason, bool* needToRecomputeCompositingRequ
irements) const |
243 { | 252 { |
244 // position:fixed elements that create their own stacking context (e.g. have
an explicit z-index, | 253 return requiresCompositingForPositionSticky(renderer, layer) || requiresComp
ositingForPositionFixed(renderer, layer, viewportConstrainedNotCompositedReason,
needToRecomputeCompositingRequirements); |
245 // opacity, transform) can get their own composited layer. A stacking contex
t is required otherwise | 254 } |
246 // z-index and clipping will be broken. | 255 |
247 if (!renderer->isPositioned()) | 256 bool CompositingReasonFinder::requiresCompositingForPositionSticky(RenderObject*
renderer, const RenderLayer* layer) const |
| 257 { |
| 258 if (!(m_compositingTriggers & ViewportConstrainedPositionedTrigger)) |
| 259 return false; |
| 260 if (renderer->style()->position() != StickyPosition) |
| 261 return false; |
| 262 // FIXME: This probably isn't correct for accelerated overflow scrolling. cr
bug.com/361723 |
| 263 // Instead it should return false only if the layer is not inside a scrollab
le region. |
| 264 return isViewportConstrainedStickyLayer(layer); |
| 265 } |
| 266 |
| 267 bool CompositingReasonFinder::requiresCompositingForPositionFixed(RenderObject*
renderer, const RenderLayer* layer, RenderLayer::ViewportConstrainedNotComposite
dReason* viewportConstrainedNotCompositedReason, bool* needToRecomputeCompositin
gRequirements) const |
| 268 { |
| 269 if (!(m_compositingTriggers & ViewportConstrainedPositionedTrigger)) |
248 return false; | 270 return false; |
249 | 271 |
250 EPosition position = renderer->style()->position(); | 272 if (renderer->style()->position() != FixedPosition) |
251 bool isFixed = renderer->isOutOfFlowPositioned() && position == FixedPositio
n; | |
252 // FIXME: The isStackingContainer check here is redundant. Fixed position el
ements are always stacking contexts. | |
253 if (isFixed && !layer->stackingNode()->isStackingContainer()) | |
254 return false; | 273 return false; |
255 | 274 |
256 bool isSticky = renderer->isInFlowPositioned() && position == StickyPosition
; | |
257 if (!isFixed && !isSticky) | |
258 return false; | |
259 | |
260 // FIXME: acceleratedCompositingForFixedPositionEnabled should probably be r
enamed acceleratedCompositingForViewportConstrainedPositionEnabled(). | |
261 if (Settings* settings = m_renderView.document().settings()) { | |
262 if (!settings->acceleratedCompositingForFixedPositionEnabled()) | |
263 return false; | |
264 } | |
265 | |
266 if (isSticky) | |
267 return isViewportConstrainedFixedOrStickyLayer(layer); | |
268 | |
269 RenderObject* container = renderer->container(); | 275 RenderObject* container = renderer->container(); |
270 // If the renderer is not hooked up yet then we have to wait until it is. | 276 // If the renderer is not hooked up yet then we have to wait until it is. |
271 if (!container) { | 277 if (!container) { |
272 *needToRecomputeCompositingRequirements = true; | 278 *needToRecomputeCompositingRequirements = true; |
273 return false; | 279 return false; |
274 } | 280 } |
275 | 281 |
276 // Don't promote fixed position elements that are descendants of a non-view
container, e.g. transformed elements. | 282 // Don't promote fixed position elements that are descendants of a non-view
container, e.g. transformed elements. |
277 // They will stay fixed wrt the container rather than the enclosing frame. | 283 // They will stay fixed wrt the container rather than the enclosing frame. |
278 if (container != &m_renderView) { | 284 if (container != &m_renderView) { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 *needToRecomputeCompositingRequirements = true; | 336 *needToRecomputeCompositingRequirements = true; |
331 } | 337 } |
332 return false; | 338 return false; |
333 } | 339 } |
334 } | 340 } |
335 | 341 |
336 return true; | 342 return true; |
337 } | 343 } |
338 | 344 |
339 } | 345 } |
OLD | NEW |