diff options
author | Oriol Brufau <obrufau@igalia.com> | 2025-01-13 03:50:25 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-13 11:50:25 +0000 |
commit | 4332c1e4058970346f07d65dfa8de29a16cc31d8 (patch) | |
tree | 17016339347e4200ac41394a5bc5364d59ce1241 /components/layout_2020/table | |
parent | f66cd172d6fd9f4cf9bcd7d413bd3a8ad22a0815 (diff) | |
download | servo-4332c1e4058970346f07d65dfa8de29a16cc31d8.tar.gz servo-4332c1e4058970346f07d65dfa8de29a16cc31d8.zip |
layout: Improve logic for block size of table (#34947)
The containing block for children already has the size coming from the
style and the rules of the parent formatting context, so no need to try
to recompute it.
This allows removing a bunch of functions, and fixes some problems when
the table is a flex item.
Signed-off-by: Oriol Brufau <obrufau@igalia.com>
Diffstat (limited to 'components/layout_2020/table')
-rw-r--r-- | components/layout_2020/table/layout.rs | 27 |
1 files changed, 8 insertions, 19 deletions
diff --git a/components/layout_2020/table/layout.rs b/components/layout_2020/table/layout.rs index b2f9f881f3b..8b153d05b4b 100644 --- a/components/layout_2020/table/layout.rs +++ b/components/layout_2020/table/layout.rs @@ -21,7 +21,6 @@ use style::values::computed::{ BorderStyle, LengthPercentage as ComputedLengthPercentage, Percentage, }; use style::values::generics::box_::{GenericVerticalAlign as VerticalAlign, VerticalAlignKeyword}; -use style::values::generics::length::GenericLengthPercentageOrAuto::{Auto, LengthPercentage}; use style::Zero; use super::{ @@ -1550,24 +1549,17 @@ impl<'a> TableLayout<'a> { &mut self, mut row_sizes: Vec<Au>, containing_block_for_children: &ContainingBlock, - containing_block_for_table: &ContainingBlock, ) { // The table content height is the maximum of the computed table height from style and the // sum of computed row heights from row layout plus size from borders and spacing. - // When block-size doesn't compute to auto, `containing_block_for children` will have - // the resulting length, properly clamped between min-block-size and max-block-size. - let style = &self.table.style; - let table_height_from_style = match style - .content_box_size_deprecated(containing_block_for_table, &self.pbm) - .block - { - LengthPercentage(_) => containing_block_for_children.size.block.to_auto_or(), - Auto => style - .content_min_box_size_deprecated(containing_block_for_table, &self.pbm) - .block - .map(Au::from), - } - .auto_is(Au::zero); + // TODO: for `height: stretch`, the block size of the containing block is the available + // space for the entire table wrapper, but here we are using that amount for the table grid. + // Therefore, if there is a caption, this will cause overflow. Gecko and WebKit have the + // same problem, but not Blink. + let table_height_from_style = match containing_block_for_children.size.block { + SizeConstraint::Definite(size) => size, + SizeConstraint::MinMax(min, _) => min, + }; let block_border_spacing = self.table.total_border_spacing().block; let table_height_from_rows = row_sizes.iter().sum::<Au>() + block_border_spacing; @@ -1756,7 +1748,6 @@ impl<'a> TableLayout<'a> { positioning_context, &containing_block_for_logical_conversion, containing_block_for_children, - containing_block_for_table, ); // Take the baseline of the grid fragment, after adjusting it to be in the coordinate system @@ -1853,7 +1844,6 @@ impl<'a> TableLayout<'a> { positioning_context: &mut PositioningContext, containing_block_for_logical_conversion: &ContainingBlock, containing_block_for_children: &ContainingBlock, - containing_block_for_table: &ContainingBlock, ) -> BoxFragment { self.distributed_column_widths = self.distribute_width_to_columns(); self.layout_cells_in_row( @@ -1866,7 +1856,6 @@ impl<'a> TableLayout<'a> { self.compute_table_height_and_final_row_heights( first_layout_row_heights, containing_block_for_children, - containing_block_for_table, ); assert_eq!(self.table.size.height, self.row_sizes.len()); |