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
This commit is contained in:
Oriol Brufau 2024-03-26 13:36:43 +01:00 committed by GitHub
parent 68b0be6dc7
commit d16f259e1d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 126 additions and 43 deletions

View file

@ -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,