From ef229b93863b7b1f1f718c4f1fbb755d0136e40d Mon Sep 17 00:00:00 2001 From: Martin Robinson Date: Thu, 19 Sep 2024 14:43:29 +0200 Subject: [PATCH] layout: Ensure that ``'s support `position: relative` (#33426) This change adds support for `position: relative` to table ``. In addition to adjusting their position according to inset values, table captions must also establish containing blocks for descendants that are absolutely positioned. Signed-off-by: Martin Robinson Co-authored-by: Oriol Brufau --- components/layout_2020/table/layout.rs | 16 +++++++++--- tests/wpt/meta/MANIFEST.json | 13 ++++++++++ ...e-caption-is-containing-block-001.html.ini | 2 -- .../position-relative-table-caption.html.ini | 2 -- .../caption-relative-positioning.html | 26 +++++++++++++++++++ 5 files changed, 52 insertions(+), 7 deletions(-) delete mode 100644 tests/wpt/meta/css/CSS2/abspos/table-caption-is-containing-block-001.html.ini delete mode 100644 tests/wpt/meta/css/css-position/position-relative-table-caption.html.ini create mode 100644 tests/wpt/tests/css/css-tables/caption-relative-positioning.html diff --git a/components/layout_2020/table/layout.rs b/components/layout_2020/table/layout.rs index 054d291c593..5b622cbb7b9 100644 --- a/components/layout_2020/table/layout.rs +++ b/components/layout_2020/table/layout.rs @@ -13,6 +13,7 @@ use style::computed_values::border_collapse::T as BorderCollapse; use style::computed_values::box_sizing::T as BoxSizing; use style::computed_values::caption_side::T as CaptionSide; use style::computed_values::empty_cells::T as EmptyCells; +use style::computed_values::position::T as Position; use style::computed_values::table_layout::T as TableLayoutMode; use style::computed_values::visibility::T as Visibility; use style::logical_geometry::WritingMode; @@ -1642,7 +1643,7 @@ impl<'a> TableLayout<'a> { style: containing_block.style, }; - let box_fragment = context.layout_in_flow_block_level( + let mut box_fragment = context.layout_in_flow_block_level( layout_context, positioning_context .as_mut() @@ -1651,7 +1652,8 @@ impl<'a> TableLayout<'a> { None, /* sequential_layout_state */ ); - if let Some(positioning_context) = positioning_context.take() { + if let Some(mut positioning_context) = positioning_context.take() { + positioning_context.layout_collected_children(layout_context, &mut box_fragment); parent_positioning_context.append(positioning_context); } @@ -1735,11 +1737,19 @@ impl<'a> TableLayout<'a> { let caption_pbm = caption_fragment .padding_border_margin() .to_logical(table_writing_mode); + + let caption_relative_offset = match caption_fragment.style.clone_position() { + Position::Relative => { + relative_adjustement(&caption_fragment.style, containing_block_for_children) + }, + _ => LogicalVec2::zero(), + }; + caption_fragment.content_rect = LogicalRect { start_corner: LogicalVec2 { inline: offset_from_wrapper.inline_start + caption_pbm.inline_start, block: current_block_offset + caption_pbm.block_start, - }, + } + caption_relative_offset, size: caption_fragment .content_rect .size diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index e35446a99bd..f692f8f9baf 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -240575,6 +240575,19 @@ {} ] ], + "caption-relative-positioning.html": [ + "2be1e86bc077f1293ccc9ea851f23123ae679157", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "col-definite-max-size-001.html": [ "bcd7ca2fd89c26384e26be64dade0e7af0ea4c79", [ diff --git a/tests/wpt/meta/css/CSS2/abspos/table-caption-is-containing-block-001.html.ini b/tests/wpt/meta/css/CSS2/abspos/table-caption-is-containing-block-001.html.ini deleted file mode 100644 index 66d3d601b7f..00000000000 --- a/tests/wpt/meta/css/CSS2/abspos/table-caption-is-containing-block-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[table-caption-is-containing-block-001.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-position/position-relative-table-caption.html.ini b/tests/wpt/meta/css/css-position/position-relative-table-caption.html.ini deleted file mode 100644 index e37d2b12888..00000000000 --- a/tests/wpt/meta/css/css-position/position-relative-table-caption.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[position-relative-table-caption.html] - expected: FAIL diff --git a/tests/wpt/tests/css/css-tables/caption-relative-positioning.html b/tests/wpt/tests/css/css-tables/caption-relative-positioning.html new file mode 100644 index 00000000000..2be1e86bc07 --- /dev/null +++ b/tests/wpt/tests/css/css-tables/caption-relative-positioning.html @@ -0,0 +1,26 @@ + + + + + <caption> elements can be relatively positioned + + + + + +

Test passes if there is a filled green square and no red.

+
+ + +
+
+