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 1f24ae7d2b8ef22e858796c8160305acfc8d1294..3b32e5defe7d194e9abbc676c5f8efd2c8d0a902 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
@@ -209,7 +209,7 @@ public: |
const size_t endOfVaryingTrackIndex = (m_direction == ForColumns) ? m_grid.size() : m_grid[0].size(); |
for (; varyingTrackIndex < endOfVaryingTrackIndex; ++varyingTrackIndex) { |
if (checkEmptyCells(rowSpan, columnSpan)) { |
- OwnPtr<GridCoordinate> result = adoptPtr(new GridCoordinate(GridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan(m_columnIndex, m_columnIndex + columnSpan))); |
+ OwnPtr<GridCoordinate> result = adoptPtr(new GridCoordinate(GridSpan::definiteGridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan::definiteGridSpan(m_columnIndex, m_columnIndex + columnSpan))); |
// Advance the iterator to avoid an infinite loop where we would return the same grid area over and over. |
++varyingTrackIndex; |
return result.release(); |
@@ -536,7 +536,7 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi |
// 4. Grow all Grid tracks having a fraction as the MaxTrackSizingFunction. |
double flexFraction = 0; |
if (hasDefiniteFreeSpace) { |
- flexFraction = findFlexFactorUnitSize(tracks, GridSpan(0, tracks.size()), direction, initialFreeSpace); |
+ flexFraction = findFlexFactorUnitSize(tracks, GridSpan::definiteGridSpan(0, tracks.size()), direction, initialFreeSpace); |
} else { |
for (const auto& trackIndex : flexibleSizedTracksIndex) |
flexFraction = std::max(flexFraction, normalizedFlexFraction(tracks[trackIndex], gridTrackSize(direction, trackIndex).maxTrackBreadth().flex())); |
@@ -547,7 +547,7 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi |
const GridSpan span = cachedGridSpan(*gridItem, direction); |
// Do not include already processed items. |
- if (i > 0 && span.resolvedInitialPosition.toInt() <= flexibleSizedTracksIndex[i - 1]) |
+ if (i > 0 && span.resolvedInitialPosition().toInt() <= flexibleSizedTracksIndex[i - 1]) |
continue; |
flexFraction = std::max(flexFraction, findFlexFactorUnitSize(tracks, span, direction, maxContentForChild(*gridItem, direction, sizingData.columnTracks))); |
@@ -834,7 +834,7 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio |
void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(GridTrackSizingDirection direction, const GridSpan& span, LayoutBox& gridItem, GridTrack& track, Vector<GridTrack>& columnTracks) |
{ |
- const GridResolvedPosition trackPosition = span.resolvedInitialPosition; |
+ const GridResolvedPosition trackPosition = span.resolvedInitialPosition(); |
GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt()); |
if (trackSize.hasMinContentMinTrackBreadth()) |
@@ -1105,7 +1105,7 @@ void LayoutGrid::ensureGridSize(size_t maximumRowSize, size_t maximumColumnSize) |
void LayoutGrid::insertItemIntoGrid(LayoutBox& child, const GridCoordinate& coordinate) |
{ |
- ensureGridSize(coordinate.rows.resolvedFinalPosition.toInt(), coordinate.columns.resolvedFinalPosition.toInt()); |
+ ensureGridSize(coordinate.rows.resolvedFinalPosition().toInt(), coordinate.columns.resolvedFinalPosition().toInt()); |
for (GridSpan::iterator row = coordinate.rows.begin(); row != coordinate.rows.end(); ++row) { |
for (GridSpan::iterator column = coordinate.columns.begin(); column != coordinate.columns.end(); ++column) |
@@ -1134,17 +1134,17 @@ void LayoutGrid::placeItemsOnGrid() |
if (child->isOutOfFlowPositioned()) |
continue; |
- OwnPtr<GridSpan> rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *child, ForRows); |
- OwnPtr<GridSpan> columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *child, ForColumns); |
- if (!rowPositions || !columnPositions) { |
- GridSpan* majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? columnPositions.get() : rowPositions.get(); |
- if (!majorAxisPositions) |
+ GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *child, ForRows); |
+ GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *child, ForColumns); |
+ if (!rowPositions.isDefinite() || !columnPositions.isDefinite()) { |
+ GridSpan majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? columnPositions : rowPositions; |
+ if (!majorAxisPositions.isDefinite()) |
autoMajorAxisAutoGridItems.append(child); |
else |
specifiedMajorAxisAutoGridItems.append(child); |
continue; |
} |
- insertItemIntoGrid(*child, GridCoordinate(*rowPositions, *columnPositions)); |
+ insertItemIntoGrid(*child, GridCoordinate(rowPositions, columnPositions)); |
} |
ASSERT(gridRowCount() >= GridResolvedPosition::explicitGridRowCount(*style())); |
@@ -1173,24 +1173,24 @@ void LayoutGrid::populateExplicitGridAndOrderIterator() |
m_gridItemsIndexesMap.set(child, childIndex++); |
// This function bypasses the cache (cachedGridCoordinate()) as it is used to build it. |
- OwnPtr<GridSpan> rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *child, ForRows); |
- OwnPtr<GridSpan> columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *child, ForColumns); |
+ GridSpan rowPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *child, ForRows); |
+ GridSpan columnPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *child, ForColumns); |
// |positions| is 0 if we need to run the auto-placement algorithm. |
- if (rowPositions) { |
- maximumRowIndex = std::max<size_t>(maximumRowIndex, rowPositions->resolvedFinalPosition.toInt()); |
+ if (rowPositions.isDefinite()) { |
+ maximumRowIndex = std::max<size_t>(maximumRowIndex, rowPositions.resolvedFinalPosition().toInt()); |
} else { |
// Grow the grid for items with a definite row span, getting the largest such span. |
GridSpan positions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(*style(), *child, ForRows, GridResolvedPosition(0)); |
- maximumRowIndex = std::max<size_t>(maximumRowIndex, positions.resolvedFinalPosition.toInt()); |
+ maximumRowIndex = std::max<size_t>(maximumRowIndex, positions.resolvedFinalPosition().toInt()); |
} |
- if (columnPositions) { |
- maximumColumnIndex = std::max<size_t>(maximumColumnIndex, columnPositions->resolvedFinalPosition.toInt()); |
+ if (columnPositions.isDefinite()) { |
+ maximumColumnIndex = std::max<size_t>(maximumColumnIndex, columnPositions.resolvedFinalPosition().toInt()); |
} else { |
// Grow the grid for items with a definite column span, getting the largest such span. |
GridSpan positions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(*style(), *child, ForColumns, GridResolvedPosition(0)); |
- maximumColumnIndex = std::max<size_t>(maximumColumnIndex, positions.resolvedFinalPosition.toInt()); |
+ maximumColumnIndex = std::max<size_t>(maximumColumnIndex, positions.resolvedFinalPosition().toInt()); |
} |
} |
@@ -1218,18 +1218,18 @@ void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au |
HashMap<unsigned, unsigned, DefaultHash<unsigned>::Hash, WTF::UnsignedWithZeroKeyHashTraits<unsigned>> minorAxisCursors; |
for (const auto& autoGridItem : autoGridItems) { |
- OwnPtr<GridSpan> majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *autoGridItem, autoPlacementMajorAxisDirection()); |
+ GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), *autoGridItem, autoPlacementMajorAxisDirection()); |
GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(*style(), *autoGridItem, autoPlacementMinorAxisDirection(), GridResolvedPosition(0)); |
- unsigned majorAxisInitialPosition = majorAxisPositions->resolvedInitialPosition.toInt(); |
+ unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPosition().toInt(); |
- GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions->resolvedInitialPosition.toInt(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxisInitialPosition)); |
- OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions->integerSpan(), minorAxisPositions.integerSpan()); |
+ GridIterator iterator(m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions.resolvedInitialPosition().toInt(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxisInitialPosition)); |
+ OwnPtr<GridCoordinate> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.integerSpan(), minorAxisPositions.integerSpan()); |
if (!emptyGridArea) |
- emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*autoGridItem, autoPlacementMajorAxisDirection(), *majorAxisPositions); |
+ emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(*autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); |
insertItemIntoGrid(*autoGridItem, *emptyGridArea); |
if (!isGridAutoFlowDense) |
- minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyGridArea->rows.resolvedInitialPosition.toInt() : emptyGridArea->columns.resolvedInitialPosition.toInt()); |
+ minorAxisCursors.set(majorAxisInitialPosition, isForColumns ? emptyGridArea->rows.resolvedInitialPosition().toInt() : emptyGridArea->columns.resolvedInitialPosition().toInt()); |
} |
} |
@@ -1251,8 +1251,8 @@ void LayoutGrid::placeAutoMajorAxisItemsOnGrid(const Vector<LayoutBox*>& autoGri |
void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<size_t, size_t>& autoPlacementCursor) |
{ |
- OwnPtr<GridSpan> minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), gridItem, autoPlacementMinorAxisDirection()); |
- ASSERT(!GridResolvedPosition::resolveGridPositionsFromStyle(*style(), gridItem, autoPlacementMajorAxisDirection())); |
+ GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), gridItem, autoPlacementMinorAxisDirection()); |
+ ASSERT(!GridResolvedPosition::resolveGridPositionsFromStyle(*style(), gridItem, autoPlacementMajorAxisDirection()).isDefinite()); |
GridSpan majorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(*style(), gridItem, autoPlacementMajorAxisDirection(), GridResolvedPosition(0)); |
const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColumns) ? gridColumnCount() : gridRowCount(); |
@@ -1260,18 +1260,18 @@ void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz |
size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == ForColumns ? autoPlacementCursor.first : autoPlacementCursor.second; |
OwnPtr<GridCoordinate> emptyGridArea; |
- if (minorAxisPositions) { |
+ if (minorAxisPositions.isDefinite()) { |
// Move to the next track in major axis if initial position in minor axis is before auto-placement cursor. |
- if (minorAxisPositions->resolvedInitialPosition.toInt() < minorAxisAutoPlacementCursor) |
+ if (minorAxisPositions.resolvedInitialPosition().toInt() < minorAxisAutoPlacementCursor) |
majorAxisAutoPlacementCursor++; |
if (majorAxisAutoPlacementCursor < endOfMajorAxis) { |
- GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAxisPositions->resolvedInitialPosition.toInt(), majorAxisAutoPlacementCursor); |
- emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions->integerSpan(), majorAxisPositions.integerSpan()); |
+ GridIterator iterator(m_grid, autoPlacementMinorAxisDirection(), minorAxisPositions.resolvedInitialPosition().toInt(), majorAxisAutoPlacementCursor); |
+ emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.integerSpan(), majorAxisPositions.integerSpan()); |
} |
if (!emptyGridArea) |
- emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(gridItem, autoPlacementMinorAxisDirection(), *minorAxisPositions); |
+ emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(gridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); |
} else { |
GridSpan minorAxisPositions = GridResolvedPosition::resolveGridPositionsFromAutoPlacementPosition(*style(), gridItem, autoPlacementMinorAxisDirection(), GridResolvedPosition(0)); |
@@ -1281,7 +1281,7 @@ void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz |
if (emptyGridArea) { |
// Check that it fits in the minor axis direction, as we shouldn't grow in that direction here (it was already managed in populateExplicitGridAndOrderIterator()). |
- GridResolvedPosition minorAxisFinalPositionIndex = autoPlacementMinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPosition : emptyGridArea->rows.resolvedFinalPosition; |
+ GridResolvedPosition minorAxisFinalPositionIndex = autoPlacementMinorAxisDirection() == ForColumns ? emptyGridArea->columns.resolvedFinalPosition() : emptyGridArea->rows.resolvedFinalPosition(); |
const size_t endOfMinorAxis = autoPlacementMinorAxisDirection() == ForColumns ? gridColumnCount() : gridRowCount(); |
if (minorAxisFinalPositionIndex.toInt() <= endOfMinorAxis) |
break; |
@@ -1301,8 +1301,8 @@ void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz |
insertItemIntoGrid(gridItem, *emptyGridArea); |
// Move auto-placement cursor to the new position. |
- autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition.toInt(); |
- autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition.toInt(); |
+ autoPlacementCursor.first = emptyGridArea->rows.resolvedInitialPosition().toInt(); |
+ autoPlacementCursor.second = emptyGridArea->columns.resolvedInitialPosition().toInt(); |
} |
GridTrackSizingDirection LayoutGrid::autoPlacementMajorAxisDirection() const |
@@ -1405,8 +1405,8 @@ void LayoutGrid::layoutGridItems(GridSizingData& sizingData) |
#if ENABLE(ASSERT) |
const GridCoordinate& coordinate = cachedGridCoordinate(*child); |
- ASSERT(coordinate.columns.resolvedInitialPosition.toInt() < sizingData.columnTracks.size()); |
- ASSERT(coordinate.rows.resolvedInitialPosition.toInt() < sizingData.rowTracks.size()); |
+ ASSERT(coordinate.columns.resolvedInitialPosition().toInt() < sizingData.columnTracks.size()); |
+ ASSERT(coordinate.rows.resolvedInitialPosition().toInt() < sizingData.rowTracks.size()); |
#endif |
child->setLogicalLocation(findChildLogicalPosition(*child, sizingData)); |
@@ -1462,8 +1462,8 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid |
{ |
ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); |
- OwnPtr<GridSpan> positions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), child, direction); |
- if (!positions) { |
+ GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), child, direction); |
+ if (!positions.isDefinite()) { |
offset = LayoutUnit(); |
breadth = (direction == ForColumns) ? clientLogicalWidth() : clientLogicalHeight(); |
return; |
@@ -1475,15 +1475,15 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid |
bool startIsAuto = startPosition.isAuto() |
|| (startPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamedLineOrArea(startPosition.namedGridLine(), styleRef(), GridResolvedPosition::initialPositionSide(direction))) |
- || (positions->resolvedInitialPosition.toInt() > lastTrackIndex); |
+ || (positions.resolvedInitialPosition().toInt() > lastTrackIndex); |
bool endIsAuto = endPosition.isAuto() |
|| (endPosition.isNamedGridArea() && !GridResolvedPosition::isValidNamedLineOrArea(endPosition.namedGridLine(), styleRef(), GridResolvedPosition::finalPositionSide(direction))) |
- || (positions->resolvedFinalPosition.prev().toInt() > lastTrackIndex); |
+ || (positions.resolvedFinalPosition().prev().toInt() > lastTrackIndex); |
GridResolvedPosition firstPosition = GridResolvedPosition(0); |
- GridResolvedPosition initialPosition = startIsAuto ? firstPosition : positions->resolvedInitialPosition; |
+ GridResolvedPosition initialPosition = startIsAuto ? firstPosition : positions.resolvedInitialPosition(); |
GridResolvedPosition lastPosition = GridResolvedPosition(lastTrackIndex); |
- GridResolvedPosition finalPosition = endIsAuto ? lastPosition : positions->resolvedFinalPosition.prev(); |
+ GridResolvedPosition finalPosition = endIsAuto ? lastPosition : positions.resolvedFinalPosition().prev(); |
// Positioned children do not grow the grid, so we need to clamp the positions to avoid ending up outside of it. |
initialPosition = std::min<GridResolvedPosition>(initialPosition, lastPosition); |
@@ -1547,10 +1547,10 @@ LayoutUnit LayoutGrid::gridAreaBreadthForChildIncludingAlignmentOffsets(const La |
const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks; |
const GridSpan& span = cachedGridSpan(child, direction); |
const Vector<LayoutUnit>& linePositions = (direction == ForColumns) ? m_columnPositions : m_rowPositions; |
- LayoutUnit initialTrackPosition = linePositions[span.resolvedInitialPosition.toInt()]; |
- LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition.prev().toInt()]; |
+ LayoutUnit initialTrackPosition = linePositions[span.resolvedInitialPosition().toInt()]; |
+ LayoutUnit finalTrackPosition = linePositions[span.resolvedFinalPosition().prev().toInt()]; |
// Track Positions vector stores the 'start' grid line of each track, so w have to add last track's baseSize. |
- return finalTrackPosition - initialTrackPosition + tracks[span.resolvedFinalPosition.prev().toInt()].baseSize(); |
+ return finalTrackPosition - initialTrackPosition + tracks[span.resolvedFinalPosition().prev().toInt()].baseSize(); |
} |
void LayoutGrid::populateGridPositions(GridSizingData& sizingData) |
@@ -1857,7 +1857,7 @@ static inline LayoutUnit offsetBetweenTracks(ContentDistributionType distributio |
LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child) const |
{ |
const GridSpan& rowsSpan = cachedGridSpan(child, ForRows); |
- size_t childStartLine = rowsSpan.resolvedInitialPosition.toInt(); |
+ size_t childStartLine = rowsSpan.resolvedInitialPosition().toInt(); |
LayoutUnit startOfRow = m_rowPositions[childStartLine]; |
LayoutUnit startPosition = startOfRow + marginBeforeForChild(child); |
if (hasAutoMarginsInColumnAxis(child)) |
@@ -1868,7 +1868,7 @@ LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child) const |
return startPosition; |
case GridAxisEnd: |
case GridAxisCenter: { |
- size_t childEndLine = rowsSpan.resolvedFinalPosition.toInt(); |
+ size_t childEndLine = rowsSpan.resolvedFinalPosition().toInt(); |
LayoutUnit endOfRow = m_rowPositions[childEndLine]; |
// m_rowPositions include gutters so we need to substract them to get the actual end position for a given |
// row (this does not have to be done for the last track as there are no more m_rowPositions after it) |
@@ -1889,7 +1889,7 @@ LayoutUnit LayoutGrid::columnAxisOffsetForChild(const LayoutBox& child) const |
LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const |
{ |
const GridSpan& columnsSpan = cachedGridSpan(child, ForColumns); |
- size_t childStartLine = columnsSpan.resolvedInitialPosition.toInt(); |
+ size_t childStartLine = columnsSpan.resolvedInitialPosition().toInt(); |
LayoutUnit startOfColumn = m_columnPositions[childStartLine]; |
LayoutUnit startPosition = startOfColumn + marginStartForChild(child); |
if (hasAutoMarginsInRowAxis(child)) |
@@ -1900,7 +1900,7 @@ LayoutUnit LayoutGrid::rowAxisOffsetForChild(const LayoutBox& child) const |
return startPosition; |
case GridAxisEnd: |
case GridAxisCenter: { |
- size_t childEndLine = columnsSpan.resolvedFinalPosition.toInt(); |
+ size_t childEndLine = columnsSpan.resolvedFinalPosition().toInt(); |
LayoutUnit endOfColumn = m_columnPositions[childEndLine]; |
// m_columnPositions include gutters so we need to substract them to get the actual end position for a given |
// column (this does not have to be done for the last track as there are no more m_columnPositions after it) |