Index: Source/core/rendering/RenderGrid.cpp |
diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp |
index 4f474611800d3c8b62ce686754120dfe0f489ba7..cc9a0b393e47bf2f3217b6bbb98a4152e79700db 100644 |
--- a/Source/core/rendering/RenderGrid.cpp |
+++ b/Source/core/rendering/RenderGrid.cpp |
@@ -1163,17 +1163,37 @@ LayoutUnit RenderGrid::centeredColumnPositionForChild(const RenderBox* child) co |
return columnPosition + std::max<LayoutUnit>(0, endOfColumn - startOfColumn - child->logicalWidth()) / 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 |
{ |
- ItemPosition childJustifySelf = child->style()->justifySelf(); |
- switch (childJustifySelf) { |
+ bool hasOrthogonalWritingMode = child->isHorizontalWritingMode() != isHorizontalWritingMode(); |
+ |
+ switch (resolveJustification(style(), child->style())) { |
case ItemPositionSelfStart: |
+ // For orthogonal writing-modes, this computes to 'start' |
+ // FIXME: grid track sizing and positioning do not support orthogonal modes yet. |
+ if (hasOrthogonalWritingMode) |
+ return columnPositionAlignedWithGridContainerStart(child); |
+ |
// self-start is based on the child's direction. That's why we need to check against the grid container's direction. |
if (child->style()->direction() != style()->direction()) |
return columnPositionAlignedWithGridContainerEnd(child); |
return columnPositionAlignedWithGridContainerStart(child); |
case ItemPositionSelfEnd: |
+ // For orthogonal writing-modes, this computes to 'start' |
+ // FIXME: grid track sizing and positioning do not support orthogonal modes yet. |
+ if (hasOrthogonalWritingMode) |
+ return columnPositionAlignedWithGridContainerEnd(child); |
+ |
// self-end is based on the child's direction. That's why we need to check against the grid container's direction. |
if (child->style()->direction() != style()->direction()) |
return columnPositionAlignedWithGridContainerStart(child); |
@@ -1181,9 +1201,11 @@ LayoutUnit RenderGrid::columnPositionForChild(const RenderBox* child) const |
return columnPositionAlignedWithGridContainerEnd(child); |
case ItemPositionFlexStart: |
- case ItemPositionFlexEnd: |
// Only used in flex layout, for other layout, it's equivalent to 'start'. |
return columnPositionAlignedWithGridContainerStart(child); |
+ case ItemPositionFlexEnd: |
+ // Only used in flex layout, for other layout, it's equivalent to 'start'. |
+ return columnPositionAlignedWithGridContainerEnd(child); |
case ItemPositionLeft: |
// If the property's axis is not parallel with the inline axis, this is equivalent to ‘start’. |
@@ -1212,6 +1234,7 @@ LayoutUnit RenderGrid::columnPositionForChild(const RenderBox* child) const |
return columnPositionAlignedWithGridContainerEnd(child); |
case ItemPositionAuto: |
+ break; |
case ItemPositionStretch: |
case ItemPositionBaseline: |
case ItemPositionLastBaseline: |