aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Robinson <mrobinson@igalia.com>2023-06-15 16:18:27 +0200
committerMartin Robinson <mrobinson@igalia.com>2023-06-16 17:11:00 +0200
commitae3c22aa887d6c74acab6cc899b19a7cb41cd131 (patch)
treec20abc3fba6d23d24625f827b9ea7cc380d1770b
parentfa266abd29688833e1ffa5995230e5a6c30161f6 (diff)
downloadservo-ae3c22aa887d6c74acab6cc899b19a7cb41cd131.tar.gz
servo-ae3c22aa887d6c74acab6cc899b19a7cb41cd131.zip
Don't pass up float stacking containers to parent stacking contexts
Instead of passing up stacking containers created by floated content, keep them in their original parent stacking containers. This is in in line with specification text for stacking containers: > To paint a stacking container, given a box root and a canvas canvas: > > 1. Paint a stacking context given root and canvas, treating root as > if it created a new stacking context, but omitting any positioned > descendants or descendants that actually create a stacking context > (letting the parent stacking context paint them, instead).
-rw-r--r--components/layout_2020/display_list/stacking_context.rs32
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/css1/c414-flt-wrap-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-003.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-001.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-002.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-003.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-008.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-001.html.ini3
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-001.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-002.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-004.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-center.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-end.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-space-around.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-space-between.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-start.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-formatting-interop.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-position/position-absolute-dynamic-static-position-floats-004.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-position/static-position/inline-level-absolute-in-block-level-context-004.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-position/static-position/inline-level-absolute-in-block-level-context-009.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-position/static-position/inline-level-absolute-in-block-level-context-010.html.ini2
21 files changed, 35 insertions, 38 deletions
diff --git a/components/layout_2020/display_list/stacking_context.rs b/components/layout_2020/display_list/stacking_context.rs
index 63fefd0c4f4..a231ab088a7 100644
--- a/components/layout_2020/display_list/stacking_context.rs
+++ b/components/layout_2020/display_list/stacking_context.rs
@@ -200,6 +200,11 @@ pub(crate) enum StackingContextType {
PseudoAtomicInline,
}
+/// A [StackingContext] represents either a stacking context or a stacking
+/// container according to the definitions outlined in
+/// <https://drafts.csswg.org/css-position-4/#painting-order>
+/// Stacking containers are sometimes called "pseudo-stacking contexts"
+/// in the Servo source.
pub struct StackingContext {
/// The spatial id of this fragment. This is used to properly handle
/// things like preserve-3d.
@@ -218,7 +223,19 @@ pub struct StackingContext {
/// of this stacking context.
stacking_contexts: Vec<StackingContext>,
- /// All float pseudo stacking context children of this stacking context.
+ /// All float stacking container children of this stacking context.
+ /// These are stored separately because they should not be passed up to
+ /// their real stacking context ancestors. From the definition of stacking
+ /// containers from <https://drafts.csswg.org/css-position-4#painting-order>:
+ ///
+ /// > To paint a stacking container, given a box root and a canvas canvas:
+ /// > 1. Paint a stacking context given root and canvas, treating root as
+ /// > if it created a new stacking context, but omitting any positioned
+ /// > descendants or descendants that actually create a stacking context
+ /// > (letting the parent stacking context paint them, instead).
+ ///
+ /// Note that all stacking containers / pseudo stacking contexts are passed up
+ /// to parent stacking contexts, except in the case of floats.
float_stacking_contexts: Vec<StackingContext>,
}
@@ -249,6 +266,15 @@ impl StackingContext {
}
}
+ /// Add a child stacking context to this stacking context.
+ fn add_stacking_context(&mut self, stacking_context: StackingContext) {
+ if stacking_context.context_type == StackingContextType::PseudoFloat {
+ self.float_stacking_contexts.push(stacking_context);
+ } else {
+ self.stacking_contexts.push(stacking_context);
+ }
+ }
+
fn z_index(&self) -> i32 {
self.initializing_fragment_style
.as_ref()
@@ -754,9 +780,7 @@ impl BoxFragment {
}
child_stacking_context.sort();
- parent_stacking_context
- .stacking_contexts
- .push(child_stacking_context);
+ parent_stacking_context.add_stacking_context(child_stacking_context);
parent_stacking_context
.stacking_contexts
.append(&mut stolen_children);
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/css1/c414-flt-wrap-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/css1/c414-flt-wrap-001.xht.ini
new file mode 100644
index 00000000000..b07643272b6
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/css1/c414-flt-wrap-001.xht.ini
@@ -0,0 +1,2 @@
+[c414-flt-wrap-001.xht]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-003.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-003.xht.ini
deleted file mode 100644
index 73ce7f8a1eb..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats-clear/clear-clearance-calculation-003.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[clear-clearance-calculation-003.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-001.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-001.html.ini
deleted file mode 100644
index 17aa43d18b1..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-001.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-placement-001.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-002.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-002.html.ini
deleted file mode 100644
index 4e00856c08e..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-002.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-placement-002.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-003.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-003.html.ini
deleted file mode 100644
index 90225d8f4d4..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-003.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-placement-003.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-008.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-008.html.ini
deleted file mode 100644
index 5a1e705388f..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/floats/floats-placement-008.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[floats-placement-008.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-001.html.ini b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-001.html.ini
new file mode 100644
index 00000000000..0842d0b5727
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/CSS2/floats/hit-test-floats-001.html.ini
@@ -0,0 +1,3 @@
+[hit-test-floats-001.html]
+ [hit-test-floats-001]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-001.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-001.xht.ini
deleted file mode 100644
index 51b3c04a7f4..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[stack-floats-001.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-002.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-002.xht.ini
deleted file mode 100644
index 413e005eeda..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-002.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[stack-floats-002.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-004.xht.ini b/tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-004.xht.ini
deleted file mode 100644
index 0e8029cf3cb..00000000000
--- a/tests/wpt/metadata-layout-2020/css/CSS2/zindex/stack-floats-004.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[stack-floats-004.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-center.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-center.html.ini
deleted file mode 100644
index dcb5578932d..00000000000
--- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-center.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[flex-align-content-center.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-end.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-end.html.ini
deleted file mode 100644
index d813a3dbc90..00000000000
--- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-end.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[flex-align-content-end.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-space-around.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-space-around.html.ini
deleted file mode 100644
index 0df689e3f18..00000000000
--- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-space-around.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[flex-align-content-space-around.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-space-between.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-space-between.html.ini
deleted file mode 100644
index e10b2f33ae2..00000000000
--- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-space-between.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[flex-align-content-space-between.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-start.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-start.html.ini
deleted file mode 100644
index 19e606aada8..00000000000
--- a/tests/wpt/metadata-layout-2020/css/css-flexbox/flex-align-content-start.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[flex-align-content-start.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-formatting-interop.html.ini b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-formatting-interop.html.ini
new file mode 100644
index 00000000000..0a5916356e7
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-flexbox/flexbox_flex-formatting-interop.html.ini
@@ -0,0 +1,2 @@
+[flexbox_flex-formatting-interop.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-dynamic-static-position-floats-004.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-dynamic-static-position-floats-004.html.ini
deleted file mode 100644
index e488c064bb1..00000000000
--- a/tests/wpt/metadata-layout-2020/css/css-position/position-absolute-dynamic-static-position-floats-004.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[position-absolute-dynamic-static-position-floats-004.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-position/static-position/inline-level-absolute-in-block-level-context-004.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/static-position/inline-level-absolute-in-block-level-context-004.html.ini
deleted file mode 100644
index 972f6697b03..00000000000
--- a/tests/wpt/metadata-layout-2020/css/css-position/static-position/inline-level-absolute-in-block-level-context-004.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[inline-level-absolute-in-block-level-context-004.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-position/static-position/inline-level-absolute-in-block-level-context-009.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/static-position/inline-level-absolute-in-block-level-context-009.html.ini
deleted file mode 100644
index 0653a572396..00000000000
--- a/tests/wpt/metadata-layout-2020/css/css-position/static-position/inline-level-absolute-in-block-level-context-009.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[inline-level-absolute-in-block-level-context-009.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-position/static-position/inline-level-absolute-in-block-level-context-010.html.ini b/tests/wpt/metadata-layout-2020/css/css-position/static-position/inline-level-absolute-in-block-level-context-010.html.ini
deleted file mode 100644
index 2035850bdc8..00000000000
--- a/tests/wpt/metadata-layout-2020/css/css-position/static-position/inline-level-absolute-in-block-level-context-010.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[inline-level-absolute-in-block-level-context-010.html]
- expected: FAIL