Implement DOMMatrix stringifier (#33792)

* Implement DOMMatrix stringifier

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

* Update WPT expectations

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

---------

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
This commit is contained in:
Simon Wülker 2024-10-11 05:06:44 +02:00 committed by GitHub
parent fc2c77be83
commit c00c6e728d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 129 additions and 261 deletions

View file

@ -10,7 +10,8 @@ use dom_struct::dom_struct;
use euclid::default::Transform3D;
use euclid::Angle;
use js::jsapi::JSObject;
use js::rust::{CustomAutoRooterGuard, HandleObject};
use js::jsval;
use js::rust::{CustomAutoRooterGuard, HandleObject, ToString};
use js::typedarray::{Float32Array, Float64Array};
use style::parser::ParserContext;
use url::Url;
@ -21,11 +22,13 @@ use crate::dom::bindings::codegen::Bindings::DOMMatrixBinding::{DOMMatrixInit, D
use crate::dom::bindings::codegen::Bindings::DOMMatrixReadOnlyBinding::DOMMatrixReadOnlyMethods;
use crate::dom::bindings::codegen::Bindings::DOMPointBinding::DOMPointInit;
use crate::dom::bindings::codegen::UnionTypes::StringOrUnrestrictedDoubleSequence;
use crate::dom::bindings::conversions::jsstring_to_str;
use crate::dom::bindings::error;
use crate::dom::bindings::error::Fallible;
use crate::dom::bindings::inheritance::Castable;
use crate::dom::bindings::reflector::{reflect_dom_object_with_proto, DomObject, Reflector};
use crate::dom::bindings::root::DomRoot;
use crate::dom::bindings::str::DOMString;
use crate::dom::dommatrix::DOMMatrix;
use crate::dom::dompoint::DOMPoint;
use crate::dom::globalscope::GlobalScope;
@ -759,6 +762,129 @@ impl DOMMatrixReadOnlyMethods for DOMMatrixReadOnly {
create_buffer_source(cx, &self.matrix.borrow().to_array(), array.handle_mut())
.expect("Converting matrix to float64 array should never fail")
}
// https://drafts.fxtf.org/geometry/#dommatrixreadonly-stringification-behavior
#[allow(unsafe_code)]
fn Stringifier(&self) -> Fallible<DOMString> {
// Step 1. If one or more of m11 element through m44 element are a non-finite value,
// then throw an "InvalidStateError" DOMException.
let mat = self.matrix.borrow();
if !mat.m11.is_finite() ||
!mat.m12.is_finite() ||
!mat.m13.is_finite() ||
!mat.m14.is_finite() ||
!mat.m21.is_finite() ||
!mat.m22.is_finite() ||
!mat.m23.is_finite() ||
!mat.m24.is_finite() ||
!mat.m31.is_finite() ||
!mat.m32.is_finite() ||
!mat.m33.is_finite() ||
!mat.m34.is_finite() ||
!mat.m41.is_finite() ||
!mat.m42.is_finite() ||
!mat.m43.is_finite() ||
!mat.m44.is_finite()
{
return Err(error::Error::InvalidState);
}
// Step 2. Let string be the empty string.
let string;
// Step 3. If is 2D is true, then:
let cx = GlobalScope::get_cx();
let to_string = |f: f64| {
let value = jsval::DoubleValue(f);
unsafe {
rooted!(in(*cx) let mut rooted_value = value);
let serialization = ToString(*cx, rooted_value.handle());
jsstring_to_str(
*cx,
ptr::NonNull::new(serialization).expect("Pointer cannot be null"),
)
}
};
if self.is2D() {
// Step 3.1 Append "matrix(" to string.
// Step 3.2 Append ! ToString(m11 element) to string.
// Step 3.3 Append ", " to string.
// Step 3.4 Append ! ToString(m12 element) to string.
// Step 3.5 Append ", " to string.
// Step 3.6 Append ! ToString(m21 element) to string.
// Step 3.7 Append ", " to string.
// Step 3.8 Append ! ToString(m22 element) to string.
// Step 3.9 Append ", " to string.
// Step 3.10 Append ! ToString(m41 element) to string.
// Step 3.11 Append ", " to string.
// Step 3.12 Append ! ToString(m42 element) to string.
// Step 3.13 Append ")" to string.
string = format!(
"matrix({}, {}, {}, {}, {}, {})",
to_string(mat.m11),
to_string(mat.m12),
to_string(mat.m21),
to_string(mat.m22),
to_string(mat.m41),
to_string(mat.m42)
)
.into();
}
// Step 4. Otherwise:
else {
// Step 4.1 Append "matrix3d(" to string.
// Step 4.2 Append ! ToString(m11 element) to string.
// Step 4.3 Append ", " to string.
// Step 4.4 Append ! ToString(m12 element) to string.
// Step 4.5 Append ", " to string.
// Step 4.6 Append ! ToString(m13 element) to string.
// Step 4.7 Append ", " to string.
// Step 4.8 Append ! ToString(m14 element) to string.
// Step 4.9 Append ", " to string.
// Step 4.10 Append ! ToString(m21 element) to string.
// Step 4.11 Append ", " to string.
// Step 4.12 Append ! ToString(m22 element) to string.
// Step 4.13 Append ", " to string.
// Step 4.14 Append ! ToString(m23 element) to string.
// Step 4.15 Append ", " to string.
// Step 4.16 Append ! ToString(m24 element) to string.
// Step 4.17 Append ", " to string.
// Step 4.18 Append ! ToString(m41 element) to string.
// Step 4.19 Append ", " to string.
// Step 4.20 Append ! ToString(m42 element) to string.
// Step 4.21 Append ", " to string.
// Step 4.22 Append ! ToString(m43 element) to string.
// Step 4.23 Append ", " to string.
// Step 4.24 Append ! ToString(m44 element) to string.
// Step 4.25 Append ")" to string.
// NOTE: The spec is wrong and missing the m3* elements.
// (https://github.com/w3c/fxtf-drafts/issues/574)
string = format!(
"matrix3d({}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {})",
to_string(mat.m11),
to_string(mat.m12),
to_string(mat.m13),
to_string(mat.m14),
to_string(mat.m21),
to_string(mat.m22),
to_string(mat.m23),
to_string(mat.m24),
to_string(mat.m31),
to_string(mat.m32),
to_string(mat.m33),
to_string(mat.m34),
to_string(mat.m41),
to_string(mat.m42),
to_string(mat.m43),
to_string(mat.m44)
)
.into();
}
Ok(string)
}
}
// https://drafts.fxtf.org/geometry-1/#create-a-2d-matrix