Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1830)

Unified Diff: third_party/WebKit/Source/core/layout/LayoutGrid.cpp

Issue 2033033002: [css-grid] Percentage columns can always be resolved during layout (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Minor fixes on tests Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutGrid.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 b6c769edce8e32388342fbea034b8292f508e30c..7bf340f7cfcc26b830b9dddb86589a4ab5cefcb3 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -250,7 +250,6 @@ public:
LayoutUnit& freeSpaceForDirection(GridTrackSizingDirection direction) { return direction == ForColumns ? freeSpaceForColumns : freeSpaceForRows; }
- enum SizingOperation { TrackSizing, IntrinsicSizeComputation };
SizingOperation sizingOperation { TrackSizing };
private:
@@ -357,7 +356,7 @@ LayoutUnit LayoutGrid::computeTrackBasedLogicalHeight(const GridSizingData& sizi
void LayoutGrid::computeTrackSizesForDirection(GridTrackSizingDirection direction, GridSizingData& sizingData, LayoutUnit freeSpace)
{
sizingData.freeSpaceForDirection(direction) = freeSpace - guttersSize(direction, direction == ForRows ? gridRowCount() : gridColumnCount());
- sizingData.sizingOperation = GridSizingData::TrackSizing;
+ sizingData.sizingOperation = TrackSizing;
LayoutUnit baseSizes, growthLimits;
computeUsedBreadthOfGridTracks(direction, sizingData, baseSizes, growthLimits);
@@ -450,7 +449,7 @@ void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo
GridSizingData sizingData(gridColumnCount(), gridRowCount());
sizingData.freeSpaceForDirection(ForColumns) = LayoutUnit();
- sizingData.sizingOperation = GridSizingData::IntrinsicSizeComputation;
+ sizingData.sizingOperation = IntrinsicSizeComputation;
const_cast<LayoutGrid*>(this)->computeUsedBreadthOfGridTracks(ForColumns, sizingData, minLogicalWidth, maxLogicalWidth);
LayoutUnit totalGuttersSize = guttersSize(ForColumns, sizingData.columnTracks.size());
@@ -466,7 +465,7 @@ void LayoutGrid::computeIntrinsicLogicalHeight(GridSizingData& sizingData)
{
ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData));
sizingData.freeSpaceForDirection(ForRows) = LayoutUnit();
- sizingData.sizingOperation = GridSizingData::IntrinsicSizeComputation;
+ sizingData.sizingOperation = IntrinsicSizeComputation;
computeUsedBreadthOfGridTracks(ForRows, sizingData, m_minContentHeight, m_maxContentHeight);
LayoutUnit totalGuttersSize = guttersSize(ForRows, gridRowCount());
@@ -512,14 +511,14 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi
LayoutUnit maxSize = std::max(LayoutUnit(), initialFreeSpace);
// Grid gutters were removed from freeSpace by the caller, but we must use them to compute relative (i.e. percentages) sizes.
- bool hasDefiniteFreeSpace = sizingData.sizingOperation == GridSizingData::TrackSizing;
+ bool hasDefiniteFreeSpace = sizingData.sizingOperation == TrackSizing;
if (hasDefiniteFreeSpace)
maxSize += guttersSize(direction, direction == ForRows ? gridRowCount() : gridColumnCount());
// 1. Initialize per Grid track variables.
for (size_t i = 0; i < tracks.size(); ++i) {
GridTrack& track = tracks[i];
- GridTrackSize trackSize = gridTrackSize(direction, i);
+ GridTrackSize trackSize = gridTrackSize(direction, i, sizingData.sizingOperation);
const GridLength& minTrackBreadth = trackSize.minTrackBreadth();
const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth();
@@ -686,11 +685,6 @@ double LayoutGrid::findFlexFactorUnitSize(const Vector<GridTrack>& tracks, const
return computeFlexFactorUnitSize(tracks, direction, flexFactorSum, leftOverSpace, flexibleTracksIndexes);
}
-bool LayoutGrid::hasDefiniteLogicalSize(GridTrackSizingDirection direction) const
-{
- return (direction == ForRows) ? hasDefiniteLogicalHeight() : hasDefiniteLogicalWidth();
-}
-
static bool hasOverrideContainingBlockContentSizeForChild(const LayoutBox& child, GridTrackSizingDirection direction)
{
return direction == ForColumns ? child.hasOverrideContainingBlockLogicalWidth() : child.overrideContainingBlockContentLogicalHeight();
@@ -747,21 +741,20 @@ const GridTrackSize& LayoutGrid::rawGridTrackSize(GridTrackSizingDirection direc
return trackStyles[untranslatedIndex - repetitions];
}
-GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size_t translatedIndex) const
+GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size_t translatedIndex, SizingOperation sizingOperation) const
{
const GridTrackSize& trackSize = rawGridTrackSize(direction, translatedIndex);
GridLength minTrackBreadth = trackSize.minTrackBreadth();
GridLength maxTrackBreadth = trackSize.maxTrackBreadth();
- // If the logical width/height of the grid container is indefinite, percentage values are treated as <auto>
- if (minTrackBreadth.hasPercentage() || maxTrackBreadth.hasPercentage()) {
- if (!hasDefiniteLogicalSize(direction)) {
- if (minTrackBreadth.hasPercentage())
- minTrackBreadth = Length(Auto);
- if (maxTrackBreadth.hasPercentage())
- maxTrackBreadth = Length(Auto);
- }
+ // If the logical width/height of the grid container is indefinite, percentage values are treated as <auto>.
+ // For the inline axis this only happens when we're computing the intrinsic sizes (AvailableSpaceIndefinite).
+ if (sizingOperation == IntrinsicSizeComputation || (direction == ForRows && !hasDefiniteLogicalHeight())) {
+ if (minTrackBreadth.hasPercentage())
+ minTrackBreadth = Length(Auto);
+ if (maxTrackBreadth.hasPercentage())
+ maxTrackBreadth = Length(Auto);
}
// Flex sizes are invalid as a min sizing function. However we still can have a flexible |minTrackBreadth|
@@ -815,7 +808,7 @@ LayoutUnit LayoutGrid::minSizeForChild(LayoutBox& child, GridTrackSizingDirectio
bool overrideSizeHasChanged = updateOverrideContainingBlockContentSizeForChild(child, childInlineDirection, sizingData);
if (isRowAxis) {
- LayoutUnit marginLogicalWidth = sizingData.sizingOperation == GridSizingData::TrackSizing ? computeMarginLogicalSizeForChild(InlineDirection, child) : marginIntrinsicLogicalWidthForChild(child);
+ LayoutUnit marginLogicalWidth = sizingData.sizingOperation == TrackSizing ? computeMarginLogicalSizeForChild(InlineDirection, child) : marginIntrinsicLogicalWidthForChild(child);
return child.computeLogicalWidthUsing(MinSize, childMinSize, overrideContainingBlockContentSizeForChild(child, childInlineDirection), this) + marginLogicalWidth;
}
@@ -902,10 +895,10 @@ private:
GridSpan m_gridSpan;
};
-bool LayoutGrid::spanningItemCrossesFlexibleSizedTracks(const GridSpan& span, GridTrackSizingDirection direction) const
+bool LayoutGrid::spanningItemCrossesFlexibleSizedTracks(const GridSpan& span, GridTrackSizingDirection direction, SizingOperation sizingOperation) const
{
for (const auto& trackPosition : span) {
- const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition);
+ const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition, sizingOperation);
if (trackSize.minTrackBreadth().isFlex() || trackSize.maxTrackBreadth().isFlex())
return true;
}
@@ -926,7 +919,7 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio
const GridSpan& span = cachedGridSpan(*gridItem, direction);
if (span.integerSpan() == 1) {
resolveContentBasedTrackSizingFunctionsForNonSpanningItems(direction, span, *gridItem, track, sizingData);
- } else if (!spanningItemCrossesFlexibleSizedTracks(span, direction)) {
+ } else if (!spanningItemCrossesFlexibleSizedTracks(span, direction, sizingData.sizingOperation)) {
sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSpan(*gridItem, span));
}
}
@@ -957,7 +950,7 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio
void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(GridTrackSizingDirection direction, const GridSpan& span, LayoutBox& gridItem, GridTrack& track, GridSizingData& sizingData)
{
const size_t trackPosition = span.startLine();
- GridTrackSize trackSize = gridTrackSize(direction, trackPosition);
+ GridTrackSize trackSize = gridTrackSize(direction, trackPosition, sizingData.sizingOperation);
if (trackSize.hasMinContentMinTrackBreadth())
track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem, direction, sizingData)));
@@ -1201,7 +1194,7 @@ bool LayoutGrid::tracksAreWiderThanMinTrackBreadth(GridTrackSizingDirection dire
const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks;
LayoutUnit& maxSize = sizingData.freeSpaceForDirection(direction);
for (size_t i = 0; i < tracks.size(); ++i) {
- GridTrackSize trackSize = gridTrackSize(direction, i);
+ GridTrackSize trackSize = gridTrackSize(direction, i, sizingData.sizingOperation);
const GridLength& minTrackBreadth = trackSize.minTrackBreadth();
if (computeUsedBreadthOfMinLength(minTrackBreadth, maxSize) > tracks[i].baseSize())
return false;
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutGrid.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698