Source/WebCore/ChangeLog

 12022-02-15 Matt Woodrow <mattwoodrow@apple.com>
 2
 3 Implement getComputedStyle for subgrids
 4 https://bugs.webkit.org/show_bug.cgi?id=236148
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Adds OrderedNamedLinesCollectorInSubgridLayout to iterate the subgrid names list, stopping
 9 at the number of actual tracks in the grid.
 10
 11
 12 * css/CSSComputedStyleDeclaration.cpp:
 13 (WebCore::OrderedNamedLinesCollectorInSubgridLayout::OrderedNamedLinesCollectorInSubgridLayout):
 14 (WebCore::OrderedNamedLinesCollectorInGridLayout::collectLineNamesForIndex const):
 15 (WebCore::OrderedNamedLinesCollectorInSubgridLayout::collectLineNamesForIndex const):
 16 (WebCore::addValuesForNamedGridLinesAtIndex):
 17 (WebCore::populateSubgridTrackList):
 18 (WebCore::valueForGridTrackList):
 19 * rendering/RenderGrid.cpp:
 20 (WebCore::RenderGrid::computeAutoRepeatTracksCount const):
 21 * rendering/RenderGrid.h:
 22 * rendering/style/GridPositionsResolver.cpp:
 23 (WebCore::NamedLineCollection::contains const):
 24 * style/StyleBuilderConverter.h:
 25 (WebCore::Style::BuilderConverter::createGridTrackList):
 26
 27
 28 Inherit track count from parent grid for subgridded axes and clamp item placement to that explicit grid.
 29 https://bugs.webkit.org/show_bug.cgi?id=236122
 30
 31 Reviewed by NOBODY (OOPS!).
 32
 33 Changes GridPositionsResolver::explicitGrid<>Count to return the number of tracks
 34 spanned in the parent grid, for axes that are a subgrid.
 35
 36 Updates adjustGridPositionsForStyle to use the number of lines specified in the
 37 subgrid property, for grid items that are also a subgrid and have an otherwise
 38 indefinite span.
 39
 40 Adds clamping support to Grid so that we can prevent subgrids from ever adding
 41 new implicit tracks.
 42
 43 * rendering/Grid.cpp:
 44 (WebCore::Grid::insert):
 45 (WebCore::Grid::setClampingForSubgrid):
 46 (WebCore::Grid::clampAndTranslateToImplicitGrid):
 47 (WebCore::Grid::setNeedsItemsPlacement):
 48 * rendering/Grid.h:
 49 * rendering/RenderGrid.cpp:
 50 (WebCore::RenderGrid::computeIntrinsicLogicalWidths const):
 51 (WebCore::RenderGrid::placeItemsOnGrid const):
 52 (WebCore::RenderGrid::populateExplicitGridAndOrderIterator const):
 53 (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid const):
 54 (WebCore::RenderGrid::isSubgrid const):
 55 (WebCore::RenderGrid::isSubgridRows const):
 56 (WebCore::RenderGrid::isSubgridColumns const):
 57 (WebCore::RenderGrid::gridAreaBreadthForOutOfFlowChild):
 58 (WebCore::RenderGrid::numTracks const):
 59 (WebCore::transposedDirection):
 60 (WebCore::RenderGrid::computeGridSpanForOutOfFlowChild const):
 61 (WebCore::RenderGrid::gridSpanForOutOfFlowChild const):
 62 (WebCore::RenderGrid::gridSpanForChild const):
 63 * rendering/RenderGrid.h:
 64 * rendering/style/GridArea.h:
 65 (WebCore::GridSpan::integerSpan const):
 66 (WebCore::GridSpan::translateTo):
 67 (WebCore::GridSpan::clamp):
 68 * rendering/style/GridPositionsResolver.cpp:
 69 (WebCore::isIndefiniteSpan):
 70 (WebCore::adjustGridPositionsFromStyle):
 71 (WebCore::GridPositionsResolver::explicitGridColumnCount):
 72 (WebCore::GridPositionsResolver::explicitGridRowCount):
 73 (WebCore::explicitGridSizeForSide):
 74 (WebCore::resolveNamedGridLinePositionFromStyle):
 75 (WebCore::resolveNamedGridLinePositionAgainstOppositePosition):
 76 (WebCore::resolveGridPositionAgainstOppositePosition):
 77 (WebCore::resolveGridPositionFromStyle):
 78 (WebCore::GridPositionsResolver::resolveGridPositionsFromStyle):
 79 * rendering/style/GridPositionsResolver.h:
 80
1812022-02-15 Matt Woodrow <mattwoodrow@apple.com>
282
383 Inherit track count from parent grid for subgridded axes and clamp item placement to that explicit grid.

Source/WebCore/css/CSSComputedStyleDeclaration.cpp

@@private:
898898 unsigned m_autoRepeatTrackListLength;
899899};
900900
 901class OrderedNamedLinesCollectorInSubgridLayout : public OrderedNamedLinesCollector {
 902public:
 903 OrderedNamedLinesCollectorInSubgridLayout(const RenderStyle& style, bool isRowAxis, unsigned totalTracksCount)
 904 : OrderedNamedLinesCollector(style, isRowAxis)
 905 , m_insertionPoint(isRowAxis ? style.gridAutoRepeatColumnsInsertionPoint() : style.gridAutoRepeatRowsInsertionPoint())
 906 , m_autoRepeatTrackListLength((isRowAxis ? style.autoRepeatOrderedNamedGridColumnLines() : style.autoRepeatOrderedNamedGridRowLines()).size())
 907 , m_totalTracks(totalTracksCount)
 908 {
 909 if (!m_autoRepeatTrackListLength) {
 910 m_autoRepeatTotalTracks = 0;
 911 return;
 912 }
 913 // +1 to convert from tracks to lines
 914 unsigned named = (isRowAxis ? style.orderedNamedGridColumnLines() : style.orderedNamedGridRowLines()).size();
 915 if (named >= m_totalTracks + 1) {
 916 m_autoRepeatTotalTracks = 0;
 917 return;
 918 }
 919 m_autoRepeatTotalTracks = (m_totalTracks + 1 - named) / m_autoRepeatTrackListLength;
 920 m_autoRepeatTotalTracks *= m_autoRepeatTrackListLength;
 921 }
 922
 923 void collectLineNamesForIndex(CSSGridLineNamesValue&, unsigned index) const override;
 924
 925 int namedGridLineCount() const override { return m_totalTracks + 1; }
 926private:
 927 unsigned m_insertionPoint;
 928 unsigned m_autoRepeatTotalTracks;
 929 unsigned m_autoRepeatTrackListLength;
 930 unsigned m_totalTracks;
 931};
 932
901933void OrderedNamedLinesCollector::appendLines(CSSGridLineNamesValue& lineNamesValue, unsigned index, NamedLinesType type) const
902934{
903935 auto iter = type == NamedLines ? m_orderedNamedGridLines.find(index) : m_orderedNamedAutoRepeatGridLines.find(index);

@@void OrderedNamedLinesCollectorInGridLayout::collectLineNamesForIndex(CSSGridLin
955987 appendLines(lineNamesValue, autoRepeatIndexInFirstRepetition, AutoRepeatNamedLines);
956988}
957989
 990void OrderedNamedLinesCollectorInSubgridLayout::collectLineNamesForIndex(CSSGridLineNamesValue& lineNamesValue, unsigned i) const
 991{
 992 if (!m_autoRepeatTrackListLength || i < m_insertionPoint) {
 993 appendLines(lineNamesValue, i, NamedLines);
 994 return;
 995 }
 996
 997 if (i >= m_insertionPoint + m_autoRepeatTotalTracks) {
 998 appendLines(lineNamesValue, i - m_autoRepeatTotalTracks, NamedLines);
 999 return;
 1000 }
 1001
 1002 if (!m_autoRepeatTotalTracks) {
 1003 appendLines(lineNamesValue, i, NamedLines);
 1004 return;
 1005 }
 1006
 1007 unsigned autoRepeatIndexInFirstRepetition = (i - m_insertionPoint) % m_autoRepeatTrackListLength;
 1008 appendLines(lineNamesValue, autoRepeatIndexInFirstRepetition, AutoRepeatNamedLines);
 1009}
 1010
9581011static void addValuesForNamedGridLinesAtIndex(OrderedNamedLinesCollector& collector, unsigned i, CSSValueList& list, bool renderEmpty = false)
9591012{
960  if (collector.isEmpty())
 1013 if (collector.isEmpty() && !renderEmpty)
9611014 return;
9621015
9631016 auto lineNames = CSSGridLineNamesValue::create();

@@static Ref<CSSValue> valueForGridTrackList(GridTrackSizingDirection direction, R
10351088
10361089 // If the element is a grid container, the resolved value is the used value,
10371090 // specifying track sizes in pixels and expanding the repeat() notation.
1038  if (isRenderGrid) {
1039  // FIXME: We need to handle computed subgrid here.
 1091 // If subgrid was specified, but the element isn't a subgrid (due to not having
 1092 // an appropriate grid parent?), then we fall back to using the specified value.
 1093 if (isRenderGrid && (!isSubgrid || downcast<RenderGrid>(renderer)->isSubgrid(direction))) {
10401094 auto* grid = downcast<RenderGrid>(renderer);
 1095 if (isSubgrid) {
 1096 OrderedNamedLinesCollectorInSubgridLayout collector(style, isRowAxis, grid->numTracks(direction));
 1097 populateSubgridLineNameList(list.get(), collector);
 1098 return list;
 1099 }
10411100 OrderedNamedLinesCollectorInGridLayout collector(style, isRowAxis, grid->autoRepeatCountForDirection(direction), autoRepeatTrackSizes.size());
10421101 // Named grid line indices are relative to the explicit grid, but we are including all tracks.
10431102 // So we need to subtract the number of leading implicit tracks in order to get the proper line index.

Source/WebCore/rendering/RenderGrid.cpp

@@unsigned RenderGrid::computeAutoRepeatTracksCount(GridTrackSizingDirection direc
495495{
496496 ASSERT(!availableSize || availableSize.value() != -1);
497497 bool isRowAxis = direction == ForColumns;
 498 if (isRowAxis ? isSubgridColumns() : isSubgridRows())
 499 return 0;
 500
498501 const auto& autoRepeatTracks = isRowAxis ? style().gridAutoRepeatColumns() : style().gridAutoRepeatRows();
499502 unsigned autoRepeatTrackListLength = autoRepeatTracks.size();
500503

Source/WebCore/rendering/RenderGrid.h

@@public:
9595 return m_grid;
9696 }
9797
 98 unsigned numTracks(GridTrackSizingDirection direction) const
 99 {
 100 return numTracks(direction, m_grid);
 101 }
 102
98103private:
99104 ItemPosition selfAlignmentNormalBehavior(const RenderBox* child = nullptr) const override
100105 {

Source/WebCore/rendering/style/GridPositionsResolver.cpp

@@NamedLineCollection::NamedLineCollection(const RenderStyle& gridContainerStyle,
7979 m_insertionPoint = isRowAxis ? gridContainerStyle.gridAutoRepeatColumnsInsertionPoint() : gridContainerStyle.gridAutoRepeatRowsInsertionPoint();
8080
8181 m_autoRepeatTrackListLength = isRowAxis ? gridContainerStyle.gridAutoRepeatColumns().size() : gridContainerStyle.gridAutoRepeatRows().size();
 82 // TODO: Handle subgrid auto repeat tracks
 83 if (isRowAxis ? gridContainerStyle.gridSubgridColumns() : gridContainerStyle.gridSubgridRows()) {
 84 m_autoRepeatTrackListLength = 0;
 85 m_autoRepeatNamedLinesIndexes = nullptr;
 86 }
8287}
8388
8489bool NamedLineCollection::hasExplicitNamedLines() const

LayoutTests/TestExpectations

@@imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-mbp-overflow-001.ht
14461446imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-mbp-overflow-002.html [ ImageOnlyFailure ]
14471447imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-mbp-overflow-003.html [ ImageOnlyFailure ]
14481448imported/w3c/web-platform-tests/css/css-grid/subgrid/subgrid-mbp-overflow-004.html [ ImageOnlyFailure ]
1449 imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-subgridded-axis-auto-repeater-crash-001.html [ Crash ]
1450 imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-subgridded-axis-auto-repeater-crash-002.html [ Crash ]
14511449
14521450webkit.org/b/149890 fast/css-grid-layout/grid-shorthands-style-format.html [ Failure ]
14531451webkit.org/b/191508 fast/css-grid-layout/crash-large-positions.html [ Skip ]

LayoutTests/imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-subgridded-axis-auto-repeater-crash-001-expected.txt

 1layer at (0,0) size 800x600
 2 RenderView at (0,0) size 800x600
 3layer at (0,0) size 800x16
 4 RenderBlock {HTML} at (0,0) size 800x16
 5 RenderBody {BODY} at (8,8) size 784x0
 6 RenderGrid {DIV} at (0,0) size 784x0
 7 RenderBlock {DIV} at (392,0) size 392x0

LayoutTests/imported/w3c/web-platform-tests/css/css-grid/subgrid/grid-subgridded-axis-auto-repeater-crash-002-expected.txt

 1layer at (0,0) size 800x600
 2 RenderView at (0,0) size 800x600
 3layer at (0,0) size 800x8
 4 RenderBlock {HTML} at (0,0) size 800x8
 5 RenderBody {BODY} at (8,8) size 784x0