Index: Source/core/layout/LayoutBlock.cpp |
diff --git a/Source/core/layout/LayoutBlock.cpp b/Source/core/layout/LayoutBlock.cpp |
index 5cee8786dba8a9c20f46c54ec7b6042949bd0eff..c1af440fd2abc4c4a1a092d3d14551061e0ca1a6 100644 |
--- a/Source/core/layout/LayoutBlock.cpp |
+++ b/Source/core/layout/LayoutBlock.cpp |
@@ -1202,20 +1202,29 @@ LayoutUnit LayoutBlock::marginIntrinsicLogicalWidthForChild(LayoutBox& child) co |
return margin; |
} |
-static bool needsLayoutDueToStaticPosition(LayoutObject* child) |
-{ |
- // When a non-positioned block element moves, it may have positioned children that are implicitly positioned relative to the |
- // non-positioned block. In block flow we can detect these when we layout the non-positioned block (by noticing the change |
- // in the immediate parent's logical top in |adjustPositionedBlock|). In line layout we always need to mark the positioned |
- // child for layout if its statically positioned in the direction in which the object lays out. |
- // crbug.com/490322(rhogan): We probably need to move the block layout case in here too, as marking a positioned object for |
- // layout while laying out an object's children invalidly assumes that our positionedObjects list is in DOM order and that |
- // we could never mark a positioned object for layout *after* we've laid it out in layoutPositionedObjects. |
- if (!child->parent()->childrenInline()) |
- return false; |
+static bool needsLayoutDueToStaticPosition(LayoutBox* child) |
+{ |
+ // When a non-positioned block element moves, it may have positioned children that are |
+ // implicitly positioned relative to the non-positioned block. |
const ComputedStyle* style = child->style(); |
bool isHorizontal = style->isHorizontalWritingMode(); |
- return style->hasStaticBlockPosition(isHorizontal) || (style->isOriginalDisplayInlineType() && style->hasStaticInlinePosition(isHorizontal)); |
+ if (style->hasStaticBlockPosition(isHorizontal)) { |
+ LayoutBox::LogicalExtentComputedValues computedValues; |
+ LayoutUnit currentLogicalTop = child->logicalTop(); |
+ LayoutUnit currentLogicalHeight = child->logicalHeight(); |
+ child->computeLogicalHeight(currentLogicalHeight, currentLogicalTop, computedValues); |
+ if (computedValues.m_position != currentLogicalTop || computedValues.m_extent != currentLogicalHeight) |
+ return true; |
+ } |
+ if (style->hasStaticInlinePosition(isHorizontal)) { |
+ LayoutBox::LogicalExtentComputedValues computedValues; |
+ LayoutUnit currentLogicalLeft = child->logicalLeft(); |
+ LayoutUnit currentLogicalWidth = child->logicalWidth(); |
+ child->computeLogicalWidth(computedValues); |
+ if (computedValues.m_position != currentLogicalLeft || computedValues.m_extent != currentLogicalWidth) |
+ return true; |
+ } |
+ return false; |
} |
void LayoutBlock::layoutPositionedObjects(bool relayoutChildren, PositionedLayoutBehavior info) |
@@ -1237,7 +1246,7 @@ void LayoutBlock::layoutPositionedObjects(bool relayoutChildren, PositionedLayou |
continue; |
} |
- if (relayoutChildren || needsLayoutDueToStaticPosition(positionedObject)) |
+ if (!positionedObject->normalChildNeedsLayout() && (relayoutChildren || needsLayoutDueToStaticPosition(positionedObject))) |
layoutScope.setChildNeedsLayout(positionedObject); |
// If relayoutChildren is set and the child has percentage padding or an embedded content box, we also need to invalidate the childs pref widths. |