Changeset 283439 in webkit
- Timestamp:
- Oct 2, 2021, 5:38:36 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 7 edited
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-001-expected.txt (modified) (2 diffs)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-002-expected.txt (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-003-expected.txt (modified) (4 diffs)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp (modified) (13 diffs)
-
Source/WebCore/rendering/GridTrackSizingAlgorithm.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/imported/w3c/ChangeLog
r283438 r283439 1 2021-10-02 Ziran Sun <zsun@igalia.com> 2 3 [css-grid] Accommodate spanning items crossing flexible tracks 4 https://bugs.webkit.org/show_bug.cgi?id=230252 5 6 Reviewed by Sergio Villar Senin. 7 8 Three tests are passing and the test expectation files are updated. 9 10 * web-platform-tests/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-001-expected.txt: 11 * web-platform-tests/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-002-expected.txt: 12 * web-platform-tests/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-003-expected.txt: 13 1 14 2021-10-02 Youenn Fablet <youenn@apple.com> 2 15 -
trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-001-expected.txt
r279269 r283439 8 8 PASS 'grid' with: grid-template-columns: minmax(0, 2fr); and grid-template-rows: minmax(0, 2fr); 9 9 PASS 'grid' with: grid-template-columns: minmax(75px, 1fr); and grid-template-rows: minmax(75px, 1fr); 10 FAIL 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; assert_in_array: gridTemplateColumns value "0px 0px" not in array ["50px 50px"] 11 FAIL 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 50px" not in array ["0px 100px"] 12 FAIL 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["100px 0px"] 13 FAIL 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr; assert_in_array: gridTemplateColumns value "25px 25px" not in array ["50px 50px"] 14 FAIL 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr; assert_in_array: gridTemplateColumns value "12.5px 37.5px" not in array ["25px 75px"] 15 FAIL 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 0px 50px" not in array ["50px 50px 0px"] 10 PASS 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; 11 PASS 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr; 12 PASS 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr; 13 PASS 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr; 14 PASS 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr; 15 PASS 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; 16 16 PASS 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 0fr); 17 17 PASS 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 1fr); … … 19 19 PASS 'grid' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(20px, 1fr) minmax(0, 1fr); 20 20 PASS 'grid' with: grid-template-columns: minmax(30px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(30px, 1fr) minmax(0, 1fr); 21 FAIL 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); assert_in_array: gridTemplateColumns value "0px 0px" not in array ["100px 0px"] 22 FAIL 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "0px 50px" not in array ["100px 0px"] 23 FAIL 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "25px 25px" not in array ["100px 0px"] 24 FAIL 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr); assert_in_array: gridTemplateColumns value "25px 25px" not in array ["75px 25px"] 25 FAIL 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; assert_in_array: gridTemplateColumns value "0px 50px" not in array ["100px 0px"] 26 FAIL 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["100px 0px"] 27 FAIL 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content; assert_in_array: gridTemplateColumns value "50px 0px" not in array ["100px 0px"] 21 PASS 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); 22 PASS 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); 23 PASS 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); 24 PASS 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr); 25 PASS 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; 26 PASS 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto; 27 PASS 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content; 28 28 PASS 'grid' with: grid-template-columns: minmax(0, 0fr) auto; and grid-template-rows: minmax(0, 0fr) auto; 29 29 PASS 'grid' with: grid-template-columns: minmax(0, 1fr) auto; and grid-template-rows: minmax(0, 1fr) auto; -
trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-002-expected.txt
r279269 r283439 1 1 2 FAIL 'grid' with: grid-template-columns: 1fr auto auto auto; and grid-template-rows: 1fr auto auto auto; assert_in_array: gridTemplateColumns value "0px 50px 50px 50px" not in array ["10px 50px 50px 50px"] 2 PASS 'grid' with: grid-template-columns: 1fr auto auto auto; and grid-template-rows: 1fr auto auto auto; 3 3 PASS 'grid' with: grid-template-columns: minmax(0, 1fr) auto auto auto; and grid-template-rows: minmax(0, 1fr) auto auto auto; 4 FAIL 'grid' with: grid-template-columns: 1fr 1fr 1fr 1fr; and grid-template-rows: 1fr 1fr 1fr 1fr; assert_in_array: gridTemplateColumns value "12.5px 12.5px 12.5px 12.5px" not in array ["30px 50px 50px 50px"] 5 FAIL 'grid' with: grid-template-columns: 1fr 1fr 1fr 4fr; and grid-template-rows: 1fr 1fr 1fr 4fr; assert_in_array: gridTemplateColumns value "7.140625px 7.140625px 7.140625px 28.5625px" not in array ["30px 30px 25px 100px"] 6 FAIL 'grid' with: grid-template-columns: 1fr 1fr 1fr; and grid-template-rows: 1fr 1fr 1fr; assert_in_array: gridTemplateColumns value "60px 0px 0px" not in array ["60px 50px 50px"] 4 PASS 'grid' with: grid-template-columns: 1fr 1fr 1fr 1fr; and grid-template-rows: 1fr 1fr 1fr 1fr; 5 PASS 'grid' with: grid-template-columns: 1fr 1fr 1fr 4fr; and grid-template-rows: 1fr 1fr 1fr 4fr; 6 PASS 'grid' with: grid-template-columns: 1fr 1fr 1fr; and grid-template-rows: 1fr 1fr 1fr; 7 7 -
trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-003-expected.txt
r267650 r283439 42 42 PASS min-content min item 'grid' with: grid-template-columns: minmax(0, 2fr); and grid-template-rows: minmax(0, 2fr); 43 43 PASS min-content min item 'grid' with: grid-template-columns: minmax(75px, 1fr); and grid-template-rows: minmax(75px, 1fr); 44 FAIL min-content min item 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; assert_in_array: gridTemplateColumns value "0px 0px" not in array ["50px 50px"] 45 FAIL min-content min item 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 60px" not in array ["0px 100px"] 46 FAIL min-content min item 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr; assert_in_array: gridTemplateColumns value "60px 0px" not in array ["100px 0px"] 47 FAIL min-content min item 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr; assert_in_array: gridTemplateColumns value "30px 30px" not in array ["50px 50px"] 48 FAIL min-content min item 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr; assert_in_array: gridTemplateColumns value "15px 45px" not in array ["25px 75px"] 49 FAIL min-content min item 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 0px 60px" not in array ["50px 50px 0px"] 44 PASS min-content min item 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; 45 PASS min-content min item 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr; 46 PASS min-content min item 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr; 47 PASS min-content min item 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr; 48 PASS min-content min item 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr; 49 PASS min-content min item 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; 50 50 PASS min-content min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 0fr); 51 51 PASS min-content min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 1fr); … … 53 53 PASS min-content min item 'grid' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(20px, 1fr) minmax(0, 1fr); 54 54 PASS min-content min item 'grid' with: grid-template-columns: minmax(40px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(40px, 1fr) minmax(0, 1fr); 55 FAIL min-content min item 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); assert_in_array: gridTemplateColumns value "0px 0px" not in array ["100px 0px"] 56 FAIL min-content min item 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "0px 60px" not in array ["100px 0px"] 57 FAIL min-content min item 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "30px 30px" not in array ["100px 0px"] 58 FAIL min-content min item 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr); assert_in_array: gridTemplateColumns value "30px 30px" not in array ["75px 25px"] 59 FAIL min-content min item 'grid' with: grid-template-columns: 0fr min-content; and grid-template-rows: 0fr min-content; assert_in_array: gridTemplateColumns value "0px 0px" not in array ["100px 0px"] 60 FAIL min-content min item 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; assert_in_array: gridTemplateColumns value "0px 60px" not in array ["100px 0px"] 61 FAIL min-content min item 'grid' with: grid-template-columns: 0.5fr auto; and grid-template-rows: 0.5fr auto; assert_in_array: gridTemplateColumns value "30px 30px" not in array ["100px 0px"] 62 FAIL min-content min item 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto; assert_in_array: gridTemplateColumns value "60px 0px" not in array ["100px 0px"] 63 FAIL min-content min item 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content; assert_in_array: gridTemplateColumns value "60px 0px" not in array ["100px 0px"] 64 FAIL min-content min item 'grid' with: grid-template-columns: 1fr min-content; and grid-template-rows: 1fr min-content; assert_in_array: gridTemplateColumns value "60px 0px" not in array ["100px 0px"] 55 PASS min-content min item 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); 56 PASS min-content min item 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); 57 PASS min-content min item 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); 58 PASS min-content min item 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr); 59 PASS min-content min item 'grid' with: grid-template-columns: 0fr min-content; and grid-template-rows: 0fr min-content; 60 PASS min-content min item 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; 61 PASS min-content min item 'grid' with: grid-template-columns: 0.5fr auto; and grid-template-rows: 0.5fr auto; 62 PASS min-content min item 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto; 63 PASS min-content min item 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content; 64 PASS min-content min item 'grid' with: grid-template-columns: 1fr min-content; and grid-template-rows: 1fr min-content; 65 65 PASS min-content min item 'grid' with: grid-template-columns: minmax(0, 0fr) min-content; and grid-template-rows: minmax(0, 0fr) min-content; 66 66 PASS min-content min item 'grid' with: grid-template-columns: minmax(0, 0fr) auto; and grid-template-rows: minmax(0, 0fr) auto; … … 76 76 PASS 50px min item 'grid' with: grid-template-columns: minmax(0, 2fr); and grid-template-rows: minmax(0, 2fr); 77 77 PASS 50px min item 'grid' with: grid-template-columns: minmax(75px, 1fr); and grid-template-rows: minmax(75px, 1fr); 78 FAIL 50px min item 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; assert_in_array: gridTemplateColumns value "0px 0px" not in array ["25px 25px"] 78 PASS 50px min item 'grid' with: grid-template-columns: 0fr 0fr; and grid-template-rows: 0fr 0fr; 79 79 PASS 50px min item 'grid' with: grid-template-columns: 0fr 1fr; and grid-template-rows: 0fr 1fr; 80 80 PASS 50px min item 'grid' with: grid-template-columns: 1fr 0fr; and grid-template-rows: 1fr 0fr; 81 81 PASS 50px min item 'grid' with: grid-template-columns: 1fr 1fr; and grid-template-rows: 1fr 1fr; 82 82 PASS 50px min item 'grid' with: grid-template-columns: 1fr 3fr; and grid-template-rows: 1fr 3fr; 83 FAIL 50px min item 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; assert_in_array: gridTemplateColumns value "0px 0px 60px" not in array ["25px 25px 10px"] 83 PASS 50px min item 'grid' with: grid-template-columns: 0fr 0fr 1fr; and grid-template-rows: 0fr 0fr 1fr; 84 84 PASS 50px min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 0fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 0fr); 85 85 PASS 50px min item 'grid' with: grid-template-columns: minmax(0, 0fr) minmax(0, 1fr); and grid-template-rows: minmax(0, 0fr) minmax(0, 1fr); … … 87 87 PASS 50px min item 'grid' with: grid-template-columns: minmax(20px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(20px, 1fr) minmax(0, 1fr); 88 88 PASS 50px min item 'grid' with: grid-template-columns: minmax(40px, 1fr) minmax(0, 1fr); and grid-template-rows: minmax(40px, 1fr) minmax(0, 1fr); 89 FAIL 50px min item 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); assert_in_array: gridTemplateColumns value "0px 0px" not in array ["50px 0px"] 90 FAIL 50px min item 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "0px 60px" not in array ["50px 10px"] 91 FAIL 50px min item 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); assert_in_array: gridTemplateColumns value "30px 30px" not in array ["50px 10px"] 89 PASS 50px min item 'grid' with: grid-template-columns: 0fr minmax(0, 0fr); and grid-template-rows: 0fr minmax(0, 0fr); 90 PASS 50px min item 'grid' with: grid-template-columns: 0fr minmax(0, 1fr); and grid-template-rows: 0fr minmax(0, 1fr); 91 PASS 50px min item 'grid' with: grid-template-columns: 1fr minmax(0, 1fr); and grid-template-rows: 1fr minmax(0, 1fr); 92 92 PASS 50px min item 'grid' with: grid-template-columns: 1fr minmax(25px, 1fr); and grid-template-rows: 1fr minmax(25px, 1fr); 93 FAIL 50px min item 'grid' with: grid-template-columns: 0fr min-content; and grid-template-rows: 0fr min-content; assert_in_array: gridTemplateColumns value "0px 0px" not in array ["50px 0px"] 94 FAIL 50px min item 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; assert_in_array: gridTemplateColumns value "0px 60px" not in array ["50px 10px"] 95 FAIL 50px min item 'grid' with: grid-template-columns: 0.5fr auto; and grid-template-rows: 0.5fr auto; assert_in_array: gridTemplateColumns value "30px 30px" not in array ["50px 10px"] 93 PASS 50px min item 'grid' with: grid-template-columns: 0fr min-content; and grid-template-rows: 0fr min-content; 94 PASS 50px min item 'grid' with: grid-template-columns: 0fr auto; and grid-template-rows: 0fr auto; 95 PASS 50px min item 'grid' with: grid-template-columns: 0.5fr auto; and grid-template-rows: 0.5fr auto; 96 96 PASS 50px min item 'grid' with: grid-template-columns: 1fr auto; and grid-template-rows: 1fr auto; 97 97 PASS 50px min item 'grid' with: grid-template-columns: 1fr max-content; and grid-template-rows: 1fr max-content; -
trunk/Source/WebCore/ChangeLog
r283438 r283439 1 2021-10-02 Ziran Sun <zsun@igalia.com> 2 3 [css-grid] Accommodate spanning items crossing flexible tracks 4 https://bugs.webkit.org/show_bug.cgi?id=230252 5 6 Reviewed by Sergio Villar Senin. 7 8 CSS spec has added one more step at https://drafts.csswg.org/css-grid/#algo-spanning-flex-items 9 for resolving intrinsic track sizes. Basically, increasing sizes to accommodate spanning items 10 crossing flexible tracks instead of ignoring their contents completely. 11 12 This patch is an import of obrufau's work in chromium. Initial CL is at 13 https://chromium-review.googlesource.com/c/chromium/src/+/1492337/16..20. 14 The performance issue caused by the patch were fixed at https://bugs.webkit.org/show_bug.cgi?id=207852 15 for webkit and https://bugs.chromium.org/p/chromium/issues/detail?id=1021929 for chromium. 16 This change also addresses web compat issue raised at https://github.com/w3c/csswg-drafts/issues/4783. 17 18 * rendering/GridTrackSizingAlgorithm.cpp: 19 (WebCore::GridTrackSizingAlgorithm::initialGrowthLimit const): 20 (WebCore::GridTrackSizingAlgorithm::spanningItemCrossesFlexibleSizedTracks const): 21 (WebCore::GridTrackSizingAlgorithm::increaseSizesToAccommodateSpanningItems): 22 (WebCore::getSizeDistributionWeight): 23 (WebCore::distributeItemIncurredIncreaseToTrack): 24 (WebCore::distributeItemIncurredIncreases): 25 (WebCore::GridTrackSizingAlgorithm::distributeSpaceToTracks const): 26 (WebCore::GridTrackSizingAlgorithmStrategy::minSizeForChild const): 27 (WebCore::GridTrackSizingAlgorithm::resolveIntrinsicTrackSizes): 28 * rendering/GridTrackSizingAlgorithm.h: 29 (WebCore::GridTrackSizingAlgorithmStrategy::distributeSpaceToTracks const): 30 1 31 2021-10-02 Youenn Fablet <youenn@apple.com> 2 32 -
trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.cpp
r282801 r283439 228 228 const GridLength& gridLength = trackSize.maxTrackBreadth(); 229 229 if (gridLength.isFlex()) 230 return baseSize;230 return trackSize.minTrackBreadth().isContentSized() ? LayoutUnit(infinity) : baseSize; 231 231 232 232 const Length& trackLength = gridLength.length(); … … 266 266 for (auto trackPosition : itemSpan) { 267 267 const auto& trackSize = trackList[trackPosition].cachedTrackSize(); 268 if (trackSize.m axTrackBreadth().isFlex())268 if (trackSize.minTrackBreadth().isFlex() || trackSize.maxTrackBreadth().isFlex()) 269 269 return true; 270 270 } … … 423 423 } 424 424 425 template <TrackSizeComputation Phase phase>425 template <TrackSizeComputationVariant variant, TrackSizeComputationPhase phase> 426 426 void GridTrackSizingAlgorithm::increaseSizesToAccommodateSpanningItems(const GridItemsSpanGroupRange& gridItemsWithSpan) 427 427 { … … 436 436 for (auto it = gridItemsWithSpan.rangeStart; it != gridItemsWithSpan.rangeEnd; ++it) { 437 437 GridItemWithSpan& gridItemWithSpan = *it; 438 ASSERT(gridItemWithSpan.span().integerSpan() > 1);439 438 const GridSpan& itemSpan = gridItemWithSpan.span(); 439 ASSERT(variant == TrackSizeComputationVariant::CrossingFlexibleTracks || itemSpan.integerSpan() > 1u); 440 440 441 441 filteredTracks.shrink(0); … … 446 446 const auto& trackSize = track.cachedTrackSize(); 447 447 spanningTracksSize += trackSizeForTrackSizeComputationPhase(phase, track, ForbidInfinity); 448 if (variant == TrackSizeComputationVariant::CrossingFlexibleTracks && !trackSize.maxTrackBreadth().isFlex()) 449 continue; 448 450 if (!shouldProcessTrackForTrackSizeComputationPhase(phase, trackSize)) 449 451 continue; … … 463 465 extraSpace = std::max<LayoutUnit>(extraSpace, 0); 464 466 auto& tracksToGrowBeyondGrowthLimits = growBeyondGrowthLimitsTracks.isEmpty() ? filteredTracks : growBeyondGrowthLimitsTracks; 465 distributeSpaceToTracks< phase>(filteredTracks, &tracksToGrowBeyondGrowthLimits, extraSpace);467 distributeSpaceToTracks<variant, phase>(filteredTracks, &tracksToGrowBeyondGrowthLimits, extraSpace); 466 468 } 467 469 … … 473 475 } 474 476 477 template <TrackSizeComputationVariant variant> 478 void GridTrackSizingAlgorithm::increaseSizesToAccommodateSpanningItems(const GridItemsSpanGroupRange& gridItemsWithSpan) 479 { 480 increaseSizesToAccommodateSpanningItems<variant, ResolveIntrinsicMinimums>(gridItemsWithSpan); 481 increaseSizesToAccommodateSpanningItems<variant, ResolveContentBasedMinimums>(gridItemsWithSpan); 482 increaseSizesToAccommodateSpanningItems<variant, ResolveMaxContentMinimums>(gridItemsWithSpan); 483 increaseSizesToAccommodateSpanningItems<variant, ResolveIntrinsicMaximums>(gridItemsWithSpan); 484 increaseSizesToAccommodateSpanningItems<variant, ResolveMaxContentMaximums>(gridItemsWithSpan); 485 } 486 487 template <TrackSizeComputationVariant variant> 488 static double getSizeDistributionWeight(const GridTrack& track) 489 { 490 if (variant != TrackSizeComputationVariant::CrossingFlexibleTracks) 491 return 0; 492 ASSERT(track.cachedTrackSize().maxTrackBreadth().isFlex()); 493 return track.cachedTrackSize().maxTrackBreadth().flex(); 494 } 495 475 496 static bool sortByGridTrackGrowthPotential(const GridTrack* track1, const GridTrack* track2) 476 497 { … … 503 524 } 504 525 505 template <TrackSizeComputationPhase phase> 526 template <TrackSizeComputationPhase phase, SpaceDistributionLimit limit> 527 static void distributeItemIncurredIncreaseToTrack(GridTrack& track, LayoutUnit& freeSpace, double shareFraction) 528 { 529 LayoutUnit freeSpaceShare(freeSpace / shareFraction); 530 LayoutUnit growthShare = limit == SpaceDistributionLimit::BeyondGrowthLimit || track.infiniteGrowthPotential() ? freeSpaceShare : std::min(freeSpaceShare, track.growthLimit() - trackSizeForTrackSizeComputationPhase(phase, track, ForbidInfinity)); 531 clampGrowthShareIfNeeded(phase, track, growthShare); 532 ASSERT_WITH_MESSAGE(growthShare >= 0, "We must never shrink any grid track or else we can't guarantee we abide by our min-sizing function."); 533 track.growTempSize(growthShare); 534 freeSpace -= growthShare; 535 } 536 537 template <TrackSizeComputationVariant variant, TrackSizeComputationPhase phase, SpaceDistributionLimit limit> 538 static void distributeItemIncurredIncreases(Vector<GridTrack*>& tracks, LayoutUnit& freeSpace) 539 { 540 uint32_t tracksSize = tracks.size(); 541 if (!tracksSize) 542 return; 543 if (variant == TrackSizeComputationVariant::NotCrossingFlexibleTracks) { 544 // We have to sort tracks according to their growth potential. This is necessary even when distributing beyond growth limits, 545 // because there might be tracks with growth limit caps (like the ones with fit-content()) which cannot indefinitely grow over the limits. 546 std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential); 547 for (uint32_t i = 0; i < tracksSize; ++i) { 548 ASSERT(!getSizeDistributionWeight<variant>(*tracks[i])); 549 distributeItemIncurredIncreaseToTrack<phase, limit>(*tracks[i], freeSpace, tracksSize - i); 550 } 551 return; 552 } 553 // We never grow flex tracks beyond growth limits, since they are infinite. 554 ASSERT(limit != SpaceDistributionLimit::BeyondGrowthLimit); 555 // For TrackSizeComputationVariant::CrossingFlexibleTracks we don't distribute equally, we need to take the weights into account. 556 Vector<double> fractionsOfRemainingSpace(tracksSize); 557 double weightSum = 0; 558 for (int32_t i = tracksSize - 1; i >= 0; --i) { 559 double weight = getSizeDistributionWeight<variant>(*tracks[i]); 560 weightSum += weight; 561 fractionsOfRemainingSpace[i] = weightSum > 0 ? weightSum / weight : tracksSize - i; 562 } 563 for (uint32_t i = 0; i < tracksSize; ++i) { 564 // Sorting is not needed for TrackSizeComputationVariant::CrossingFlexibleTracks, since all tracks have an infinite growth potential. 565 ASSERT(tracks[i]->growthLimitIsInfinite()); 566 distributeItemIncurredIncreaseToTrack<phase, limit>(*tracks[i], freeSpace, fractionsOfRemainingSpace[i]); 567 } 568 } 569 570 template <TrackSizeComputationVariant variant, TrackSizeComputationPhase phase> 506 571 void GridTrackSizingAlgorithm::distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<GridTrack*>* growBeyondGrowthLimitsTracks, LayoutUnit& freeSpace) const 507 572 { … … 511 576 track->setTempSize(trackSizeForTrackSizeComputationPhase(phase, *track, ForbidInfinity)); 512 577 513 if (freeSpace > 0) { 514 std::sort(tracks.begin(), tracks.end(), sortByGridTrackGrowthPotential); 515 516 unsigned tracksSize = tracks.size(); 517 for (unsigned i = 0; i < tracksSize; ++i) { 518 GridTrack& track = *tracks[i]; 519 const LayoutUnit& trackBreadth = trackSizeForTrackSizeComputationPhase(phase, track, ForbidInfinity); 520 bool infiniteGrowthPotential = track.infiniteGrowthPotential(); 521 LayoutUnit trackGrowthPotential = infiniteGrowthPotential ? track.growthLimit() : track.growthLimit() - trackBreadth; 522 // Let's avoid computing availableLogicalSpaceShare as much as possible as it's a hot spot in performance tests. 523 if (trackGrowthPotential > 0 || infiniteGrowthPotential) { 524 LayoutUnit availableLogicalSpaceShare = freeSpace / (tracksSize - i); 525 LayoutUnit growthShare = infiniteGrowthPotential ? availableLogicalSpaceShare : std::min(availableLogicalSpaceShare, trackGrowthPotential); 526 clampGrowthShareIfNeeded(phase, track, growthShare); 527 ASSERT_WITH_MESSAGE(growthShare >= 0, "We should never shrink any grid track or else we can't guarantee we abide by our min-sizing function. We can still have 0 as growthShare if the amount of tracks greatly exceeds the freeSpace."); 528 track.growTempSize(growthShare); 529 freeSpace -= growthShare; 530 } 531 } 532 } 533 534 if (freeSpace > 0 && growBeyondGrowthLimitsTracks) { 535 // We need to sort them because there might be tracks with growth limit caps (like the ones 536 // with fit-content()) which cannot indefinitely grow over the limits. 537 if (phase == ResolveMaxContentMaximums) 538 std::sort(growBeyondGrowthLimitsTracks->begin(), growBeyondGrowthLimitsTracks->end(), sortByGridTrackGrowthPotential); 539 540 unsigned tracksGrowingBeyondGrowthLimitsSize = growBeyondGrowthLimitsTracks->size(); 541 for (unsigned i = 0; i < tracksGrowingBeyondGrowthLimitsSize; ++i) { 542 GridTrack* track = growBeyondGrowthLimitsTracks->at(i); 543 LayoutUnit growthShare = freeSpace / (tracksGrowingBeyondGrowthLimitsSize - i); 544 clampGrowthShareIfNeeded(phase, *track, growthShare); 545 track->growTempSize(growthShare); 546 freeSpace -= growthShare; 547 } 548 } 549 578 if (freeSpace > 0) 579 distributeItemIncurredIncreases<variant, phase, SpaceDistributionLimit::UpToGrowthLimit>(tracks, freeSpace); 580 581 if (freeSpace > 0 && growBeyondGrowthLimitsTracks) 582 distributeItemIncurredIncreases<variant, phase, SpaceDistributionLimit::BeyondGrowthLimit>(*growBeyondGrowthLimitsTracks, freeSpace); 583 550 584 for (auto* track : tracks) 551 585 track->setPlannedSize(track->plannedSize() == infinity ? track->tempSize() : std::max(track->plannedSize(), track->tempSize())); … … 811 845 if (childMinSize.isAuto() && overflowIsVisible) { 812 846 auto minSize = minContentForChild(child); 847 const GridSpan& span = m_algorithm.grid().gridItemSpan(child, direction()); 848 813 849 LayoutUnit maxBreadth; 814 850 auto allTracks = m_algorithm.tracks(direction()); 815 for (auto trackPosition : m_algorithm.grid().gridItemSpan(child, direction())) { 851 bool allFixed = true; 852 for (auto trackPosition : span) { 816 853 const auto& trackSize = allTracks[trackPosition].cachedTrackSize(); 854 if (trackSize.maxTrackBreadth().isFlex() && span.integerSpan() > 1) 855 return { }; 817 856 if (!trackSize.hasFixedMaxTrackBreadth()) 818 return minSize; 819 maxBreadth += valueForLength(trackSize.maxTrackBreadth().length(), availableSpace().value_or(0_lu)); 857 allFixed = false; 858 else if (allFixed) 859 maxBreadth += valueForLength(trackSize.maxTrackBreadth().length(), availableSpace().value_or(0_lu)); 820 860 } 861 if (!allFixed) 862 return minSize; 821 863 if (minSize > maxBreadth) { 822 864 auto marginAndBorderAndPadding = GridLayoutFunctions::marginLogicalSizeForChild(*renderGrid(), direction(), child); … … 1164 1206 1165 1207 Vector<GridItemWithSpan> itemsSortedByIncreasingSpan; 1208 Vector<GridItemWithSpan> itemsCrossingFlexibleTracks; 1166 1209 HashSet<RenderBox*> itemsSet; 1167 1210 if (m_grid.hasGridItems()) { … … 1173 1216 if (itemsSet.add(gridItem).isNewEntry) { 1174 1217 const GridSpan& span = m_grid.gridItemSpan(*gridItem, m_direction); 1175 if (span.integerSpan() == 1) 1218 if (spanningItemCrossesFlexibleSizedTracks(span)) 1219 itemsCrossingFlexibleTracks.append(GridItemWithSpan(*gridItem, span)); 1220 else if (span.integerSpan() == 1) 1176 1221 sizeTrackToFitNonSpanningItem(span, *gridItem, track); 1177 else if (!spanningItemCrossesFlexibleSizedTracks(span))1222 else 1178 1223 itemsSortedByIncreasingSpan.append(GridItemWithSpan(*gridItem, span)); 1179 1224 } … … 1187 1232 while (it != end) { 1188 1233 GridItemsSpanGroupRange spanGroupRange = { it, std::upper_bound(it, end, *it) }; 1189 increaseSizesToAccommodateSpanningItems<ResolveIntrinsicMinimums>(spanGroupRange); 1190 increaseSizesToAccommodateSpanningItems<ResolveContentBasedMinimums>(spanGroupRange); 1191 increaseSizesToAccommodateSpanningItems<ResolveMaxContentMinimums>(spanGroupRange); 1192 increaseSizesToAccommodateSpanningItems<ResolveIntrinsicMaximums>(spanGroupRange); 1193 increaseSizesToAccommodateSpanningItems<ResolveMaxContentMaximums>(spanGroupRange); 1234 increaseSizesToAccommodateSpanningItems<TrackSizeComputationVariant::NotCrossingFlexibleTracks>(spanGroupRange); 1194 1235 it = spanGroupRange.rangeEnd; 1195 1236 } 1237 GridItemsSpanGroupRange tracksGroupRange = { itemsCrossingFlexibleTracks.begin(), itemsCrossingFlexibleTracks.end() }; 1238 increaseSizesToAccommodateSpanningItems<TrackSizeComputationVariant::CrossingFlexibleTracks>(tracksGroupRange); 1196 1239 handleInfinityGrowthLimit(); 1197 1240 } -
trunk/Source/WebCore/rendering/GridTrackSizingAlgorithm.h
r278253 r283439 36 36 enum SizingOperation { TrackSizing, IntrinsicSizeComputation }; 37 37 38 enum class TrackSizeComputationVariant : uint8_t { 39 NotCrossingFlexibleTracks, 40 CrossingFlexibleTracks, 41 }; 42 38 43 enum TrackSizeComputationPhase { 39 44 ResolveIntrinsicMinimums, … … 45 50 }; 46 51 52 enum class SpaceDistributionLimit : uint8_t { 53 UpToGrowthLimit, 54 BeyondGrowthLimit, 55 }; 56 47 57 class GridTrackSizingAlgorithmStrategy; 48 58 … … 153 163 bool spanningItemCrossesFlexibleSizedTracks(const GridSpan&) const; 154 164 typedef struct GridItemsSpanGroupRange GridItemsSpanGroupRange; 155 template <TrackSizeComputationPhase phase> void increaseSizesToAccommodateSpanningItems(const GridItemsSpanGroupRange& gridItemsWithSpan); 165 template <TrackSizeComputationVariant variant, TrackSizeComputationPhase phase> void increaseSizesToAccommodateSpanningItems(const GridItemsSpanGroupRange& gridItemsWithSpan); 166 template <TrackSizeComputationVariant variant> void increaseSizesToAccommodateSpanningItems(const GridItemsSpanGroupRange& gridItemsWithSpan); 156 167 LayoutUnit itemSizeForTrackSizeComputationPhase(TrackSizeComputationPhase, RenderBox&) const; 157 template <TrackSizeComputationPhase phase> void distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<GridTrack*>* growBeyondGrowthLimitsTracks, LayoutUnit& availableLogicalSpace) const; 168 template <TrackSizeComputationVariant variant, TrackSizeComputationPhase phase> void distributeSpaceToTracks(Vector<GridTrack*>& tracks, Vector<GridTrack*>* growBeyondGrowthLimitsTracks, LayoutUnit& freeSpace) const; 169 158 170 std::optional<LayoutUnit> gridAreaBreadthForChild(const RenderBox&, GridTrackSizingDirection) const; 159 171 … … 275 287 GridTrackSizingDirection direction() const { return m_algorithm.m_direction; } 276 288 double findFrUnitSize(const GridSpan& tracksSpan, LayoutUnit leftOverSpace) const { return m_algorithm.findFrUnitSize(tracksSpan, leftOverSpace); } 277 void distributeSpaceToTracks(Vector<GridTrack*>& tracks, LayoutUnit& availableLogicalSpace) const { m_algorithm.distributeSpaceToTracks< MaximizeTracks>(tracks, nullptr, availableLogicalSpace); }289 void distributeSpaceToTracks(Vector<GridTrack*>& tracks, LayoutUnit& availableLogicalSpace) const { m_algorithm.distributeSpaceToTracks<TrackSizeComputationVariant::NotCrossingFlexibleTracks, MaximizeTracks>(tracks, nullptr, availableLogicalSpace); } 278 290 const RenderGrid* renderGrid() const { return m_algorithm.m_renderGrid; } 279 291 std::optional<LayoutUnit> availableSpace() const { return m_algorithm.availableSpace(); }
Note:
See TracChangeset
for help on using the changeset viewer.