Index: Source/core/rendering/RenderGrid.cpp |
diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp |
index 44287ba03f6c9673710e9a3278f18b4ba98652eb..11474d6b9153b483983e0f05f4bbff8f4b23fdc0 100644 |
--- a/Source/core/rendering/RenderGrid.cpp |
+++ b/Source/core/rendering/RenderGrid.cpp |
@@ -624,6 +624,8 @@ LayoutUnit RenderGrid::logicalHeightForChild(RenderBox& child, Vector<GridTrack> |
if (child.style()->logicalHeight().isPercent() || oldOverrideContainingBlockContentLogicalWidth != overrideContainingBlockContentLogicalWidth) |
layoutScope.setNeedsLayout(&child); |
+ child.clearOverrideLogicalContentHeight(); |
+ |
child.setOverrideContainingBlockContentLogicalWidth(overrideContainingBlockContentLogicalWidth); |
// If |child| has a percentage logical height, we shouldn't let it override its intrinsic height, which is |
// what we are interested in here. Thus we need to set the override logical height to -1 (no possible resolution). |
@@ -1117,9 +1119,8 @@ void RenderGrid::layoutGridItems() |
child->setOverrideContainingBlockContentLogicalWidth(overrideContainingBlockContentLogicalWidth); |
child->setOverrideContainingBlockContentLogicalHeight(overrideContainingBlockContentLogicalHeight); |
- // FIXME: Grid items should stretch to fill their cells. Once we |
- // implement grid-{column,row}-align, we can also shrink to fit. For |
- // now, just size as if we were a regular child. |
+ applyStretchAlignmentToChildIfNeeded(*child, overrideContainingBlockContentLogicalHeight); |
+ |
child->layoutIfNeeded(); |
#if ENABLE(ASSERT) |
@@ -1237,19 +1238,11 @@ LayoutUnit RenderGrid::centeredColumnPositionForChild(const RenderBox& child) co |
return columnPosition + offsetFromColumnPosition / 2; |
} |
-static ItemPosition resolveJustification(const RenderStyle* parentStyle, const RenderStyle* childStyle) |
-{ |
- ItemPosition justify = childStyle->justifySelf(); |
- if (justify == ItemPositionAuto) |
- justify = (parentStyle->justifyItems() == ItemPositionAuto) ? ItemPositionStretch : parentStyle->justifyItems(); |
- return justify; |
-} |
- |
LayoutUnit RenderGrid::columnPositionForChild(const RenderBox& child) const |
{ |
bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizontalWritingMode(); |
- switch (resolveJustification(style(), child.style())) { |
+ switch (RenderStyle::resolveJustification(style(), child.style(), ItemPositionStretch)) { |
case ItemPositionSelfStart: |
// For orthogonal writing-modes, this computes to 'start' |
// FIXME: grid track sizing and positioning do not support orthogonal modes yet. |
@@ -1309,6 +1302,7 @@ LayoutUnit RenderGrid::columnPositionForChild(const RenderBox& child) const |
case ItemPositionAuto: |
break; |
case ItemPositionStretch: |
+ return startOfColumnForChild(child); |
case ItemPositionBaseline: |
case ItemPositionLastBaseline: |
// FIXME: Implement the previous values. For now, we always start align the child. |
@@ -1357,11 +1351,86 @@ LayoutUnit RenderGrid::centeredRowPositionForChild(const RenderBox& child) const |
return rowPosition + offsetFromRowPosition / 2; |
} |
-LayoutUnit RenderGrid::rowPositionForChild(const RenderBox& child) const |
+static inline LayoutUnit constrainedChildIntrinsicContentLogicalHeight(const RenderBox& child) |
+{ |
+ LayoutUnit childIntrinsicContentLogicalHeight = child.intrinsicContentLogicalHeight(); |
+ return child.constrainLogicalHeightByMinMax(childIntrinsicContentLogicalHeight + child.borderAndPaddingLogicalHeight(), childIntrinsicContentLogicalHeight); |
+} |
+ |
+// FIXME: This logic is shared by RenderFlexibleBox, so it should be moved to RenderBox. |
+bool RenderGrid::needToStretchChildLogicalHeight(const RenderBox& child) const |
+{ |
+ if (RenderStyle::resolveAlignment(style(), child.style(), ItemPositionStretch) != ItemPositionStretch) |
+ return false; |
+ |
+ return isHorizontalWritingMode() && child.style()->height().isAuto(); |
+} |
+ |
+// FIXME: This logic is shared by RenderFlexibleBox, so it should be moved to RenderBox. |
+LayoutUnit RenderGrid::childIntrinsicHeight(const RenderBox& child) const |
+{ |
+ if (child.isHorizontalWritingMode() && needToStretchChildLogicalHeight(child)) |
+ return constrainedChildIntrinsicContentLogicalHeight(child); |
+ return child.height(); |
+} |
+ |
+// FIXME: This logic is shared by RenderFlexibleBox, so it should be moved to RenderBox. |
+LayoutUnit RenderGrid::childIntrinsicWidth(const RenderBox& child) const |
+{ |
+ if (!child.isHorizontalWritingMode() && needToStretchChildLogicalHeight(child)) |
+ return constrainedChildIntrinsicContentLogicalHeight(child); |
+ return child.width(); |
+} |
+ |
+// FIXME: This logic is shared by RenderFlexibleBox, so it should be moved to RenderBox. |
+LayoutUnit RenderGrid::intrinsicLogicalHeightForChild(const RenderBox& child) const |
+{ |
+ return isHorizontalWritingMode() ? childIntrinsicHeight(child) : childIntrinsicWidth(child); |
+} |
+ |
+// FIXME: This logic is shared by RenderFlexibleBox, so it should be moved to RenderBox. |
+LayoutUnit RenderGrid::marginLogicalHeightForChild(const RenderBox& child) const |
+{ |
+ return isHorizontalWritingMode() ? child.marginHeight() : child.marginWidth(); |
+} |
+ |
+// FIXME: This logic is shared by RenderFlexibleBox, so it should be moved to RenderBox. |
+LayoutUnit RenderGrid::availableAlignmentSpaceForChildBeforeStretching(LayoutUnit gridAreaBreadthForChild, const RenderBox& child) const |
+{ |
+ LayoutUnit childLogicalHeight = marginLogicalHeightForChild(child) + intrinsicLogicalHeightForChild(child); |
+ return gridAreaBreadthForChild - childLogicalHeight; |
+} |
+ |
+// FIXME: This logic is shared by RenderFlexibleBox, so it should be moved to RenderBox. |
+void RenderGrid::applyStretchAlignmentToChildIfNeeded(RenderBox& child, LayoutUnit gridAreaBreadthForChild) |
{ |
+ if (RenderStyle::resolveAlignment(style(), child.style(), ItemPositionStretch) != ItemPositionStretch) |
+ return; |
+ |
bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizontalWritingMode(); |
+ if (child.style()->logicalHeight().isAuto()) { |
+ // 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 heightBeforeStretching = needToStretchChildLogicalHeight(child) ? constrainedChildIntrinsicContentLogicalHeight(child) : child.logicalHeight(); |
+ LayoutUnit stretchedLogicalHeight = heightBeforeStretching + availableAlignmentSpaceForChildBeforeStretching(gridAreaBreadthForChild, child); |
+ LayoutUnit desiredLogicalHeight = child.constrainLogicalHeightByMinMax(stretchedLogicalHeight, heightBeforeStretching - child.borderAndPaddingLogicalHeight()); |
+ LayoutUnit desiredLogicalContentHeight = desiredLogicalHeight - child.borderAndPaddingLogicalHeight(); |
+ |
+ // FIXME: Can avoid laying out here in some cases. See https://webkit.org/b/87905. |
+ if (desiredLogicalHeight != child.logicalHeight() || !child.hasOverrideHeight() || desiredLogicalContentHeight != child.overrideLogicalContentHeight()) { |
+ child.setOverrideLogicalContentHeight(desiredLogicalContentHeight); |
+ child.setLogicalHeight(0); |
+ child.forceChildLayout(); |
+ } |
+ } |
+ } |
+} |
- switch (RenderStyle::resolveAlignment(style(), child.style())) { |
+LayoutUnit RenderGrid::rowPositionForChild(const RenderBox& child) const |
+{ |
+ bool hasOrthogonalWritingMode = child.isHorizontalWritingMode() != isHorizontalWritingMode(); |
+ switch (RenderStyle::resolveAlignment(style(), child.style(), ItemPositionStretch)) { |
case ItemPositionSelfStart: |
// If orthogonal writing-modes, this computes to 'Start'. |
// FIXME: grid track sizing and positioning does not support orthogonal modes yet. |
@@ -1414,7 +1483,6 @@ LayoutUnit RenderGrid::rowPositionForChild(const RenderBox& child) const |
case ItemPositionEnd: |
return endOfRowForChild(child); |
case ItemPositionStretch: |
- // FIXME: Implement the Stretch value. For now, we always start align the child. |
return startOfRowForChild(child); |
case ItemPositionBaseline: |
case ItemPositionLastBaseline: |