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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutGrid.cpp

Issue 2287113004: [css-grid] Implement fit-content track size (Closed)
Patch Set: Patch for landing 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2011 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 42
43 class GridItemWithSpan; 43 class GridItemWithSpan;
44 44
45 class GridTrack { 45 class GridTrack {
46 public: 46 public:
47 GridTrack() 47 GridTrack()
48 : m_infinitelyGrowable(false) 48 : m_infinitelyGrowable(false)
49 { 49 {
50 } 50 }
51 51
52 const LayoutUnit& baseSize() const 52 LayoutUnit baseSize() const
53 { 53 {
54 ASSERT(isGrowthLimitBiggerThanBaseSize()); 54 DCHECK(isGrowthLimitBiggerThanBaseSize());
55 return m_baseSize; 55 return m_baseSize;
56 } 56 }
57 57
58 const LayoutUnit& growthLimit() const 58 LayoutUnit growthLimit() const
59 { 59 {
60 ASSERT(isGrowthLimitBiggerThanBaseSize()); 60 DCHECK(isGrowthLimitBiggerThanBaseSize());
61 DCHECK(!m_growthLimitCap || m_growthLimitCap.value() >= m_growthLimit || m_baseSize >= m_growthLimitCap.value());
61 return m_growthLimit; 62 return m_growthLimit;
62 } 63 }
63 64
64 void setBaseSize(LayoutUnit baseSize) 65 void setBaseSize(LayoutUnit baseSize)
65 { 66 {
66 m_baseSize = baseSize; 67 m_baseSize = baseSize;
67 ensureGrowthLimitIsBiggerThanBaseSize(); 68 ensureGrowthLimitIsBiggerThanBaseSize();
68 } 69 }
69 70
70 void setGrowthLimit(LayoutUnit growthLimit) 71 void setGrowthLimit(LayoutUnit growthLimit)
71 { 72 {
72 m_growthLimit = growthLimit; 73 m_growthLimit = growthLimit == infinity ? growthLimit : std::min(growthL imit, m_growthLimitCap.value_or(growthLimit));
73 ensureGrowthLimitIsBiggerThanBaseSize(); 74 ensureGrowthLimitIsBiggerThanBaseSize();
74 } 75 }
75 76
76 bool growthLimitIsInfinite() const 77 bool infiniteGrowthPotential() const { return growthLimitIsInfinite() || m_i nfinitelyGrowable; }
77 {
78 return m_growthLimit == infinity;
79 }
80 78
81 bool infiniteGrowthPotential() const 79 LayoutUnit plannedSize() const { return m_plannedSize; }
82 {
83 return growthLimitIsInfinite() || m_infinitelyGrowable;
84 }
85
86 const LayoutUnit& plannedSize() const { return m_plannedSize; }
87 80
88 void setPlannedSize(const LayoutUnit& plannedSize) 81 void setPlannedSize(const LayoutUnit& plannedSize)
89 { 82 {
90 ASSERT(plannedSize >= 0 || plannedSize == infinity); 83 ASSERT(plannedSize >= 0 || plannedSize == infinity);
91 m_plannedSize = plannedSize; 84 m_plannedSize = plannedSize;
92 } 85 }
93 86
94 const LayoutUnit& sizeDuringDistribution() { return m_sizeDuringDistribution ; } 87 LayoutUnit sizeDuringDistribution() const { return m_sizeDuringDistribution; }
95 88
96 void setSizeDuringDistribution(const LayoutUnit& sizeDuringDistribution) 89 void setSizeDuringDistribution(const LayoutUnit& sizeDuringDistribution)
97 { 90 {
98 ASSERT(sizeDuringDistribution >= 0); 91 DCHECK_GE(sizeDuringDistribution, 0);
92 DCHECK(growthLimitIsInfinite() || growthLimit() >= sizeDuringDistributio n);
99 m_sizeDuringDistribution = sizeDuringDistribution; 93 m_sizeDuringDistribution = sizeDuringDistribution;
100 } 94 }
101 95
102 void growSizeDuringDistribution(const LayoutUnit& sizeDuringDistribution) 96 void growSizeDuringDistribution(const LayoutUnit& sizeDuringDistribution)
103 { 97 {
104 ASSERT(sizeDuringDistribution >= 0); 98 DCHECK_GE(sizeDuringDistribution, 0);
105 m_sizeDuringDistribution += sizeDuringDistribution; 99 m_sizeDuringDistribution += sizeDuringDistribution;
106 } 100 }
107 101
108 bool infinitelyGrowable() const { return m_infinitelyGrowable; } 102 bool infinitelyGrowable() const { return m_infinitelyGrowable; }
109 void setInfinitelyGrowable(bool infinitelyGrowable) { m_infinitelyGrowable = infinitelyGrowable; } 103 void setInfinitelyGrowable(bool infinitelyGrowable) { m_infinitelyGrowable = infinitelyGrowable; }
110 104
105 void setGrowthLimitCap(Optional<LayoutUnit> growthLimitCap)
106 {
107 DCHECK(!growthLimitCap || *growthLimitCap >= 0);
108 m_growthLimitCap = growthLimitCap;
109 }
110
111 Optional<LayoutUnit> growthLimitCap() const { return m_growthLimitCap; }
112
111 private: 113 private:
114 bool growthLimitIsInfinite() const { return m_growthLimit == infinity; }
112 bool isGrowthLimitBiggerThanBaseSize() const { return growthLimitIsInfinite( ) || m_growthLimit >= m_baseSize; } 115 bool isGrowthLimitBiggerThanBaseSize() const { return growthLimitIsInfinite( ) || m_growthLimit >= m_baseSize; }
113 116
114 void ensureGrowthLimitIsBiggerThanBaseSize() 117 void ensureGrowthLimitIsBiggerThanBaseSize()
115 { 118 {
116 if (m_growthLimit != infinity && m_growthLimit < m_baseSize) 119 if (m_growthLimit != infinity && m_growthLimit < m_baseSize)
117 m_growthLimit = m_baseSize; 120 m_growthLimit = m_baseSize;
118 } 121 }
119 122
120 LayoutUnit m_baseSize; 123 LayoutUnit m_baseSize;
121 LayoutUnit m_growthLimit; 124 LayoutUnit m_growthLimit;
122 LayoutUnit m_plannedSize; 125 LayoutUnit m_plannedSize;
123 LayoutUnit m_sizeDuringDistribution; 126 LayoutUnit m_sizeDuringDistribution;
127 Optional<LayoutUnit> m_growthLimitCap;
124 bool m_infinitelyGrowable; 128 bool m_infinitelyGrowable;
125 }; 129 };
126 130
127 struct ContentAlignmentData { 131 struct ContentAlignmentData {
128 STACK_ALLOCATED(); 132 STACK_ALLOCATED();
129 public: 133 public:
130 ContentAlignmentData() {}; 134 ContentAlignmentData() {};
131 ContentAlignmentData(LayoutUnit position, LayoutUnit distribution) 135 ContentAlignmentData(LayoutUnit position, LayoutUnit distribution)
132 : positionOffset(position) 136 : positionOffset(position)
133 , distributionOffset(distribution) 137 , distributionOffset(distribution)
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 247
244 Vector<GridTrack> columnTracks; 248 Vector<GridTrack> columnTracks;
245 Vector<GridTrack> rowTracks; 249 Vector<GridTrack> rowTracks;
246 Vector<size_t> contentSizedTracksIndex; 250 Vector<size_t> contentSizedTracksIndex;
247 251
248 // Performance optimization: hold onto these Vectors until the end of Layout to avoid repeated malloc / free. 252 // Performance optimization: hold onto these Vectors until the end of Layout to avoid repeated malloc / free.
249 Vector<GridTrack*> filteredTracks; 253 Vector<GridTrack*> filteredTracks;
250 Vector<GridItemWithSpan> itemsSortedByIncreasingSpan; 254 Vector<GridItemWithSpan> itemsSortedByIncreasingSpan;
251 Vector<GridTrack*> growBeyondGrowthLimitsTracks; 255 Vector<GridTrack*> growBeyondGrowthLimitsTracks;
252 256
253 LayoutUnit& freeSpaceForDirection(GridTrackSizingDirection direction) { retu rn direction == ForColumns ? freeSpaceForColumns : freeSpaceForRows; } 257 LayoutUnit& freeSpace(GridTrackSizingDirection direction) { return direction == ForColumns ? freeSpaceForColumns : freeSpaceForRows; }
258
259 LayoutUnit availableSpace() const { return m_availableSpace; }
260 void setAvailableSpace(LayoutUnit availableSpace) { m_availableSpace = avail ableSpace; }
254 261
255 SizingOperation sizingOperation { TrackSizing }; 262 SizingOperation sizingOperation { TrackSizing };
256 enum SizingState { ColumnSizingFirstIteration, RowSizingFirstIteration, Colu mnSizingSecondIteration, RowSizingSecondIteration}; 263 enum SizingState { ColumnSizingFirstIteration, RowSizingFirstIteration, Colu mnSizingSecondIteration, RowSizingSecondIteration};
257 SizingState sizingState { ColumnSizingFirstIteration }; 264 SizingState sizingState { ColumnSizingFirstIteration };
258 void nextState() 265 void nextState()
259 { 266 {
260 switch (sizingState) { 267 switch (sizingState) {
261 case ColumnSizingFirstIteration: 268 case ColumnSizingFirstIteration:
262 sizingState = RowSizingFirstIteration; 269 sizingState = RowSizingFirstIteration;
263 return; 270 return;
(...skipping 19 matching lines...) Expand all
283 case RowSizingFirstIteration: 290 case RowSizingFirstIteration:
284 case RowSizingSecondIteration: 291 case RowSizingSecondIteration:
285 return direction == ForRows; 292 return direction == ForRows;
286 } 293 }
287 NOTREACHED(); 294 NOTREACHED();
288 return false; 295 return false;
289 } 296 }
290 private: 297 private:
291 LayoutUnit freeSpaceForColumns { }; 298 LayoutUnit freeSpaceForColumns { };
292 LayoutUnit freeSpaceForRows { }; 299 LayoutUnit freeSpaceForRows { };
300 // No need to store one per direction as it will be only used for computatio ns during each axis
301 // track sizing. It's cached here because we need it to compute relative siz es.
302 LayoutUnit m_availableSpace;
293 }; 303 };
294 304
295 struct GridItemsSpanGroupRange { 305 struct GridItemsSpanGroupRange {
296 Vector<GridItemWithSpan>::iterator rangeStart; 306 Vector<GridItemWithSpan>::iterator rangeStart;
297 Vector<GridItemWithSpan>::iterator rangeEnd; 307 Vector<GridItemWithSpan>::iterator rangeEnd;
298 }; 308 };
299 309
300 LayoutGrid::LayoutGrid(Element* element) 310 LayoutGrid::LayoutGrid(Element* element)
301 : LayoutBlock(element) 311 : LayoutBlock(element)
302 , m_gridIsDirty(true) 312 , m_gridIsDirty(true)
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 LayoutUnit logicalHeight; 391 LayoutUnit logicalHeight;
382 392
383 for (const auto& row : sizingData.rowTracks) 393 for (const auto& row : sizingData.rowTracks)
384 logicalHeight += row.baseSize(); 394 logicalHeight += row.baseSize();
385 395
386 logicalHeight += guttersSize(ForRows, 0, sizingData.rowTracks.size()); 396 logicalHeight += guttersSize(ForRows, 0, sizingData.rowTracks.size());
387 397
388 return logicalHeight; 398 return logicalHeight;
389 } 399 }
390 400
391 void LayoutGrid::computeTrackSizesForDirection(GridTrackSizingDirection directio n, GridSizingData& sizingData, LayoutUnit freeSpace) 401 void LayoutGrid::computeTrackSizesForDirection(GridTrackSizingDirection directio n, GridSizingData& sizingData, LayoutUnit availableSpace)
392 { 402 {
393 DCHECK(sizingData.isValidTransition(direction)); 403 DCHECK(sizingData.isValidTransition(direction));
394 sizingData.freeSpaceForDirection(direction) = freeSpace - guttersSize(direct ion, 0, direction == ForRows ? gridRowCount() : gridColumnCount()); 404 sizingData.setAvailableSpace(availableSpace);
405 sizingData.freeSpace(direction) = availableSpace - guttersSize(direction, 0, direction == ForRows ? gridRowCount() : gridColumnCount());
395 sizingData.sizingOperation = TrackSizing; 406 sizingData.sizingOperation = TrackSizing;
396 407
397 LayoutUnit baseSizes, growthLimits; 408 LayoutUnit baseSizes, growthLimits;
398 computeUsedBreadthOfGridTracks(direction, sizingData, baseSizes, growthLimit s); 409 computeUsedBreadthOfGridTracks(direction, sizingData, baseSizes, growthLimit s);
399 ASSERT(tracksAreWiderThanMinTrackBreadth(direction, sizingData)); 410 ASSERT(tracksAreWiderThanMinTrackBreadth(direction, sizingData));
400 sizingData.nextState(); 411 sizingData.nextState();
401 } 412 }
402 413
403 void LayoutGrid::repeatTracksSizingIfNeeded(GridSizingData& sizingData, LayoutUn it availableSpaceForColumns, LayoutUnit availableSpaceForRows) 414 void LayoutGrid::repeatTracksSizingIfNeeded(GridSizingData& sizingData, LayoutUn it availableSpaceForColumns, LayoutUnit availableSpaceForRows)
404 { 415 {
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 } 581 }
571 582
572 return gapAccumulator; 583 return gapAccumulator;
573 } 584 }
574 585
575 void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo utUnit& maxLogicalWidth) const 586 void LayoutGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo utUnit& maxLogicalWidth) const
576 { 587 {
577 const_cast<LayoutGrid*>(this)->placeItemsOnGrid(IntrinsicSizeComputation); 588 const_cast<LayoutGrid*>(this)->placeItemsOnGrid(IntrinsicSizeComputation);
578 589
579 GridSizingData sizingData(gridColumnCount(), gridRowCount()); 590 GridSizingData sizingData(gridColumnCount(), gridRowCount());
580 sizingData.freeSpaceForDirection(ForColumns) = LayoutUnit(); 591 sizingData.setAvailableSpace(LayoutUnit());
592 sizingData.freeSpace(ForColumns) = LayoutUnit();
581 sizingData.sizingOperation = IntrinsicSizeComputation; 593 sizingData.sizingOperation = IntrinsicSizeComputation;
582 computeUsedBreadthOfGridTracks(ForColumns, sizingData, minLogicalWidth, maxL ogicalWidth); 594 computeUsedBreadthOfGridTracks(ForColumns, sizingData, minLogicalWidth, maxL ogicalWidth);
583 595
584 LayoutUnit totalGuttersSize = guttersSize(ForColumns, 0, sizingData.columnTr acks.size()); 596 LayoutUnit totalGuttersSize = guttersSize(ForColumns, 0, sizingData.columnTr acks.size());
585 minLogicalWidth += totalGuttersSize; 597 minLogicalWidth += totalGuttersSize;
586 maxLogicalWidth += totalGuttersSize; 598 maxLogicalWidth += totalGuttersSize;
587 599
588 LayoutUnit scrollbarWidth = LayoutUnit(scrollbarLogicalWidth()); 600 LayoutUnit scrollbarWidth = LayoutUnit(scrollbarLogicalWidth());
589 minLogicalWidth += scrollbarWidth; 601 minLogicalWidth += scrollbarWidth;
590 maxLogicalWidth += scrollbarWidth; 602 maxLogicalWidth += scrollbarWidth;
591 } 603 }
592 604
593 void LayoutGrid::computeIntrinsicLogicalHeight(GridSizingData& sizingData) 605 void LayoutGrid::computeIntrinsicLogicalHeight(GridSizingData& sizingData)
594 { 606 {
595 ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData)); 607 ASSERT(tracksAreWiderThanMinTrackBreadth(ForColumns, sizingData));
596 sizingData.freeSpaceForDirection(ForRows) = LayoutUnit(); 608 sizingData.setAvailableSpace(LayoutUnit());
609 sizingData.freeSpace(ForRows) = LayoutUnit();
597 sizingData.sizingOperation = IntrinsicSizeComputation; 610 sizingData.sizingOperation = IntrinsicSizeComputation;
598 computeUsedBreadthOfGridTracks(ForRows, sizingData, m_minContentHeight, m_ma xContentHeight); 611 computeUsedBreadthOfGridTracks(ForRows, sizingData, m_minContentHeight, m_ma xContentHeight);
599 612
600 LayoutUnit totalGuttersSize = guttersSize(ForRows, 0, gridRowCount()); 613 LayoutUnit totalGuttersSize = guttersSize(ForRows, 0, gridRowCount());
601 m_minContentHeight += totalGuttersSize; 614 m_minContentHeight += totalGuttersSize;
602 m_maxContentHeight += totalGuttersSize; 615 m_maxContentHeight += totalGuttersSize;
603 616
604 ASSERT(tracksAreWiderThanMinTrackBreadth(ForRows, sizingData)); 617 ASSERT(tracksAreWiderThanMinTrackBreadth(ForRows, sizingData));
605 } 618 }
606 619
(...skipping 18 matching lines...) Expand all
625 return LayoutUnit(); 638 return LayoutUnit();
626 } 639 }
627 640
628 static inline double normalizedFlexFraction(const GridTrack& track, double flexF actor) 641 static inline double normalizedFlexFraction(const GridTrack& track, double flexF actor)
629 { 642 {
630 return track.baseSize() / std::max<double>(1, flexFactor); 643 return track.baseSize() / std::max<double>(1, flexFactor);
631 } 644 }
632 645
633 void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi on, GridSizingData& sizingData, LayoutUnit& baseSizesWithoutMaximization, Layout Unit& growthLimitsWithoutMaximization) const 646 void LayoutGrid::computeUsedBreadthOfGridTracks(GridTrackSizingDirection directi on, GridSizingData& sizingData, LayoutUnit& baseSizesWithoutMaximization, Layout Unit& growthLimitsWithoutMaximization) const
634 { 647 {
635 LayoutUnit& freeSpace = sizingData.freeSpaceForDirection(direction); 648 LayoutUnit& freeSpace = sizingData.freeSpace(direction);
636 const LayoutUnit initialFreeSpace = freeSpace; 649 const LayoutUnit initialFreeSpace = freeSpace;
637 Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTra cks : sizingData.rowTracks; 650 Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTra cks : sizingData.rowTracks;
638 Vector<size_t> flexibleSizedTracksIndex; 651 Vector<size_t> flexibleSizedTracksIndex;
639 sizingData.contentSizedTracksIndex.shrink(0); 652 sizingData.contentSizedTracksIndex.shrink(0);
640 653
641 LayoutUnit maxSize = std::max(LayoutUnit(), initialFreeSpace);
642 // Grid gutters were removed from freeSpace by the caller, but we must use t hem to compute relative (i.e. percentages) sizes. 654 // Grid gutters were removed from freeSpace by the caller, but we must use t hem to compute relative (i.e. percentages) sizes.
655 LayoutUnit maxSize = sizingData.availableSpace().clampNegativeToZero();
643 bool hasDefiniteFreeSpace = sizingData.sizingOperation == TrackSizing; 656 bool hasDefiniteFreeSpace = sizingData.sizingOperation == TrackSizing;
644 if (hasDefiniteFreeSpace)
645 maxSize += guttersSize(direction, 0, direction == ForRows ? gridRowCount () : gridColumnCount());
646 657
647 // 1. Initialize per Grid track variables. 658 // 1. Initialize per Grid track variables.
648 for (size_t i = 0; i < tracks.size(); ++i) { 659 for (size_t i = 0; i < tracks.size(); ++i) {
649 GridTrack& track = tracks[i]; 660 GridTrack& track = tracks[i];
650 GridTrackSize trackSize = gridTrackSize(direction, i, sizingData.sizingO peration); 661 GridTrackSize trackSize = gridTrackSize(direction, i, sizingData.sizingO peration);
651 const GridLength& minTrackBreadth = trackSize.minTrackBreadth();
652 const GridLength& maxTrackBreadth = trackSize.maxTrackBreadth();
653 662
654 track.setBaseSize(computeUsedBreadthOfMinLength(minTrackBreadth, maxSize )); 663 track.setBaseSize(computeUsedBreadthOfMinLength(trackSize, maxSize));
655 track.setGrowthLimit(computeUsedBreadthOfMaxLength(maxTrackBreadth, trac k.baseSize(), maxSize)); 664 track.setGrowthLimit(computeUsedBreadthOfMaxLength(trackSize, track.base Size(), maxSize));
656 track.setInfinitelyGrowable(false); 665 track.setInfinitelyGrowable(false);
657 666
667 if (trackSize.isFitContent()) {
668 GridLength gridLength = trackSize.length();
669 if (!gridLength.hasPercentage() || hasDefiniteFreeSpace)
670 track.setGrowthLimitCap(valueForLength(gridLength.length(), maxS ize));
671 }
672
658 if (trackSize.isContentSized()) 673 if (trackSize.isContentSized())
659 sizingData.contentSizedTracksIndex.append(i); 674 sizingData.contentSizedTracksIndex.append(i);
660 if (trackSize.maxTrackBreadth().isFlex()) 675 if (trackSize.maxTrackBreadth().isFlex())
661 flexibleSizedTracksIndex.append(i); 676 flexibleSizedTracksIndex.append(i);
662 } 677 }
663 678
664 // 2. Resolve content-based TrackSizingFunctions. 679 // 2. Resolve content-based TrackSizingFunctions.
665 if (!sizingData.contentSizedTracksIndex.isEmpty()) 680 if (!sizingData.contentSizedTracksIndex.isEmpty())
666 resolveContentBasedTrackSizingFunctions(direction, sizingData); 681 resolveContentBasedTrackSizingFunctions(direction, sizingData);
667 682
668 baseSizesWithoutMaximization = growthLimitsWithoutMaximization = LayoutUnit( ); 683 baseSizesWithoutMaximization = growthLimitsWithoutMaximization = LayoutUnit( );
669 684
670 for (const auto& track: tracks) { 685 for (auto& track: tracks) {
671 ASSERT(!track.infiniteGrowthPotential()); 686 ASSERT(!track.infiniteGrowthPotential());
672 baseSizesWithoutMaximization += track.baseSize(); 687 baseSizesWithoutMaximization += track.baseSize();
673 growthLimitsWithoutMaximization += track.growthLimit(); 688 growthLimitsWithoutMaximization += track.growthLimit();
689 // The growth limit caps must be cleared now in order to properly sort t racks by growth
690 // potential on an eventual "Maximize Tracks".
691 track.setGrowthLimitCap(WTF::nullopt);
674 } 692 }
675 freeSpace = initialFreeSpace - baseSizesWithoutMaximization; 693 freeSpace = initialFreeSpace - baseSizesWithoutMaximization;
676 694
677 if (hasDefiniteFreeSpace && freeSpace <= 0) 695 if (hasDefiniteFreeSpace && freeSpace <= 0)
678 return; 696 return;
679 697
680 // 3. Grow all Grid tracks in GridTracks from their baseSize up to their gro wthLimit value until freeSpace is exhausted. 698 // 3. Grow all Grid tracks in GridTracks from their baseSize up to their gro wthLimit value until freeSpace is exhausted.
681 const size_t tracksSize = tracks.size(); 699 const size_t tracksSize = tracks.size();
682 if (hasDefiniteFreeSpace) { 700 if (hasDefiniteFreeSpace) {
683 Vector<GridTrack*> tracksForDistribution(tracksSize); 701 Vector<GridTrack*> tracksForDistribution(tracksSize);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
730 if (LayoutUnit increment = baseSize - oldBaseSize) { 748 if (LayoutUnit increment = baseSize - oldBaseSize) {
731 tracks[trackIndex].setBaseSize(baseSize); 749 tracks[trackIndex].setBaseSize(baseSize);
732 freeSpace -= increment; 750 freeSpace -= increment;
733 751
734 baseSizesWithoutMaximization += increment; 752 baseSizesWithoutMaximization += increment;
735 growthLimitsWithoutMaximization += increment; 753 growthLimitsWithoutMaximization += increment;
736 } 754 }
737 } 755 }
738 } 756 }
739 757
740 LayoutUnit LayoutGrid::computeUsedBreadthOfMinLength(const GridLength& gridLengt h, LayoutUnit maxSize) const 758 LayoutUnit LayoutGrid::computeUsedBreadthOfMinLength(const GridTrackSize& trackS ize, LayoutUnit maxSize) const
741 { 759 {
760 const GridLength& gridLength = trackSize.minTrackBreadth();
742 if (gridLength.isFlex()) 761 if (gridLength.isFlex())
743 return LayoutUnit(); 762 return LayoutUnit();
744 763
745 const Length& trackLength = gridLength.length(); 764 const Length& trackLength = gridLength.length();
746 if (trackLength.isSpecified()) 765 if (trackLength.isSpecified())
747 return valueForLength(trackLength, maxSize); 766 return valueForLength(trackLength, maxSize);
748 767
749 ASSERT(trackLength.isMinContent() || trackLength.isAuto() || trackLength.isM axContent()); 768 ASSERT(trackLength.isMinContent() || trackLength.isAuto() || trackLength.isM axContent());
750 return LayoutUnit(); 769 return LayoutUnit();
751 } 770 }
752 771
753 LayoutUnit LayoutGrid::computeUsedBreadthOfMaxLength(const GridLength& gridLengt h, LayoutUnit usedBreadth, LayoutUnit maxSize) const 772 LayoutUnit LayoutGrid::computeUsedBreadthOfMaxLength(const GridTrackSize& trackS ize, LayoutUnit usedBreadth, LayoutUnit maxSize) const
754 { 773 {
774 const GridLength& gridLength = trackSize.maxTrackBreadth();
755 if (gridLength.isFlex()) 775 if (gridLength.isFlex())
756 return usedBreadth; 776 return usedBreadth;
757 777
758 const Length& trackLength = gridLength.length(); 778 const Length& trackLength = gridLength.length();
759 if (trackLength.isSpecified()) 779 if (trackLength.isSpecified())
760 return valueForLength(trackLength, maxSize); 780 return valueForLength(trackLength, maxSize);
761 781
762 ASSERT(trackLength.isMinContent() || trackLength.isAuto() || trackLength.isM axContent()); 782 ASSERT(trackLength.isMinContent() || trackLength.isAuto() || trackLength.isM axContent());
763 return LayoutUnit(infinity); 783 return LayoutUnit(infinity);
764 } 784 }
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 return autoRepeatTrackStyles[autoRepeatLocalIndex % autoRepeatTrackStyle s.size()]; 894 return autoRepeatTrackStyles[autoRepeatLocalIndex % autoRepeatTrackStyle s.size()];
875 } 895 }
876 896
877 return trackStyles[untranslatedIndex - autoRepeatTracksCount]; 897 return trackStyles[untranslatedIndex - autoRepeatTracksCount];
878 } 898 }
879 899
880 GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size _t translatedIndex, SizingOperation sizingOperation) const 900 GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size _t translatedIndex, SizingOperation sizingOperation) const
881 { 901 {
882 // Collapse empty auto repeat tracks if auto-fit. 902 // Collapse empty auto repeat tracks if auto-fit.
883 if (hasAutoRepeatEmptyTracks(direction) && isEmptyAutoRepeatTrack(direction, translatedIndex)) 903 if (hasAutoRepeatEmptyTracks(direction) && isEmptyAutoRepeatTrack(direction, translatedIndex))
884 return { Length(Fixed), Length(Fixed) }; 904 return { Length(Fixed), LengthTrackSizing };
885 905
886 const GridTrackSize& trackSize = rawGridTrackSize(direction, translatedIndex ); 906 const GridTrackSize& trackSize = rawGridTrackSize(direction, translatedIndex );
907 if (trackSize.isFitContent())
908 return trackSize;
887 909
888 GridLength minTrackBreadth = trackSize.minTrackBreadth(); 910 GridLength minTrackBreadth = trackSize.minTrackBreadth();
889 GridLength maxTrackBreadth = trackSize.maxTrackBreadth(); 911 GridLength maxTrackBreadth = trackSize.maxTrackBreadth();
890
891 // If the logical width/height of the grid container is indefinite, percenta ge values are treated as <auto>. 912 // If the logical width/height of the grid container is indefinite, percenta ge values are treated as <auto>.
892 if (minTrackBreadth.hasPercentage() || maxTrackBreadth.hasPercentage()) { 913 if (minTrackBreadth.hasPercentage() || maxTrackBreadth.hasPercentage()) {
893 // For the inline axis this only happens when we're computing the intrin sic sizes (AvailableSpaceIndefinite). 914 // For the inline axis this only happens when we're computing the intrin sic sizes (AvailableSpaceIndefinite).
894 // For the block axis we check that the percentage height is resolvable on the first in-flow child. 915 // For the block axis we check that the percentage height is resolvable on the first in-flow child.
895 // TODO (lajava) This condition for determining whether a size is indefi nite or not is not working correctly for orthogonal flows. 916 // TODO (lajava) This condition for determining whether a size is indefi nite or not is not working correctly for orthogonal flows.
896 if ((sizingOperation == IntrinsicSizeComputation) || (direction == ForRo ws && firstInFlowChildBox() && !firstInFlowChildBox()->percentageLogicalHeightIs Resolvable())) { 917 if ((sizingOperation == IntrinsicSizeComputation) || (direction == ForRo ws && firstInFlowChildBox() && !firstInFlowChildBox()->percentageLogicalHeightIs Resolvable())) {
897 if (minTrackBreadth.hasPercentage()) 918 if (minTrackBreadth.hasPercentage())
898 minTrackBreadth = Length(Auto); 919 minTrackBreadth = Length(Auto);
899 if (maxTrackBreadth.hasPercentage()) 920 if (maxTrackBreadth.hasPercentage())
900 maxTrackBreadth = Length(Auto); 921 maxTrackBreadth = Length(Auto);
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
1089 resolveContentBasedTrackSizingFunctionsForItems<ResolveIntrinsicMinimums >(direction, sizingData, spanGroupRange); 1110 resolveContentBasedTrackSizingFunctionsForItems<ResolveIntrinsicMinimums >(direction, sizingData, spanGroupRange);
1090 resolveContentBasedTrackSizingFunctionsForItems<ResolveContentBasedMinim ums>(direction, sizingData, spanGroupRange); 1111 resolveContentBasedTrackSizingFunctionsForItems<ResolveContentBasedMinim ums>(direction, sizingData, spanGroupRange);
1091 resolveContentBasedTrackSizingFunctionsForItems<ResolveMaxContentMinimum s>(direction, sizingData, spanGroupRange); 1112 resolveContentBasedTrackSizingFunctionsForItems<ResolveMaxContentMinimum s>(direction, sizingData, spanGroupRange);
1092 resolveContentBasedTrackSizingFunctionsForItems<ResolveIntrinsicMaximums >(direction, sizingData, spanGroupRange); 1113 resolveContentBasedTrackSizingFunctionsForItems<ResolveIntrinsicMaximums >(direction, sizingData, spanGroupRange);
1093 resolveContentBasedTrackSizingFunctionsForItems<ResolveMaxContentMaximum s>(direction, sizingData, spanGroupRange); 1114 resolveContentBasedTrackSizingFunctionsForItems<ResolveMaxContentMaximum s>(direction, sizingData, spanGroupRange);
1094 it = spanGroupRange.rangeEnd; 1115 it = spanGroupRange.rangeEnd;
1095 } 1116 }
1096 1117
1097 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { 1118 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) {
1098 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; 1119 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex];
1099 if (track.growthLimitIsInfinite()) 1120 if (track.growthLimit() == infinity)
1100 track.setGrowthLimit(track.baseSize()); 1121 track.setGrowthLimit(track.baseSize());
1101 } 1122 }
1102 } 1123 }
1103 1124
1104 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid TrackSizingDirection direction, const GridSpan& span, LayoutBox& gridItem, GridT rack& track, GridSizingData& sizingData) const 1125 void LayoutGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid TrackSizingDirection direction, const GridSpan& span, LayoutBox& gridItem, GridT rack& track, GridSizingData& sizingData) const
1105 { 1126 {
1106 const size_t trackPosition = span.startLine(); 1127 const size_t trackPosition = span.startLine();
1107 GridTrackSize trackSize = gridTrackSize(direction, trackPosition, sizingData .sizingOperation); 1128 GridTrackSize trackSize = gridTrackSize(direction, trackPosition, sizingData .sizingOperation);
1108 1129
1109 if (trackSize.hasMinContentMinTrackBreadth()) 1130 if (trackSize.hasMinContentMinTrackBreadth())
1110 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem , direction, sizingData))); 1131 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem , direction, sizingData)));
1111 else if (trackSize.hasMaxContentMinTrackBreadth()) 1132 else if (trackSize.hasMaxContentMinTrackBreadth())
1112 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem , direction, sizingData))); 1133 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem , direction, sizingData)));
1113 else if (trackSize.hasAutoMinTrackBreadth()) 1134 else if (trackSize.hasAutoMinTrackBreadth())
1114 track.setBaseSize(std::max(track.baseSize(), minSizeForChild(gridItem, d irection, sizingData))); 1135 track.setBaseSize(std::max(track.baseSize(), minSizeForChild(gridItem, d irection, sizingData)));
1115 1136
1116 if (trackSize.hasMinContentMaxTrackBreadth()) 1137 if (trackSize.hasMinContentMaxTrackBreadth()) {
1117 track.setGrowthLimit(std::max(track.growthLimit(), minContentForChild(gr idItem, direction, sizingData))); 1138 track.setGrowthLimit(std::max(track.growthLimit(), minContentForChild(gr idItem, direction, sizingData)));
1118 else if (trackSize.hasMaxContentOrAutoMaxTrackBreadth()) 1139 } else if (trackSize.hasMaxContentOrAutoMaxTrackBreadth()) {
1119 track.setGrowthLimit(std::max(track.growthLimit(), maxContentForChild(gr idItem, direction, sizingData))); 1140 LayoutUnit growthLimit = maxContentForChild(gridItem, direction, sizingD ata);
1141 if (trackSize.isFitContent()) {
1142 DCHECK(trackSize.length().isLength());
1143 growthLimit = std::min(growthLimit, valueForLength(trackSize.length( ).length(), sizingData.availableSpace()));
1144 }
1145 track.setGrowthLimit(std::max(track.growthLimit(), growthLimit));
1146 }
1120 } 1147 }
1121 1148
1122 static const LayoutUnit& trackSizeForTrackSizeComputationPhase(TrackSizeComputat ionPhase phase, const GridTrack& track, TrackSizeRestriction restriction) 1149 static LayoutUnit trackSizeForTrackSizeComputationPhase(TrackSizeComputationPhas e phase, const GridTrack& track, TrackSizeRestriction restriction)
1123 { 1150 {
1124 switch (phase) { 1151 switch (phase) {
1125 case ResolveIntrinsicMinimums: 1152 case ResolveIntrinsicMinimums:
1126 case ResolveContentBasedMinimums: 1153 case ResolveContentBasedMinimums:
1127 case ResolveMaxContentMinimums: 1154 case ResolveMaxContentMinimums:
1128 case MaximizeTracks: 1155 case MaximizeTracks:
1129 return track.baseSize(); 1156 return track.baseSize();
1130 case ResolveIntrinsicMaximums: 1157 case ResolveIntrinsicMaximums:
1131 case ResolveMaxContentMaximums: 1158 case ResolveMaxContentMaximums:
1132 const LayoutUnit& growthLimit = track.growthLimit(); 1159 const LayoutUnit& growthLimit = track.growthLimit();
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1289 GridTrack& track = tracks[trackIndex]; 1316 GridTrack& track = tracks[trackIndex];
1290 markAsInfinitelyGrowableForTrackSizeComputationPhase(phase, track); 1317 markAsInfinitelyGrowableForTrackSizeComputationPhase(phase, track);
1291 updateTrackSizeForTrackSizeComputationPhase(phase, track); 1318 updateTrackSizeForTrackSizeComputationPhase(phase, track);
1292 } 1319 }
1293 } 1320 }
1294 1321
1295 static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTr ack* track2) 1322 static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTr ack* track2)
1296 { 1323 {
1297 // This check ensures that we respect the irreflexivity property of the stri ct weak ordering required by std::sort 1324 // This check ensures that we respect the irreflexivity property of the stri ct weak ordering required by std::sort
1298 // (forall x: NOT x < x). 1325 // (forall x: NOT x < x).
1299 if (track1->infiniteGrowthPotential() && track2->infiniteGrowthPotential()) 1326 bool track1HasInfiniteGrowthPotentialWithoutCap = track1->infiniteGrowthPote ntial() && !track1->growthLimitCap();
1327 bool track2HasInfiniteGrowthPotentialWithoutCap = track2->infiniteGrowthPote ntial() && !track2->growthLimitCap();
1328
1329 if (track1HasInfiniteGrowthPotentialWithoutCap && track2HasInfiniteGrowthPot entialWithoutCap)
1300 return false; 1330 return false;
1301 1331
1302 if (track1->infiniteGrowthPotential() || track2->infiniteGrowthPotential()) 1332 if (track1HasInfiniteGrowthPotentialWithoutCap || track2HasInfiniteGrowthPot entialWithoutCap)
1303 return track2->infiniteGrowthPotential(); 1333 return track2HasInfiniteGrowthPotentialWithoutCap;
1304 1334
1305 return (track1->growthLimit() - track1->baseSize()) < (track2->growthLimit() - track2->baseSize()); 1335 LayoutUnit track1Limit = track1->growthLimitCap().value_or(track1->growthLim it());
1336 LayoutUnit track2Limit = track2->growthLimitCap().value_or(track2->growthLim it());
1337 return (track1Limit - track1->baseSize()) < (track2Limit - track2->baseSize( ));
1338 }
1339
1340 static void clampGrowthShareIfNeeded(TrackSizeComputationPhase phase, const Grid Track& track, LayoutUnit& growthShare)
1341 {
1342 if (phase != ResolveMaxContentMaximums || !track.growthLimitCap())
1343 return;
1344
1345 LayoutUnit distanceToCap = track.growthLimitCap().value() - track.sizeDuring Distribution();
1346 if (distanceToCap <= 0)
1347 return;
1348
1349 growthShare = std::min(growthShare, distanceToCap);
1306 } 1350 }
1307 1351
1308 template <TrackSizeComputationPhase phase> 1352 template <TrackSizeComputationPhase phase>
1309 void LayoutGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, const Vecto r<GridTrack*>* growBeyondGrowthLimitsTracks, GridSizingData& sizingData, LayoutU nit& availableLogicalSpace) const 1353 void LayoutGrid::distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<Grid Track*>* growBeyondGrowthLimitsTracks, GridSizingData& sizingData, LayoutUnit& a vailableLogicalSpace) const
1310 { 1354 {
1311 ASSERT(availableLogicalSpace >= 0); 1355 ASSERT(availableLogicalSpace >= 0);
1312 1356
1313 for (auto* track : tracks) 1357 for (auto* track : tracks)
1314 track->setSizeDuringDistribution(trackSizeForTrackSizeComputationPhase(p hase, *track, ForbidInfinity)); 1358 track->setSizeDuringDistribution(trackSizeForTrackSizeComputationPhase(p hase, *track, ForbidInfinity));
1315 1359
1316 if (availableLogicalSpace > 0) { 1360 if (availableLogicalSpace > 0) {
1317 std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential); 1361 std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential);
1318 1362
1319 size_t tracksSize = tracks.size(); 1363 size_t tracksSize = tracks.size();
1320 for (size_t i = 0; i < tracksSize; ++i) { 1364 for (size_t i = 0; i < tracksSize; ++i) {
1321 GridTrack& track = *tracks[i]; 1365 GridTrack& track = *tracks[i];
1322 LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tra cksSize - i); 1366 LayoutUnit availableLogicalSpaceShare = availableLogicalSpace / (tra cksSize - i);
1323 const LayoutUnit& trackBreadth = trackSizeForTrackSizeComputationPha se(phase, track, ForbidInfinity); 1367 const LayoutUnit& trackBreadth = trackSizeForTrackSizeComputationPha se(phase, track, ForbidInfinity);
1324 LayoutUnit growthShare = track.infiniteGrowthPotential() ? available LogicalSpaceShare : std::min(availableLogicalSpaceShare, track.growthLimit() - t rackBreadth); 1368 LayoutUnit growthShare = track.infiniteGrowthPotential() ? available LogicalSpaceShare : std::min(availableLogicalSpaceShare, track.growthLimit() - t rackBreadth);
1369 clampGrowthShareIfNeeded(phase, track, growthShare);
1325 DCHECK_GE(growthShare, 0) << "We must never shrink any grid track or else we can't guarantee we abide by our min-sizing function."; 1370 DCHECK_GE(growthShare, 0) << "We must never shrink any grid track or else we can't guarantee we abide by our min-sizing function.";
1326 track.growSizeDuringDistribution(growthShare); 1371 track.growSizeDuringDistribution(growthShare);
1327 availableLogicalSpace -= growthShare; 1372 availableLogicalSpace -= growthShare;
1328 } 1373 }
1329 } 1374 }
1330 1375
1331 if (availableLogicalSpace > 0 && growBeyondGrowthLimitsTracks) { 1376 if (availableLogicalSpace > 0 && growBeyondGrowthLimitsTracks) {
1377 // We need to sort them because there might be tracks with growth limit caps (like the ones
1378 // with fit-content()) which cannot indefinitely grow over the limits.
1379 if (phase == ResolveMaxContentMaximums)
1380 std::sort(growBeyondGrowthLimitsTracks->begin(), growBeyondGrowthLim itsTracks->end(), sortByGridTrackGrowthPotential);
1381
1332 size_t tracksGrowingAboveMaxBreadthSize = growBeyondGrowthLimitsTracks-> size(); 1382 size_t tracksGrowingAboveMaxBreadthSize = growBeyondGrowthLimitsTracks-> size();
1333 for (size_t i = 0; i < tracksGrowingAboveMaxBreadthSize; ++i) { 1383 for (size_t i = 0; i < tracksGrowingAboveMaxBreadthSize; ++i) {
1334 GridTrack* track = growBeyondGrowthLimitsTracks->at(i); 1384 GridTrack* track = growBeyondGrowthLimitsTracks->at(i);
1335 LayoutUnit growthShare = availableLogicalSpace / (tracksGrowingAbove MaxBreadthSize - i); 1385 LayoutUnit growthShare = availableLogicalSpace / (tracksGrowingAbove MaxBreadthSize - i);
1386 clampGrowthShareIfNeeded(phase, *track, growthShare);
1387 DCHECK_GE(growthShare, 0) << "We must never shrink any grid track or else we can't guarantee we abide by our min-sizing function.";
1336 track->growSizeDuringDistribution(growthShare); 1388 track->growSizeDuringDistribution(growthShare);
1337 availableLogicalSpace -= growthShare; 1389 availableLogicalSpace -= growthShare;
1338 } 1390 }
1339 } 1391 }
1340 1392
1341 for (auto* track : tracks) 1393 for (auto* track : tracks)
1342 track->setPlannedSize(track->plannedSize() == infinity ? track->sizeDuri ngDistribution() : std::max(track->plannedSize(), track->sizeDuringDistribution( ))); 1394 track->setPlannedSize(track->plannedSize() == infinity ? track->sizeDuri ngDistribution() : std::max(track->plannedSize(), track->sizeDuringDistribution( )));
1343 } 1395 }
1344 1396
1345 #if ENABLE(ASSERT) 1397 #if ENABLE(ASSERT)
1346 bool LayoutGrid::tracksAreWiderThanMinTrackBreadth(GridTrackSizingDirection dire ction, GridSizingData& sizingData) 1398 bool LayoutGrid::tracksAreWiderThanMinTrackBreadth(GridTrackSizingDirection dire ction, GridSizingData& sizingData)
1347 { 1399 {
1348 const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.col umnTracks : sizingData.rowTracks; 1400 const Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.col umnTracks : sizingData.rowTracks;
1349 LayoutUnit& maxSize = sizingData.freeSpaceForDirection(direction); 1401 LayoutUnit& maxSize = sizingData.freeSpace(direction);
1350 for (size_t i = 0; i < tracks.size(); ++i) { 1402 for (size_t i = 0; i < tracks.size(); ++i) {
1351 GridTrackSize trackSize = gridTrackSize(direction, i, sizingData.sizingO peration); 1403 GridTrackSize trackSize = gridTrackSize(direction, i, sizingData.sizingO peration);
1352 const GridLength& minTrackBreadth = trackSize.minTrackBreadth(); 1404 if (computeUsedBreadthOfMinLength(trackSize, maxSize) > tracks[i].baseSi ze())
1353 if (computeUsedBreadthOfMinLength(minTrackBreadth, maxSize) > tracks[i]. baseSize())
1354 return false; 1405 return false;
1355 } 1406 }
1356 return true; 1407 return true;
1357 } 1408 }
1358 #endif 1409 #endif
1359 1410
1360 void LayoutGrid::ensureGridSize(size_t maximumRowSize, size_t maximumColumnSize) 1411 void LayoutGrid::ensureGridSize(size_t maximumRowSize, size_t maximumColumnSize)
1361 { 1412 {
1362 const size_t oldRowSize = gridRowCount(); 1413 const size_t oldRowSize = gridRowCount();
1363 if (maximumRowSize > oldRowSize) { 1414 if (maximumRowSize > oldRowSize) {
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
1792 } 1843 }
1793 1844
1794 static const StyleContentAlignmentData& contentAlignmentNormalBehavior() 1845 static const StyleContentAlignmentData& contentAlignmentNormalBehavior()
1795 { 1846 {
1796 static const StyleContentAlignmentData normalBehavior = {ContentPositionNorm al, ContentDistributionStretch}; 1847 static const StyleContentAlignmentData normalBehavior = {ContentPositionNorm al, ContentDistributionStretch};
1797 return normalBehavior; 1848 return normalBehavior;
1798 } 1849 }
1799 1850
1800 void LayoutGrid::applyStretchAlignmentToTracksIfNeeded(GridTrackSizingDirection direction, GridSizingData& sizingData) 1851 void LayoutGrid::applyStretchAlignmentToTracksIfNeeded(GridTrackSizingDirection direction, GridSizingData& sizingData)
1801 { 1852 {
1802 LayoutUnit& availableSpace = sizingData.freeSpaceForDirection(direction); 1853 LayoutUnit& availableSpace = sizingData.freeSpace(direction);
1803 if (availableSpace <= 0 1854 if (availableSpace <= 0
1804 || (direction == ForColumns && styleRef().resolvedJustifyContentDistribu tion(contentAlignmentNormalBehavior()) != ContentDistributionStretch) 1855 || (direction == ForColumns && styleRef().resolvedJustifyContentDistribu tion(contentAlignmentNormalBehavior()) != ContentDistributionStretch)
1805 || (direction == ForRows && styleRef().resolvedAlignContentDistribution( contentAlignmentNormalBehavior()) != ContentDistributionStretch)) 1856 || (direction == ForRows && styleRef().resolvedAlignContentDistribution( contentAlignmentNormalBehavior()) != ContentDistributionStretch))
1806 return; 1857 return;
1807 1858
1808 // Spec defines auto-sized tracks as the ones with an 'auto' max-sizing func tion. 1859 // Spec defines auto-sized tracks as the ones with an 'auto' max-sizing func tion.
1809 Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTra cks : sizingData.rowTracks; 1860 Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTra cks : sizingData.rowTracks;
1810 Vector<unsigned> autoSizedTracksIndex; 1861 Vector<unsigned> autoSizedTracksIndex;
1811 for (unsigned i = 0; i < tracks.size(); ++i) { 1862 for (unsigned i = 0; i < tracks.size(); ++i) {
1812 const GridTrackSize& trackSize = gridTrackSize(direction, i); 1863 const GridTrackSize& trackSize = gridTrackSize(direction, i);
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
2077 // except the last one, which is the only one considered as a final grid lin e of a track. 2128 // except the last one, which is the only one considered as a final grid lin e of a track.
2078 2129
2079 // The grid container's frame elements (border, padding and <content-positio n> offset) are sensible to the 2130 // The grid container's frame elements (border, padding and <content-positio n> offset) are sensible to the
2080 // inline-axis flow direction. However, column lines positions are 'directio n' unaware. This simplification 2131 // inline-axis flow direction. However, column lines positions are 'directio n' unaware. This simplification
2081 // allows us to use the same indexes to identify the columns independently o n the inline-axis direction. 2132 // allows us to use the same indexes to identify the columns independently o n the inline-axis direction.
2082 bool isRowAxis = direction == ForColumns; 2133 bool isRowAxis = direction == ForColumns;
2083 auto& tracks = isRowAxis ? sizingData.columnTracks : sizingData.rowTracks; 2134 auto& tracks = isRowAxis ? sizingData.columnTracks : sizingData.rowTracks;
2084 size_t numberOfTracks = tracks.size(); 2135 size_t numberOfTracks = tracks.size();
2085 size_t numberOfLines = numberOfTracks + 1; 2136 size_t numberOfLines = numberOfTracks + 1;
2086 size_t lastLine = numberOfLines - 1; 2137 size_t lastLine = numberOfLines - 1;
2087 ContentAlignmentData offset = computeContentPositionAndDistributionOffset(di rection, sizingData.freeSpaceForDirection(direction), numberOfTracks); 2138 ContentAlignmentData offset = computeContentPositionAndDistributionOffset(di rection, sizingData.freeSpace(direction), numberOfTracks);
2088 auto& positions = isRowAxis ? m_columnPositions : m_rowPositions; 2139 auto& positions = isRowAxis ? m_columnPositions : m_rowPositions;
2089 positions.resize(numberOfLines); 2140 positions.resize(numberOfLines);
2090 auto borderAndPadding = isRowAxis ? borderAndPaddingLogicalLeft() : borderAn dPaddingBefore(); 2141 auto borderAndPadding = isRowAxis ? borderAndPaddingLogicalLeft() : borderAn dPaddingBefore();
2091 positions[0] = borderAndPadding + offset.positionOffset; 2142 positions[0] = borderAndPadding + offset.positionOffset;
2092 if (numberOfLines > 1) { 2143 if (numberOfLines > 1) {
2093 // If we have collapsed tracks we just ignore gaps here and add them lat er as we might not 2144 // If we have collapsed tracks we just ignore gaps here and add them lat er as we might not
2094 // compute the gap between two consecutive tracks without examining the surrounding ones. 2145 // compute the gap between two consecutive tracks without examining the surrounding ones.
2095 bool hasCollapsedTracks = hasAutoRepeatEmptyTracks(direction); 2146 bool hasCollapsedTracks = hasAutoRepeatEmptyTracks(direction);
2096 LayoutUnit gap = !hasCollapsedTracks ? gridGapForDirection(direction) : LayoutUnit(); 2147 LayoutUnit gap = !hasCollapsedTracks ? gridGapForDirection(direction) : LayoutUnit();
2097 size_t nextToLastLine = numberOfLines - 2; 2148 size_t nextToLastLine = numberOfLines - 2;
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after
2602 return isOrthogonalChild(child) ? childLocation.transposedPoint() : childLoc ation; 2653 return isOrthogonalChild(child) ? childLocation.transposedPoint() : childLoc ation;
2603 } 2654 }
2604 2655
2605 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const 2656 void LayoutGrid::paintChildren(const PaintInfo& paintInfo, const LayoutPoint& pa intOffset) const
2606 { 2657 {
2607 if (!m_gridItemArea.isEmpty()) 2658 if (!m_gridItemArea.isEmpty())
2608 GridPainter(*this).paintChildren(paintInfo, paintOffset); 2659 GridPainter(*this).paintChildren(paintInfo, paintOffset);
2609 } 2660 }
2610 2661
2611 } // namespace blink 2662 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutGrid.h ('k') | third_party/WebKit/Source/core/style/GridTrackSize.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698