Commit 55b4817a authored by svillar's avatar svillar Committed by Commit bot

[css-grid] Use Optional to represent indefinite lengths

Blink has been using LayoutUnit(-1) to represent indefinite sizes or more in
general, sizes that cannot be resolved. That's unfortunate because it forces
us to use that magic number and also because negative LayoutUnits are valid
outcomes of some operations.

In our particular case, that was forcing us to check the SizingOperation
argument in the GridTrackSizingAlgorithm to know whether the passed
available and free sizes where actually indefinite or not. Actually that was
not totally correct as this was based on the assumption that we were doing
intrinsic size computations (preferred widths) whenever the sizes where
indefinite which is not correct for all the cases (it's true for widths but
a height:auto grid container would have indefinite height and require
indefinite size computations).

This does not require any additional tests as we are not changing any
behaviour. It's a step forward in the process of decoupling the concepts of
definite/indefinite sizes and intrinsicSize/layout operations.

Review-Url: https://codereview.chromium.org/2808453002
Cr-Commit-Position: refs/heads/master@{#462881}
parent e148e7ab
...@@ -84,8 +84,8 @@ class GridTrackSizingAlgorithm final { ...@@ -84,8 +84,8 @@ class GridTrackSizingAlgorithm final {
void setup(GridTrackSizingDirection, void setup(GridTrackSizingDirection,
size_t numTracks, size_t numTracks,
SizingOperation, SizingOperation,
LayoutUnit availableSpace, Optional<LayoutUnit> availableSpace,
LayoutUnit freeSpace); Optional<LayoutUnit> freeSpace);
void run(); void run();
void reset(); void reset();
...@@ -100,7 +100,8 @@ class GridTrackSizingAlgorithm final { ...@@ -100,7 +100,8 @@ class GridTrackSizingAlgorithm final {
Vector<GridTrack>& tracks(GridTrackSizingDirection); Vector<GridTrack>& tracks(GridTrackSizingDirection);
const Vector<GridTrack>& tracks(GridTrackSizingDirection) const; const Vector<GridTrack>& tracks(GridTrackSizingDirection) const;
LayoutUnit& freeSpace(GridTrackSizingDirection); Optional<LayoutUnit> freeSpace(GridTrackSizingDirection);
void setFreeSpace(GridTrackSizingDirection, Optional<LayoutUnit>);
#if DCHECK_IS_ON() #if DCHECK_IS_ON()
bool tracksAreWiderThanMinTrackBreadth() const; bool tracksAreWiderThanMinTrackBreadth() const;
...@@ -164,7 +165,7 @@ class GridTrackSizingAlgorithm final { ...@@ -164,7 +165,7 @@ class GridTrackSizingAlgorithm final {
// method at thise level. // method at thise level.
void initializeTrackSizes(); void initializeTrackSizes();
void resolveIntrinsicTrackSizes(); void resolveIntrinsicTrackSizes();
void stretchFlexibleTracks(LayoutUnit freeSpace); void stretchFlexibleTracks(Optional<LayoutUnit> freeSpace);
// State machine. // State machine.
void advanceNextState(); void advanceNextState();
...@@ -172,10 +173,10 @@ class GridTrackSizingAlgorithm final { ...@@ -172,10 +173,10 @@ class GridTrackSizingAlgorithm final {
// Data. // Data.
bool m_needsSetup{true}; bool m_needsSetup{true};
LayoutUnit m_availableSpace; Optional<LayoutUnit> m_availableSpace;
LayoutUnit m_freeSpaceColumns; Optional<LayoutUnit> m_freeSpaceColumns;
LayoutUnit m_freeSpaceRows; Optional<LayoutUnit> m_freeSpaceRows;
// We need to keep both alive in order to properly size grids with orthogonal // We need to keep both alive in order to properly size grids with orthogonal
// writing modes. // writing modes.
...@@ -231,10 +232,12 @@ class GridTrackSizingAlgorithmStrategy { ...@@ -231,10 +232,12 @@ class GridTrackSizingAlgorithmStrategy {
LayoutUnit maxContentForChild(LayoutBox&) const; LayoutUnit maxContentForChild(LayoutBox&) const;
LayoutUnit minSizeForChild(LayoutBox&) const; LayoutUnit minSizeForChild(LayoutBox&) const;
virtual void maximizeTracks(Vector<GridTrack>&, LayoutUnit& freeSpace) = 0; virtual void maximizeTracks(Vector<GridTrack>&,
virtual double findUsedFlexFraction(Vector<size_t>& flexibleSizedTracksIndex, Optional<LayoutUnit>& freeSpace) = 0;
GridTrackSizingDirection, virtual double findUsedFlexFraction(
LayoutUnit initialFreeSpace) const = 0; Vector<size_t>& flexibleSizedTracksIndex,
GridTrackSizingDirection,
Optional<LayoutUnit> initialFreeSpace) const = 0;
virtual bool recomputeUsedFlexFractionIfNeeded( virtual bool recomputeUsedFlexFractionIfNeeded(
Vector<size_t>& flexibleSizedTracksIndex, Vector<size_t>& flexibleSizedTracksIndex,
double& flexFraction, double& flexFraction,
......
...@@ -284,8 +284,8 @@ void LayoutGrid::layoutBlock(bool relayoutChildren) { ...@@ -284,8 +284,8 @@ void LayoutGrid::layoutBlock(bool relayoutChildren) {
// Once grid's indefinite height is resolved, we can compute the // Once grid's indefinite height is resolved, we can compute the
// available free space for Content Alignment. // available free space for Content Alignment.
if (!cachedHasDefiniteLogicalHeight()) { if (!cachedHasDefiniteLogicalHeight()) {
m_trackSizingAlgorithm.freeSpace(ForRows) = m_trackSizingAlgorithm.setFreeSpace(
logicalHeight() - trackBasedLogicalHeight; ForRows, logicalHeight() - trackBasedLogicalHeight);
} }
// TODO (lajava): We need to compute baselines after step 2 so // TODO (lajava): We need to compute baselines after step 2 so
...@@ -436,7 +436,7 @@ void LayoutGrid::computeTrackSizesForIndefiniteSize( ...@@ -436,7 +436,7 @@ void LayoutGrid::computeTrackSizesForIndefiniteSize(
LayoutUnit& minIntrinsicSize, LayoutUnit& minIntrinsicSize,
LayoutUnit& maxIntrinsicSize) const { LayoutUnit& maxIntrinsicSize) const {
algo.setup(direction, numTracks(direction, grid), IntrinsicSizeComputation, algo.setup(direction, numTracks(direction, grid), IntrinsicSizeComputation,
LayoutUnit(), LayoutUnit()); WTF::nullopt, WTF::nullopt);
algo.run(); algo.run();
minIntrinsicSize = algo.minContentSize(); minIntrinsicSize = algo.minContentSize();
...@@ -1046,8 +1046,8 @@ static const StyleContentAlignmentData& contentAlignmentNormalBehavior() { ...@@ -1046,8 +1046,8 @@ static const StyleContentAlignmentData& contentAlignmentNormalBehavior() {
void LayoutGrid::applyStretchAlignmentToTracksIfNeeded( void LayoutGrid::applyStretchAlignmentToTracksIfNeeded(
GridTrackSizingDirection direction) { GridTrackSizingDirection direction) {
LayoutUnit& availableSpace = m_trackSizingAlgorithm.freeSpace(direction); Optional<LayoutUnit> freeSpace = m_trackSizingAlgorithm.freeSpace(direction);
if (availableSpace <= 0 || if (!freeSpace || freeSpace.value() <= 0 ||
(direction == ForColumns && (direction == ForColumns &&
styleRef().resolvedJustifyContentDistribution( styleRef().resolvedJustifyContentDistribution(
contentAlignmentNormalBehavior()) != ContentDistributionStretch) || contentAlignmentNormalBehavior()) != ContentDistributionStretch) ||
...@@ -1071,14 +1071,13 @@ void LayoutGrid::applyStretchAlignmentToTracksIfNeeded( ...@@ -1071,14 +1071,13 @@ void LayoutGrid::applyStretchAlignmentToTracksIfNeeded(
if (numberOfAutoSizedTracks < 1) if (numberOfAutoSizedTracks < 1)
return; return;
LayoutUnit sizeToIncrease = availableSpace / numberOfAutoSizedTracks; LayoutUnit sizeToIncrease = freeSpace.value() / numberOfAutoSizedTracks;
for (const auto& trackIndex : autoSizedTracksIndex) { for (const auto& trackIndex : autoSizedTracksIndex) {
GridTrack* track = allTracks.data() + trackIndex; GridTrack* track = allTracks.data() + trackIndex;
LayoutUnit baseSize = track->baseSize() + sizeToIncrease; LayoutUnit baseSize = track->baseSize() + sizeToIncrease;
track->setBaseSize(baseSize); track->setBaseSize(baseSize);
} }
m_trackSizingAlgorithm.setFreeSpace(direction, LayoutUnit());
availableSpace = LayoutUnit();
} }
void LayoutGrid::layoutGridItems() { void LayoutGrid::layoutGridItems() {
...@@ -1345,7 +1344,8 @@ void LayoutGrid::populateGridPositionsForDirection( ...@@ -1345,7 +1344,8 @@ void LayoutGrid::populateGridPositionsForDirection(
size_t numberOfLines = numberOfTracks + 1; size_t numberOfLines = numberOfTracks + 1;
size_t lastLine = numberOfLines - 1; size_t lastLine = numberOfLines - 1;
ContentAlignmentData offset = computeContentPositionAndDistributionOffset( ContentAlignmentData offset = computeContentPositionAndDistributionOffset(
direction, m_trackSizingAlgorithm.freeSpace(direction), numberOfTracks); direction, m_trackSizingAlgorithm.freeSpace(direction).value(),
numberOfTracks);
auto& positions = isRowAxis ? m_columnPositions : m_rowPositions; auto& positions = isRowAxis ? m_columnPositions : m_rowPositions;
positions.resize(numberOfLines); positions.resize(numberOfLines);
auto borderAndPadding = auto borderAndPadding =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment