aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/layout_2020/positioned.rs11
-rw-r--r--tests/wpt/meta/MANIFEST.json13
-rw-r--r--tests/wpt/meta/css/css-position/hypothetical-dynamic-change-001.html.ini2
-rw-r--r--tests/wpt/meta/css/css-position/hypothetical-dynamic-change-002.html.ini2
-rw-r--r--tests/wpt/meta/css/css-position/position-fixed-scroll-nested-fixed.html.ini2
-rw-r--r--tests/wpt/web-platform-tests/css/CSS2/abspos/static-fixed-inside-abspos.html13
6 files changed, 37 insertions, 6 deletions
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 @@
+<!DOCTYPE html>
+<title>Static position fixed inside static position absolute</title>
+<link rel="author" title="Martin Robinson" href="mrobinson@igalia.com">
+<link rel="help" href="https://www.w3.org/TR/CSS22/visudet.html#abs-non-replaced-width" title="10.3.7 Absolutely positioned, non-replaced elements">
+<link rel="match" href="../../reference/ref-filled-green-100px-square.xht">
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div style="display: absolute; width: 100px; height: 100px; background: green;">
+ <div style="position: absolute; width: 50px; height: 50px; margin-left: 50px; margin-top: 50px; background: red;">
+ <div style="position: fixed; width: 50px; height: 50px; background: green;"></div>
+ </div>
+</div>