From a44b98c3588ef6f18f77e76abc93d7ab493116bf Mon Sep 17 00:00:00 2001 From: lumiscosity Date: Thu, 4 Sep 2025 09:08:37 +0200 Subject: [PATCH] script: preserve 2D on DOMMatrix invert (#39113) More small geometry fixes. Testing: Covered by WPT (css/geometry/DOMMatrix-invert-preserves-2d.html) --------- Signed-off-by: lumiscosity --- components/script/dom/dommatrixreadonly.rs | 16 +++++++++++----- .../DOMMatrix-invert-preserves-2d.html.ini | 3 --- 2 files changed, 11 insertions(+), 8 deletions(-) delete mode 100644 tests/wpt/meta/css/geometry/DOMMatrix-invert-preserves-2d.html.ini diff --git a/components/script/dom/dommatrixreadonly.rs b/components/script/dom/dommatrixreadonly.rs index d53bceb8f43..aa0aae18764 100644 --- a/components/script/dom/dommatrixreadonly.rs +++ b/components/script/dom/dommatrixreadonly.rs @@ -409,12 +409,18 @@ impl DOMMatrixReadOnly { // Step 2 in DOMMatrix.SkewYSelf } - // https://drafts.fxtf.org/geometry-1/#dom-dommatrix-invertself + /// pub(crate) fn invert_self(&self) { let mut matrix = self.matrix.borrow_mut(); - // Step 1. - *matrix = matrix.inverse().unwrap_or_else(|| { - // Step 2. + // Step 1. Invert the current matrix. + let inverted = match self.is2D() { + true => matrix.to_2d().inverse().map(|m| m.to_3d()), + false => matrix.inverse(), + }; + + // Step 2. If the current matrix is not invertible set all attributes to NaN + // and set is 2D to false. + *matrix = inverted.unwrap_or_else(|| -> Transform3D { self.is2D.set(false); Transform3D::new( f64::NAN, @@ -434,7 +440,7 @@ impl DOMMatrixReadOnly { f64::NAN, f64::NAN, ) - }) + }); // Step 3 in DOMMatrix.InvertSelf } } diff --git a/tests/wpt/meta/css/geometry/DOMMatrix-invert-preserves-2d.html.ini b/tests/wpt/meta/css/geometry/DOMMatrix-invert-preserves-2d.html.ini deleted file mode 100644 index 36eb63e7acf..00000000000 --- a/tests/wpt/meta/css/geometry/DOMMatrix-invert-preserves-2d.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[DOMMatrix-invert-preserves-2d.html] - [scale] - expected: FAIL