Index: third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
index 390a4410d79de9baacadd9c36c8bf90a5fd4460c..3fa6729bf8e321f8586f2c87bdac547cc06c1d28 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
@@ -1486,47 +1486,48 @@ void LayoutGrid::layoutPositionedObjects(bool relayoutChildren, PositionedLayout |
void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, GridTrackSizingDirection direction, LayoutUnit& offset, LayoutUnit& breadth) |
{ |
ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); |
+ bool isForColumns = direction == ForColumns; |
GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), child, direction); |
if (positions.isIndefinite()) { |
offset = LayoutUnit(); |
- breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogicalHeight(); |
+ breadth = isForColumns ? clientLogicalWidth() : clientLogicalHeight(); |
return; |
} |
- positions.translate(direction == ForColumns ? m_smallestColumnStart : m_smallestRowStart); |
- GridPosition startPosition = (direction == ForColumns) ? child.style()->gridColumnStart() : child.style()->gridRowStart(); |
- GridPosition endPosition = (direction == ForColumns) ? child.style()->gridColumnEnd() : child.style()->gridRowEnd(); |
- size_t lastTrackIndex = (direction == ForColumns ? gridColumnCount() : gridRowCount()) - 1; |
+ // For positioned items we cannot use GridSpan::translate(). Because we could end up with negative values, as the positioned items do not create implicit tracks per spec. |
+ int smallestStart = abs(isForColumns ? m_smallestColumnStart : m_smallestRowStart); |
+ int resolvedInitialPosition = positions.untranslatedResolvedInitialPosition() + smallestStart; |
+ int resolvedFinalPosition = positions.untranslatedResolvedFinalPosition() + smallestStart; |
+ |
+ GridPosition startPosition = isForColumns ? child.style()->gridColumnStart() : child.style()->gridRowStart(); |
+ GridPosition endPosition = isForColumns ? child.style()->gridColumnEnd() : child.style()->gridRowEnd(); |
+ int lastExplicitLine = isForColumns ? gridColumnCount() : gridRowCount(); |
bool startIsAuto = startPosition.isAuto() |
|| (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamedLineOrArea(startPosition.namedGridLine(), styleRef(), GridResolvedPosition::initialPositionSide(direction))) |
- || (positions.resolvedInitialPosition() > lastTrackIndex); |
+ || (resolvedInitialPosition < 0) |
+ || (resolvedInitialPosition > lastExplicitLine); |
bool endIsAuto = endPosition.isAuto() |
|| (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamedLineOrArea(endPosition.namedGridLine(), styleRef(), GridResolvedPosition::finalPositionSide(direction))) |
- || (positions.resolvedFinalPosition() - 1 > lastTrackIndex); |
- |
- size_t firstPosition = 0; |
- size_t initialPosition = startIsAuto ? firstPosition : positions.resolvedInitialPosition(); |
- size_t lastPosition = lastTrackIndex; |
- size_t finalPosition = endIsAuto ? lastPosition : positions.resolvedFinalPosition() - 1; |
+ || (resolvedFinalPosition < 0) |
+ || (resolvedFinalPosition > lastExplicitLine); |
- // Positioned children do not grow the grid, so we need to clamp the positions to avoid ending up outside of it. |
- initialPosition = std::min(initialPosition, lastPosition); |
- finalPosition = std::min(finalPosition, lastPosition); |
+ size_t initialPosition = startIsAuto ? 0 : resolvedInitialPosition; |
+ size_t finalPosition = endIsAuto ? lastExplicitLine : resolvedFinalPosition; |
- LayoutUnit start = startIsAuto ? LayoutUnit() : (direction == ForColumns) ? m_columnPositions[initialPosition] : m_rowPositions[initialPosition]; |
- LayoutUnit end = endIsAuto ? (direction == ForColumns) ? logicalWidth() : logicalHeight() : (direction == ForColumns) ? m_columnPositions[finalPosition + 1] : m_rowPositions[finalPosition + 1]; |
+ LayoutUnit start = startIsAuto ? LayoutUnit() : isForColumns ? m_columnPositions[initialPosition] : m_rowPositions[initialPosition]; |
+ LayoutUnit end = endIsAuto ? isForColumns ? logicalWidth() : logicalHeight() : isForColumns ? m_columnPositions[finalPosition] : m_rowPositions[finalPosition]; |
breadth = end - start; |
if (startIsAuto) |
- breadth -= (direction == ForColumns) ? borderStart() : borderBefore(); |
+ breadth -= isForColumns ? borderStart() : borderBefore(); |
else |
- start -= ((direction == ForColumns) ? borderStart() : borderBefore()); |
+ start -= isForColumns ? borderStart() : borderBefore(); |
if (endIsAuto) { |
- breadth -= (direction == ForColumns) ? borderEnd() : borderAfter(); |
+ breadth -= isForColumns ? borderEnd() : borderAfter(); |
breadth -= scrollbarLogicalWidth(); |
} |
@@ -1535,7 +1536,7 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid |
if (child.parent() == this && !startIsAuto) { |
// If column/row start is "auto" the static position has been already set in prepareChildForPositionedLayout(). |
PaintLayer* childLayer = child.layer(); |
- if (direction == ForColumns) |
+ if (isForColumns) |
childLayer->setStaticInlinePosition(borderStart() + offset); |
else |
childLayer->setStaticBlockPosition(borderBefore() + offset); |