Index: Source/core/layout/LayoutGrid.cpp |
diff --git a/Source/core/layout/LayoutGrid.cpp b/Source/core/layout/LayoutGrid.cpp |
index bbc127fec4d4b4a5055d2b86284633e04ea4c9ea..363e7f0a95f8b97aa67c686c04cea3e0f3f3a804 100644 |
--- a/Source/core/layout/LayoutGrid.cpp |
+++ b/Source/core/layout/LayoutGrid.cpp |
@@ -1275,7 +1275,7 @@ void LayoutGrid::layoutGridItems() |
// Stretching logic might force a child layout, so we need to run it before the layoutIfNeeded |
// call to avoid unnecessary relayouts. This might imply that child margins, needed to correctly |
// determine the available space before stretching, are not set yet. |
- applyStretchAlignmentToChildIfNeeded(*child, overrideContainingBlockContentLogicalHeight); |
+ applyStretchAlignmentToChildIfNeeded(*child); |
child->layoutIfNeeded(); |
@@ -1458,6 +1458,11 @@ bool LayoutGrid::allowedToStretchLogicalHeightForChild(const LayoutBox& child) c |
return child.style()->logicalHeight().isAuto() && !child.style()->marginBeforeUsing(style()).isAuto() && !child.style()->marginAfterUsing(style()).isAuto(); |
} |
+bool LayoutGrid::allowedToStretchLogicalWidthForChild(const LayoutBox& child) const |
+{ |
+ return child.style()->logicalWidth().isAuto() && !child.style()->marginStartUsing(style()).isAuto() && !child.style()->marginEndUsing(style()).isAuto(); |
+} |
+ |
// FIXME: This logic is shared by LayoutFlexibleBox, so it should be moved to LayoutBox. |
bool LayoutGrid::needToStretchChildLogicalHeight(const LayoutBox& child) const |
{ |
@@ -1523,18 +1528,27 @@ LayoutUnit LayoutGrid::availableAlignmentSpaceForChildBeforeStretching(LayoutUni |
} |
// FIXME: This logic is shared by LayoutFlexibleBox, so it should be moved to LayoutBox. |
-void LayoutGrid::applyStretchAlignmentToChildIfNeeded(LayoutBox& child, LayoutUnit gridAreaBreadthForChild) |
+void LayoutGrid::applyStretchAlignmentToChildIfNeeded(LayoutBox& child) |
{ |
- if (!allowedToStretchLogicalHeightForChild(child) || ComputedStyle::resolveAlignment(styleRef(), child.styleRef(), ItemPositionStretch) != ItemPositionStretch) { |
- child.clearOverrideLogicalContentHeight(); |
- return; |
+ child.clearOverrideSize(); |
+ |
+ if (!allowedToStretchLogicalWidthForChild(child) || ComputedStyle::resolveJustification(styleRef(), child.styleRef(), ItemPositionStretch) != ItemPositionStretch) { |
+ if (child.style()->logicalWidth().isAuto()) { |
+ LayoutUnit childPreferredWidth = child.maxPreferredLogicalWidth(); |
+ child.setOverrideLogicalContentWidth(childPreferredWidth - child.borderAndPaddingLogicalWidth()); |
+ if (childPreferredWidth != child.logicalWidth()) |
+ child.setNeedsLayout(LayoutInvalidationReason::GridChanged); |
+ } |
} |
+ if (!allowedToStretchLogicalHeightForChild(child) || ComputedStyle::resolveAlignment(styleRef(), child.styleRef(), ItemPositionStretch) != ItemPositionStretch) |
+ return; |
+ |
bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizontalWritingMode(); |
// FIXME: If the child has orthogonal flow, then it already has an override height set, so use it. |
// FIXME: grid track sizing and positioning do not support orthogonal modes yet. |
if (!hasOrthogonalWritingMode) { |
- LayoutUnit stretchedLogicalHeight = availableAlignmentSpaceForChildBeforeStretching(gridAreaBreadthForChild, child); |
+ LayoutUnit stretchedLogicalHeight = availableAlignmentSpaceForChildBeforeStretching(child.overrideContainingBlockContentLogicalHeight(), child); |
LayoutUnit desiredLogicalHeight = child.constrainLogicalHeightByMinMax(stretchedLogicalHeight, -1); |
// FIXME: Can avoid laying out here in some cases. See https://webkit.org/b/87905. |