Chromium Code Reviews| Index: Source/core/layout/LayoutGrid.cpp |
| diff --git a/Source/core/layout/LayoutGrid.cpp b/Source/core/layout/LayoutGrid.cpp |
| index 2de38a480b67dc7c3a5bede6d2eb962a899aec5a..882203707b6a259d0e71ed4de92ba61ca83d29e6 100644 |
| --- a/Source/core/layout/LayoutGrid.cpp |
| +++ b/Source/core/layout/LayoutGrid.cpp |
| @@ -391,9 +391,32 @@ void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo |
| maxLogicalWidth += scrollbarWidth; |
| } |
| -bool LayoutGrid::gridElementIsShrinkToFit() |
| +static bool heightSizedUnderMinContentConstraint(const ComputedStyle& style) |
| { |
| - return isFloatingOrOutOfFlowPositioned(); |
| + return style.logicalMinHeight().isMinContent() || style.logicalHeight().isMinContent() || style.logicalMaxHeight().isMinContent(); |
|
Manuel Rego
2015/09/17 11:04:03
What happens if it's not you, but it's an ancestor
svillar
2015/09/17 14:05:44
max-content
|_min-content
|_auto <- this is the
Manuel Rego
2015/09/18 10:52:07
Sorry but I'm not still 100% sure about this. :-/
svillar
2015/09/18 12:01:20
Well in this particular example the fact that heig
Manuel Rego
2015/09/22 10:12:34
My question is why the row is 100px tall and not 0
|
| +} |
| + |
| +static bool heightSizedUnderMaxContentConstraint(const ComputedStyle& style) |
| +{ |
| + return style.logicalMinHeight().isMaxContent() || style.logicalHeight().isMaxContent() || style.logicalMaxHeight().isMaxContent(); |
| +} |
| + |
| +void LayoutGrid::maximizeTracks(Vector<GridTrack>& tracks, GridSizingData& sizingData, LayoutUnit& spaceToDistribute) |
| +{ |
| + if (spaceToDistribute <= 0) |
| + return; |
| + |
| + size_t tracksSize = tracks.size(); |
| + Vector<GridTrack*> tracksForDistribution(tracksSize); |
| + for (size_t i = 0; i < tracksSize; ++i) { |
| + tracksForDistribution[i] = tracks.data() + i; |
| + tracksForDistribution[i]->setPlannedSize(tracksForDistribution[i]->baseSize()); |
| + } |
| + |
| + distributeSpaceToTracks<MaximizeTracks>(tracksForDistribution, nullptr, sizingData, spaceToDistribute); |
| + |
| + for (auto* track : tracksForDistribution) |
| + track->setBaseSize(track->plannedSize()); |
| } |
| void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection direction, GridSizingData& sizingData, LayoutUnit& freeSpace) |
| @@ -429,27 +452,39 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi |
| freeSpace -= track.baseSize(); |
| } |
| - const bool hasUndefinedRemainingSpace = (direction == ForRows) ? style()->logicalHeight().isAuto() : gridElementIsShrinkToFit(); |
| - |
| - if (!hasUndefinedRemainingSpace && freeSpace <= 0) |
| + const bool hasDefiniteAvailableSpace = (direction == ForRows) ? hasDefiniteLogicalHeight() : true; |
|
jfernandez
2015/09/01 23:41:39
I don't get why hasDefiniteAvailableSpace is alway
svillar
2015/09/02 13:25:48
It's explained in the comment I added bellow, for
Manuel Rego
2015/09/17 11:04:02
Probably the comment should be before the variable
svillar
2015/09/17 14:05:44
Acknowledged.
|
| + if (hasDefiniteAvailableSpace && freeSpace <= 0) |
| return; |
| // 3. Grow all Grid tracks in GridTracks from their baseSize up to their growthLimit value until freeSpace is exhausted. |
| - const size_t tracksSize = tracks.size(); |
| - if (!hasUndefinedRemainingSpace) { |
| - Vector<GridTrack*> tracksForDistribution(tracksSize); |
| - for (size_t i = 0; i < tracksSize; ++i) { |
| - tracksForDistribution[i] = tracks.data() + i; |
| - tracksForDistribution[i]->setPlannedSize(tracksForDistribution[i]->baseSize()); |
| - } |
| - |
| - distributeSpaceToTracks<MaximizeTracks>(tracksForDistribution, nullptr, sizingData, freeSpace); |
| - |
| - for (auto* track : tracksForDistribution) |
| - track->setBaseSize(track->plannedSize()); |
| + // We only need to check for the interactions of the track sizing algorithm with intrinsic sizes and min/max size |
| + // restrictions **for rows**, as for columns we already have the right available space because the intrinsic sizes |
| + // were previously computed by computeIntrinsicLogicalWidths() |
| + if (direction == ForColumns) { |
| + maximizeTracks(tracks, sizingData, freeSpace); |
| } else { |
| - for (auto& track : tracks) |
| - track.setBaseSize(track.growthLimit()); |
| + if (heightSizedUnderMaxContentConstraint(styleRef())) { |
| + if (styleRef().logicalMaxHeight().isMaxSizeNone()) { |
| + for (auto& track : tracks) |
| + track.setBaseSize(track.growthLimit()); |
| + } else { |
| + LayoutUnit tracksBreadth = initialFreeSpace - freeSpace; |
| + LayoutUnit spaceToDistribute = computeLogicalHeightUsing(MaxSize, styleRef().logicalMaxHeight(), contentLogicalHeight()) - tracksBreadth; |
| + maximizeTracks(tracks, sizingData, spaceToDistribute); |
| + } |
| + } else if (heightSizedUnderMinContentConstraint(styleRef())) { |
| + const Length& logicalMinSize = styleRef().logicalMinHeight(); |
| + if (!logicalMinSize.isZero() || logicalMinSize.isIntrinsic()) { |
| + LayoutUnit tracksBreadth = initialFreeSpace - freeSpace; |
| + LayoutUnit spaceToDistribute = computeLogicalHeightUsing(MinSize, styleRef().logicalMinHeight(), contentLogicalHeight()) - tracksBreadth; |
| + maximizeTracks(tracks, sizingData, spaceToDistribute); |
| + } |
| + } else if (hasDefiniteAvailableSpace) { |
| + maximizeTracks(tracks, sizingData, freeSpace); |
| + } else { |
| + for (auto& track : tracks) |
| + track.setBaseSize(track.growthLimit()); |
| + } |
|
Manuel Rego
2015/09/17 11:04:03
In order to try to simplify this "if-else",
would
svillar
2015/09/17 14:05:44
If you mean the whole if-else thing the answer is
|
| } |
| if (flexibleSizedTracksIndex.isEmpty()) |
| @@ -457,7 +492,7 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi |
| // 4. Grow all Grid tracks having a fraction as the MaxTrackSizingFunction. |
| double normalizedFractionBreadth = 0; |
| - if (!hasUndefinedRemainingSpace) { |
| + if (hasDefiniteAvailableSpace) { |
| normalizedFractionBreadth = computeNormalizedFractionBreadth(tracks, GridSpan(0, tracks.size() - 1), direction, initialFreeSpace); |
| } else { |
| for (const auto& trackIndex : flexibleSizedTracksIndex) { |