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

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

Issue 2334133002: [css-grid] Cache definite height detection (Closed)
Patch Set: Created 4 years, 3 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 ea4d9ff9a84367692c6ed0672561fcf4c7a4521a..e71428f682b170a4290011ebd334c42d0b5a4571 100644
--- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp
@@ -239,9 +239,10 @@ struct LayoutGrid::GridSizingData {
WTF_MAKE_NONCOPYABLE(GridSizingData);
STACK_ALLOCATED();
public:
- GridSizingData(size_t gridColumnCount, size_t gridRowCount)
+ GridSizingData(size_t gridColumnCount, size_t gridRowCount, bool definiteLogicalHeight)
jfernandez 2016/09/14 10:29:37 better use 'hasDefiniteLogicalHeigth" as variable
: columnTracks(gridColumnCount)
, rowTracks(gridRowCount)
+ , m_definiteLogicalHeight(definiteLogicalHeight)
jfernandez 2016/09/14 10:29:37 Again, better use the 'has' prefix in the attribut
{
}
@@ -258,6 +259,7 @@ public:
LayoutUnit availableSpace() const { return m_availableSpace; }
void setAvailableSpace(LayoutUnit availableSpace) { m_availableSpace = availableSpace; }
+ bool hasDefiniteLogicalHeight() const { return m_definiteLogicalHeight; }
SizingOperation sizingOperation { TrackSizing };
enum SizingState { ColumnSizingFirstIteration, RowSizingFirstIteration, ColumnSizingSecondIteration, RowSizingSecondIteration};
@@ -300,6 +302,8 @@ private:
// No need to store one per direction as it will be only used for computations during each axis
// track sizing. It's cached here because we need it to compute relative sizes.
LayoutUnit m_availableSpace;
+
+ bool m_definiteLogicalHeight;
};
struct GridItemsSpanGroupRange {
@@ -453,8 +457,6 @@ void LayoutGrid::layoutBlock(bool relayoutChildren)
LayoutSize previousSize = size();
updateLogicalWidth();
- bool logicalHeightWasIndefinite = !hasDefiniteLogicalHeight();
-
TextAutosizer::LayoutScope textAutosizerLayoutScope(this, &layoutScope);
// TODO(svillar): we won't need to do this once the intrinsic width computation is isolated
@@ -463,7 +465,7 @@ void LayoutGrid::layoutBlock(bool relayoutChildren)
dirtyGrid();
placeItemsOnGrid(TrackSizing);
- GridSizingData sizingData(gridColumnCount(), gridRowCount());
+ GridSizingData sizingData(gridColumnCount(), gridRowCount(), hasDefiniteLogicalHeight());
jfernandez 2016/09/14 10:29:37 Are we suer we want to store this information in t
Manuel Rego 2016/09/15 06:35:28 Ok, I've moved it to an attribute called m_hasDefi
// 1- First, the track sizing algorithm is used to resolve the sizes of the grid columns.
// At this point the logical width is always definite as the above call to updateLogicalWidth()
@@ -475,10 +477,10 @@ void LayoutGrid::layoutBlock(bool relayoutChildren)
// 2- Next, the track sizing algorithm resolves the sizes of the grid rows, using the
// grid column sizes calculated in the previous step.
- if (logicalHeightWasIndefinite)
- computeIntrinsicLogicalHeight(sizingData);
- else
+ if (sizingData.hasDefiniteLogicalHeight())
computeTrackSizesForDirection(ForRows, sizingData, availableLogicalHeight(ExcludeMarginBorderPadding));
+ else
+ computeIntrinsicLogicalHeight(sizingData);
setLogicalHeight(computeTrackBasedLogicalHeight(sizingData) + borderAndPaddingLogicalHeight() + scrollbarLogicalHeight());
LayoutUnit oldClientAfterEdge = clientLogicalBottom();
@@ -487,7 +489,7 @@ void LayoutGrid::layoutBlock(bool relayoutChildren)
// The above call might have changed the grid's logical height depending on min|max height restrictions.
// Update the sizes of the rows whose size depends on the logical height (also on definite|indefinite sizes).
LayoutUnit availableSpaceForRows = contentLogicalHeight();
- if (logicalHeightWasIndefinite)
+ if (!sizingData.hasDefiniteLogicalHeight())
computeTrackSizesForDirection(ForRows, sizingData, availableSpaceForRows);
// 3- If the min-content contribution of any grid items have changed based on the row
@@ -599,7 +601,7 @@ void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo
{
const_cast<LayoutGrid*>(this)->placeItemsOnGrid(IntrinsicSizeComputation);
- GridSizingData sizingData(gridColumnCount(), gridRowCount());
+ GridSizingData sizingData(gridColumnCount(), gridRowCount(), false);
sizingData.setAvailableSpace(LayoutUnit());
sizingData.freeSpace(ForColumns) = LayoutUnit();
sizingData.sizingOperation = IntrinsicSizeComputation;
@@ -670,7 +672,7 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi
// 1. Initialize per Grid track variables.
for (size_t i = 0; i < tracks.size(); ++i) {
GridTrack& track = tracks[i];
- GridTrackSize trackSize = gridTrackSize(direction, i, sizingData.sizingOperation);
+ GridTrackSize trackSize = gridTrackSize(direction, i, sizingData);
track.setBaseSize(computeUsedBreadthOfMinLength(trackSize, maxSize));
track.setGrowthLimit(computeUsedBreadthOfMaxLength(trackSize, track.baseSize(), maxSize));
@@ -731,10 +733,10 @@ 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::translatedDefiniteGridSpan(0, tracks.size()), direction, initialFreeSpace);
+ flexFraction = findFlexFactorUnitSize(tracks, GridSpan::translatedDefiniteGridSpan(0, tracks.size()), direction, sizingData, initialFreeSpace);
} else {
for (const auto& trackIndex : flexibleSizedTracksIndex)
- flexFraction = std::max(flexFraction, normalizedFlexFraction(tracks[trackIndex], gridTrackSize(direction, trackIndex).maxTrackBreadth().flex()));
+ flexFraction = std::max(flexFraction, normalizedFlexFraction(tracks[trackIndex], gridTrackSize(direction, trackIndex, sizingData).maxTrackBreadth().flex()));
if (!m_gridItemArea.isEmpty()) {
for (size_t i = 0; i < flexibleSizedTracksIndex.size(); ++i) {
@@ -746,14 +748,14 @@ void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi
if (i > 0 && span.startLine() <= flexibleSizedTracksIndex[i - 1])
continue;
- flexFraction = std::max(flexFraction, findFlexFactorUnitSize(tracks, span, direction, maxContentForChild(*gridItem, direction, sizingData)));
+ flexFraction = std::max(flexFraction, findFlexFactorUnitSize(tracks, span, direction, sizingData, maxContentForChild(*gridItem, direction, sizingData)));
}
}
}
}
for (const auto& trackIndex : flexibleSizedTracksIndex) {
- GridTrackSize trackSize = gridTrackSize(direction, trackIndex);
+ GridTrackSize trackSize = gridTrackSize(direction, trackIndex, sizingData);
LayoutUnit oldBaseSize = tracks[trackIndex].baseSize();
LayoutUnit baseSize = std::max(oldBaseSize, LayoutUnit(flexFraction * trackSize.maxTrackBreadth().flex()));
@@ -795,7 +797,7 @@ LayoutUnit LayoutGrid::computeUsedBreadthOfMaxLength(const GridTrackSize& trackS
return LayoutUnit(infinity);
}
-double LayoutGrid::computeFlexFactorUnitSize(const Vector<GridTrack>& tracks, GridTrackSizingDirection direction, double flexFactorSum, LayoutUnit& leftOverSpace, const Vector<size_t, 8>& flexibleTracksIndexes, std::unique_ptr<TrackIndexSet> tracksToTreatAsInflexible) const
+double LayoutGrid::computeFlexFactorUnitSize(const Vector<GridTrack>& tracks, GridTrackSizingDirection direction, const GridSizingData& sizingData, double flexFactorSum, LayoutUnit& leftOverSpace, const Vector<size_t, 8>& flexibleTracksIndexes, std::unique_ptr<TrackIndexSet> tracksToTreatAsInflexible) const
{
// We want to avoid the effect of flex factors sum below 1 making the factor unit size to grow exponentially.
double hypotheticalFactorUnitSize = leftOverSpace / std::max<double>(1, flexFactorSum);
@@ -807,7 +809,7 @@ double LayoutGrid::computeFlexFactorUnitSize(const Vector<GridTrack>& tracks, Gr
if (additionalTracksToTreatAsInflexible && additionalTracksToTreatAsInflexible->contains(index))
continue;
LayoutUnit baseSize = tracks[index].baseSize();
- double flexFactor = gridTrackSize(direction, index).maxTrackBreadth().flex();
+ double flexFactor = gridTrackSize(direction, index, sizingData).maxTrackBreadth().flex();
// treating all such tracks as inflexible.
if (baseSize > hypotheticalFactorUnitSize * flexFactor) {
leftOverSpace -= baseSize;
@@ -819,11 +821,11 @@ double LayoutGrid::computeFlexFactorUnitSize(const Vector<GridTrack>& tracks, Gr
}
}
if (!validFlexFactorUnit)
- return computeFlexFactorUnitSize(tracks, direction, flexFactorSum, leftOverSpace, flexibleTracksIndexes, std::move(additionalTracksToTreatAsInflexible));
+ return computeFlexFactorUnitSize(tracks, direction, sizingData, flexFactorSum, leftOverSpace, flexibleTracksIndexes, std::move(additionalTracksToTreatAsInflexible));
return hypotheticalFactorUnitSize;
}
-double LayoutGrid::findFlexFactorUnitSize(const Vector<GridTrack>& tracks, const GridSpan& tracksSpan, GridTrackSizingDirection direction, LayoutUnit leftOverSpace) const
+double LayoutGrid::findFlexFactorUnitSize(const Vector<GridTrack>& tracks, const GridSpan& tracksSpan, GridTrackSizingDirection direction, const GridSizingData& sizingData, LayoutUnit leftOverSpace) const
jfernandez 2016/09/14 10:29:37 an example of why I don't like a lot the approach
{
if (leftOverSpace <= 0)
return 0;
@@ -831,7 +833,7 @@ double LayoutGrid::findFlexFactorUnitSize(const Vector<GridTrack>& tracks, const
double flexFactorSum = 0;
Vector<size_t, 8> flexibleTracksIndexes;
for (const auto& trackIndex : tracksSpan) {
- GridTrackSize trackSize = gridTrackSize(direction, trackIndex);
+ GridTrackSize trackSize = gridTrackSize(direction, trackIndex, sizingData);
if (!trackSize.maxTrackBreadth().isFlex()) {
leftOverSpace -= tracks[trackIndex].baseSize();
} else {
@@ -843,7 +845,7 @@ double LayoutGrid::findFlexFactorUnitSize(const Vector<GridTrack>& tracks, const
// The function is not called if we don't have <flex> grid tracks
ASSERT(!flexibleTracksIndexes.isEmpty());
- return computeFlexFactorUnitSize(tracks, direction, flexFactorSum, leftOverSpace, flexibleTracksIndexes);
+ return computeFlexFactorUnitSize(tracks, direction, sizingData, flexFactorSum, leftOverSpace, flexibleTracksIndexes);
}
static bool hasOverrideContainingBlockContentSizeForChild(const LayoutBox& child, GridTrackSizingDirection direction)
@@ -909,7 +911,7 @@ const GridTrackSize& LayoutGrid::rawGridTrackSize(GridTrackSizingDirection direc
return trackStyles[untranslatedIndex - autoRepeatTracksCount];
}
-GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size_t translatedIndex, SizingOperation sizingOperation) const
+GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size_t translatedIndex, const GridSizingData& sizingData) const
{
// Collapse empty auto repeat tracks if auto-fit.
if (hasAutoRepeatEmptyTracks(direction) && isEmptyAutoRepeatTrack(direction, translatedIndex))
@@ -924,7 +926,7 @@ GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size
// If the logical width/height of the grid container is indefinite, percentage values are treated as <auto>.
if (minTrackBreadth.hasPercentage() || maxTrackBreadth.hasPercentage()) {
// For the inline axis this only happens when we're computing the intrinsic sizes (AvailableSpaceIndefinite).
- if ((sizingOperation == IntrinsicSizeComputation) || (direction == ForRows && !hasDefiniteLogicalHeight())) {
+ if ((sizingData.sizingOperation == IntrinsicSizeComputation) || (direction == ForRows && !sizingData.hasDefiniteLogicalHeight())) {
jfernandez 2016/09/14 10:29:37 If I understood it correctly, you have passed 'fal
Manuel Rego 2016/09/15 06:35:28 The possibilities are: * IntrinsicSizeComputation:
if (minTrackBreadth.hasPercentage())
minTrackBreadth = Length(Auto);
if (maxTrackBreadth.hasPercentage())
@@ -1080,10 +1082,10 @@ private:
GridSpan m_gridSpan;
};
-bool LayoutGrid::spanningItemCrossesFlexibleSizedTracks(const GridSpan& span, GridTrackSizingDirection direction, SizingOperation sizingOperation) const
+bool LayoutGrid::spanningItemCrossesFlexibleSizedTracks(const GridSpan& span, GridTrackSizingDirection direction, const GridSizingData& sizingData) const
jfernandez 2016/09/14 10:29:37 isn't this another example of a method just forwar
{
for (const auto& trackPosition : span) {
- const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition, sizingOperation);
+ const GridTrackSize& trackSize = gridTrackSize(direction, trackPosition, sizingData);
if (trackSize.minTrackBreadth().isFlex() || trackSize.maxTrackBreadth().isFlex())
return true;
}
@@ -1104,7 +1106,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, sizingData.sizingOperation)) {
+ } else if (!spanningItemCrossesFlexibleSizedTracks(span, direction, sizingData)) {
sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSpan(*gridItem, span));
}
}
@@ -1135,7 +1137,7 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio
void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(GridTrackSizingDirection direction, const GridSpan& span, LayoutBox& gridItem, GridTrack& track, GridSizingData& sizingData) const
{
const size_t trackPosition = span.startLine();
- GridTrackSize trackSize = gridTrackSize(direction, trackPosition, sizingData.sizingOperation);
+ GridTrackSize trackSize = gridTrackSize(direction, trackPosition, sizingData);
if (trackSize.hasMinContentMinTrackBreadth())
track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem, direction, sizingData)));
@@ -1297,7 +1299,7 @@ void LayoutGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing
sizingData.filteredTracks.shrink(0);
LayoutUnit spanningTracksSize;
for (const auto& trackPosition : itemSpan) {
- GridTrackSize trackSize = gridTrackSize(direction, trackPosition);
+ GridTrackSize trackSize = gridTrackSize(direction, trackPosition, sizingData);
GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[trackPosition] : sizingData.rowTracks[trackPosition];
spanningTracksSize += trackSizeForTrackSizeComputationPhase(phase, track, ForbidInfinity);
if (!shouldProcessTrackForTrackSizeComputationPhase(phase, trackSize))
@@ -1408,7 +1410,7 @@ bool LayoutGrid::tracksAreWiderThanMinTrackBreadth(GridTrackSizingDirection dire
const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks;
LayoutUnit& maxSize = sizingData.freeSpace(direction);
for (size_t i = 0; i < tracks.size(); ++i) {
- GridTrackSize trackSize = gridTrackSize(direction, i, sizingData.sizingOperation);
+ GridTrackSize trackSize = gridTrackSize(direction, i, sizingData);
if (computeUsedBreadthOfMinLength(trackSize, maxSize) > tracks[i].baseSize())
return false;
}
@@ -1868,7 +1870,7 @@ void LayoutGrid::applyStretchAlignmentToTracksIfNeeded(GridTrackSizingDirection
Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks;
Vector<unsigned> autoSizedTracksIndex;
for (unsigned i = 0; i < tracks.size(); ++i) {
- const GridTrackSize& trackSize = gridTrackSize(direction, i);
+ const GridTrackSize& trackSize = gridTrackSize(direction, i, sizingData);
if (trackSize.hasAutoMaxTrackBreadth())
autoSizedTracksIndex.append(i);
}
@@ -2077,7 +2079,7 @@ GridSpan LayoutGrid::cachedGridSpan(const LayoutBox& gridItem, GridTrackSizingDi
return direction == ForColumns ? area.columns : area.rows;
}
-LayoutUnit LayoutGrid::assumedRowsSizeForOrthogonalChild(const LayoutBox& child, SizingOperation sizingOperation) const
+LayoutUnit LayoutGrid::assumedRowsSizeForOrthogonalChild(const LayoutBox& child, const GridSizingData& sizingData) const
{
DCHECK(isOrthogonalChild(child));
const GridSpan& span = cachedGridSpan(child, ForRows);
@@ -2085,14 +2087,14 @@ LayoutUnit LayoutGrid::assumedRowsSizeForOrthogonalChild(const LayoutBox& child,
bool gridAreaIsIndefinite = false;
LayoutUnit containingBlockAvailableSize = containingBlockLogicalHeightForContent(ExcludeMarginBorderPadding);
for (auto trackPosition : span) {
- GridLength maxTrackSize = gridTrackSize(ForRows, trackPosition, sizingOperation).maxTrackBreadth();
+ GridLength maxTrackSize = gridTrackSize(ForRows, trackPosition, sizingData).maxTrackBreadth();
if (maxTrackSize.isContentSized() || maxTrackSize.isFlex())
gridAreaIsIndefinite = true;
else
gridAreaSize += valueForLength(maxTrackSize.length(), containingBlockAvailableSize);
}
- gridAreaSize += guttersSize(ForRows, span.startLine(), span.integerSpan(), sizingOperation);
+ gridAreaSize += guttersSize(ForRows, span.startLine(), span.integerSpan(), sizingData.sizingOperation);
return gridAreaIsIndefinite ? std::max(child.maxPreferredLogicalWidth(), gridAreaSize) : gridAreaSize;
}
@@ -2103,7 +2105,7 @@ LayoutUnit LayoutGrid::gridAreaBreadthForChild(const LayoutBox& child, GridTrack
// may depend on the row track's size. It's possible that the row tracks sizing logic has not been performed yet,
// so we will need to do an estimation.
if (direction == ForRows && sizingData.sizingState == GridSizingData::ColumnSizingFirstIteration)
- return assumedRowsSizeForOrthogonalChild(child, sizingData.sizingOperation);
+ return assumedRowsSizeForOrthogonalChild(child, sizingData);
const Vector<GridTrack>& tracks = direction == ForColumns ? sizingData.columnTracks : sizingData.rowTracks;
const GridSpan& span = cachedGridSpan(child, direction);
« 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