Index: Source/core/rendering/RenderBlock.cpp |
diff --git a/Source/core/rendering/RenderBlock.cpp b/Source/core/rendering/RenderBlock.cpp |
index 87606d2b3ced0230b4814927fa407f8a5d07e80c..77be983db216b5e8817599492583f745e41d043c 100644 |
--- a/Source/core/rendering/RenderBlock.cpp |
+++ b/Source/core/rendering/RenderBlock.cpp |
@@ -1663,7 +1663,7 @@ bool RenderBlock::simplifiedLayout() |
// are statically positioned and thus need to move with their absolute ancestors. |
bool canContainFixedPosObjects = canContainFixedPositionObjects(); |
if (posChildNeedsLayout() || canContainFixedPosObjects) |
- layoutPositionedObjects(false, !posChildNeedsLayout() && canContainFixedPosObjects); |
+ layoutPositionedObjects(false, !posChildNeedsLayout() && canContainFixedPosObjects ? LayoutOnlyFixedPositionedObjects : DefaultLayout); |
// Recompute our overflow information. |
// FIXME: We could do better here by computing a temporary overflow object from layoutPositionedObjects and only |
@@ -1731,7 +1731,7 @@ LayoutUnit RenderBlock::marginIntrinsicLogicalWidthForChild(RenderBox* child) co |
return margin; |
} |
-void RenderBlock::layoutPositionedObjects(bool relayoutChildren, bool fixedPositionObjectsOnly) |
+void RenderBlock::layoutPositionedObjects(bool relayoutChildren, PositionedLayoutBehavior info) |
{ |
TrackedRendererListHashSet* positionedDescendants = positionedObjects(); |
if (!positionedDescendants) |
@@ -1750,7 +1750,7 @@ void RenderBlock::layoutPositionedObjects(bool relayoutChildren, bool fixedPosit |
// if this is a fixed position element, mark it for layout if it has an abspos ancestor and needs to move with that ancestor, i.e. |
// it has static position. |
markFixedPositionObjectForLayoutIfNeeded(r, layoutScope); |
- if (fixedPositionObjectsOnly) { |
+ if (info == LayoutOnlyFixedPositionedObjects) { |
r->layoutIfNeeded(); |
continue; |
} |
@@ -1786,6 +1786,11 @@ void RenderBlock::layoutPositionedObjects(bool relayoutChildren, bool fixedPosit |
oldLogicalTop = logicalTopForChild(r); |
} |
+ // FIXME: We should be able to do a r->setNeedsPositionedMovementLayout() here instead of a full layout. Need |
+ // to investigate why it does not trigger the correct invalidations in that case. crbug.com/350756 |
+ if (info == ForcedLayoutAfterContainingBlockMoved) |
+ r->setNeedsLayout(); |
+ |
r->layoutIfNeeded(); |
// Lay out again if our estimate was wrong. |