Index: Source/core/rendering/RenderGrid.cpp |
diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp |
index e5f2e11fe974c9be408d69bfdc7022623bae776f..d2390ff0b012b3be49d34a314d6cfdb71014c508 100644 |
--- a/Source/core/rendering/RenderGrid.cpp |
+++ b/Source/core/rendering/RenderGrid.cpp |
@@ -566,7 +566,6 @@ LayoutUnit RenderGrid::logicalContentHeightForChild(RenderBox* child, Vector<Gri |
if (child->style()->logicalHeight().isPercent()) |
layoutScope.setNeedsLayout(child); |
- child->setOverrideContainingBlockContentLogicalWidth(gridAreaBreadthForChild(child, ForColumns, columnTracks)); |
// If |child| has a percentage logical height, we shouldn't let it override its intrinsic height, which is |
// what we are interested in here. Thus we need to set the override logical height to -1 (no possible resolution). |
child->setOverrideContainingBlockContentLogicalHeight(-1); |
@@ -615,6 +614,16 @@ void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio |
for (size_t i = 0; i < sizingData.contentSizedTracksIndex.size(); ++i) { |
GridIterator iterator(m_grid, direction, sizingData.contentSizedTracksIndex[i]); |
while (RenderBox* gridItem = iterator.nextGridItem()) { |
+ LayoutUnit oldOverrideContainingBlockContentLogicalWidth = gridItem->hasOverrideContainingBlockLogicalWidth() ? gridItem->overrideContainingBlockContentLogicalWidth() : LayoutUnit(); |
+ LayoutUnit overrideContainingBlockContentLogicalWidth = gridAreaBreadthForChild(gridItem, ForColumns, sizingData.columnTracks); |
+ |
+ SubtreeLayoutScope layoutScope(gridItem); |
+ if ((oldOverrideContainingBlockContentLogicalWidth != overrideContainingBlockContentLogicalWidth) && breathIsFlexOrContentSizedForChild(gridItem, ForColumns)) |
+ layoutScope.setNeedsLayout(gridItem); |
+ |
+ gridItem->setOverrideContainingBlockContentLogicalWidth(overrideContainingBlockContentLogicalWidth); |
+ gridItem->layoutIfNeeded(); |
Julien - ping for review
2014/02/07 00:13:57
I think I understand the problem now. The original
|
+ |
resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, gridItem, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::minContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); |
resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, gridItem, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth); |
resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, gridItem, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::minContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); |
@@ -627,6 +636,19 @@ void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio |
} |
} |
+bool RenderGrid::breathIsFlexOrContentSizedForChild(RenderBox* child, GridTrackSizingDirection direction) const |
Julien - ping for review
2014/02/07 00:13:57
If you think of it, this check is unneeded as we o
|
+{ |
+ const GridCoordinate& coordinate = cachedGridCoordinate(child); |
+ const size_t initial = (direction == ForColumns) ? coordinate.columns.initialPositionIndex : coordinate.rows.initialPositionIndex; |
+ const size_t final = (direction == ForColumns) ? coordinate.columns.finalPositionIndex : coordinate.rows.finalPositionIndex; |
+ for (size_t i = initial; i <= final; i++) { |
+ const GridTrackSize& trackSize = gridTrackSize(direction, i); |
+ if (trackSize.maxTrackBreadth().isFlex() || trackSize.maxTrackBreadth().isContentSized()) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData& sizingData, RenderBox* gridItem, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction) |
{ |
const GridCoordinate coordinate = cachedGridCoordinate(gridItem); |