diff options
author | Martin Robinson <mrobinson@igalia.com> | 2023-06-15 16:18:27 +0200 |
---|---|---|
committer | Martin Robinson <mrobinson@igalia.com> | 2023-06-16 17:11:00 +0200 |
commit | ae3c22aa887d6c74acab6cc899b19a7cb41cd131 (patch) | |
tree | c20abc3fba6d23d24625f827b9ea7cc380d1770b | |
parent | fa266abd29688833e1ffa5995230e5a6c30161f6 (diff) | |
download | servo-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).
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 |