aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Robinson <mrobinson@igalia.com>2023-05-03 17:53:27 +0200
committerMartin Robinson <mrobinson@igalia.com>2023-05-05 06:36:12 +0200
commit932dc72402905cf9597b864199fd85fdb491c287 (patch)
tree4b93a5172ffc5f8783b1e3e8a53654c484591202
parent4e37d07ea4f2bba124f78f17873fbb02c66d1cdb (diff)
downloadservo-932dc72402905cf9597b864199fd85fdb491c287.tar.gz
servo-932dc72402905cf9597b864199fd85fdb491c287.zip
Fix an assertion failure in Layout 2020
The recent changes to containing blocks, exposed an issue in the StyleExt trait: - When deciding whether an element creates a reference frame, whether or not it is a non-replaced inline is taken into account when determining if it has a transform. - When deciding whether an element creates a stacking context for all descendants, whether or not it is a non-replaced inline is *not* taken into account when determining if it has a transform. In both cases, elements that are inline should not be considered to have transforms. This commit fixes that issue as well as making it so that inlines cannot be transformed. Note that is also breaks transforms on replaced elements, but that functionality was fairly half-baked due to the inconsistent determination of transforms.
-rw-r--r--components/layout_2020/style_ext.rs20
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/css-transforms-3d-on-anonymous-block-001.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/perspective-untransformable-no-stacking-context.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/transform-applies-to-002.xht.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/transform-inline-001.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-001.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-002.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-003.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-004.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-005.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/css-transforms/transform3d-image-scale-001.html.ini2
-rw-r--r--tests/wpt/metadata-layout-2020/css/filter-effects/filter-cb-abspos-inline-002.html.ini2
-rw-r--r--tests/wpt/mozilla/meta-layout-2020/mozilla/element_parentOffset.html.ini3
13 files changed, 28 insertions, 17 deletions
diff --git a/components/layout_2020/style_ext.rs b/components/layout_2020/style_ext.rs
index c1d2f47e2fa..56a1be3eca5 100644
--- a/components/layout_2020/style_ext.rs
+++ b/components/layout_2020/style_ext.rs
@@ -336,8 +336,22 @@ impl ComputedValuesExt for ComputedValues {
)
}
- /// Returns true if this style has a transform, or perspective property set.
+ /// Returns true if this style has a transform, or perspective property set and
+ /// it applies to this element.
fn has_transform_or_perspective(&self) -> bool {
+ // "A transformable element is an element in one of these categories:
+ // * all elements whose layout is governed by the CSS box model except for
+ // non-replaced inline boxes, table-column boxes, and table-column-group
+ // boxes,
+ // * all SVG paint server elements, the clipPath element and SVG renderable
+ // elements with the exception of any descendant element of text content
+ // elements."
+ // https://drafts.csswg.org/css-transforms/#transformable-element
+ // FIXME(mrobinson): Properly handle tables and replaced elements here.
+ if self.get_box().display.is_inline_flow() {
+ return false;
+ }
+
!self.get_box().transform.0.is_empty() || self.get_box().perspective != Perspective::None
}
@@ -414,9 +428,7 @@ impl ComputedValuesExt for ComputedValues {
/// Note that this also implies that it establishes a containing block
/// for absolute descendants (`position: absolute`).
fn establishes_containing_block_for_all_descendants(&self) -> bool {
- if self.get_box().display.outside() != stylo::DisplayOutside::Inline &&
- self.has_transform_or_perspective()
- {
+ if self.has_transform_or_perspective() {
return true;
}
diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/css-transforms-3d-on-anonymous-block-001.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/css-transforms-3d-on-anonymous-block-001.html.ini
deleted file mode 100644
index bbb2e5f171e..00000000000
--- a/tests/wpt/metadata-layout-2020/css/css-transforms/css-transforms-3d-on-anonymous-block-001.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[css-transforms-3d-on-anonymous-block-001.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/perspective-untransformable-no-stacking-context.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/perspective-untransformable-no-stacking-context.html.ini
deleted file mode 100644
index f7dd637e965..00000000000
--- a/tests/wpt/metadata-layout-2020/css/css-transforms/perspective-untransformable-no-stacking-context.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[perspective-untransformable-no-stacking-context.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-applies-to-002.xht.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-applies-to-002.xht.ini
deleted file mode 100644
index 27a2c3c0916..00000000000
--- a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-applies-to-002.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[transform-applies-to-002.xht]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-inline-001.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-inline-001.html.ini
deleted file mode 100644
index 677683d5adb..00000000000
--- a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-inline-001.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[transform-inline-001.html]
- expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-001.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-001.html.ini
new file mode 100644
index 00000000000..2d6426ebe5a
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-001.html.ini
@@ -0,0 +1,2 @@
+[transform-table-001.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-002.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-002.html.ini
new file mode 100644
index 00000000000..dcbba9fdd2b
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-002.html.ini
@@ -0,0 +1,2 @@
+[transform-table-002.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-003.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-003.html.ini
new file mode 100644
index 00000000000..8a99504ae7e
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-003.html.ini
@@ -0,0 +1,2 @@
+[transform-table-003.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-004.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-004.html.ini
new file mode 100644
index 00000000000..e0dc22c67a7
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-004.html.ini
@@ -0,0 +1,2 @@
+[transform-table-004.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-005.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-005.html.ini
new file mode 100644
index 00000000000..8c65ab23535
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform-table-005.html.ini
@@ -0,0 +1,2 @@
+[transform-table-005.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/css-transforms/transform3d-image-scale-001.html.ini b/tests/wpt/metadata-layout-2020/css/css-transforms/transform3d-image-scale-001.html.ini
new file mode 100644
index 00000000000..11da067d959
--- /dev/null
+++ b/tests/wpt/metadata-layout-2020/css/css-transforms/transform3d-image-scale-001.html.ini
@@ -0,0 +1,2 @@
+[transform3d-image-scale-001.html]
+ expected: FAIL
diff --git a/tests/wpt/metadata-layout-2020/css/filter-effects/filter-cb-abspos-inline-002.html.ini b/tests/wpt/metadata-layout-2020/css/filter-effects/filter-cb-abspos-inline-002.html.ini
deleted file mode 100644
index 83748f6b1c5..00000000000
--- a/tests/wpt/metadata-layout-2020/css/filter-effects/filter-cb-abspos-inline-002.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[filter-cb-abspos-inline-002.html]
- expected: FAIL
diff --git a/tests/wpt/mozilla/meta-layout-2020/mozilla/element_parentOffset.html.ini b/tests/wpt/mozilla/meta-layout-2020/mozilla/element_parentOffset.html.ini
deleted file mode 100644
index 0db83ebfda4..00000000000
--- a/tests/wpt/mozilla/meta-layout-2020/mozilla/element_parentOffset.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[element_parentOffset.html]
- [element_parentOffset]
- expected: FAIL