SVG2: Use DOMMatrix2DInit for setMatrix and createSVGTransformFromMatrix
authorkrit@webkit.org <krit@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 22 Oct 2019 09:43:49 +0000 (09:43 +0000)
committerkrit@webkit.org <krit@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 22 Oct 2019 09:43:49 +0000 (09:43 +0000)
https://bugs.webkit.org/show_bug.cgi?id=191417

Reviewed by Dean Jackson.

Source/WebCore:

setMatrix and createSVGTransformFromMatrix used to use SVGMatrix as argument.
With SVG 2.0, any DOMPoint2DInit type is supported which inlcudes dictionaries,
DOMMatrix, DOMMatrixReadOnly and SVGMatrix (alias of DOMMatrix).

Extended existing tests.

* svg/SVGSVGElement.cpp:
(WebCore::SVGSVGElement::createSVGTransformFromMatrix):
* svg/SVGSVGElement.h:
* svg/SVGSVGElement.idl:
* svg/SVGTransform.h:
(WebCore::SVGTransform::setMatrix):
* svg/SVGTransform.idl:
* svg/SVGTransformList.h:
* svg/SVGTransformList.idl:
* svg/SVGTransformListValues.cpp:
(WebCore::SVGTransformListValues::createSVGTransformFromMatrix const):
* svg/SVGTransformListValues.h:

LayoutTests:

Extended existing tests to cover change to new argument
DOMMatrix2DInit.

* svg/dom/SVGTransform-expected.txt:
* svg/dom/SVGTransform.html:
* svg/dom/SVGTransformList-expected.txt:
* svg/dom/SVGTransformList.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251427 268f45cc-cd09-0410-ab3c-d52691b4dbfc

14 files changed:
LayoutTests/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/svg/idlharness.window-expected.txt
LayoutTests/svg/dom/SVGTransform-expected.txt
LayoutTests/svg/dom/SVGTransform.html
LayoutTests/svg/dom/SVGTransformList-expected.txt
LayoutTests/svg/dom/SVGTransformList.html
Source/WebCore/ChangeLog
Source/WebCore/svg/SVGSVGElement.cpp
Source/WebCore/svg/SVGSVGElement.h
Source/WebCore/svg/SVGSVGElement.idl
Source/WebCore/svg/SVGTransform.h
Source/WebCore/svg/SVGTransform.idl
Source/WebCore/svg/SVGTransformList.h
Source/WebCore/svg/SVGTransformList.idl

index 1e7869e..7baa6d1 100644 (file)
@@ -1,3 +1,18 @@
+2019-10-22  Dirk Schulze  <krit@webkit.org>
+
+        SVG2: Use DOMMatrix2DInit for setMatrix and createSVGTransformFromMatrix
+        https://bugs.webkit.org/show_bug.cgi?id=191417
+
+        Reviewed by Dean Jackson.
+
+        Extended existing tests to cover change to new argument
+        DOMMatrix2DInit.
+
+        * svg/dom/SVGTransform-expected.txt:
+        * svg/dom/SVGTransform.html:
+        * svg/dom/SVGTransformList-expected.txt:
+        * svg/dom/SVGTransformList.html:
+
 2019-10-21  Simon Fraser  <simon.fraser@apple.com>
 
         Multiple fast/scrolling/ios tests failing with unexpected scrollbars appearing in result
index 6c2d583..0905cde 100644 (file)
@@ -372,7 +372,7 @@ PASS SVGSVGElement interface: operation createSVGPoint()
 PASS SVGSVGElement interface: operation createSVGMatrix() 
 PASS SVGSVGElement interface: operation createSVGRect() 
 PASS SVGSVGElement interface: operation createSVGTransform() 
-FAIL SVGSVGElement interface: operation createSVGTransformFromMatrix(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 1
+PASS SVGSVGElement interface: operation createSVGTransformFromMatrix(DOMMatrix2DInit) 
 PASS SVGSVGElement interface: operation getElementById(DOMString) 
 FAIL SVGSVGElement interface: operation suspendRedraw(unsigned long) assert_equals: property has wrong .length expected 1 but got 0
 FAIL SVGSVGElement interface: operation unsuspendRedraw(unsigned long) assert_equals: property has wrong .length expected 1 but got 0
@@ -648,7 +648,7 @@ PASS SVGTransform interface: constant SVG_TRANSFORM_SKEWY on interface prototype
 PASS SVGTransform interface: attribute type 
 PASS SVGTransform interface: attribute matrix 
 PASS SVGTransform interface: attribute angle 
-FAIL SVGTransform interface: operation setMatrix(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 1
+PASS SVGTransform interface: operation setMatrix(DOMMatrix2DInit) 
 PASS SVGTransform interface: operation setTranslate(float, float) 
 PASS SVGTransform interface: operation setScale(float, float) 
 PASS SVGTransform interface: operation setRotate(float, float, float) 
@@ -693,7 +693,7 @@ PASS SVGTransformList interface: operation insertItemBefore(SVGTransform, unsign
 PASS SVGTransformList interface: operation replaceItem(SVGTransform, unsigned long) 
 PASS SVGTransformList interface: operation removeItem(unsigned long) 
 PASS SVGTransformList interface: operation appendItem(SVGTransform) 
-FAIL SVGTransformList interface: operation createSVGTransformFromMatrix(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 1
+PASS SVGTransformList interface: operation createSVGTransformFromMatrix(DOMMatrix2DInit) 
 PASS SVGTransformList interface: operation consolidate() 
 PASS SVGTransformList must be primary interface of objects.pattern.patternTransform.baseVal 
 PASS Stringification of objects.pattern.patternTransform.baseVal 
index e4a7712..3f6fde6 100644 (file)
@@ -49,12 +49,26 @@ PASS transform.matrix.e is 0
 PASS transform.matrix.f is 0
 
 Check passing invalid arguments to 'setMatrix'
-PASS transform.setMatrix() threw exception TypeError: Not enough arguments.
-PASS transform.setMatrix(transform) threw exception TypeError: Argument 1 ('matrix') to SVGTransform.setMatrix must be an instance of SVGMatrix.
-PASS transform.setMatrix(svgElement) threw exception TypeError: Argument 1 ('matrix') to SVGTransform.setMatrix must be an instance of SVGMatrix.
-PASS transform.setMatrix('aString') threw exception TypeError: Argument 1 ('matrix') to SVGTransform.setMatrix must be an instance of SVGMatrix.
-PASS transform.setMatrix(1) threw exception TypeError: Argument 1 ('matrix') to SVGTransform.setMatrix must be an instance of SVGMatrix.
-PASS transform.setMatrix(false) threw exception TypeError: Argument 1 ('matrix') to SVGTransform.setMatrix must be an instance of SVGMatrix.
+PASS transform.setMatrix('aString') threw exception TypeError: Type error.
+PASS transform.setMatrix(1) threw exception TypeError: Type error.
+PASS transform.setMatrix(false) threw exception TypeError: Type error.
+Check passing abritary objects, nothing or dictionaries
+PASS transform.setMatrix(transform) is undefined.
+PASS transform.setMatrix(svgElement) is undefined.
+PASS transform.setMatrix({a: 2, b: 0, c: 0, d: 2, e: 10, f: 10}) is undefined.
+PASS transform.matrix.a is 2
+PASS transform.matrix.b is 0
+PASS transform.matrix.c is 0
+PASS transform.matrix.d is 2
+PASS transform.matrix.e is 10
+PASS transform.matrix.f is 10
+PASS transform.setMatrix() is undefined.
+PASS transform.matrix.a is 1
+PASS transform.matrix.b is 0
+PASS transform.matrix.c is 0
+PASS transform.matrix.d is 1
+PASS transform.matrix.e is 0
+PASS transform.matrix.f is 0
 
 Check passing invalid arguments to 'setTranslate'
 PASS transform.setTranslate() threw exception TypeError: Not enough arguments.
index b870019..e36404f 100644 (file)
@@ -62,12 +62,26 @@ shouldBe("transform.matrix.f", "0");
 
 debug("");
 debug("Check passing invalid arguments to 'setMatrix'");
-shouldThrow("transform.setMatrix()");
-shouldThrow("transform.setMatrix(transform)");
-shouldThrow("transform.setMatrix(svgElement)");
 shouldThrow("transform.setMatrix('aString')");
 shouldThrow("transform.setMatrix(1)");
 shouldThrow("transform.setMatrix(false)");
+debug("Check passing abritary objects, nothing or dictionaries");
+shouldBeUndefined("transform.setMatrix(transform)");
+shouldBeUndefined("transform.setMatrix(svgElement)");
+shouldBeUndefined("transform.setMatrix({a: 2, b: 0, c: 0, d: 2, e: 10, f: 10})");
+shouldBe("transform.matrix.a", "2");
+shouldBe("transform.matrix.b", "0");
+shouldBe("transform.matrix.c", "0");
+shouldBe("transform.matrix.d", "2");
+shouldBe("transform.matrix.e", "10");
+shouldBe("transform.matrix.f", "10");
+shouldBeUndefined("transform.setMatrix()");
+shouldBe("transform.matrix.a", "1");
+shouldBe("transform.matrix.b", "0");
+shouldBe("transform.matrix.c", "0");
+shouldBe("transform.matrix.d", "1");
+shouldBe("transform.matrix.e", "0");
+shouldBe("transform.matrix.f", "0");
 
 debug("");
 debug("Check passing invalid arguments to 'setTranslate'");
index f91e239..7ecd43e 100644 (file)
@@ -5,14 +5,33 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 
 Check passing invalid arguments to 'createSVGTransformFromMatrix'
-PASS transform.createSVGTransformFromMatrix() threw exception TypeError: Not enough arguments.
-PASS transform.createSVGTransformFromMatrix(svgElement.createSVGTransform()) threw exception TypeError: Argument 1 ('matrix') to SVGTransformList.createSVGTransformFromMatrix must be an instance of SVGMatrix.
-PASS transform.createSVGTransformFromMatrix(svgElement) threw exception TypeError: Argument 1 ('matrix') to SVGTransformList.createSVGTransformFromMatrix must be an instance of SVGMatrix.
-PASS transform.createSVGTransformFromMatrix('aString') threw exception TypeError: Argument 1 ('matrix') to SVGTransformList.createSVGTransformFromMatrix must be an instance of SVGMatrix.
-PASS transform.createSVGTransformFromMatrix(1) threw exception TypeError: Argument 1 ('matrix') to SVGTransformList.createSVGTransformFromMatrix must be an instance of SVGMatrix.
-PASS transform.createSVGTransformFromMatrix(true) threw exception TypeError: Argument 1 ('matrix') to SVGTransformList.createSVGTransformFromMatrix must be an instance of SVGMatrix.
-PASS transform.createSVGTransformFromMatrix(undefined) threw exception TypeError: Argument 1 ('matrix') to SVGTransformList.createSVGTransformFromMatrix must be an instance of SVGMatrix.
-PASS transform.createSVGTransformFromMatrix(null) threw exception TypeError: Argument 1 ('matrix') to SVGTransformList.createSVGTransformFromMatrix must be an instance of SVGMatrix.
+PASS transform.createSVGTransformFromMatrix('aString') threw exception TypeError: Type error.
+PASS transform.createSVGTransformFromMatrix(1) threw exception TypeError: Type error.
+PASS transform.createSVGTransformFromMatrix(true) threw exception TypeError: Type error.
+Check passing valid arguments to 'createSVGTransformFromMatrix'
+PASS transform.createSVGTransformFromMatrix(null) did not throw exception.
+PASS transform.createSVGTransformFromMatrix(svgElement.createSVGTransform()) did not throw exception.
+PASS transform.createSVGTransformFromMatrix(svgElement) did not throw exception.
+PASS transform.createSVGTransformFromMatrix(undefined) did not throw exception.
+PASS transform.createSVGTransformFromMatrix() did not throw exception.
+PASS t.matrix.a is 2
+PASS t.matrix.b is 0
+PASS t.matrix.c is 0
+PASS t.matrix.d is 3
+PASS t.matrix.e is 10
+PASS t.matrix.f is 20
+PASS t.matrix.a is 3
+PASS t.matrix.b is 0
+PASS t.matrix.c is 0
+PASS t.matrix.d is 4
+PASS t.matrix.e is 0
+PASS t.matrix.f is 0
+PASS t.matrix.a is 1
+PASS t.matrix.b is 0
+PASS t.matrix.c is 0
+PASS t.matrix.d is 1
+PASS t.matrix.e is 0
+PASS t.matrix.f is 0
 PASS successfullyParsed is true
 
 TEST COMPLETE
index f3b8fa6..69ef03c 100644 (file)
@@ -15,14 +15,36 @@ var transform = rectElement.transform.baseVal;
 
 debug("");
 debug("Check passing invalid arguments to 'createSVGTransformFromMatrix'");
-shouldThrow("transform.createSVGTransformFromMatrix()");
-shouldThrow("transform.createSVGTransformFromMatrix(svgElement.createSVGTransform())");
-shouldThrow("transform.createSVGTransformFromMatrix(svgElement)");
 shouldThrow("transform.createSVGTransformFromMatrix('aString')");
 shouldThrow("transform.createSVGTransformFromMatrix(1)");
 shouldThrow("transform.createSVGTransformFromMatrix(true)");
-shouldThrow("transform.createSVGTransformFromMatrix(undefined)");
-shouldThrow("transform.createSVGTransformFromMatrix(null)");
+debug("Check passing valid arguments to 'createSVGTransformFromMatrix'");
+shouldNotThrow("transform.createSVGTransformFromMatrix(null)");
+shouldNotThrow("transform.createSVGTransformFromMatrix(svgElement.createSVGTransform())");
+shouldNotThrow("transform.createSVGTransformFromMatrix(svgElement)");
+shouldNotThrow("transform.createSVGTransformFromMatrix(undefined)");
+shouldNotThrow("transform.createSVGTransformFromMatrix()");
+var t = transform.createSVGTransformFromMatrix({a: 2, d: 3, e: 10, f: 20});
+shouldBe("t.matrix.a", "2");
+shouldBe("t.matrix.b", "0");
+shouldBe("t.matrix.c", "0");
+shouldBe("t.matrix.d", "3");
+shouldBe("t.matrix.e", "10");
+shouldBe("t.matrix.f", "20");
+t = transform.createSVGTransformFromMatrix(svgElement.createSVGMatrix().scaleNonUniform(3, 4));
+shouldBe("t.matrix.a", "3");
+shouldBe("t.matrix.b", "0");
+shouldBe("t.matrix.c", "0");
+shouldBe("t.matrix.d", "4");
+shouldBe("t.matrix.e", "0");
+shouldBe("t.matrix.f", "0");
+t = transform.createSVGTransformFromMatrix();
+shouldBe("t.matrix.a", "1");
+shouldBe("t.matrix.b", "0");
+shouldBe("t.matrix.c", "0");
+shouldBe("t.matrix.d", "1");
+shouldBe("t.matrix.e", "0");
+shouldBe("t.matrix.f", "0");
 
 successfullyParsed = true;
 </script>
index a474e8c..798cf24 100644 (file)
@@ -1,3 +1,29 @@
+2019-10-22  Dirk Schulze  <krit@webkit.org>
+
+        SVG2: Use DOMMatrix2DInit for setMatrix and createSVGTransformFromMatrix
+        https://bugs.webkit.org/show_bug.cgi?id=191417
+
+        Reviewed by Dean Jackson.
+
+        setMatrix and createSVGTransformFromMatrix used to use SVGMatrix as argument.
+        With SVG 2.0, any DOMPoint2DInit type is supported which inlcudes dictionaries,
+        DOMMatrix, DOMMatrixReadOnly and SVGMatrix (alias of DOMMatrix).
+
+        Extended existing tests.
+
+        * svg/SVGSVGElement.cpp:
+        (WebCore::SVGSVGElement::createSVGTransformFromMatrix):
+        * svg/SVGSVGElement.h:
+        * svg/SVGSVGElement.idl:
+        * svg/SVGTransform.h:
+        (WebCore::SVGTransform::setMatrix):
+        * svg/SVGTransform.idl:
+        * svg/SVGTransformList.h:
+        * svg/SVGTransformList.idl:
+        * svg/SVGTransformListValues.cpp:
+        (WebCore::SVGTransformListValues::createSVGTransformFromMatrix const):
+        * svg/SVGTransformListValues.h:
+
 2019-10-21  Yusuke Suzuki  <ysuzuki@apple.com>
 
         [JSC] Thread JSGlobalObject* instead of ExecState*
index e1b5f3b..7d2026e 100644 (file)
@@ -24,6 +24,7 @@
 #include "SVGSVGElement.h"
 
 #include "CSSHelper.h"
+#include "DOMMatrix2DInit.h"
 #include "DOMWrapperWorld.h"
 #include "ElementIterator.h"
 #include "EventNames.h"
@@ -386,9 +387,22 @@ Ref<SVGTransform> SVGSVGElement::createSVGTransform()
     return SVGTransform::create(SVGTransformValue::SVG_TRANSFORM_MATRIX);
 }
 
-Ref<SVGTransform> SVGSVGElement::createSVGTransformFromMatrix(SVGMatrix& matrix)
+Ref<SVGTransform> SVGSVGElement::createSVGTransformFromMatrix(DOMMatrix2DInit&& matrixInit)
 {
-    return SVGTransform::create(matrix.value());
+    AffineTransform transform;
+    if (matrixInit.a.hasValue())
+        transform.setA(matrixInit.a.value());
+    if (matrixInit.b.hasValue())
+        transform.setB(matrixInit.b.value());
+    if (matrixInit.c.hasValue())
+        transform.setC(matrixInit.c.value());
+    if (matrixInit.d.hasValue())
+        transform.setD(matrixInit.d.value());
+    if (matrixInit.e.hasValue())
+        transform.setE(matrixInit.e.value());
+    if (matrixInit.f.hasValue())
+        transform.setF(matrixInit.f.value());
+    return SVGTransform::create(transform);
 }
 
 AffineTransform SVGSVGElement::localCoordinateSpaceTransform(SVGLocatable::CTMScope mode) const
index 81bcb34..5baa0b5 100644 (file)
@@ -28,6 +28,7 @@
 
 namespace WebCore {
 
+struct DOMMatrix2DInit;
 class SMILTimeContainer;
 class SVGAngle;
 class SVGLength;
@@ -89,7 +90,7 @@ public: // DOM
     static Ref<SVGMatrix> createSVGMatrix();
     static Ref<SVGRect> createSVGRect();
     static Ref<SVGTransform> createSVGTransform();
-    static Ref<SVGTransform> createSVGTransformFromMatrix(SVGMatrix&);
+    static Ref<SVGTransform> createSVGTransformFromMatrix(DOMMatrix2DInit&&);
 
     Element* getElementById(const AtomString&);
 
index 47dad41..d4a62e5 100644 (file)
@@ -72,7 +72,7 @@
     [NewObject] SVGMatrix createSVGMatrix();
     [NewObject] SVGRect createSVGRect();
     [NewObject] SVGTransform createSVGTransform();
-    [NewObject] SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix);
+    [NewObject] SVGTransform createSVGTransformFromMatrix(optional DOMMatrix2DInit matrix);
 
     Element getElementById([RequiresExistingAtomString] DOMString elementId);
 };
index 6a29c72..38fdd78 100644 (file)
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include "DOMMatrix2DInit.h"
 #include "SVGMatrix.h"
 #include "SVGTransformValue.h"
 #include "SVGValueProperty.h"
@@ -70,12 +71,25 @@ public:
     float angle() { return m_value.angle(); }
     const Ref<SVGMatrix>& matrix() { return m_value.matrix(); }
 
-    ExceptionOr<void> setMatrix(SVGMatrix& matrix)
+    ExceptionOr<void> setMatrix(DOMMatrix2DInit&& matrixInit)
     {
         if (isReadOnly())
             return Exception { NoModificationAllowedError };
 
-        m_value.setMatrix(matrix.value());
+        AffineTransform transform;
+        if (matrixInit.a.hasValue())
+            transform.setA(matrixInit.a.value());
+        if (matrixInit.b.hasValue())
+            transform.setB(matrixInit.b.value());
+        if (matrixInit.c.hasValue())
+            transform.setC(matrixInit.c.value());
+        if (matrixInit.d.hasValue())
+            transform.setD(matrixInit.d.value());
+        if (matrixInit.e.hasValue())
+            transform.setE(matrixInit.e.value());
+        if (matrixInit.f.hasValue())
+            transform.setF(matrixInit.f.value());
+        m_value.setMatrix(transform);
         commitChange();
         return { };
     }
index 529b0ed..6e67135 100644 (file)
@@ -35,7 +35,7 @@
     readonly attribute SVGMatrix matrix;
     readonly attribute unrestricted float angle;
 
-    [MayThrowException] void setMatrix(SVGMatrix matrix);
+    [MayThrowException] void setMatrix(optional DOMMatrix2DInit matrix);
     [MayThrowException] void setTranslate(unrestricted float tx, unrestricted float ty);
     [MayThrowException] void setScale(unrestricted float sx, unrestricted float sy);
     [MayThrowException] void setRotate(unrestricted float angle, unrestricted float cx, unrestricted float cy);
index 544d60b..4e96b6a 100644 (file)
@@ -21,6 +21,7 @@
 
 #pragma once
 
+#include "DOMMatrix2DInit.h"
 #include "SVGTransform.h"
 #include "SVGTransformable.h"
 #include "SVGValuePropertyList.h"
@@ -48,9 +49,11 @@ public:
         return adoptRef(*new SVGTransformList(other, access));
     }
 
-    ExceptionOr<Ref<SVGTransform>> createSVGTransformFromMatrix(const Ref<SVGMatrix>& matrix)
+    ExceptionOr<Ref<SVGTransform>> createSVGTransformFromMatrix(DOMMatrix2DInit&& matrixInit)
     {
-        return SVGTransform::create(matrix->value());
+        auto svgTransform =  SVGTransform::create();
+        svgTransform->setMatrix(WTFMove(matrixInit));
+        return svgTransform;
     }
 
     ExceptionOr<RefPtr<SVGTransform>> consolidate()
index 0325831..8affa3b 100644 (file)
@@ -37,6 +37,6 @@ interface SVGTransformList {
     [MayThrowException] SVGTransform appendItem(SVGTransform newItem);
     [MayThrowException] setter void (unsigned long index, SVGTransform newItem);
 
-    [MayThrowException, NewObject] SVGTransform createSVGTransformFromMatrix(SVGMatrix matrix);
+    [MayThrowException, NewObject] SVGTransform createSVGTransformFromMatrix(optional DOMMatrix2DInit matrix);
     [MayThrowException] SVGTransform consolidate();
 };