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

Unified Diff: Source/core/rendering/compositing/CompositingReasonFinder.cpp

Issue 231613002: Cleanup CompositingReasonFinder::requiresCompositingForPosition (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: make new methods private 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 side-by-side diff with in-line comments
Download patch
Index: Source/core/rendering/compositing/CompositingReasonFinder.cpp
diff --git a/Source/core/rendering/compositing/CompositingReasonFinder.cpp b/Source/core/rendering/compositing/CompositingReasonFinder.cpp
index e7a901c1f216022525455093badd09039a449013..cf8b0f69651c903864cb9ebd1f8e10a2ef66d88b 100644
--- a/Source/core/rendering/compositing/CompositingReasonFinder.cpp
+++ b/Source/core/rendering/compositing/CompositingReasonFinder.cpp
@@ -187,8 +187,11 @@ CompositingReasons CompositingReasonFinder::nonStyleDeterminedDirectReasons(cons
if (requiresCompositingForOverflowScrolling(layer))
directReasons |= CompositingReasonOverflowScrollingTouch;
- if (requiresCompositingForPosition(renderer, layer, 0, needToRecomputeCompositingRequirements))
- directReasons |= renderer->style()->position() == FixedPosition ? CompositingReasonPositionFixed : CompositingReasonPositionSticky;
+ if (requiresCompositingForPositionSticky(renderer, layer))
+ directReasons |= CompositingReasonPositionSticky;
+
+ if (requiresCompositingForPositionFixed(renderer, layer, 0, needToRecomputeCompositingRequirements))
+ directReasons |= CompositingReasonPositionFixed;
directReasons |= renderer->additionalCompositingReasons(m_compositingTriggers);
@@ -221,10 +224,16 @@ bool CompositingReasonFinder::requiresCompositingForOverflowScrolling(const Rend
return layer->needsCompositedScrolling();
}
+static bool isViewportConstrainedStickyLayer(const RenderLayer* layer)
+{
+ ASSERT(layer->renderer()->isStickyPositioned());
+ return !layer->enclosingOverflowClipLayer(ExcludeSelf);
+}
+
bool CompositingReasonFinder::isViewportConstrainedFixedOrStickyLayer(const RenderLayer* layer)
{
if (layer->renderer()->isStickyPositioned())
- return !layer->enclosingOverflowClipLayer(ExcludeSelf);
+ return isViewportConstrainedStickyLayer(layer);
if (layer->renderer()->style()->position() != FixedPosition)
return false;
@@ -241,30 +250,27 @@ bool CompositingReasonFinder::isViewportConstrainedFixedOrStickyLayer(const Rend
bool CompositingReasonFinder::requiresCompositingForPosition(RenderObject* renderer, const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason* viewportConstrainedNotCompositedReason, bool* needToRecomputeCompositingRequirements) const
{
- // position:fixed elements that create their own stacking context (e.g. have an explicit z-index,
- // opacity, transform) can get their own composited layer. A stacking context is required otherwise
- // z-index and clipping will be broken.
- if (!renderer->isPositioned())
- return false;
+ return requiresCompositingForPositionSticky(renderer, layer) || requiresCompositingForPositionFixed(renderer, layer, viewportConstrainedNotCompositedReason, needToRecomputeCompositingRequirements);
+}
- EPosition position = renderer->style()->position();
- bool isFixed = renderer->isOutOfFlowPositioned() && position == FixedPosition;
- // FIXME: The isStackingContainer check here is redundant. Fixed position elements are always stacking contexts.
- if (isFixed && !layer->stackingNode()->isStackingContainer())
+bool CompositingReasonFinder::requiresCompositingForPositionSticky(RenderObject* renderer, const RenderLayer* layer) const
+{
+ if (!(m_compositingTriggers & ViewportConstrainedPositionedTrigger))
return false;
-
- bool isSticky = renderer->isInFlowPositioned() && position == StickyPosition;
- if (!isFixed && !isSticky)
+ if (renderer->style()->position() != StickyPosition)
return false;
+ // FIXME: This probably isn't correct for accelerated overflow scrolling. crbug.com/361723
+ // Instead it should return false only if the layer is not inside a scrollable region.
+ return isViewportConstrainedStickyLayer(layer);
+}
- // FIXME: acceleratedCompositingForFixedPositionEnabled should probably be renamed acceleratedCompositingForViewportConstrainedPositionEnabled().
- if (Settings* settings = m_renderView.document().settings()) {
- if (!settings->acceleratedCompositingForFixedPositionEnabled())
- return false;
- }
+bool CompositingReasonFinder::requiresCompositingForPositionFixed(RenderObject* renderer, const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason* viewportConstrainedNotCompositedReason, bool* needToRecomputeCompositingRequirements) const
+{
+ if (!(m_compositingTriggers & ViewportConstrainedPositionedTrigger))
+ return false;
- if (isSticky)
- return isViewportConstrainedFixedOrStickyLayer(layer);
+ if (renderer->style()->position() != FixedPosition)
+ return false;
RenderObject* container = renderer->container();
// If the renderer is not hooked up yet then we have to wait until it is.
« no previous file with comments | « Source/core/rendering/compositing/CompositingReasonFinder.h ('k') | Source/core/rendering/compositing/CompositingTriggers.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698