mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-04-26 01:35:08 +02:00
LibWeb: Validate grid-template-areas rectangles at parse time
Move grid area rectangle computation and validation from layout to the CSS parser. Named grid areas that don't form filled-in rectangles now correctly invalidate the declaration per spec.
This commit is contained in:
committed by
Alexander Kalenik
parent
0206150b70
commit
795222fab3
Notes:
github-actions[bot]
2026-02-21 20:47:29 +00:00
Author: https://github.com/kalenikaliaksandr Commit: https://github.com/LadybirdBrowser/ladybird/commit/795222fab30 Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/8058
@@ -12,26 +12,35 @@
|
||||
|
||||
namespace Web::CSS {
|
||||
|
||||
ValueComparingNonnullRefPtr<GridTemplateAreaStyleValue const> GridTemplateAreaStyleValue::create(Vector<Vector<String>> grid_template_area)
|
||||
ValueComparingNonnullRefPtr<GridTemplateAreaStyleValue const> GridTemplateAreaStyleValue::create(HashMap<String, GridArea> grid_areas, size_t row_count, size_t column_count)
|
||||
{
|
||||
return adopt_ref(*new (nothrow) GridTemplateAreaStyleValue(grid_template_area));
|
||||
return adopt_ref(*new (nothrow) GridTemplateAreaStyleValue(move(grid_areas), row_count, column_count));
|
||||
}
|
||||
|
||||
String GridTemplateAreaStyleValue::cell_name_at(size_t row, size_t column) const
|
||||
{
|
||||
for (auto const& [name, area] : m_grid_areas) {
|
||||
if (row >= area.row_start && row < area.row_end && column >= area.column_start && column < area.column_end)
|
||||
return name;
|
||||
}
|
||||
return "."_string;
|
||||
}
|
||||
|
||||
void GridTemplateAreaStyleValue::serialize(StringBuilder& builder, SerializationMode) const
|
||||
{
|
||||
if (m_grid_template_area.is_empty()) {
|
||||
if (m_row_count == 0) {
|
||||
builder.append("none"sv);
|
||||
return;
|
||||
}
|
||||
|
||||
for (size_t y = 0; y < m_grid_template_area.size(); ++y) {
|
||||
for (size_t y = 0; y < m_row_count; ++y) {
|
||||
if (y != 0)
|
||||
builder.append(' ');
|
||||
StringBuilder row_builder;
|
||||
for (size_t x = 0; x < m_grid_template_area[y].size(); ++x) {
|
||||
for (size_t x = 0; x < m_column_count; ++x) {
|
||||
if (x != 0)
|
||||
row_builder.append(' ');
|
||||
row_builder.appendff("{}", m_grid_template_area[y][x]);
|
||||
row_builder.append(cell_name_at(y, x));
|
||||
}
|
||||
serialize_a_string(builder, row_builder.string_view());
|
||||
}
|
||||
|
||||
@@ -9,28 +9,42 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/HashMap.h>
|
||||
#include <LibWeb/CSS/GridTrackSize.h>
|
||||
#include <LibWeb/CSS/StyleValues/StyleValue.h>
|
||||
|
||||
namespace Web::CSS {
|
||||
|
||||
class GridTemplateAreaStyleValue final : public StyleValueWithDefaultOperators<GridTemplateAreaStyleValue> {
|
||||
public:
|
||||
static ValueComparingNonnullRefPtr<GridTemplateAreaStyleValue const> create(Vector<Vector<String>> grid_template_area);
|
||||
static ValueComparingNonnullRefPtr<GridTemplateAreaStyleValue const> create(HashMap<String, GridArea> grid_areas, size_t row_count, size_t column_count);
|
||||
virtual ~GridTemplateAreaStyleValue() override = default;
|
||||
|
||||
Vector<Vector<String>> const& grid_template_area() const { return m_grid_template_area; }
|
||||
HashMap<String, GridArea> const& grid_areas() const { return m_grid_areas; }
|
||||
size_t row_count() const { return m_row_count; }
|
||||
size_t column_count() const { return m_column_count; }
|
||||
String cell_name_at(size_t row, size_t column) const;
|
||||
virtual void serialize(StringBuilder&, SerializationMode) const override;
|
||||
|
||||
bool properties_equal(GridTemplateAreaStyleValue const& other) const { return m_grid_template_area == other.m_grid_template_area; }
|
||||
bool properties_equal(GridTemplateAreaStyleValue const& other) const
|
||||
{
|
||||
return m_row_count == other.m_row_count
|
||||
&& m_column_count == other.m_column_count
|
||||
&& m_grid_areas == other.m_grid_areas;
|
||||
}
|
||||
|
||||
private:
|
||||
explicit GridTemplateAreaStyleValue(Vector<Vector<String>> grid_template_area)
|
||||
explicit GridTemplateAreaStyleValue(HashMap<String, GridArea> grid_areas, size_t row_count, size_t column_count)
|
||||
: StyleValueWithDefaultOperators(Type::GridTemplateArea)
|
||||
, m_grid_template_area(grid_template_area)
|
||||
, m_grid_areas(move(grid_areas))
|
||||
, m_row_count(row_count)
|
||||
, m_column_count(column_count)
|
||||
{
|
||||
}
|
||||
|
||||
Vector<Vector<String>> m_grid_template_area;
|
||||
HashMap<String, GridArea> m_grid_areas;
|
||||
size_t m_row_count { 0 };
|
||||
size_t m_column_count { 0 };
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -713,7 +713,7 @@ void ShorthandStyleValue::serialize(StringBuilder& builder, SerializationMode mo
|
||||
auto& rows = rows_value->as_grid_track_size_list();
|
||||
auto& columns = columns_value->as_grid_track_size_list();
|
||||
|
||||
if (areas.grid_template_area().size() == 0 && rows.grid_track_size_list().track_list().size() == 0 && columns.grid_track_size_list().track_list().size() == 0) {
|
||||
if (areas.row_count() == 0 && rows.grid_track_size_list().track_list().size() == 0 && columns.grid_track_size_list().track_list().size() == 0) {
|
||||
builder.append("none"sv);
|
||||
return;
|
||||
}
|
||||
@@ -729,14 +729,14 @@ void ShorthandStyleValue::serialize(StringBuilder& builder, SerializationMode mo
|
||||
line_names->serialize(inner_builder);
|
||||
}
|
||||
if (auto* track_size = track_size_or_line_names.get_pointer<ExplicitGridTrack>()) {
|
||||
if (area_index < areas.grid_template_area().size()) {
|
||||
if (area_index < areas.row_count()) {
|
||||
if (!inner_builder.is_empty())
|
||||
inner_builder.append(' ');
|
||||
inner_builder.append("\""sv);
|
||||
for (size_t y = 0; y < areas.grid_template_area()[area_index].size(); ++y) {
|
||||
for (size_t y = 0; y < areas.column_count(); ++y) {
|
||||
if (y != 0)
|
||||
inner_builder.append(' ');
|
||||
inner_builder.append(areas.grid_template_area()[area_index][y]);
|
||||
inner_builder.append(areas.cell_name_at(area_index, y));
|
||||
}
|
||||
inner_builder.append("\""sv);
|
||||
}
|
||||
@@ -752,7 +752,7 @@ void ShorthandStyleValue::serialize(StringBuilder& builder, SerializationMode mo
|
||||
return MUST(inner_builder.to_string());
|
||||
};
|
||||
|
||||
if (areas.grid_template_area().is_empty()) {
|
||||
if (areas.row_count() == 0) {
|
||||
rows.grid_track_size_list().serialize(builder, mode);
|
||||
builder.append(" / "sv);
|
||||
columns.grid_track_size_list().serialize(builder, mode);
|
||||
@@ -767,7 +767,7 @@ void ShorthandStyleValue::serialize(StringBuilder& builder, SerializationMode mo
|
||||
builder.append(rows_serialization);
|
||||
return;
|
||||
}
|
||||
builder.append(construct_rows_string());
|
||||
builder.append(rows_serialization);
|
||||
builder.append(" / "sv);
|
||||
columns.grid_track_size_list().serialize(builder, mode);
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user