Index: Source/core/rendering/RenderLayer.cpp |
diff --git a/Source/core/rendering/RenderLayer.cpp b/Source/core/rendering/RenderLayer.cpp |
index 4416269caf0c8026c50fede8960553be71590c6f..47daac7a275648b61943f8507c8de06b3394a616 100644 |
--- a/Source/core/rendering/RenderLayer.cpp |
+++ b/Source/core/rendering/RenderLayer.cpp |
@@ -577,17 +577,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, OnlyStackingContextsCanBeStackingContainers); |
const RenderLayer* positionedAncestor = parent(); |
while (positionedAncestor && !isPositionedContainer(positionedAncestor) && !positionedAncestor->isStackingContext()) |
@@ -618,17 +608,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, ForceLayerToStackingContainer); |
} |
// Compute what positive and negative z-order lists would look like before and |
@@ -5591,16 +5571,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, CollectLayersBehavior collectLayersBehavior) |
{ |
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, collectLayersBehavior); |
// Sort the two lists. |
if (posZOrderList) |
@@ -5642,7 +5622,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, CollectLayersBehavior collectLayersBehavior) |
{ |
if (isInTopLayer()) |
return; |
@@ -5650,20 +5630,33 @@ void RenderLayer::collectLayers(bool includeHiddenLayers, CollectLayersBehavior |
updateDescendantDependentFlags(); |
bool isStacking = false; |
+ bool isNormalFlow = false; |
- switch (behavior) { |
- case StopAtStackingContexts: |
- isStacking = (this == layerToForceAsStackingContainer) || isStackingContext(); |
- break; |
- |
- case StopAtStackingContainers: |
- isStacking = (this == layerToForceAsStackingContainer) || isStackingContainer(); |
- break; |
+ switch (collectLayersBehavior) { |
+ case ForceLayerToStackingContainer: |
+ ASSERT(layerToForceAsStackingContainer); |
+ if (this == layerToForceAsStackingContainer) { |
+ isStacking = true; |
+ isNormalFlow = false; |
+ } else { |
+ isStacking = isStackingContext(); |
+ isNormalFlow = shouldBeNormalFlowOnlyIgnoringCompositedScrolling(); |
+ } |
+ break; |
+ case OverflowScrollCanBeStackingContainers: |
+ ASSERT(!layerToForceAsStackingContainer); |
+ isStacking = isStackingContainer(); |
+ isNormalFlow = isNormalFlowOnly(); |
+ break; |
+ case OnlyStackingContextsCanBeStackingContainers: |
+ isStacking = isStackingContext(); |
+ isNormalFlow = shouldBeNormalFlowOnlyIgnoringCompositedScrolling(); |
+ break; |
} |
// 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; |
@@ -5681,7 +5674,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, collectLayersBehavior); |
} |
} |
} |
@@ -5743,23 +5736,28 @@ void RenderLayer::repaintIncludingNonCompositingDescendants(RenderLayerModelObje |
bool RenderLayer::shouldBeNormalFlowOnly() const |
{ |
- return (renderer()->hasOverflowClip() |
- || renderer()->hasReflection() |
- || renderer()->hasMask() |
- || renderer()->isCanvas() |
- || renderer()->isVideo() |
- || renderer()->isEmbeddedObject() |
- || renderer()->isRenderIFrame() |
- || (renderer()->style()->specifiesColumns() && !isRootLayer())) |
- && !renderer()->isPositioned() |
- && !renderer()->hasTransform() |
- && !renderer()->hasClipPath() |
- && !renderer()->hasFilter() |
- && !renderer()->hasBlendMode() |
- && !isTransparent() |
- && !needsCompositedScrolling() |
- && !renderer()->isFloatingWithShapeOutside() |
- ; |
+ return shouldBeNormalFlowOnlyIgnoringCompositedScrolling() && !needsCompositedScrolling(); |
+} |
+ |
+bool RenderLayer::shouldBeNormalFlowOnlyIgnoringCompositedScrolling() const |
+{ |
+ const bool couldBeNormalFlow = renderer()->hasOverflowClip() |
+ || renderer()->hasReflection() |
+ || renderer()->hasMask() |
+ || renderer()->isCanvas() |
+ || renderer()->isVideo() |
+ || renderer()->isEmbeddedObject() |
+ || renderer()->isRenderIFrame() |
+ || (renderer()->style()->specifiesColumns() && !isRootLayer()); |
+ const bool preventsElementFromBeingNormalFlow = renderer()->isPositioned() |
+ || renderer()->hasTransform() |
+ || renderer()->hasClipPath() |
+ || renderer()->hasFilter() |
+ || renderer()->hasBlendMode() |
+ || isTransparent() |
+ || renderer()->isFloatingWithShapeOutside(); |
+ |
+ return couldBeNormalFlow && !preventsElementFromBeingNormalFlow; |
} |
void RenderLayer::updateIsNormalFlowOnly() |