From 63a6b73f9a1a10af2a913b051fb89c7b599a3593 Mon Sep 17 00:00:00 2001 From: Martin Robinson Date: Thu, 22 Jun 2023 11:28:26 +0200 Subject: [PATCH] Fix positioning of statically positioned fixed child of absolutes --- components/layout_2020/positioned.rs | 11 +++++++++++ tests/wpt/meta/MANIFEST.json | 13 +++++++++++++ .../hypothetical-dynamic-change-001.html.ini | 2 -- .../hypothetical-dynamic-change-002.html.ini | 2 -- .../position-fixed-scroll-nested-fixed.html.ini | 2 -- .../css/CSS2/abspos/static-fixed-inside-abspos.html | 13 +++++++++++++ 6 files changed, 37 insertions(+), 6 deletions(-) delete mode 100644 tests/wpt/meta/css/css-position/hypothetical-dynamic-change-001.html.ini delete mode 100644 tests/wpt/meta/css/css-position/hypothetical-dynamic-change-002.html.ini delete mode 100644 tests/wpt/meta/css/css-position/position-fixed-scroll-nested-fixed.html.ini create mode 100644 tests/wpt/web-platform-tests/css/CSS2/abspos/static-fixed-inside-abspos.html diff --git a/components/layout_2020/positioned.rs b/components/layout_2020/positioned.rs index 07831f8dbf8..493c5a1c714 100644 --- a/components/layout_2020/positioned.rs +++ b/components/layout_2020/positioned.rs @@ -626,8 +626,19 @@ impl HoistedAbsolutelyPositionedBox { ) }; positioning_context.layout_collected_children(layout_context, &mut new_fragment); + + // Any hoisted boxes that remain in this positioning context are going to be hoisted + // up above this absolutely positioned box. These will necessarily be fixed position + // elements, because absolutely positioned elements form containing blocks for all + // other elements. If any of them have a static start position though, we need to + // adjust it to account for the start corner of this absolute. + positioning_context.adjust_static_position_of_hoisted_fragments_with_offset( + &new_fragment.content_rect.start_corner, + ); + for_nearest_containing_block_for_all_descendants .extend(positioning_context.for_nearest_containing_block_for_all_descendants); + new_fragment } } diff --git a/tests/wpt/meta/MANIFEST.json b/tests/wpt/meta/MANIFEST.json index d39c79550ed..acbf476370f 100644 --- a/tests/wpt/meta/MANIFEST.json +++ b/tests/wpt/meta/MANIFEST.json @@ -31605,6 +31605,19 @@ {} ] ], + "static-fixed-inside-abspos.html": [ + "e3c3aa450d42505557b1f3eefd0aee8ea63fa4d6", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "static-inside-inline-block.html": [ "327e8e6dacdeabb4d2d57ab700d80f966ccde76b", [ diff --git a/tests/wpt/meta/css/css-position/hypothetical-dynamic-change-001.html.ini b/tests/wpt/meta/css/css-position/hypothetical-dynamic-change-001.html.ini deleted file mode 100644 index 334022baff7..00000000000 --- a/tests/wpt/meta/css/css-position/hypothetical-dynamic-change-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[hypothetical-dynamic-change-001.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-position/hypothetical-dynamic-change-002.html.ini b/tests/wpt/meta/css/css-position/hypothetical-dynamic-change-002.html.ini deleted file mode 100644 index 5541b847967..00000000000 --- a/tests/wpt/meta/css/css-position/hypothetical-dynamic-change-002.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[hypothetical-dynamic-change-002.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-position/position-fixed-scroll-nested-fixed.html.ini b/tests/wpt/meta/css/css-position/position-fixed-scroll-nested-fixed.html.ini deleted file mode 100644 index 2903ed8c405..00000000000 --- a/tests/wpt/meta/css/css-position/position-fixed-scroll-nested-fixed.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[position-fixed-scroll-nested-fixed.html] - expected: FAIL diff --git a/tests/wpt/web-platform-tests/css/CSS2/abspos/static-fixed-inside-abspos.html b/tests/wpt/web-platform-tests/css/CSS2/abspos/static-fixed-inside-abspos.html new file mode 100644 index 00000000000..e3c3aa450d4 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/CSS2/abspos/static-fixed-inside-abspos.html @@ -0,0 +1,13 @@ + +Static position fixed inside static position absolute + + + + +

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

+ +
+
+
+
+