diff --git a/Libraries/LibWeb/CSS/GridTrackSize.cpp b/Libraries/LibWeb/CSS/GridTrackSize.cpp index 91daf44fa5e..9b5647a32e6 100644 --- a/Libraries/LibWeb/CSS/GridTrackSize.cpp +++ b/Libraries/LibWeb/CSS/GridTrackSize.cpp @@ -166,7 +166,11 @@ String GridLineNames::to_string() const { StringBuilder builder; builder.append("["sv); - builder.join(' ', names); + for (size_t i = 0; i < m_names.size(); ++i) { + if (i > 0) + builder.append(" "sv); + builder.append(m_names[i].name); + } builder.append("]"sv); return MUST(builder.to_string()); } @@ -211,7 +215,8 @@ void GridTrackSizeList::append(GridLineNames&& line_names) { if (!m_list.is_empty() && m_list.last().has()) { auto& last_line_names = m_list.last().get(); - last_line_names.names.extend(move(line_names.names)); + for (auto const& name : line_names.names()) + last_line_names.append(name.name); return; } m_list.append(move(line_names)); diff --git a/Libraries/LibWeb/CSS/GridTrackSize.h b/Libraries/LibWeb/CSS/GridTrackSize.h index 84ecc28b667..38005b1a8ff 100644 --- a/Libraries/LibWeb/CSS/GridTrackSize.h +++ b/Libraries/LibWeb/CSS/GridTrackSize.h @@ -78,11 +78,25 @@ private: GridSize m_max_grid_size; }; -struct GridLineNames { - Vector names; +struct GridLineName { + FlyString name; + bool implicit { false }; + + bool operator==(GridLineName const& other) const = default; +}; + +class GridLineNames { +public: + void append(FlyString const& name) { m_names.append({ name }); } + bool is_empty() const { return m_names.is_empty(); } + auto const& names() const& { return m_names; } String to_string() const; + bool operator==(GridLineNames const& other) const = default; + +private: + Vector m_names; }; class GridTrackSizeList { diff --git a/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp b/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp index fab43af63b4..aceebd785c6 100644 --- a/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp +++ b/Libraries/LibWeb/CSS/Parser/ValueParsing.cpp @@ -3291,7 +3291,7 @@ Optional Parser::parse_grid_line_names(TokenStream& tokens, GridTr if (!explicit_grid_track.has_value()) break; - if (line_names.has_value() && !line_names->names.is_empty()) + if (line_names.has_value() && !line_names->is_empty()) output.append(line_names.release_value()); output.append(explicit_grid_track.release_value()); if (allow_trailing_line_names_for_each_track == AllowTrailingLineNamesForEachTrack::Yes) { auto trailing_line_names = parse_grid_line_names(tokens); - if (trailing_line_names.has_value() && !trailing_line_names->names.is_empty()) { + if (trailing_line_names.has_value() && !trailing_line_names->is_empty()) { output.append(trailing_line_names.release_value()); } } @@ -3328,7 +3328,7 @@ size_t Parser::parse_track_list_impl(TokenStream& tokens, GridTr } if (allow_trailing_line_names_for_each_track == AllowTrailingLineNamesForEachTrack::No) { - if (auto trailing_line_names = parse_grid_line_names(tokens); trailing_line_names.has_value() && !trailing_line_names->names.is_empty()) { + if (auto trailing_line_names = parse_grid_line_names(tokens); trailing_line_names.has_value() && !trailing_line_names->is_empty()) { output.append(trailing_line_names.release_value()); } } diff --git a/Libraries/LibWeb/Forward.h b/Libraries/LibWeb/Forward.h index d5300f7783e..a2039170db7 100644 --- a/Libraries/LibWeb/Forward.h +++ b/Libraries/LibWeb/Forward.h @@ -240,6 +240,7 @@ class FrequencyOrCalculated; class FrequencyPercentage; class FrequencyStyleValue; class GridAutoFlowStyleValue; +class GridLineNames; class GridMinMax; class GridRepeat; class GridSize; @@ -316,7 +317,6 @@ enum class PropertyID : u16; struct BackgroundLayerData; struct CSSStyleSheetInit; -struct GridLineNames; struct GridRepeatParams; struct StyleSheetIdentifier; diff --git a/Libraries/LibWeb/Layout/GridFormattingContext.cpp b/Libraries/LibWeb/Layout/GridFormattingContext.cpp index 51da45401f0..0ec5e0bc688 100644 --- a/Libraries/LibWeb/Layout/GridFormattingContext.cpp +++ b/Libraries/LibWeb/Layout/GridFormattingContext.cpp @@ -1385,10 +1385,10 @@ void GridFormattingContext::build_grid_areas() // and column-end lines of the named grid area. for (auto const& it : grid_areas) { auto const& grid_area = it.value; - m_column_lines[grid_area.column_start].names.append(MUST(String::formatted("{}-start", grid_area.name))); - m_column_lines[grid_area.column_end].names.append(MUST(String::formatted("{}-end", grid_area.name))); - m_row_lines[grid_area.row_start].names.append(MUST(String::formatted("{}-start", grid_area.name))); - m_row_lines[grid_area.row_end].names.append(MUST(String::formatted("{}-end", grid_area.name))); + m_column_lines[grid_area.column_start].append({ .name = MUST(String::formatted("{}-start", grid_area.name)), .implicit = true }); + m_column_lines[grid_area.column_end].append({ .name = MUST(String::formatted("{}-end", grid_area.name)), .implicit = true }); + m_row_lines[grid_area.row_start].append({ .name = MUST(String::formatted("{}-start", grid_area.name)), .implicit = true }); + m_row_lines[grid_area.row_end].append({ .name = MUST(String::formatted("{}-end", grid_area.name)), .implicit = true }); } } @@ -2061,9 +2061,14 @@ void GridFormattingContext::run(AvailableSpace const& available_space) auto serialize = [](auto const& tracks, auto const& lines) { CSS::GridTrackSizeList result; for (size_t i = 0; i < lines.size(); ++i) { - auto const& line = lines[i]; - if (!line.names.is_empty()) { - result.append(CSS::GridLineNames { line.names }); + auto const& names = lines[i]; + if (!names.is_empty()) { + CSS::GridLineNames grid_line_names; + for (auto const& [name, implicit] : names) { + if (!implicit) + grid_line_names.append(name); + } + result.append(CSS::GridLineNames { move(grid_line_names) }); } if (i < tracks.size()) { @@ -2273,8 +2278,8 @@ Optional GridFormattingContext::get_nth_line_index_by_line_name(GridDimensi // of the explicit grid corresponding to the search direction are assumed to have that name for the purpose of counting this span. // Source: https://drafts.csswg.org/css-grid/#line-placement for (size_t actual_line_index = 0; actual_line_index < lines.size(); actual_line_index++) { - for (auto const& name : lines[actual_line_index].names) { - if (name == line_name) { + for (auto const& line : lines[actual_line_index]) { + if (line.name == line_name) { // https://drafts.csswg.org/css-grid/#line-placement // Contributes the nth grid line to the grid item’s placement. if (line_index == 0) @@ -2293,15 +2298,15 @@ void GridFormattingContext::init_grid_lines(GridDimension dimension) auto const& lines_definition = dimension == GridDimension::Column ? grid_computed_values.grid_template_columns() : grid_computed_values.grid_template_rows(); auto& lines = dimension == GridDimension::Column ? m_column_lines : m_row_lines; - Vector line_names; + Vector line_names; Function expand_lines_definition = [&](CSS::GridTrackSizeList const& lines_definition) { for (auto const& item : lines_definition.list()) { if (item.has()) { - line_names.extend(item.get().names); + line_names.extend(item.get().names()); } else if (item.has()) { auto const& explicit_track = item.get(); if (explicit_track.is_default() || explicit_track.is_minmax()) { - lines.append({ .names = line_names }); + lines.append(line_names); line_names.clear(); } else if (explicit_track.is_repeat()) { int repeat_count = 0; @@ -2320,7 +2325,7 @@ void GridFormattingContext::init_grid_lines(GridDimension dimension) }; expand_lines_definition(lines_definition); - lines.append({ .names = line_names }); + lines.append(line_names); } void OccupationGrid::set_occupied(int column_start, int column_end, int row_start, int row_end) diff --git a/Libraries/LibWeb/Layout/GridFormattingContext.h b/Libraries/LibWeb/Layout/GridFormattingContext.h index ccf4bc51f97..51162d62846 100644 --- a/Libraries/LibWeb/Layout/GridFormattingContext.h +++ b/Libraries/LibWeb/Layout/GridFormattingContext.h @@ -233,11 +233,8 @@ private: bool invalid { false }; /* FIXME: Ignore ignore invalid areas during layout */ }; - struct GridLine { - Vector names; - }; - Vector m_row_lines; - Vector m_column_lines; + Vector> m_row_lines; + Vector> m_column_lines; void init_grid_lines(GridDimension); diff --git a/Tests/LibWeb/Text/expected/css/getComputedStyle-grid-template-rows.txt b/Tests/LibWeb/Text/expected/css/getComputedStyle-grid-template-rows.txt new file mode 100644 index 00000000000..485c9be437d --- /dev/null +++ b/Tests/LibWeb/Text/expected/css/getComputedStyle-grid-template-rows.txt @@ -0,0 +1 @@ +[a] 0px [c] 0px [] diff --git a/Tests/LibWeb/Text/input/css/getComputedStyle-grid-template-rows.html b/Tests/LibWeb/Text/input/css/getComputedStyle-grid-template-rows.html new file mode 100644 index 00000000000..cd22610eb68 --- /dev/null +++ b/Tests/LibWeb/Text/input/css/getComputedStyle-grid-template-rows.html @@ -0,0 +1,11 @@ + + + +