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:
Aliaksandr Kalenik
2026-02-21 12:36:20 +01:00
committed by Alexander Kalenik
parent 0206150b70
commit 795222fab3
Notes: github-actions[bot] 2026-02-21 20:47:29 +00:00
11 changed files with 136 additions and 92 deletions

View File

@@ -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 };
};
}