From 863092afdcbca747d8f3183abd2a99a94959faf1 Mon Sep 17 00:00:00 2001
From: Gingeh <39150378+Gingeh@users.noreply.github.com>
Date: Tue, 1 Jul 2025 16:32:56 +1000
Subject: [PATCH] LibWeb: Don't crash with non-
table-column
---
.../LibWeb/Layout/TableFormattingContext.cpp | 8 +++----
Libraries/LibWeb/Layout/TableGrid.cpp | 5 +++--
.../expected/display-table-column-crash.txt | 22 +++++++++++++++++++
.../input/display-table-column-crash.html | 21 ++++++++++++++++++
4 files changed, 50 insertions(+), 6 deletions(-)
create mode 100644 Tests/LibWeb/Layout/expected/display-table-column-crash.txt
create mode 100644 Tests/LibWeb/Layout/input/display-table-column-crash.html
diff --git a/Libraries/LibWeb/Layout/TableFormattingContext.cpp b/Libraries/LibWeb/Layout/TableFormattingContext.cpp
index 434832b323e..9ac53444d57 100644
--- a/Libraries/LibWeb/Layout/TableFormattingContext.cpp
+++ b/Libraries/LibWeb/Layout/TableFormattingContext.cpp
@@ -74,7 +74,7 @@ void TableFormattingContext::compute_constrainedness()
if (computed_values.width().is_length()) {
m_columns[column_index].is_constrained = true;
}
- auto const& col_node = static_cast(*column_box.dom_node());
+ auto const& col_node = static_cast(*column_box.dom_node());
unsigned span = col_node.get_attribute_value(HTML::AttributeNames::span).to_number().value_or(1);
column_index += span;
});
@@ -191,7 +191,7 @@ void TableFormattingContext::compute_outer_content_sizes()
m_columns[column_index].min_size = max(min_width, width);
// The outer max-content width of a table-column or table-column-group is max(min-width, min(max-width, width)).
m_columns[column_index].max_size = max(min_width, min(max_width, width));
- auto const& col_node = static_cast(*column_box.dom_node());
+ auto const& col_node = static_cast(*column_box.dom_node());
unsigned span = col_node.get_attribute_value(HTML::AttributeNames::span).to_number().value_or(1);
column_index += span;
});
@@ -1393,7 +1393,7 @@ void TableFormattingContext::BorderConflictFinder::collect_conflicting_col_eleme
size_t column_index = 0;
for (auto* child_of_column_group = child->first_child(); child_of_column_group; child_of_column_group = child_of_column_group->next_sibling()) {
VERIFY(child_of_column_group->display().is_table_column());
- auto const& col_node = static_cast(*child_of_column_group->dom_node());
+ auto const& col_node = static_cast(*child_of_column_group->dom_node());
unsigned span = col_node.get_attribute_value(HTML::AttributeNames::span).to_number().value_or(1);
m_col_elements_by_index.resize(column_index + span);
for (size_t i = column_index; i < column_index + span; ++i) {
@@ -1792,7 +1792,7 @@ void TableFormattingContext::initialize_intrinsic_percentages_from_rows_or_colum
auto width_percentage = computed_values.width().is_percentage() ? computed_values.width().percentage().value() : 0;
m_columns[column_index].has_intrinsic_percentage = computed_values.max_width().is_percentage() || computed_values.width().is_percentage();
m_columns[column_index].intrinsic_percentage = min(width_percentage, max_width_percentage);
- auto const& col_node = static_cast(*column_box.dom_node());
+ auto const& col_node = static_cast(*column_box.dom_node());
unsigned span = col_node.get_attribute_value(HTML::AttributeNames::span).to_number().value_or(1);
column_index += span;
});
diff --git a/Libraries/LibWeb/Layout/TableGrid.cpp b/Libraries/LibWeb/Layout/TableGrid.cpp
index bf548218fe9..b025114f68f 100644
--- a/Libraries/LibWeb/Layout/TableGrid.cpp
+++ b/Libraries/LibWeb/Layout/TableGrid.cpp
@@ -65,8 +65,9 @@ TableGrid TableGrid::calculate_row_column_grid(Box const& box, Vector& cel
auto process_col_group = [&](auto& col_group) {
auto dom_node = col_group.dom_node();
- dom_node->template for_each_in_subtree_of_type([&](auto&) {
- x_width += 1;
+ dom_node->for_each_in_subtree([&](auto& descendant) {
+ if (descendant.layout_node() && descendant.layout_node()->display().is_table_column())
+ x_width += 1;
return TraversalDecision::Continue;
});
};
diff --git a/Tests/LibWeb/Layout/expected/display-table-column-crash.txt b/Tests/LibWeb/Layout/expected/display-table-column-crash.txt
new file mode 100644
index 00000000000..4fa53bf3c81
--- /dev/null
+++ b/Tests/LibWeb/Layout/expected/display-table-column-crash.txt
@@ -0,0 +1,22 @@
+Viewport <#document> at (0,0) content-size 800x600 children: not-inline
+ BlockContainer at (0,0) content-size 800x16 [BFC] children: not-inline
+ BlockContainer <(anonymous)> at (0,0) content-size 800x0 children: inline
+ TextNode <#text>
+ BlockContainer at (8,8) content-size 784x0 children: not-inline
+ BlockContainer <(anonymous)> at (8,8) content-size 784x0 children: inline
+ TextNode <#text>
+ TableWrapper <(anonymous)> at (8,8) content-size 0x0 [BFC] children: not-inline
+ Box <(anonymous)> at (8,8) content-size 0x0 table-box [TFC] children: not-inline
+ BlockContainer (not painted) table-column-group children: not-inline
+ BlockContainer (not painted) children: not-inline
+ BlockContainer (not painted) children: not-inline
+ BlockContainer <(anonymous)> (not painted) children: inline
+ TextNode <#text>
+
+ViewportPaintable (Viewport<#document>) [0,0 800x600]
+ PaintableWithLines (BlockContainer) [0,0 800x16]
+ PaintableWithLines (BlockContainer(anonymous)) [0,0 800x0]
+ PaintableWithLines (BlockContainer) [8,8 784x0]
+ PaintableWithLines (BlockContainer(anonymous)) [8,8 784x0]
+ PaintableWithLines (TableWrapper(anonymous)) [8,8 0x0]
+ PaintableBox (Box(anonymous)) [8,8 0x0]
diff --git a/Tests/LibWeb/Layout/input/display-table-column-crash.html b/Tests/LibWeb/Layout/input/display-table-column-crash.html
new file mode 100644
index 00000000000..1b9c06753ed
--- /dev/null
+++ b/Tests/LibWeb/Layout/input/display-table-column-crash.html
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
|