mirror of
https://github.com/servo/servo.git
synced 2025-08-06 22:15:33 +01:00
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:
parent
68b0be6dc7
commit
d16f259e1d
6 changed files with 126 additions and 43 deletions
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue