Index: Source/core/rendering/RenderGrid.cpp |
diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp |
index a459c51506629a0765ae64109fd4ab4de0e1b92e..1a6669f2c704a11c5a7ba5f9029fe7c530577e18 100644 |
--- a/Source/core/rendering/RenderGrid.cpp |
+++ b/Source/core/rendering/RenderGrid.cpp |
@@ -712,6 +712,25 @@ struct VectorTraits<blink::GridItemWithSpan> : SimpleClassVectorTraits<blink::Gr |
namespace blink { |
+bool RenderGrid::spanningItemCrossesFlexibleSizedTracks(const GridCoordinate& coordinate, GridTrackSizingDirection direction) const |
+{ |
+ const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition; |
+ const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition; |
+ |
+ for (GridResolvedPosition trackPosition = initialTrackPosition; trackPosition <= finalTrackPosition; ++trackPosition) { |
+ const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition.toInt()); |
+ if (trackSize.minTrackBreadth().isFlex() || trackSize.maxTrackBreadth().isFlex()) |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+static inline size_t integerSpanForDirection(const GridCoordinate& coordinate, GridTrackSizingDirection direction) |
+{ |
+ return (direction == ForRows) ? coordinate.rows.integerSpan() : coordinate.columns.integerSpan(); |
+} |
+ |
void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirection direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace) |
{ |
sizingData.itemsSortedByIncreasingSpan.shrink(0); |
@@ -720,15 +739,18 @@ void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio |
for (size_t i = 0; i < contentSizedTracksCount; ++i) { |
GridIterator iterator(m_grid, direction, sizingData.contentSizedTracksIndex[i]); |
while (RenderBox* gridItem = iterator.nextGridItem()) { |
- if (itemsSet.add(gridItem).isNewEntry) |
- sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSpan(*gridItem, cachedGridCoordinate(*gridItem), direction)); |
+ if (itemsSet.add(gridItem).isNewEntry) { |
+ const GridCoordinate& coordinate = cachedGridCoordinate(*gridItem); |
+ // We should not include items spanning more than one track that span tracks with flexible sizing functions. |
+ if (integerSpanForDirection(coordinate, direction) == 1 || !spanningItemCrossesFlexibleSizedTracks(coordinate, direction)) |
+ sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSpan(*gridItem, coordinate, direction)); |
+ } |
} |
} |
std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSortedByIncreasingSpan.end()); |
Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingSpan.end(); |
for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreasingSpan.begin(); it != end; ++it) { |
- // FIXME: do not consider items with a span > 1 that span a track with a flexible sizing function. |
GridItemWithSpan itemWithSpan = *it; |
resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, itemWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); |
resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, itemWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); |