Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: Source/core/rendering/compositing/CompositingReasonFinder.cpp

Issue 231613002: Cleanup CompositingReasonFinder::requiresCompositingForPosition (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: fix assert Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698