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 42b03d34f4a3ed31c22d368ce506ae4f4457199a..412bc93e12cd693905fb8eb526df6fe1ba8c84c2 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::definiteGridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan::definiteGridSpan(m_columnIndex, m_columnIndex + columnSpan))); |
+ OwnPtr<GridCoordinate> result = adoptPtr(new GridCoordinate(GridSpan::translatedDefiniteGridSpan(m_rowIndex, m_rowIndex + rowSpan), GridSpan::translatedDefiniteGridSpan(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::definiteGridSpan(0, tracks.size()), direction, initialFreeSpace); |
+ flexFraction = findFlexFactorUnitSize(tracks, GridSpan::translatedDefiniteGridSpan(0, tracks.size()), direction, initialFreeSpace); |
} else { |
for (const auto& trackIndex : flexibleSizedTracksIndex) |
flexFraction = std::max(flexFraction, normalizedFlexFraction(tracks[trackIndex], gridTrackSize(direction, trackIndex).maxTrackBreadth().flex())); |
@@ -656,7 +656,9 @@ GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size |
{ |
bool isForColumns = direction == ForColumns; |
const Vector<GridTrackSize>& trackStyles = isForColumns ? style()->gridTemplateColumns() : style()->gridTemplateRows(); |
- const GridTrackSize& trackSize = (i >= trackStyles.size()) ? (isForColumns ? style()->gridAutoColumns() : style()->gridAutoRows()) : trackStyles[i]; |
+ const GridTrackSize& autoTrackSize = isForColumns ? style()->gridAutoColumns() : style()->gridAutoRows(); |
+ int translatedIndex = i + (isForColumns ? m_smallestColumnStart : m_smallestRowStart); |
+ const GridTrackSize& trackSize = (translatedIndex < 0 || translatedIndex >= static_cast<int>(trackStyles.size())) ? autoTrackSize : trackStyles[translatedIndex]; |
GridLength minTrackBreadth = trackSize.minTrackBreadth(); |
GridLength maxTrackBreadth = trackSize.maxTrackBreadth(); |
@@ -1104,7 +1106,7 @@ void LayoutGrid::ensureGridSize(size_t maximumRowSize, size_t maximumColumnSize) |
void LayoutGrid::insertItemIntoGrid(LayoutBox& child, const GridCoordinate& coordinate) |
{ |
- RELEASE_ASSERT(coordinate.rows.isDefinite() && coordinate.columns.isDefinite()); |
+ RELEASE_ASSERT(coordinate.rows.isTranslatedDefinite() && coordinate.columns.isTranslatedDefinite()); |
ensureGridSize(coordinate.rows.resolvedFinalPosition(), coordinate.columns.resolvedFinalPosition()); |
for (const auto& row : coordinate.rows) { |
@@ -1132,9 +1134,15 @@ void LayoutGrid::placeItemsOnGrid() |
continue; |
GridCoordinate coordinate = cachedGridCoordinate(*child); |
- if (!coordinate.rows.isDefinite() || !coordinate.columns.isDefinite()) { |
+ if (!coordinate.rows.isIndefinite()) |
+ coordinate.rows.translate(abs(m_smallestRowStart)); |
+ if (!coordinate.columns.isIndefinite()) |
+ coordinate.columns.translate(abs(m_smallestColumnStart)); |
+ m_gridItemCoordinate.set(child, coordinate); |
+ |
+ if (coordinate.rows.isIndefinite() || coordinate.columns.isIndefinite()) { |
GridSpan majorAxisPositions = (autoPlacementMajorAxisDirection() == ForColumns) ? coordinate.columns : coordinate.rows; |
- if (!majorAxisPositions.isDefinite()) |
+ if (majorAxisPositions.isIndefinite()) |
autoMajorAxisAutoGridItems.append(child); |
else |
specifiedMajorAxisAutoGridItems.append(child); |
@@ -1157,7 +1165,7 @@ void LayoutGrid::placeItemsOnGrid() |
continue; |
GridCoordinate coordinate = cachedGridCoordinate(*child); |
- ASSERT(coordinate.rows.isDefinite() && coordinate.columns.isDefinite()); |
+ ASSERT(coordinate.rows.isTranslatedDefinite() && coordinate.columns.isTranslatedDefinite()); |
} |
#endif |
} |
@@ -1166,6 +1174,8 @@ void LayoutGrid::populateExplicitGridAndOrderIterator() |
{ |
OrderIteratorPopulator populator(m_orderIterator); |
+ m_smallestRowStart = m_smallestColumnStart = 0; |
+ |
size_t maximumRowIndex = std::max<size_t>(1, GridResolvedPosition::explicitGridRowCount(*style())); |
size_t maximumColumnIndex = std::max<size_t>(1, GridResolvedPosition::explicitGridColumnCount(*style())); |
@@ -1184,26 +1194,28 @@ void LayoutGrid::populateExplicitGridAndOrderIterator() |
m_gridItemCoordinate.set(child, GridCoordinate(rowPositions, columnPositions)); |
// |positions| is 0 if we need to run the auto-placement algorithm. |
- if (rowPositions.isDefinite()) { |
- maximumRowIndex = std::max<size_t>(maximumRowIndex, rowPositions.resolvedFinalPosition()); |
+ if (!rowPositions.isIndefinite()) { |
+ m_smallestRowStart = std::min(m_smallestRowStart, rowPositions.untranslatedResolvedInitialPosition()); |
+ maximumRowIndex = std::max<int>(maximumRowIndex, rowPositions.untranslatedResolvedFinalPosition()); |
} else { |
// Grow the grid for items with a definite row span, getting the largest such span. |
size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*style(), *child, ForRows); |
- maximumRowIndex = std::max<size_t>(maximumRowIndex, spanSize); |
+ maximumRowIndex = std::max(maximumRowIndex, spanSize); |
} |
- if (columnPositions.isDefinite()) { |
- maximumColumnIndex = std::max<size_t>(maximumColumnIndex, columnPositions.resolvedFinalPosition()); |
+ if (!columnPositions.isIndefinite()) { |
+ m_smallestColumnStart = std::min(m_smallestColumnStart, columnPositions.untranslatedResolvedInitialPosition()); |
+ maximumColumnIndex = std::max<int>(maximumColumnIndex, columnPositions.untranslatedResolvedFinalPosition()); |
} else { |
// Grow the grid for items with a definite column span, getting the largest such span. |
size_t spanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*style(), *child, ForColumns); |
- maximumColumnIndex = std::max<size_t>(maximumColumnIndex, spanSize); |
+ maximumColumnIndex = std::max(maximumColumnIndex, spanSize); |
} |
} |
- m_grid.grow(maximumRowIndex); |
+ m_grid.grow(maximumRowIndex + abs(m_smallestRowStart)); |
for (auto& column : m_grid) |
- column.grow(maximumColumnIndex); |
+ column.grow(maximumColumnIndex + abs(m_smallestColumnStart)); |
} |
PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(const LayoutBox& gridItem, GridTrackSizingDirection specifiedDirection, const GridSpan& specifiedPositions) const |
@@ -1211,7 +1223,7 @@ PassOwnPtr<GridCoordinate> LayoutGrid::createEmptyGridAreaAtSpecifiedPositionsOu |
GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns; |
const size_t endOfCrossDirection = crossDirection == ForColumns ? gridColumnCount() : gridRowCount(); |
size_t crossDirectionSpanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*style(), gridItem, crossDirection); |
- GridSpan crossDirectionPositions = GridSpan::definiteGridSpan(endOfCrossDirection, endOfCrossDirection + crossDirectionSpanSize); |
+ GridSpan crossDirectionPositions = GridSpan::translatedDefiniteGridSpan(endOfCrossDirection, endOfCrossDirection + crossDirectionSpanSize); |
return adoptPtr(new GridCoordinate(specifiedDirection == ForColumns ? crossDirectionPositions : specifiedPositions, specifiedDirection == ForColumns ? specifiedPositions : crossDirectionPositions)); |
} |
@@ -1227,8 +1239,8 @@ void LayoutGrid::placeSpecifiedMajorAxisItemsOnGrid(const Vector<LayoutBox*>& au |
for (const auto& autoGridItem : autoGridItems) { |
GridSpan majorAxisPositions = cachedGridSpan(*autoGridItem, autoPlacementMajorAxisDirection()); |
- ASSERT(majorAxisPositions.isDefinite()); |
- ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection()).isDefinite()); |
+ ASSERT(majorAxisPositions.isTranslatedDefinite()); |
+ ASSERT(!cachedGridSpan(*autoGridItem, autoPlacementMinorAxisDirection()).isTranslatedDefinite()); |
size_t minorAxisSpanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*style(), *autoGridItem, autoPlacementMinorAxisDirection()); |
unsigned majorAxisInitialPosition = majorAxisPositions.resolvedInitialPosition(); |
@@ -1264,7 +1276,7 @@ void LayoutGrid::placeAutoMajorAxisItemsOnGrid(const Vector<LayoutBox*>& autoGri |
void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<size_t, size_t>& autoPlacementCursor) |
{ |
GridSpan minorAxisPositions = cachedGridSpan(gridItem, autoPlacementMinorAxisDirection()); |
- ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isDefinite()); |
+ ASSERT(!cachedGridSpan(gridItem, autoPlacementMajorAxisDirection()).isTranslatedDefinite()); |
size_t majorAxisSpanSize = GridResolvedPosition::spanSizeForAutoPlacedItem(*style(), gridItem, autoPlacementMajorAxisDirection()); |
const size_t endOfMajorAxis = (autoPlacementMajorAxisDirection() == ForColumns) ? gridColumnCount() : gridRowCount(); |
@@ -1272,7 +1284,7 @@ void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz |
size_t minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == ForColumns ? autoPlacementCursor.first : autoPlacementCursor.second; |
OwnPtr<GridCoordinate> emptyGridArea; |
- if (minorAxisPositions.isDefinite()) { |
+ if (minorAxisPositions.isTranslatedDefinite()) { |
// Move to the next track in major axis if initial position in minor axis is before auto-placement cursor. |
if (minorAxisPositions.resolvedInitialPosition() < minorAxisAutoPlacementCursor) |
majorAxisAutoPlacementCursor++; |
@@ -1308,7 +1320,7 @@ void LayoutGrid::placeAutoMajorAxisItemOnGrid(LayoutBox& gridItem, std::pair<siz |
} |
if (!emptyGridArea) |
- emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(gridItem, autoPlacementMinorAxisDirection(), GridSpan::definiteGridSpan(0, minorAxisSpanSize)); |
+ emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(gridItem, autoPlacementMinorAxisDirection(), GridSpan::translatedDefiniteGridSpan(0, minorAxisSpanSize)); |
} |
m_gridItemCoordinate.set(&gridItem, *emptyGridArea); |
@@ -1476,11 +1488,12 @@ void LayoutGrid::offsetAndBreadthForPositionedChild(const LayoutBox& child, Grid |
ASSERT(child.isHorizontalWritingMode() == isHorizontalWritingMode()); |
GridSpan positions = GridResolvedPosition::resolveGridPositionsFromStyle(*style(), child, direction); |
- if (!positions.isDefinite()) { |
+ if (positions.isIndefinite()) { |
offset = LayoutUnit(); |
breadth = (direction == ForColumns) ? 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(); |