diff options
4 files changed, 39 insertions, 66 deletions
diff --git a/components/layout_2020/table/layout.rs b/components/layout_2020/table/layout.rs index 05501724c5e..6e6b7009541 100644 --- a/components/layout_2020/table/layout.rs +++ b/components/layout_2020/table/layout.rs @@ -9,6 +9,7 @@ use log::warn; use servo_arc::Arc; use style::computed_values::border_collapse::T as BorderCollapse; use style::logical_geometry::WritingMode; +use style::properties::longhands::box_sizing::computed_value::T as BoxSizing; use style::properties::ComputedValues; use style::values::computed::{ CSSPixelLength, Length, LengthPercentage as ComputedLengthPercentage, Percentage, @@ -143,11 +144,24 @@ impl<'a> TableLayout<'a> { _ => continue, }; - let (size, min_size, max_size) = get_sizes_from_style(&cell.style, writing_mode); + let padding = cell + .style + .padding(writing_mode) + .percentages_relative_to(Length::zero()); + let border = cell.style.border_width(writing_mode); + let padding_border_sums = LogicalVec2 { + inline: (padding.inline_sum() + border.inline_sum()).into(), + block: (padding.block_sum() + border.block_sum()).into(), + }; + + let (size, min_size, max_size) = + get_outer_sizes_from_style(&cell.style, writing_mode, &padding_border_sums); let mut inline_content_sizes = cell .contents .contents .inline_content_sizes(layout_context, writing_mode); + inline_content_sizes.min_content += padding_border_sums.inline; + inline_content_sizes.max_content += padding_border_sums.inline; // TODO: the max-content size should never be smaller than the min-content size! inline_content_sizes.max_content = inline_content_sizes @@ -158,11 +172,11 @@ impl<'a> TableLayout<'a> { get_size_percentage_contribution_from_style(&cell.style, writing_mode); // These formulas differ from the spec, but seem to match Gecko and Blink. - let mut outer_min_content_width = inline_content_sizes + let outer_min_content_width = inline_content_sizes .min_content .min(max_size.inline) .max(min_size.inline); - let mut outer_max_content_width = if self.columns[column_index].constrained { + let outer_max_content_width = if self.columns[column_index].constrained { inline_content_sizes .min_content .max(size.inline) @@ -177,17 +191,6 @@ impl<'a> TableLayout<'a> { }; assert!(outer_min_content_width <= outer_max_content_width); - let padding = cell - .style - .padding(writing_mode) - .percentages_relative_to(Length::zero()); - let border = cell.style.border_width(writing_mode); - - let inline_padding_border_sum = - Au::from(padding.inline_sum() + border.inline_sum()); - outer_min_content_width += inline_padding_border_sum; - outer_max_content_width += inline_padding_border_sum; - let inline_measure = CellOrTrackMeasure { content_sizes: ContentSizes { min_content: outer_min_content_width, @@ -203,8 +206,8 @@ impl<'a> TableLayout<'a> { // TODO: Is it correct to use the block size as the minimum of the `outer min // content height` here? The specification doesn't mention this, but it does cause // a test to pass. - let mut outer_min_content_height = min_size.block.max(size.block); - let mut outer_max_content_height = if !self.rows[row_index].constrained { + let outer_min_content_height = min_size.block.max(size.block); + let outer_max_content_height = if !self.rows[row_index].constrained { min_size.block.max(size.block) } else { min_size @@ -213,10 +216,6 @@ impl<'a> TableLayout<'a> { .max(max_size.block.min(size.block)) }; - let block_padding_border_sum = Au::from(padding.block_sum() + border.block_sum()); - outer_min_content_height += block_padding_border_sum; - outer_max_content_height += block_padding_border_sum; - let block_measure = CellOrTrackMeasure { content_sizes: ContentSizes { min_content: outer_min_content_height, @@ -1743,7 +1742,8 @@ impl Table { None => return CellOrTrackMeasure::zero(), }; - let (size, min_size, max_size) = get_sizes_from_style(&column.style, writing_mode); + let (size, min_size, max_size) = + get_outer_sizes_from_style(&column.style, writing_mode, &LogicalVec2::zero()); let percentage_contribution = get_size_percentage_contribution_from_style(&column.style, writing_mode); @@ -1921,40 +1921,34 @@ fn get_size_percentage_contribution_from_style( } } -fn get_sizes_from_style( +fn get_outer_sizes_from_style( style: &Arc<ComputedValues>, writing_mode: WritingMode, + padding_border_sums: &LogicalVec2<Au>, ) -> (LogicalVec2<Au>, LogicalVec2<Au>, LogicalVec2<Au>) { - let get_max_size_for_axis = |size: Option<&ComputedLengthPercentage>| { - size.and_then(|length_percentage| length_percentage.to_length()) - .map_or(MAX_AU, Au::from) + let box_sizing = style.get_position().box_sizing; + let outer_size = |size: LogicalVec2<Au>| match box_sizing { + BoxSizing::ContentBox => &size + padding_border_sums, + BoxSizing::BorderBox => LogicalVec2 { + inline: size.inline.max(padding_border_sums.inline), + block: size.block.max(padding_border_sums.block), + }, }; - - let max_size = style.max_box_size(writing_mode); - let max_size = LogicalVec2 { - inline: get_max_size_for_axis(max_size.inline), - block: get_max_size_for_axis(max_size.block), - }; - - let get_size_for_axis = |size: LengthPercentageOrAuto<'_>| { + let get_size_for_axis = |size: &LengthPercentageOrAuto<'_>| { size.non_auto() .and_then(|size| size.to_length()) .map_or_else(Au::zero, Au::from) }; - - let min_size = style.min_box_size(writing_mode); - let min_size = LogicalVec2 { - inline: get_size_for_axis(min_size.inline), - block: get_size_for_axis(min_size.block), - }; - - let size = style.box_size(writing_mode); - let size = LogicalVec2 { - inline: get_size_for_axis(size.inline), - block: get_size_for_axis(size.block), + let get_max_size_for_axis = |size: &Option<&ComputedLengthPercentage>| { + size.and_then(|length_percentage| length_percentage.to_length()) + .map_or(MAX_AU, Au::from) }; - (size, min_size, max_size) + ( + outer_size(style.box_size(writing_mode).map(get_size_for_axis)), + outer_size(style.min_box_size(writing_mode).map(get_size_for_axis)), + outer_size(style.max_box_size(writing_mode).map(get_max_size_for_axis)), + ) } struct RowspanToDistribute<'a> { diff --git a/tests/wpt/meta/css/css-tables/tentative/table-quirks.html.ini b/tests/wpt/meta/css/css-tables/tentative/table-quirks.html.ini index 47a9d3d7812..531bb82592e 100644 --- a/tests/wpt/meta/css/css-tables/tentative/table-quirks.html.ini +++ b/tests/wpt/meta/css/css-tables/tentative/table-quirks.html.ini @@ -2,8 +2,5 @@ [table 1] expected: FAIL - [table 2] - expected: FAIL - [table 3] expected: FAIL diff --git a/tests/wpt/meta/css/css-tables/tentative/td-box-sizing-001.html.ini b/tests/wpt/meta/css/css-tables/tentative/td-box-sizing-001.html.ini index 361ead3909e..ab1485f9841 100644 --- a/tests/wpt/meta/css/css-tables/tentative/td-box-sizing-001.html.ini +++ b/tests/wpt/meta/css/css-tables/tentative/td-box-sizing-001.html.ini @@ -5,12 +5,6 @@ [table 2] expected: FAIL - [table 6] - expected: FAIL - - [table 8] - expected: FAIL - [table 9] expected: FAIL @@ -19,6 +13,3 @@ [table 11] expected: FAIL - - [table 14] - expected: FAIL diff --git a/tests/wpt/meta/css/css-tables/tentative/td-box-sizing-003.html.ini b/tests/wpt/meta/css/css-tables/tentative/td-box-sizing-003.html.ini index 6764cfe0204..06e1f46f468 100644 --- a/tests/wpt/meta/css/css-tables/tentative/td-box-sizing-003.html.ini +++ b/tests/wpt/meta/css/css-tables/tentative/td-box-sizing-003.html.ini @@ -5,14 +5,5 @@ [table 9] expected: FAIL - [table 5] - expected: FAIL - - [table 6] - expected: FAIL - - [table 7] - expected: FAIL - [table 10] expected: FAIL |