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

Unified Diff: third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.h

Issue 2654533003: [css-grid] Move the track sizing algorithm to its own class (Closed)
Patch Set: Win build fix Created 3 years, 11 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
Index: third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.h
diff --git a/third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.h b/third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.h
new file mode 100644
index 0000000000000000000000000000000000000000..443f8d25b300225c11480e2caedb5154a9c7dc91
--- /dev/null
+++ b/third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.h
@@ -0,0 +1,270 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef GridTrackSizingAlgorithm_h
+#define GridTrackSizingAlgorithm_h
+
+#include "core/style/GridPositionsResolver.h"
+#include "core/style/GridTrackSize.h"
+#include "platform/LayoutUnit.h"
+#include "wtf/HashSet.h"
+#include "wtf/Optional.h"
+#include <memory>
+
+namespace blink {
+
+static const int infinity = -1;
+
+class Grid;
+class GridTrackSizingAlgorithmStrategy;
+class LayoutGrid;
+
+enum SizingOperation { TrackSizing, IntrinsicSizeComputation };
+
+enum TrackSizeComputationPhase {
+ ResolveIntrinsicMinimums,
+ ResolveContentBasedMinimums,
+ ResolveMaxContentMinimums,
+ ResolveIntrinsicMaximums,
+ ResolveMaxContentMaximums,
+ MaximizeTracks,
+};
+
+class GridTrack {
+ public:
+ GridTrack() : m_infinitelyGrowable(false) {}
+
+ LayoutUnit baseSize() const;
+ void setBaseSize(LayoutUnit);
+
+ LayoutUnit growthLimit() const;
+ void setGrowthLimit(LayoutUnit);
+
+ bool infiniteGrowthPotential() const;
+
+ LayoutUnit plannedSize() const { return m_plannedSize; }
+ void setPlannedSize(LayoutUnit);
+
+ LayoutUnit sizeDuringDistribution() const { return m_sizeDuringDistribution; }
+ void setSizeDuringDistribution(LayoutUnit);
+
+ void growSizeDuringDistribution(LayoutUnit);
+
+ bool infinitelyGrowable() const { return m_infinitelyGrowable; }
+ void setInfinitelyGrowable(bool);
+
+ Optional<LayoutUnit> growthLimitCap() const { return m_growthLimitCap; }
+ void setGrowthLimitCap(Optional<LayoutUnit>);
+
+ private:
+ bool growthLimitIsInfinite() const { return m_growthLimit == infinity; }
+ bool isGrowthLimitBiggerThanBaseSize() const;
+ void ensureGrowthLimitIsBiggerThanBaseSize();
+
+ LayoutUnit m_baseSize;
+ LayoutUnit m_growthLimit;
+ LayoutUnit m_plannedSize;
+ LayoutUnit m_sizeDuringDistribution;
+ Optional<LayoutUnit> m_growthLimitCap;
+ bool m_infinitelyGrowable;
+};
+
+class GridTrackSizingAlgorithm final {
+ friend class GridTrackSizingAlgorithmStrategy;
+
+ public:
+ GridTrackSizingAlgorithm(const LayoutGrid* layoutGrid, Grid& grid)
+ : m_grid(grid),
+ m_layoutGrid(layoutGrid),
+ m_sizingState(ColumnSizingFirstIteration) {}
+
+ // setup() must be run before calling run() as it configures the behaviour of
+ // the algorithm.
+ void setup(GridTrackSizingDirection,
+ size_t numTracks,
+ SizingOperation,
+ LayoutUnit availableSpace,
+ LayoutUnit freeSpace);
+ void run();
+ void reset();
+
+ // Required by LayoutGrid. Try to minimize the exposed surface.
+ const Grid& grid() const { return m_grid; }
+ GridTrackSize gridTrackSize(GridTrackSizingDirection,
+ size_t translatedIndex,
+ SizingOperation) const;
+ LayoutUnit minContentSize() const { return m_minContentSize; };
+ LayoutUnit maxContentSize() const { return m_maxContentSize; };
+
+ Vector<GridTrack>& tracks(GridTrackSizingDirection);
+ const Vector<GridTrack>& tracks(GridTrackSizingDirection) const;
+
+ LayoutUnit& freeSpace(GridTrackSizingDirection);
+
+#if DCHECK_IS_ON()
+ bool tracksAreWiderThanMinTrackBreadth() const;
+#endif
+
+ private:
+ GridTrackSize gridTrackSize(GridTrackSizingDirection,
+ size_t translatedIndex) const;
+ GridTrackSize rawGridTrackSize(GridTrackSizingDirection,
+ size_t translatedIndex) const;
+ LayoutUnit assumedRowsSizeForOrthogonalChild(const LayoutBox&) const;
+ LayoutUnit computeTrackBasedSize() const;
+
+ // Helper methods for step 1. initializeTrackSizes().
+ LayoutUnit initialBaseSize(const GridTrackSize&) const;
+ LayoutUnit initialGrowthLimit(const GridTrackSize&,
+ LayoutUnit baseSize) const;
+
+ // Helper methods for step 2. resolveIntrinsicTrackSizes().
+ void sizeTrackToFitNonSpanningItem(const GridSpan&,
+ LayoutBox& gridItem,
+ GridTrack&);
+ bool spanningItemCrossesFlexibleSizedTracks(const GridSpan&) const;
+ typedef struct GridItemsSpanGroupRange GridItemsSpanGroupRange;
+ template <TrackSizeComputationPhase phase>
+ void increaseSizesToAccommodateSpanningItems(
+ const GridItemsSpanGroupRange& gridItemsWithSpan);
+ LayoutUnit itemSizeForTrackSizeComputationPhase(TrackSizeComputationPhase,
+ LayoutBox&) const;
+ template <TrackSizeComputationPhase phase>
+ void distributeSpaceToTracks(Vector<GridTrack*>& tracks,
+ Vector<GridTrack*>* growBeyondGrowthLimitsTracks,
+ LayoutUnit& availableLogicalSpace) const;
+ LayoutUnit gridAreaBreadthForChild(const LayoutBox&,
+ GridTrackSizingDirection);
+
+ void computeGridContainerIntrinsicSizes();
+
+ // Helper methods for step 4. Strech flexible tracks.
+ typedef HashSet<size_t,
+ DefaultHash<size_t>::Hash,
+ WTF::UnsignedWithZeroKeyHashTraits<size_t>>
+ TrackIndexSet;
+ double computeFlexFactorUnitSize(
+ const Vector<GridTrack>& tracks,
+ double flexFactorSum,
+ LayoutUnit& leftOverSpace,
+ const Vector<size_t, 8>& flexibleTracksIndexes,
+ std::unique_ptr<TrackIndexSet> tracksToTreatAsInflexible = nullptr) const;
+ void computeFlexSizedTracksGrowth(double flexFraction,
+ Vector<LayoutUnit>& increments,
+ LayoutUnit& totalGrowth) const;
+ double findFrUnitSize(const GridSpan& tracksSpan,
+ LayoutUnit leftOverSpace) const;
+
+ // Track sizing algorithm steps. Note that the "Maximize Tracks" step is done
+ // entirely inside the strategies, that's why we don't need an additional
+ // method at thise level.
+ void initializeTrackSizes();
+ void resolveIntrinsicTrackSizes();
+ void stretchFlexibleTracks(LayoutUnit freeSpace);
+
+ // State machine.
+ void advanceNextState();
+ bool isValidTransition() const;
+
+ // Data.
+ bool m_needsSetup{true};
+ LayoutUnit m_availableSpace;
+
+ LayoutUnit m_freeSpaceColumns;
+ LayoutUnit m_freeSpaceRows;
+
+ // We need to keep both alive in order to properly size grids with orthogonal
+ // writing modes.
+ Vector<GridTrack> m_columns;
+ Vector<GridTrack> m_rows;
+ Vector<size_t> m_contentSizedTracksIndex;
+ Vector<size_t> m_flexibleSizedTracksIndex;
+
+ GridTrackSizingDirection m_direction;
+ SizingOperation m_sizingOperation;
+
+ Grid& m_grid;
+
+ const LayoutGrid* m_layoutGrid;
+ std::unique_ptr<GridTrackSizingAlgorithmStrategy> m_strategy;
+
+ // The track sizing algorithm is used for both layout and intrinsic size
+ // computation. We're normally just interested in intrinsic inline sizes
+ // (a.k.a widths in most of the cases) for the computeIntrinsicLogicalWidths()
+ // computations. That's why we don't need to keep around different values for
+ // rows/columns.
+ LayoutUnit m_minContentSize;
+ LayoutUnit m_maxContentSize;
+
+ enum SizingState {
+ ColumnSizingFirstIteration,
+ RowSizingFirstIteration,
+ ColumnSizingSecondIteration,
+ RowSizingSecondIteration
+ };
+ SizingState m_sizingState;
+
+ // This is a RAII class used to ensure that the track sizing algorithm is
+ // executed as it is suppossed to be, i.e., first resolve columns and then
+ // rows. Only if required a second iteration is run following the same order,
+ // first columns and then rows.
+ class StateMachine {
+ public:
+ StateMachine(GridTrackSizingAlgorithm&);
+ ~StateMachine();
+
+ private:
+ GridTrackSizingAlgorithm& m_algorithm;
+ };
+};
+
+class GridTrackSizingAlgorithmStrategy {
+ WTF_MAKE_NONCOPYABLE(GridTrackSizingAlgorithmStrategy);
+ USING_FAST_MALLOC(GridTrackSizingAlgorithmStrategy);
+
+ public:
+ LayoutUnit minContentForChild(LayoutBox&) const;
+ LayoutUnit maxContentForChild(LayoutBox&) const;
+ LayoutUnit minSizeForChild(LayoutBox&) const;
+
+ virtual void maximizeTracks(Vector<GridTrack>&, LayoutUnit& freeSpace) = 0;
+ virtual double findUsedFlexFraction(Vector<size_t>& flexibleSizedTracksIndex,
+ GridTrackSizingDirection,
+ LayoutUnit initialFreeSpace) const = 0;
+ virtual bool recomputeUsedFlexFractionIfNeeded(
+ Vector<size_t>& flexibleSizedTracksIndex,
+ double& flexFraction,
+ Vector<LayoutUnit>& increments,
+ LayoutUnit& totalGrowth) const = 0;
+
+ protected:
+ GridTrackSizingAlgorithmStrategy(GridTrackSizingAlgorithm& algorithm)
+ : m_algorithm(algorithm) {}
+
+ virtual LayoutUnit minLogicalWidthForChild(
+ LayoutBox&,
+ Length childMinSize,
+ GridTrackSizingDirection) const = 0;
+ virtual void layoutGridItemForMinSizeComputation(
+ LayoutBox&,
+ bool overrideSizeHasChanged) const = 0;
+
+ LayoutUnit logicalHeightForChild(LayoutBox&) const;
+
+ bool updateOverrideContainingBlockContentSizeForChild(
+ LayoutBox&,
+ GridTrackSizingDirection) const;
+ LayoutUnit computeTrackBasedSize() const;
+ GridTrackSizingDirection direction() const { return m_algorithm.m_direction; }
+ double findFrUnitSize(const GridSpan& tracksSpan,
+ LayoutUnit leftOverSpace) const;
+ void distributeSpaceToTracks(Vector<GridTrack*>& tracks,
+ LayoutUnit& availableLogicalSpace) const;
+ const LayoutGrid* layoutGrid() const { return m_algorithm.m_layoutGrid; }
+
+ GridTrackSizingAlgorithm& m_algorithm;
+};
+}
+
+#endif // GridTrackSizingAlgorithm_h
« no previous file with comments | « third_party/WebKit/Source/core/layout/Grid.cpp ('k') | third_party/WebKit/Source/core/layout/GridTrackSizingAlgorithm.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698