| Index: third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.cpp b/third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.cpp
|
| index 2d251c65ac86e7df961147e8e5ea2d8be06dce44..41292c6c6c60ff8419a4e139a28193b167853a81 100644
|
| --- a/third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.cpp
|
| @@ -88,10 +88,11 @@ class IndefiniteSizeStrategy final : public GridTrackSizingAlgorithmStrategy {
|
| void layoutGridItemForMinSizeComputation(
|
| LayoutBox&,
|
| bool overrideSizeHasChanged) const override;
|
| - void maximizeTracks(Vector<GridTrack>&, LayoutUnit& freeSpace) override;
|
| + void maximizeTracks(Vector<GridTrack>&,
|
| + Optional<LayoutUnit>& freeSpace) override;
|
| double findUsedFlexFraction(Vector<size_t>& flexibleSizedTracksIndex,
|
| GridTrackSizingDirection,
|
| - LayoutUnit freeSpace) const override;
|
| + Optional<LayoutUnit> freeSpace) const override;
|
| bool recomputeUsedFlexFractionIfNeeded(
|
| Vector<size_t>& flexibleSizedTracksIndex,
|
| double& flexFraction,
|
| @@ -111,10 +112,11 @@ class DefiniteSizeStrategy final : public GridTrackSizingAlgorithmStrategy {
|
| void layoutGridItemForMinSizeComputation(
|
| LayoutBox&,
|
| bool overrideSizeHasChanged) const override;
|
| - void maximizeTracks(Vector<GridTrack>&, LayoutUnit& freeSpace) override;
|
| + void maximizeTracks(Vector<GridTrack>&,
|
| + Optional<LayoutUnit>& freeSpace) override;
|
| double findUsedFlexFraction(Vector<size_t>& flexibleSizedTracksIndex,
|
| GridTrackSizingDirection,
|
| - LayoutUnit freeSpace) const override;
|
| + Optional<LayoutUnit> freeSpace) const override;
|
| bool recomputeUsedFlexFractionIfNeeded(
|
| Vector<size_t>& flexibleSizedTracksIndex,
|
| double& flexFraction,
|
| @@ -446,7 +448,7 @@ void DefiniteSizeStrategy::layoutGridItemForMinSizeComputation(
|
| }
|
|
|
| void DefiniteSizeStrategy::maximizeTracks(Vector<GridTrack>& tracks,
|
| - LayoutUnit& freeSpace) {
|
| + Optional<LayoutUnit>& freeSpace) {
|
| size_t tracksSize = tracks.size();
|
| Vector<GridTrack*> tracksForDistribution(tracksSize);
|
| for (size_t i = 0; i < tracksSize; ++i) {
|
| @@ -455,7 +457,8 @@ void DefiniteSizeStrategy::maximizeTracks(Vector<GridTrack>& tracks,
|
| tracksForDistribution[i]->baseSize());
|
| }
|
|
|
| - distributeSpaceToTracks(tracksForDistribution, freeSpace);
|
| + DCHECK(freeSpace);
|
| + distributeSpaceToTracks(tracksForDistribution, freeSpace.value());
|
|
|
| for (auto* track : tracksForDistribution)
|
| track->setBaseSize(track->plannedSize());
|
| @@ -464,10 +467,11 @@ void DefiniteSizeStrategy::maximizeTracks(Vector<GridTrack>& tracks,
|
| double DefiniteSizeStrategy::findUsedFlexFraction(
|
| Vector<size_t>& flexibleSizedTracksIndex,
|
| GridTrackSizingDirection direction,
|
| - LayoutUnit freeSpace) const {
|
| + Optional<LayoutUnit> freeSpace) const {
|
| GridSpan allTracksSpan = GridSpan::translatedDefiniteGridSpan(
|
| 0, m_algorithm.tracks(direction).size());
|
| - return findFrUnitSize(allTracksSpan, freeSpace);
|
| + DCHECK(freeSpace);
|
| + return findFrUnitSize(allTracksSpan, freeSpace.value());
|
| }
|
|
|
| LayoutUnit IndefiniteSizeStrategy::minLogicalWidthForChild(
|
| @@ -494,7 +498,7 @@ void IndefiniteSizeStrategy::layoutGridItemForMinSizeComputation(
|
| }
|
|
|
| void IndefiniteSizeStrategy::maximizeTracks(Vector<GridTrack>& tracks,
|
| - LayoutUnit&) {
|
| + Optional<LayoutUnit>&) {
|
| for (auto& track : tracks)
|
| track.setBaseSize(track.growthLimit());
|
| }
|
| @@ -507,7 +511,7 @@ static inline double normalizedFlexFraction(const GridTrack& track,
|
| double IndefiniteSizeStrategy::findUsedFlexFraction(
|
| Vector<size_t>& flexibleSizedTracksIndex,
|
| GridTrackSizingDirection direction,
|
| - LayoutUnit freeSpace) const {
|
| + Optional<LayoutUnit>) const {
|
| auto allTracks = m_algorithm.tracks(direction);
|
|
|
| double flexFraction = 0;
|
| @@ -580,7 +584,7 @@ bool IndefiniteSizeStrategy::recomputeUsedFlexFractionIfNeeded(
|
| return true;
|
| }
|
|
|
| -LayoutUnit& GridTrackSizingAlgorithm::freeSpace(
|
| +Optional<LayoutUnit> GridTrackSizingAlgorithm::freeSpace(
|
| GridTrackSizingDirection direction) {
|
| return direction == ForRows ? m_freeSpaceRows : m_freeSpaceColumns;
|
| }
|
| @@ -595,6 +599,14 @@ const Vector<GridTrack>& GridTrackSizingAlgorithm::tracks(
|
| return direction == ForColumns ? m_columns : m_rows;
|
| }
|
|
|
| +void GridTrackSizingAlgorithm::setFreeSpace(GridTrackSizingDirection direction,
|
| + Optional<LayoutUnit> freeSpace) {
|
| + if (direction == ForColumns)
|
| + m_freeSpaceColumns = freeSpace;
|
| + else
|
| + m_freeSpaceRows = freeSpace;
|
| +}
|
| +
|
| GridTrackSize GridTrackSizingAlgorithm::rawGridTrackSize(
|
| GridTrackSizingDirection direction,
|
| size_t translatedIndex) const {
|
| @@ -701,7 +713,7 @@ LayoutUnit GridTrackSizingAlgorithm::initialBaseSize(
|
|
|
| const Length& trackLength = gridLength.length();
|
| if (trackLength.isSpecified())
|
| - return valueForLength(trackLength, m_availableSpace.clampNegativeToZero());
|
| + return valueForLength(trackLength, m_availableSpace.value_or(LayoutUnit()));
|
|
|
| DCHECK(trackLength.isMinContent() || trackLength.isAuto() ||
|
| trackLength.isMaxContent());
|
| @@ -717,7 +729,7 @@ LayoutUnit GridTrackSizingAlgorithm::initialGrowthLimit(
|
|
|
| const Length& trackLength = gridLength.length();
|
| if (trackLength.isSpecified())
|
| - return valueForLength(trackLength, m_availableSpace.clampNegativeToZero());
|
| + return valueForLength(trackLength, m_availableSpace.value_or(LayoutUnit()));
|
|
|
| DCHECK(trackLength.isMinContent() || trackLength.isAuto() ||
|
| trackLength.isMaxContent());
|
| @@ -728,7 +740,7 @@ void GridTrackSizingAlgorithm::initializeTrackSizes() {
|
| DCHECK(m_contentSizedTracksIndex.isEmpty());
|
| DCHECK(m_flexibleSizedTracksIndex.isEmpty());
|
| Vector<GridTrack>& trackList = tracks(m_direction);
|
| - bool hasDefiniteFreeSpace = m_sizingOperation == TrackSizing;
|
| + bool hasDefiniteFreeSpace = !!m_availableSpace;
|
| size_t numTracks = trackList.size();
|
| for (size_t i = 0; i < numTracks; ++i) {
|
| GridTrackSize trackSize = gridTrackSize(m_direction, i);
|
| @@ -741,7 +753,7 @@ void GridTrackSizingAlgorithm::initializeTrackSizes() {
|
| GridLength gridLength = trackSize.fitContentTrackBreadth();
|
| if (!gridLength.hasPercentage() || hasDefiniteFreeSpace) {
|
| track.setGrowthLimitCap(valueForLength(
|
| - gridLength.length(), m_availableSpace.clampNegativeToZero()));
|
| + gridLength.length(), m_availableSpace.value_or(LayoutUnit())));
|
| }
|
| }
|
|
|
| @@ -779,7 +791,7 @@ void GridTrackSizingAlgorithm::sizeTrackToFitNonSpanningItem(
|
| growthLimit =
|
| std::min(growthLimit,
|
| valueForLength(trackSize.fitContentTrackBreadth().length(),
|
| - m_availableSpace));
|
| + m_availableSpace.value_or(LayoutUnit())));
|
| }
|
| track.setGrowthLimit(std::max(track.growthLimit(), growthLimit));
|
| }
|
| @@ -1296,7 +1308,8 @@ void GridTrackSizingAlgorithm::computeFlexSizedTracksGrowth(
|
| }
|
| }
|
|
|
| -void GridTrackSizingAlgorithm::stretchFlexibleTracks(LayoutUnit freeSpace) {
|
| +void GridTrackSizingAlgorithm::stretchFlexibleTracks(
|
| + Optional<LayoutUnit> freeSpace) {
|
| double flexFraction = m_strategy->findUsedFlexFraction(
|
| m_flexibleSizedTracksIndex, m_direction, freeSpace);
|
|
|
| @@ -1318,7 +1331,10 @@ void GridTrackSizingAlgorithm::stretchFlexibleTracks(LayoutUnit freeSpace) {
|
| if (LayoutUnit increment = increments[i++])
|
| track.setBaseSize(track.baseSize() + increment);
|
| }
|
| - this->freeSpace(m_direction) -= totalGrowth;
|
| + if (this->freeSpace(m_direction)) {
|
| + setFreeSpace(m_direction,
|
| + this->freeSpace(m_direction).value() - totalGrowth);
|
| + }
|
| m_maxContentSize += totalGrowth;
|
| }
|
|
|
| @@ -1357,26 +1373,26 @@ bool GridTrackSizingAlgorithm::isValidTransition() const {
|
| void GridTrackSizingAlgorithm::setup(GridTrackSizingDirection direction,
|
| size_t numTracks,
|
| SizingOperation sizingOperation,
|
| - LayoutUnit availableSpace,
|
| - LayoutUnit freeSpace) {
|
| + Optional<LayoutUnit> availableSpace,
|
| + Optional<LayoutUnit> freeSpace) {
|
| DCHECK(m_needsSetup);
|
| + DCHECK_EQ(!!availableSpace, !!freeSpace);
|
| m_direction = direction;
|
| - m_availableSpace = availableSpace;
|
| + m_availableSpace = availableSpace
|
| + ? availableSpace.value().clampNegativeToZero()
|
| + : availableSpace;
|
|
|
| m_sizingOperation = sizingOperation;
|
| - switch (m_sizingOperation) {
|
| - case IntrinsicSizeComputation:
|
| - m_strategy = WTF::makeUnique<IndefiniteSizeStrategy>(*this);
|
| - break;
|
| - case TrackSizing:
|
| - m_strategy = WTF::makeUnique<DefiniteSizeStrategy>(*this);
|
| - break;
|
| - }
|
| +
|
| + if (availableSpace)
|
| + m_strategy = WTF::makeUnique<DefiniteSizeStrategy>(*this);
|
| + else
|
| + m_strategy = WTF::makeUnique<IndefiniteSizeStrategy>(*this);
|
|
|
| m_contentSizedTracksIndex.shrink(0);
|
| m_flexibleSizedTracksIndex.shrink(0);
|
|
|
| - this->freeSpace(direction) = freeSpace;
|
| + setFreeSpace(direction, freeSpace);
|
| tracks(direction).resize(numTracks);
|
|
|
| m_needsSetup = false;
|
| @@ -1387,7 +1403,7 @@ void GridTrackSizingAlgorithm::run() {
|
| StateMachine stateMachine(*this);
|
|
|
| // Step 1.
|
| - LayoutUnit initialFreeSpace = freeSpace(m_direction);
|
| + Optional<LayoutUnit> initialFreeSpace = freeSpace(m_direction);
|
| initializeTrackSizes();
|
|
|
| // Step 2.
|
| @@ -1399,13 +1415,19 @@ void GridTrackSizingAlgorithm::run() {
|
| // up to this moment (before maximization) to calculate the grid container
|
| // intrinsic sizes.
|
| computeGridContainerIntrinsicSizes();
|
| - freeSpace(m_direction) -= m_minContentSize;
|
|
|
| - if (m_sizingOperation == TrackSizing && freeSpace(m_direction) <= 0)
|
| - return;
|
| + if (freeSpace(m_direction)) {
|
| + LayoutUnit updatedFreeSpace =
|
| + freeSpace(m_direction).value() - m_minContentSize;
|
| + setFreeSpace(m_direction, updatedFreeSpace);
|
| + if (updatedFreeSpace <= 0)
|
| + return;
|
| + }
|
|
|
| // Step 3.
|
| - m_strategy->maximizeTracks(tracks(m_direction), freeSpace(m_direction));
|
| + m_strategy->maximizeTracks(tracks(m_direction), m_direction == ForColumns
|
| + ? m_freeSpaceColumns
|
| + : m_freeSpaceRows);
|
|
|
| if (m_flexibleSizedTracksIndex.isEmpty())
|
| return;
|
|
|