From fe25f77bcf17af3034326a1f20ce10b5b99296cf Mon Sep 17 00:00:00 2001 From: "tanner.drake" Date: Thu, 26 Dec 2024 16:32:16 -0500 Subject: [PATCH] LibWeb/Geometry: Implement "other than none" keyword check --- .../LibWeb/Geometry/DOMMatrixReadOnly.cpp | 3 +- .../wpt-import/css/geometry/DOMMatrix-001.txt | 132 +++++++++++ .../css/geometry/DOMMatrix-001.html | 212 ++++++++++++++++++ .../geometry/support/dommatrix-test-util.js | 85 +++++++ 4 files changed, 431 insertions(+), 1 deletion(-) create mode 100644 Tests/LibWeb/Text/expected/wpt-import/css/geometry/DOMMatrix-001.txt create mode 100644 Tests/LibWeb/Text/input/wpt-import/css/geometry/DOMMatrix-001.html create mode 100644 Tests/LibWeb/Text/input/wpt-import/css/geometry/support/dommatrix-test-util.js diff --git a/Libraries/LibWeb/Geometry/DOMMatrixReadOnly.cpp b/Libraries/LibWeb/Geometry/DOMMatrixReadOnly.cpp index 50f380e1a8e..ed58afc5da0 100644 --- a/Libraries/LibWeb/Geometry/DOMMatrixReadOnly.cpp +++ b/Libraries/LibWeb/Geometry/DOMMatrixReadOnly.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -947,7 +948,7 @@ WebIDL::ExceptionOr parse_dom_matrix_init_string(JS::Realm& realm, // The result will be a , the keyword none, or failure. // If parsedValue is failure, or any has values without absolute length units, or any keyword other than none is used, then return failure. [CSS3-SYNTAX] [CSS3-TRANSFORMS] auto transform_style_value = parse_css_value(CSS::Parser::ParsingContext {}, transform_list, CSS::PropertyID::Transform); - if (!transform_style_value) + if (!transform_style_value || (transform_style_value->is_keyword() && transform_style_value->to_keyword() != CSS::Keyword::None)) return WebIDL::SyntaxError::create(realm, "Failed to parse CSS transform string."_string); auto parsed_value = CSS::ComputedProperties::transformations_for_style_value(*transform_style_value); diff --git a/Tests/LibWeb/Text/expected/wpt-import/css/geometry/DOMMatrix-001.txt b/Tests/LibWeb/Text/expected/wpt-import/css/geometry/DOMMatrix-001.txt new file mode 100644 index 00000000000..3adc93db209 --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/css/geometry/DOMMatrix-001.txt @@ -0,0 +1,132 @@ +Harness status: OK + +Found 126 tests + +122 Pass +4 Fail +Pass new DOMMatrix() +Pass new DOMMatrix(undefined) +Pass new DOMMatrix(new DOMMatrix()) +Pass new DOMMatrix("none") +Pass new DOMMatrix(" none") +Pass new DOMMatrix("none ") +Pass new DOMMatrix("NONE") +Pass new DOMMatrix("none/**/") +Pass new DOMMatrix("/**/none") +Pass new DOMMatrix("") +Pass new DOMMatrix(float32Array) 16 elements +Pass new DOMMatrix(float32Array) 6 elements +Pass new DOMMatrix(float64Array) 16 elements +Pass new DOMMatrix((float64Array) 6 elements +Pass new DOMMatrix(sequence) 16 elements +Pass new DOMMatrix(sequence) 6 elements +Pass new DOMMatrix("scale(2) translateX(5px) translateY(5px)") +Pass new DOMMatrix("scale(2, 2) translateX(5px) translateY(5px)") +Pass new DOMMatrix("scale(2)translateX(5px)translateY(5px)") +Fail new DOMMatrix("scale(2) translateX(calc(2 * 2.5px)) translateY(5px)") +Pass new DOMMatrix("scale(2) translateX(5px) translateY(5px) rotate(5deg) rotate(-5deg)") +Pass new DOMMatrix("translateX (5px)") +Pass new DOMMatrix("scale(2 2) translateX(5) translateY(5)") +Pass new DOMMatrix("scale(2, 2), translateX(5) ,translateY(5)") +Pass new DOMMatrix("translateX(5em)") +Pass new DOMMatrix("translateX(5ex)") +Pass new DOMMatrix("translateX(5ch)") +Pass new DOMMatrix("translateX(5rem)") +Pass new DOMMatrix("translateX(5cqw)") +Pass new DOMMatrix("translateX(5cqh)") +Pass new DOMMatrix("translateX(5cqb)") +Pass new DOMMatrix("translateX(5cqi)") +Pass new DOMMatrix("translateX(5cqmin)") +Pass new DOMMatrix("translateX(5cqmax)") +Pass new DOMMatrix("translateX(5vw)") +Pass new DOMMatrix("translateX(5vh)") +Pass new DOMMatrix("translateX(5vb)") +Pass new DOMMatrix("translateX(5vi)") +Pass new DOMMatrix("translateX(5vmin)") +Pass new DOMMatrix("translateX(5vmax)") +Pass new DOMMatrix("translateX(5%)") +Pass new DOMMatrix("rotate(5)") +Pass new DOMMatrix("rotate(5, 5, 5)") +Pass new DOMMatrix("rotate(5, 5px, 5px)") +Pass new DOMMatrix("rotate(5deg, 5px, 5px)") +Pass new DOMMatrix(" ") +Pass new DOMMatrix("/**/") +Pass new DOMMatrix("\0") +Pass new DOMMatrix(";") +Fail new DOMMatrix("none;") +Pass new DOMMatrix("null") +Pass new DOMMatrix(null) +Pass new DOMMatrix("undefined") +Pass new DOMMatrix("inherit") +Pass new DOMMatrix("initial") +Pass new DOMMatrix("unset") +Pass new DOMMatrix(sequence) +Pass new DOMMatrix(matrix) +Pass new DOMMatrix("scale(2, 2), translateX(5px) translateY(5px)") +Pass new DOMMatrix(sequence) 17 elements +Pass new DOMMatrix(sequence) 15 elements +Pass new DOMMatrix(sequence) 5 elements +Pass new DOMMatrix(sequence) 0 elements +Pass new DOMMatrixReadOnly() +Pass new DOMMatrixReadOnly(undefined) +Pass new DOMMatrixReadOnly(new DOMMatrixReadOnly()) +Pass new DOMMatrixReadOnly("none") +Pass new DOMMatrixReadOnly(" none") +Pass new DOMMatrixReadOnly("none ") +Pass new DOMMatrixReadOnly("NONE") +Pass new DOMMatrixReadOnly("none/**/") +Pass new DOMMatrixReadOnly("/**/none") +Pass new DOMMatrixReadOnly("") +Pass new DOMMatrixReadOnly(float32Array) 16 elements +Pass new DOMMatrixReadOnly(float32Array) 6 elements +Pass new DOMMatrixReadOnly(float64Array) 16 elements +Pass new DOMMatrixReadOnly((float64Array) 6 elements +Pass new DOMMatrixReadOnly(sequence) 16 elements +Pass new DOMMatrixReadOnly(sequence) 6 elements +Pass new DOMMatrixReadOnly("scale(2) translateX(5px) translateY(5px)") +Pass new DOMMatrixReadOnly("scale(2, 2) translateX(5px) translateY(5px)") +Pass new DOMMatrixReadOnly("scale(2)translateX(5px)translateY(5px)") +Fail new DOMMatrixReadOnly("scale(2) translateX(calc(2 * 2.5px)) translateY(5px)") +Pass new DOMMatrixReadOnly("scale(2) translateX(5px) translateY(5px) rotate(5deg) rotate(-5deg)") +Pass new DOMMatrixReadOnly("translateX (5px)") +Pass new DOMMatrixReadOnly("scale(2 2) translateX(5) translateY(5)") +Pass new DOMMatrixReadOnly("scale(2, 2), translateX(5) ,translateY(5)") +Pass new DOMMatrixReadOnly("translateX(5em)") +Pass new DOMMatrixReadOnly("translateX(5ex)") +Pass new DOMMatrixReadOnly("translateX(5ch)") +Pass new DOMMatrixReadOnly("translateX(5rem)") +Pass new DOMMatrixReadOnly("translateX(5cqw)") +Pass new DOMMatrixReadOnly("translateX(5cqh)") +Pass new DOMMatrixReadOnly("translateX(5cqb)") +Pass new DOMMatrixReadOnly("translateX(5cqi)") +Pass new DOMMatrixReadOnly("translateX(5cqmin)") +Pass new DOMMatrixReadOnly("translateX(5cqmax)") +Pass new DOMMatrixReadOnly("translateX(5vw)") +Pass new DOMMatrixReadOnly("translateX(5vh)") +Pass new DOMMatrixReadOnly("translateX(5vb)") +Pass new DOMMatrixReadOnly("translateX(5vi)") +Pass new DOMMatrixReadOnly("translateX(5vmin)") +Pass new DOMMatrixReadOnly("translateX(5vmax)") +Pass new DOMMatrixReadOnly("translateX(5%)") +Pass new DOMMatrixReadOnly("rotate(5)") +Pass new DOMMatrixReadOnly("rotate(5, 5, 5)") +Pass new DOMMatrixReadOnly("rotate(5, 5px, 5px)") +Pass new DOMMatrixReadOnly("rotate(5deg, 5px, 5px)") +Pass new DOMMatrixReadOnly(" ") +Pass new DOMMatrixReadOnly("/**/") +Pass new DOMMatrixReadOnly("\0") +Pass new DOMMatrixReadOnly(";") +Fail new DOMMatrixReadOnly("none;") +Pass new DOMMatrixReadOnly("null") +Pass new DOMMatrixReadOnly(null) +Pass new DOMMatrixReadOnly("undefined") +Pass new DOMMatrixReadOnly("inherit") +Pass new DOMMatrixReadOnly("initial") +Pass new DOMMatrixReadOnly("unset") +Pass new DOMMatrixReadOnly(sequence) +Pass new DOMMatrixReadOnly(matrix) +Pass new DOMMatrixReadOnly("scale(2, 2), translateX(5px) translateY(5px)") +Pass new DOMMatrixReadOnly(sequence) 17 elements +Pass new DOMMatrixReadOnly(sequence) 15 elements +Pass new DOMMatrixReadOnly(sequence) 5 elements +Pass new DOMMatrixReadOnly(sequence) 0 elements \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/wpt-import/css/geometry/DOMMatrix-001.html b/Tests/LibWeb/Text/input/wpt-import/css/geometry/DOMMatrix-001.html new file mode 100644 index 00000000000..b67c16ca538 --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/css/geometry/DOMMatrix-001.html @@ -0,0 +1,212 @@ + + + + Geometry Interfaces: DOMMatrix and DOMMatrixReadOnly constructors + + + + + + + + + +
+ + + diff --git a/Tests/LibWeb/Text/input/wpt-import/css/geometry/support/dommatrix-test-util.js b/Tests/LibWeb/Text/input/wpt-import/css/geometry/support/dommatrix-test-util.js new file mode 100644 index 00000000000..40c336ea8c9 --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/css/geometry/support/dommatrix-test-util.js @@ -0,0 +1,85 @@ +// This formats dict as a string suitable as test name. +// format_value() is provided by testharness.js, +// which also preserves sign for -0. +function format_dict(dict) { + const props = []; + for (let prop in dict) { + props.push(`${prop}: ${format_value(dict[prop])}`); + } + return `{${props.join(', ')}}`; +} + +// Create a normal JS object with the expected properties +// from a dict with only m11..m44 specified (not a..f). +function matrix3D(dict) { + const matrix = {m11: 1, m12: 0, m13: 0, m14: 0, + m21: 0, m22: 1, m23: 0, m24: 0, + m31: 0, m32: 0, m33: 1, m34: 0, + m41: 0, m42: 0, m43: 0, m44: 1} + matrix.is2D = false; + for (let member in dict) { + matrix[member] = dict[member]; + } + matrix.a = matrix.m11; + matrix.b = matrix.m12; + matrix.c = matrix.m21; + matrix.d = matrix.m22; + matrix.e = matrix.m41; + matrix.f = matrix.m42; + return matrix; +} + +function matrix2D(dict) { + const matrix = matrix3D(dict); + matrix.is2D = true; + return matrix; +} + +function checkMatrix(actual, expected, { epsilon = Number.MIN_VALUE } = {}) { + for (let member in expected) { + if (epsilon && typeof expected[member] === "number") { + assert_approx_equals(actual[member], expected[member], epsilon, member); + } else { + assert_equals(actual[member], expected[member], member); + } + } +} + +// checkMatrix and checkDOMMatrix should probably be merged... +function checkDOMMatrix(m, exp, is2D) { + if (is2D === undefined) { + is2D = exp.is2D; + } + assert_equals(m.m11, exp.m11, "Expected value for m11 is " + exp.m11); + assert_equals(m.m12, exp.m12, "Expected value for m12 is " + exp.m12); + assert_equals(m.m13, exp.m13, "Expected value for m13 is " + exp.m13); + assert_equals(m.m14, exp.m14, "Expected value for m14 is " + exp.m14); + assert_equals(m.m21, exp.m21, "Expected value for m21 is " + exp.m21); + assert_equals(m.m22, exp.m22, "Expected value for m22 is " + exp.m22); + assert_equals(m.m23, exp.m23, "Expected value for m23 is " + exp.m23); + assert_equals(m.m24, exp.m24, "Expected value for m24 is " + exp.m24); + assert_equals(m.m31, exp.m31, "Expected value for m31 is " + exp.m31); + assert_equals(m.m32, exp.m32, "Expected value for m32 is " + exp.m32); + assert_equals(m.m33, exp.m33, "Expected value for m33 is " + exp.m33); + assert_equals(m.m34, exp.m34, "Expected value for m34 is " + exp.m34); + assert_equals(m.m41, exp.m41, "Expected value for m41 is " + exp.m41); + assert_equals(m.m42, exp.m42, "Expected value for m42 is " + exp.m42); + assert_equals(m.m43, exp.m43, "Expected value for m43 is " + exp.m43); + assert_equals(m.m44, exp.m44, "Expected value for m44 is " + exp.m44); + assert_equals(m.is2D, is2D, "Expected value for is2D is " + is2D); + assert_equals(m.isIdentity, exp.isIdentity, "Expected value for isIdentity is " + exp.isIdentity); +} + + +function identity() { + return new DOMMatrix( + [1, 0, 0, 0, + 0, 1, 0 ,0, + 0, 0, 1, 0, + 0, 0, 0, 1]); +} + +function update(matrix, f) { + f(matrix); + return matrix; +}