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

Unified Diff: Source/core/rendering/RenderLayer.cpp

Issue 14999005: Fix RenderLayer::collectLayers logic bug. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Addressing review comments Created 7 years, 7 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
« Source/core/rendering/RenderLayer.h ('K') | « Source/core/rendering/RenderLayer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderLayer.cpp
diff --git a/Source/core/rendering/RenderLayer.cpp b/Source/core/rendering/RenderLayer.cpp
index 7c893323a1087c15405daf5a2c22bbbc73c9d405..10cb3f358c347e8602a3bd260dc31a3bf744a154 100644
--- a/Source/core/rendering/RenderLayer.cpp
+++ b/Source/core/rendering/RenderLayer.cpp
@@ -596,17 +596,7 @@ static inline bool isPositionedContainer(const RenderLayer* layer)
void RenderLayer::collectBeforePromotionZOrderList(RenderLayer* ancestorStackingContext, OwnPtr<Vector<RenderLayer*> >& posZOrderListBeforePromote, OwnPtr<Vector<RenderLayer*> >& negZOrderListBeforePromote)
{
- // FIXME: TemporaryChange should support bit fields.
- bool oldNeedsCompositedScrolling = m_needsCompositedScrolling;
- bool oldIsNormalFlowOnly = m_isNormalFlowOnly;
-
- m_needsCompositedScrolling = false;
- m_isNormalFlowOnly = shouldBeNormalFlowOnly();
-
- ancestorStackingContext->rebuildZOrderLists(StopAtStackingContexts, posZOrderListBeforePromote, negZOrderListBeforePromote, 0);
-
- m_needsCompositedScrolling = oldNeedsCompositedScrolling;
- m_isNormalFlowOnly = oldIsNormalFlowOnly;
+ ancestorStackingContext->rebuildZOrderLists(posZOrderListBeforePromote, negZOrderListBeforePromote, this, AcceleratedCompositingForOverflowScrollDisabled);
const RenderLayer* positionedAncestor = parent();
while (positionedAncestor && !isPositionedContainer(positionedAncestor) && !positionedAncestor->isStackingContext())
@@ -637,17 +627,7 @@ void RenderLayer::collectBeforePromotionZOrderList(RenderLayer* ancestorStacking
void RenderLayer::collectAfterPromotionZOrderList(RenderLayer* ancestorStackingContext, OwnPtr<Vector<RenderLayer*> >& posZOrderListAfterPromote, OwnPtr<Vector<RenderLayer*> >& negZOrderListAfterPromote)
{
- // FIXME: TemporaryChange should support bit fields.
- bool oldNeedsCompositedScrolling = m_needsCompositedScrolling;
- bool oldIsNormalFlowOnly = m_isNormalFlowOnly;
-
- m_isNormalFlowOnly = false;
- m_needsCompositedScrolling = true;
-
- ancestorStackingContext->rebuildZOrderLists(StopAtStackingContexts, posZOrderListAfterPromote, negZOrderListAfterPromote, this);
-
- m_needsCompositedScrolling = oldNeedsCompositedScrolling;
- m_isNormalFlowOnly = oldIsNormalFlowOnly;
+ ancestorStackingContext->rebuildZOrderLists(posZOrderListAfterPromote, negZOrderListAfterPromote, this, AcceleratedCompositingForOverflowScrollAlwaysOn);
}
// Compute what positive and negative z-order lists would look like before and
@@ -5618,16 +5598,16 @@ void RenderLayer::rebuildZOrderLists()
{
ASSERT(m_layerListMutationAllowed);
ASSERT(isDirtyStackingContainer());
- rebuildZOrderLists(StopAtStackingContainers, m_posZOrderList, m_negZOrderList);
+ rebuildZOrderLists(m_posZOrderList, m_negZOrderList);
m_zOrderListsDirty = false;
}
-void RenderLayer::rebuildZOrderLists(CollectLayersBehavior behavior, OwnPtr<Vector<RenderLayer*> >& posZOrderList, OwnPtr<Vector<RenderLayer*> >& negZOrderList, const RenderLayer* layerToForceAsStackingContainer)
+void RenderLayer::rebuildZOrderLists(OwnPtr<Vector<RenderLayer*> >& posZOrderList, OwnPtr<Vector<RenderLayer*> >& negZOrderList, const RenderLayer* layerToForceAsStackingContainer, AcceleratedCompositingForOverflowScrollEnabledMode acceleratedCompositingForOverflowScrollEnabledMode)
{
bool includeHiddenLayers = compositor()->inCompositingMode();
for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
if (!m_reflection || reflectionLayer() != child)
- child->collectLayers(includeHiddenLayers, behavior, posZOrderList, negZOrderList, layerToForceAsStackingContainer);
+ child->collectLayers(includeHiddenLayers, posZOrderList, negZOrderList, layerToForceAsStackingContainer, acceleratedCompositingForOverflowScrollEnabledMode);
// Sort the two lists.
if (posZOrderList)
@@ -5669,7 +5649,7 @@ void RenderLayer::updateNormalFlowList()
m_normalFlowListDirty = false;
}
-void RenderLayer::collectLayers(bool includeHiddenLayers, CollectLayersBehavior behavior, OwnPtr<Vector<RenderLayer*> >& posBuffer, OwnPtr<Vector<RenderLayer*> >& negBuffer, const RenderLayer* layerToForceAsStackingContainer)
+void RenderLayer::collectLayers(bool includeHiddenLayers, OwnPtr<Vector<RenderLayer*> >& posBuffer, OwnPtr<Vector<RenderLayer*> >& negBuffer, const RenderLayer* layerToForceAsStackingContainer, AcceleratedCompositingForOverflowScrollEnabledMode acceleratedCompositingForOverflowScrollEnabledMode)
{
if (isInTopLayer())
return;
@@ -5677,20 +5657,40 @@ void RenderLayer::collectLayers(bool includeHiddenLayers, CollectLayersBehavior
updateDescendantDependentFlags();
bool isStacking = false;
-
- switch (behavior) {
- case StopAtStackingContexts:
- isStacking = (this == layerToForceAsStackingContainer) || isStackingContext();
+ bool isNormalFlow = false;
+
+ // To decide whether to treat the current layers as a stacking context or
+ // normal flow only, we have to take the current state of
+ // AcceleratedCompositingForOverflowScrollEnabledMode into account.
+ if (this == layerToForceAsStackingContainer) {
shawnsingh 2013/05/16 09:47:54 OK, so I think I'm gradually overcoming the confus
hartmanng 2013/05/20 15:09:10 https://codereview.chromium.org/14858004/ is where
+ switch (acceleratedCompositingForOverflowScrollEnabledMode) {
+ case AcceleratedCompositingForOverflowScrollAlwaysOn:
+ isStacking = true;
+ isNormalFlow = false;
break;
-
- case StopAtStackingContainers:
- isStacking = (this == layerToForceAsStackingContainer) || isStackingContainer();
+ case AcceleratedCompositingForOverflowScrollDisabled:
+ isStacking = isStackingContext();
+ isNormalFlow = shouldBeNormalFlowOnly(AcceleratedCompositingForOverflowScrollDisabled);
break;
+ case AcceleratedCompositingForOverflowScrollEnabled:
+ // If we've supplied a layer to force, we should either be forcing on or off.
+ ASSERT_NOT_REACHED();
+ break;
+ }
+ } else if (acceleratedCompositingForOverflowScrollEnabledMode == AcceleratedCompositingForOverflowScrollEnabled) {
+ isStacking = isStackingContainer();
+ isNormalFlow = isNormalFlowOnly();
+ } else {
+ // If we get to this case, we need to descend to stacking containers,
+ // and therefore composited-ness should not be taken into account at
+ // all.
+ isStacking = isStackingContext();
+ isNormalFlow = shouldBeNormalFlowOnly(AcceleratedCompositingForOverflowScrollDisabled);
}
// Overflow layers are just painted by their enclosing layers, so they don't get put in zorder lists.
bool includeHiddenLayer = includeHiddenLayers || (m_hasVisibleContent || (m_hasVisibleDescendant && isStacking));
- if (includeHiddenLayer && !isNormalFlowOnly() && !isOutOfFlowRenderFlowThread()) {
+ if (includeHiddenLayer && !isNormalFlow && !isOutOfFlowRenderFlowThread()) {
// Determine which buffer the child should be in.
OwnPtr<Vector<RenderLayer*> >& buffer = (zIndex() >= 0) ? posBuffer : negBuffer;
@@ -5708,7 +5708,7 @@ void RenderLayer::collectLayers(bool includeHiddenLayers, CollectLayersBehavior
for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) {
// Ignore reflections.
if (!m_reflection || reflectionLayer() != child)
- child->collectLayers(includeHiddenLayers, behavior, posBuffer, negBuffer, layerToForceAsStackingContainer);
+ child->collectLayers(includeHiddenLayers, posBuffer, negBuffer, layerToForceAsStackingContainer, acceleratedCompositingForOverflowScrollEnabledMode);
}
}
}
@@ -5775,8 +5775,9 @@ void RenderLayer::repaintIncludingNonCompositingDescendants(RenderLayerModelObje
}
}
-bool RenderLayer::shouldBeNormalFlowOnly() const
+bool RenderLayer::shouldBeNormalFlowOnly(AcceleratedCompositingForOverflowScrollEnabledMode acceleratedCompositingForOverflowScrollEnabledMode) const
{
+ const bool shouldNeedCompositedScrolling = ((acceleratedCompositingForOverflowScrollEnabledMode == AcceleratedCompositingForOverflowScrollDisabled) || !needsCompositedScrolling());
shawnsingh 2013/05/16 09:47:54 I think we're trying to hide actual conditional lo
shawnsingh 2013/05/16 09:53:23 Hmm, maybe this could be even a bit more intuitive
hartmanng 2013/05/20 15:09:10 Done.
hartmanng 2013/05/20 15:09:10 Done.
return (renderer()->hasOverflowClip()
|| renderer()->hasReflection()
|| renderer()->hasMask()
@@ -5791,7 +5792,7 @@ bool RenderLayer::shouldBeNormalFlowOnly() const
&& !renderer()->hasFilter()
&& !renderer()->hasBlendMode()
&& !isTransparent()
- && !needsCompositedScrolling()
+ && shouldNeedCompositedScrolling
&& !renderer()->isFloatingWithShapeOutside()
;
}
« Source/core/rendering/RenderLayer.h ('K') | « Source/core/rendering/RenderLayer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698