From d16f259e1d3c7b8c0c0f4692af41ba2e41085e23 Mon Sep 17 00:00:00 2001 From: Oriol Brufau Date: Tue, 26 Mar 2024 13:36:43 +0100 Subject: [PATCH] Fix table with rows but no column (#31862) * Fix table with rows but no column We weren't generating any fragment for the rows, which meant that JS APIs like clientWidth would be 0, and also outlines weren't painted. This aligns Servo with Blink and WebKit. Gecko is broken, it distributes twice the table height among the rows. * Feedback * Avoid conflict with #31874 --- components/layout_2020/table/layout.rs | 28 ++++++--- .../table-rows-with-zero-columns.html.ini | 36 +++++++++++ tests/wpt/meta/MANIFEST.json | 7 +++ .../tentative/baseline-table.html.ini | 3 - .../table-height-redistribution.html.ini | 33 ---------- .../table-rows-with-zero-columns.html | 62 +++++++++++++++++++ 6 files changed, 126 insertions(+), 43 deletions(-) create mode 100644 tests/wpt/meta-legacy-layout/css/css-tables/tentative/table-rows-with-zero-columns.html.ini create mode 100644 tests/wpt/tests/css/css-tables/tentative/table-rows-with-zero-columns.html diff --git a/components/layout_2020/table/layout.rs b/components/layout_2020/table/layout.rs index 652f7a3b2f3..ea223ea0cce 100644 --- a/components/layout_2020/table/layout.rs +++ b/components/layout_2020/table/layout.rs @@ -1423,7 +1423,7 @@ impl<'a> TableLayout<'a> { let mut baselines = Baselines::default(); let mut table_fragments = Vec::new(); - if self.table.size.width == 0 || self.table.size.height == 0 { + if self.table.size.width == 0 && self.table.size.height == 0 { return IndependentLayout { fragments: table_fragments, content_block_size: self.final_table_height, @@ -1794,8 +1794,16 @@ impl TableAndTrackDimensions { fn new(table_layout: &TableLayout) -> Self { let border_spacing = table_layout.table.border_spacing(); + // The sizes used for a dimension when that dimension has no table tracks. + let fallback_inline_size = table_layout.assignable_width; + let fallback_block_size = table_layout.final_table_height; + let mut column_dimensions = Vec::new(); - let mut column_offset = border_spacing.inline; + let mut column_offset = if table_layout.table.size.width == 0 { + fallback_inline_size + } else { + border_spacing.inline + }; for column_index in 0..table_layout.table.size.width { let column_size = table_layout.distributed_column_widths[column_index]; column_dimensions.push((column_offset, column_offset + column_size)); @@ -1803,7 +1811,11 @@ impl TableAndTrackDimensions { } let mut row_dimensions = Vec::new(); - let mut row_offset = border_spacing.block; + let mut row_offset = if table_layout.table.size.height == 0 { + fallback_block_size + } else { + border_spacing.block + }; for row_index in 0..table_layout.table.size.height { let row_size = table_layout.row_sizes[row_index]; row_dimensions.push((row_offset, row_offset + row_size)); @@ -1811,12 +1823,14 @@ impl TableAndTrackDimensions { } let table_start_corner = LogicalVec2 { - inline: column_dimensions[0].0, - block: row_dimensions[0].0, + inline: column_dimensions.first().map_or_else(Au::zero, |v| v.0), + block: row_dimensions.first().map_or_else(Au::zero, |v| v.0), }; let table_size = &LogicalVec2 { - inline: column_dimensions[column_dimensions.len() - 1].1, - block: row_dimensions[row_dimensions.len() - 1].1, + inline: column_dimensions + .last() + .map_or(fallback_inline_size, |v| v.1), + block: row_dimensions.last().map_or(fallback_block_size, |v| v.1), } - &table_start_corner; let table_cells_rect = LogicalRect { start_corner: table_start_corner, diff --git a/tests/wpt/meta-legacy-layout/css/css-tables/tentative/table-rows-with-zero-columns.html.ini b/tests/wpt/meta-legacy-layout/css/css-tables/tentative/table-rows-with-zero-columns.html.ini new file mode 100644 index 00000000000..9ee3963940f --- /dev/null +++ b/tests/wpt/meta-legacy-layout/css/css-tables/tentative/table-rows-with-zero-columns.html.ini @@ -0,0 +1,36 @@ +[table-rows-with-zero-columns.html] + [tr 1] + expected: FAIL + + [tr 2] + expected: FAIL + + [tr 3] + expected: FAIL + + [tr 4] + expected: FAIL + + [tr 5] + expected: FAIL + + [tr 6] + expected: FAIL + + [tr 7] + expected: FAIL + + [tr 8] + expected: FAIL + + [tr 9] + expected: FAIL + + [tr 10] + expected: FAIL + + [tr 11] + expected: FAIL + + [tr 12] + expected: FAIL diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index bc1da1607a9..0654489de5b 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -545267,6 +545267,13 @@ {} ] ], + "table-rows-with-zero-columns.html": [ + "da9e0098a7a1e6657887539448c5e1b2c1f14b5b", + [ + null, + {} + ] + ], "table-width-redistribution-fixed-padding.html": [ "097ddacfc3139105f0d80689e0c03ac722a00aeb", [ diff --git a/tests/wpt/meta/css/css-tables/tentative/baseline-table.html.ini b/tests/wpt/meta/css/css-tables/tentative/baseline-table.html.ini index d89695fbaef..2acbad53770 100644 --- a/tests/wpt/meta/css/css-tables/tentative/baseline-table.html.ini +++ b/tests/wpt/meta/css/css-tables/tentative/baseline-table.html.ini @@ -7,6 +7,3 @@ [.container 13] expected: FAIL - - [.container 3] - expected: FAIL diff --git a/tests/wpt/meta/css/css-tables/tentative/table-height-redistribution.html.ini b/tests/wpt/meta/css/css-tables/tentative/table-height-redistribution.html.ini index 99e920f9e6c..54c6daef5c1 100644 --- a/tests/wpt/meta/css/css-tables/tentative/table-height-redistribution.html.ini +++ b/tests/wpt/meta/css/css-tables/tentative/table-height-redistribution.html.ini @@ -2,39 +2,9 @@ [table 5] expected: FAIL - [table 6] - expected: FAIL - - [table 7] - expected: FAIL - - [table 8] - expected: FAIL - - [table 9] - expected: FAIL - - [table 10] - expected: FAIL - [table 11] expected: FAIL - [table 12] - expected: FAIL - - [table 13] - expected: FAIL - - [table 14] - expected: FAIL - - [table 15] - expected: FAIL - - [table 16] - expected: FAIL - [table 17] expected: FAIL @@ -53,9 +23,6 @@ [table 22] expected: FAIL - [table 23] - expected: FAIL - [table 25] expected: FAIL diff --git a/tests/wpt/tests/css/css-tables/tentative/table-rows-with-zero-columns.html b/tests/wpt/tests/css/css-tables/tentative/table-rows-with-zero-columns.html new file mode 100644 index 00000000000..da9e0098a7a --- /dev/null +++ b/tests/wpt/tests/css/css-tables/tentative/table-rows-with-zero-columns.html @@ -0,0 +1,62 @@ + + +CSS Test: size of table rows when the table has no columns + + + + + + + +
+ +
+ + +
+ + + + +
+ + + +
+ + + + +
+ + + +
+ + + + +
+ + + +
+ + + + +
+
+ + + + +