Enable animVal support for SVGNumberList
authorzimmermann@webkit.org <zimmermann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 15 Mar 2012 15:27:21 +0000 (15:27 +0000)
committerzimmermann@webkit.org <zimmermann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 15 Mar 2012 15:27:21 +0000 (15:27 +0000)
https://bugs.webkit.org/show_bug.cgi?id=81219

Reviewed by Rob Buis.

Source/WebCore:

Enable animVal support for SVGNumberList. Easy patch, we just need to add the missing
constructFromCopy() method to SVGAnumatedNumberListAnimator and report AnimatedNumberList
as supporting animVal.

Covered by existing tests.

* svg/SVGAnimatedNumberList.cpp:
(WebCore::SVGAnimatedNumberListAnimator::constructFromCopy):
(WebCore):
* svg/SVGAnimatedNumberList.h:
(WebCore):
(SVGAnimatedNumberListAnimator):
* svg/SVGAnimatedType.cpp:
(WebCore::SVGAnimatedType::supportsAnimVal):
(WebCore::SVGAnimatedType::setVariantValue):

LayoutTests:

Extend SVGNumberList tests to cover animVal/baseVal at the same time.

* platform/chromium/test_expectations.txt:
* svg/animations/script-tests/svgnumberlist-animation-1.js:
(sample1):
(sample2):
(sample3):
(sample4):
(executeTest):
* svg/animations/script-tests/svgnumberlist-animation-2.js:
(sample1):
(sample2):
(sample3):
(sample4):
(executeTest):
* svg/animations/svgnumberlist-animation-1-expected.txt:
* svg/animations/svgnumberlist-animation-2-expected.txt:
* svg/filters/feColorMatrix-invalid-animation-expected.txt: We no longer mutate the DOM, thus the dump is now correct.

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

LayoutTests/ChangeLog
LayoutTests/platform/chromium/test_expectations.txt
LayoutTests/svg/animations/script-tests/svgnumberlist-animation-1.js
LayoutTests/svg/animations/script-tests/svgnumberlist-animation-2.js
LayoutTests/svg/animations/svgnumberlist-animation-1-expected.txt
LayoutTests/svg/animations/svgnumberlist-animation-2-expected.txt
LayoutTests/svg/filters/feColorMatrix-invalid-animation-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/svg/SVGAnimatedNumberList.cpp
Source/WebCore/svg/SVGAnimatedNumberList.h
Source/WebCore/svg/SVGAnimatedType.cpp

index c8c1862..9bae6a1 100644 (file)
@@ -1,5 +1,31 @@
 2012-03-15  Nikolas Zimmermann  <nzimmermann@rim.com>
 
+        Enable animVal support for SVGNumberList
+        https://bugs.webkit.org/show_bug.cgi?id=81219
+
+        Reviewed by Rob Buis.
+
+        Extend SVGNumberList tests to cover animVal/baseVal at the same time.
+
+        * platform/chromium/test_expectations.txt:
+        * svg/animations/script-tests/svgnumberlist-animation-1.js:
+        (sample1):
+        (sample2):
+        (sample3):
+        (sample4):
+        (executeTest):
+        * svg/animations/script-tests/svgnumberlist-animation-2.js:
+        (sample1):
+        (sample2):
+        (sample3):
+        (sample4):
+        (executeTest):
+        * svg/animations/svgnumberlist-animation-1-expected.txt:
+        * svg/animations/svgnumberlist-animation-2-expected.txt:
+        * svg/filters/feColorMatrix-invalid-animation-expected.txt: We no longer mutate the DOM, thus the dump is now correct.
+
+2012-03-15  Nikolas Zimmermann  <nzimmermann@rim.com>
+
         Enable animVal support for SVGNumber
         https://bugs.webkit.org/show_bug.cgi?id=81212
 
index 6ae8bcf..3190d73 100644 (file)
@@ -935,6 +935,9 @@ BUGWK77535 : svg/repaint/inner-svg-change-viewPort-relative.svg = IMAGE IMAGE+TE
 // Updated test, needs a rebaseline
 BUGWK78613 : svg/custom/circle-move-invalidation.svg = IMAGE IMAGE+TEXT
 
+// Updated test, needs a rebaseline
+BUGWK81219 : svg/filters/feColorMatrix-invalid-animation.svg = TEXT
+
 // Changed test, needs a rebaseline
 BUGWK34714 : svg/text/select-textLength-spacing-squeeze-2.svg = IMAGE IMAGE+TEXT
 
index b7d692d..8f51d43 100644 (file)
@@ -4,10 +4,9 @@ createSVGTestCase();
 // Setup test document
 var text = createSVGElement("text");
 text.textContent = "ABCD";
-text.setAttribute("id", "rect");
 text.setAttribute("x", "40 60 80 100");
 text.setAttribute("y", "60");
-text.setAttribute("rotate", "0 0 0 0");
+text.setAttribute("rotate", "15");
 text.setAttribute("fill", "green");
 text.setAttribute("onclick", "executeTest()");
 
@@ -23,32 +22,53 @@ rootSVGElement.appendChild(text);
 
 // Setup animation test
 function sample1() {
+    shouldBe("text.rotate.animVal.numberOfItems", "1");
+    shouldBeCloseEnough("text.rotate.animVal.getItem(0).value", "15");
+
+    shouldBe("text.rotate.baseVal.numberOfItems", "1");
+    shouldBe("text.rotate.baseVal.getItem(0).value", "15");
+}
+
+function sample2() {
+    shouldBe("text.rotate.animVal.numberOfItems", "4");
     shouldBeCloseEnough("text.rotate.animVal.getItem(0).value", "0");
     shouldBeCloseEnough("text.rotate.animVal.getItem(1).value", "0");
     shouldBeCloseEnough("text.rotate.animVal.getItem(2).value", "0");
     shouldBeCloseEnough("text.rotate.animVal.getItem(3).value", "0");
+
+    shouldBe("text.rotate.baseVal.numberOfItems", "1");
+    shouldBe("text.rotate.baseVal.getItem(0).value", "15");
 }
 
-function sample2() {
+function sample3() {
+    shouldBe("text.rotate.animVal.numberOfItems", "4");
     shouldBeCloseEnough("text.rotate.animVal.getItem(0).value", "22.5");
     shouldBeCloseEnough("text.rotate.animVal.getItem(1).value", "45");
     shouldBeCloseEnough("text.rotate.animVal.getItem(2).value", "67.5");
     shouldBeCloseEnough("text.rotate.animVal.getItem(3).value", "90");
+
+    shouldBe("text.rotate.baseVal.numberOfItems", "1");
+    shouldBe("text.rotate.baseVal.getItem(0).value", "15");
 }
 
-function sample3() {
+function sample4() {
+    shouldBe("text.rotate.animVal.numberOfItems", "4");
     shouldBeCloseEnough("text.rotate.animVal.getItem(0).value", "45");
     shouldBeCloseEnough("text.rotate.animVal.getItem(1).value", "90");
     shouldBeCloseEnough("text.rotate.animVal.getItem(2).value", "135");
     shouldBeCloseEnough("text.rotate.animVal.getItem(3).value", "180");
+
+    shouldBe("text.rotate.baseVal.numberOfItems", "1");
+    shouldBe("text.rotate.baseVal.getItem(0).value", "15");
 }
 
 function executeTest() {
     const expectedValues = [
         // [animationId, time, sampleCallback]
         ["animation", 0.0,   sample1],
-        ["animation", 2.0,   sample2],
-        ["animation", 3.999, sample3],
+        ["animation", 0.001, sample2],
+        ["animation", 2.0,   sample3],
+        ["animation", 3.999, sample4],
         ["animation", 4.001, sample1]
     ];
 
index 54ddad7..1166760 100644 (file)
@@ -4,10 +4,9 @@ createSVGTestCase();
 // Setup test document
 var text = createSVGElement("text");
 text.textContent = "ABCD";
-text.setAttribute("id", "text");
 text.setAttribute("x", "40 60 80 100");
 text.setAttribute("y", "60");
-text.setAttribute("rotate", "0 45 90 153");
+text.setAttribute("rotate", "15");
 text.setAttribute("fill", "green");
 text.setAttribute("onclick", "executeTest()");
 
@@ -23,32 +22,53 @@ rootSVGElement.appendChild(text);
 
 // Setup animation test
 function sample1() {
+    shouldBe("text.rotate.animVal.numberOfItems", "1");
+    shouldBeCloseEnough("text.rotate.animVal.getItem(0).value", "15");
+
+    shouldBe("text.rotate.baseVal.numberOfItems", "1");
+    shouldBe("text.rotate.baseVal.getItem(0).value", "15");
+}
+
+function sample2() {
+    shouldBe("text.rotate.animVal.numberOfItems", "4");
     shouldBeCloseEnough("text.rotate.animVal.getItem(0).value", "0");
     shouldBeCloseEnough("text.rotate.animVal.getItem(1).value", "45");
     shouldBeCloseEnough("text.rotate.animVal.getItem(2).value", "90");
-    shouldBeCloseEnough("text.rotate.animVal.getItem(3).value", "153");
+    shouldBeCloseEnough("text.rotate.animVal.getItem(3).value", "135");
+
+    shouldBe("text.rotate.baseVal.numberOfItems", "1");
+    shouldBe("text.rotate.baseVal.getItem(0).value", "15");
 }
 
-function sample2() {
+function sample3() {
+    shouldBe("text.rotate.animVal.numberOfItems", "4");
     shouldBeCloseEnough("text.rotate.animVal.getItem(0).value", "22.5");
     shouldBeCloseEnough("text.rotate.animVal.getItem(1).value", "67.5");
     shouldBeCloseEnough("text.rotate.animVal.getItem(2).value", "112.5");
     shouldBeCloseEnough("text.rotate.animVal.getItem(3).value", "157.5");
+
+    shouldBe("text.rotate.baseVal.numberOfItems", "1");
+    shouldBe("text.rotate.baseVal.getItem(0).value", "15");
 }
 
-function sample3() {
+function sample4() {
+    shouldBe("text.rotate.animVal.numberOfItems", "4");
     shouldBeCloseEnough("text.rotate.animVal.getItem(0).value", "45");
     shouldBeCloseEnough("text.rotate.animVal.getItem(1).value", "90");
     shouldBeCloseEnough("text.rotate.animVal.getItem(2).value", "135");
     shouldBeCloseEnough("text.rotate.animVal.getItem(3).value", "180");
+
+    shouldBe("text.rotate.baseVal.numberOfItems", "1");
+    shouldBe("text.rotate.baseVal.getItem(0).value", "15");
 }
 
 function executeTest() {
     const expectedValues = [
         // [animationId, time, sampleCallback]
         ["animation", 0.0,   sample1],
-        ["animation", 2.0,   sample2],
-        ["animation", 3.999, sample3],
+        ["animation", 0.001, sample2],
+        ["animation", 2.0,   sample3],
+        ["animation", 3.999, sample4],
         ["animation", 4.001, sample1]
     ];
 
index d8e6b0c..9cfef3d 100644 (file)
@@ -6,22 +6,35 @@ Test SVGNumberList animation on 'rotate' attribute of text.
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
+PASS text.rotate.animVal.numberOfItems is 1
+PASS text.rotate.animVal.getItem(0).value is 15
+PASS text.rotate.baseVal.numberOfItems is 1
+PASS text.rotate.baseVal.getItem(0).value is 15
+PASS text.rotate.animVal.numberOfItems is 4
 PASS text.rotate.animVal.getItem(0).value is 0
 PASS text.rotate.animVal.getItem(1).value is 0
 PASS text.rotate.animVal.getItem(2).value is 0
 PASS text.rotate.animVal.getItem(3).value is 0
+PASS text.rotate.baseVal.numberOfItems is 1
+PASS text.rotate.baseVal.getItem(0).value is 15
+PASS text.rotate.animVal.numberOfItems is 4
 PASS text.rotate.animVal.getItem(0).value is 22.5
 PASS text.rotate.animVal.getItem(1).value is 45
 PASS text.rotate.animVal.getItem(2).value is 67.5
 PASS text.rotate.animVal.getItem(3).value is 90
+PASS text.rotate.baseVal.numberOfItems is 1
+PASS text.rotate.baseVal.getItem(0).value is 15
+PASS text.rotate.animVal.numberOfItems is 4
 PASS text.rotate.animVal.getItem(0).value is 45
 PASS text.rotate.animVal.getItem(1).value is 90
 PASS text.rotate.animVal.getItem(2).value is 135
 PASS text.rotate.animVal.getItem(3).value is 180
-PASS text.rotate.animVal.getItem(0).value is 0
-PASS text.rotate.animVal.getItem(1).value is 0
-PASS text.rotate.animVal.getItem(2).value is 0
-PASS text.rotate.animVal.getItem(3).value is 0
+PASS text.rotate.baseVal.numberOfItems is 1
+PASS text.rotate.baseVal.getItem(0).value is 15
+PASS text.rotate.animVal.numberOfItems is 1
+PASS text.rotate.animVal.getItem(0).value is 15
+PASS text.rotate.baseVal.numberOfItems is 1
+PASS text.rotate.baseVal.getItem(0).value is 15
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 0a6a591..34dcf53 100644 (file)
@@ -6,22 +6,35 @@ Test 'by' animation of SVGNumberList on 'rotate' attribute of text.
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
+PASS text.rotate.animVal.numberOfItems is 1
+PASS text.rotate.animVal.getItem(0).value is 15
+PASS text.rotate.baseVal.numberOfItems is 1
+PASS text.rotate.baseVal.getItem(0).value is 15
+PASS text.rotate.animVal.numberOfItems is 4
 PASS text.rotate.animVal.getItem(0).value is 0
 PASS text.rotate.animVal.getItem(1).value is 45
 PASS text.rotate.animVal.getItem(2).value is 90
-PASS text.rotate.animVal.getItem(3).value is 153
+PASS text.rotate.animVal.getItem(3).value is 135
+PASS text.rotate.baseVal.numberOfItems is 1
+PASS text.rotate.baseVal.getItem(0).value is 15
+PASS text.rotate.animVal.numberOfItems is 4
 PASS text.rotate.animVal.getItem(0).value is 22.5
 PASS text.rotate.animVal.getItem(1).value is 67.5
 PASS text.rotate.animVal.getItem(2).value is 112.5
 PASS text.rotate.animVal.getItem(3).value is 157.5
+PASS text.rotate.baseVal.numberOfItems is 1
+PASS text.rotate.baseVal.getItem(0).value is 15
+PASS text.rotate.animVal.numberOfItems is 4
 PASS text.rotate.animVal.getItem(0).value is 45
 PASS text.rotate.animVal.getItem(1).value is 90
 PASS text.rotate.animVal.getItem(2).value is 135
 PASS text.rotate.animVal.getItem(3).value is 180
-PASS text.rotate.animVal.getItem(0).value is 0
-PASS text.rotate.animVal.getItem(1).value is 45
-PASS text.rotate.animVal.getItem(2).value is 90
-PASS text.rotate.animVal.getItem(3).value is 153
+PASS text.rotate.baseVal.numberOfItems is 1
+PASS text.rotate.baseVal.getItem(0).value is 15
+PASS text.rotate.animVal.numberOfItems is 1
+PASS text.rotate.animVal.getItem(0).value is 15
+PASS text.rotate.baseVal.numberOfItems is 1
+PASS text.rotate.baseVal.getItem(0).value is 15
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 9e6e07a..98fcdc3 100644 (file)
@@ -3,4 +3,6 @@ layer at (0,0) size 800x600
 layer at (0,0) size 800x600
   RenderSVGRoot {svg} at (0,0) size 100x100
     RenderSVGResourceFilter {filter} [id=""] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse]
+      [feColorMatrix type="MATRIX" values="1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00"]
+        [SourceGraphic]
     RenderSVGRect {rect} at (0,0) size 100x100 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
index cbc03b4..6476753 100644 (file)
@@ -1,3 +1,26 @@
+2012-03-15  Nikolas Zimmermann  <nzimmermann@rim.com>
+
+        Enable animVal support for SVGNumberList
+        https://bugs.webkit.org/show_bug.cgi?id=81219
+
+        Reviewed by Rob Buis.
+
+        Enable animVal support for SVGNumberList. Easy patch, we just need to add the missing
+        constructFromCopy() method to SVGAnumatedNumberListAnimator and report AnimatedNumberList
+        as supporting animVal.
+
+        Covered by existing tests.
+
+        * svg/SVGAnimatedNumberList.cpp:
+        (WebCore::SVGAnimatedNumberListAnimator::constructFromCopy):
+        (WebCore):
+        * svg/SVGAnimatedNumberList.h:
+        (WebCore):
+        (SVGAnimatedNumberListAnimator):
+        * svg/SVGAnimatedType.cpp:
+        (WebCore::SVGAnimatedType::supportsAnimVal):
+        (WebCore::SVGAnimatedType::setVariantValue):
+
 2012-03-15  Rob Buis  <rbuis@rim.com>
 
         Fix cast-align GCC warnings
index af02e5c..61b0abc 100644 (file)
@@ -39,6 +39,12 @@ PassOwnPtr<SVGAnimatedType> SVGAnimatedNumberListAnimator::constructFromString(c
     return animtedType.release();
 }
 
+PassOwnPtr<SVGAnimatedType> SVGAnimatedNumberListAnimator::constructFromCopy(SVGGenericAnimatedType* animatedType)
+{
+    ASSERT(animatedType);
+    return SVGAnimatedType::createNumberList(new SVGNumberList(*reinterpret_cast<SVGNumberList*>(animatedType)));
+}
+
 void SVGAnimatedNumberListAnimator::calculateFromAndToValues(OwnPtr<SVGAnimatedType>& from, OwnPtr<SVGAnimatedType>& to, const String& fromString, const String& toString)
 {
     ASSERT(m_contextElement);
index f914fbe..6147d07 100644 (file)
@@ -37,6 +37,7 @@ DECLARE_ANIMATED_LIST_PROPERTY(SVGAnimatedNumberList, SVGNumberList, UpperProper
 DEFINE_ANIMATED_PROPERTY(AnimatedNumberList, OwnerType, DOMAttribute, DOMAttribute.localName(), UpperProperty, LowerProperty)
 
 class SVGAnimationElement;
+class SVGGenericAnimatedType;
 
 class SVGAnimatedNumberListAnimator : public SVGAnimatedTypeAnimator {
     
@@ -45,6 +46,7 @@ public:
     virtual ~SVGAnimatedNumberListAnimator() { }
     
     virtual PassOwnPtr<SVGAnimatedType> constructFromString(const String&);
+    virtual PassOwnPtr<SVGAnimatedType> constructFromCopy(SVGGenericAnimatedType*);
     
     virtual void calculateFromAndToValues(OwnPtr<SVGAnimatedType>& fromValue, OwnPtr<SVGAnimatedType>& toValue, const String& fromString, const String& toString);
     virtual void calculateFromAndByValues(OwnPtr<SVGAnimatedType>& fromValue, OwnPtr<SVGAnimatedType>& toValue, const String& fromString, const String& byString);
index c7c2080..5895140 100644 (file)
@@ -455,15 +455,15 @@ bool SVGAnimatedType::supportsAnimVal(AnimatedPropertyType type)
     switch (type) {
     case AnimatedLength:
     case AnimatedLengthList:
-    case AnimatedTransformList:
     case AnimatedNumber:
+    case AnimatedNumberList:
+    case AnimatedTransformList:
         return true;
     case AnimatedAngle:
     case AnimatedBoolean:
     case AnimatedColor:
     case AnimatedEnumeration:
     case AnimatedInteger:
-    case AnimatedNumberList:
     case AnimatedNumberOptionalNumber:
     case AnimatedPath:
     case AnimatedPoints:
@@ -488,18 +488,20 @@ void SVGAnimatedType::setVariantValue(SVGGenericAnimatedType* type)
     case AnimatedLengthList:
         *m_data.lengthList = *reinterpret_cast<SVGLengthList*>(type);
         return;
-    case AnimatedTransformList:
-        *m_data.transformList = *reinterpret_cast<SVGTransformList*>(type);
-        return;
     case AnimatedNumber:
         *m_data.number = *reinterpret_cast<float*>(type);
         return;
+    case AnimatedNumberList:
+        *m_data.numberList = *reinterpret_cast<SVGNumberList*>(type);
+        return;
+    case AnimatedTransformList:
+        *m_data.transformList = *reinterpret_cast<SVGTransformList*>(type);
+        return;
     case AnimatedAngle:
     case AnimatedBoolean:
     case AnimatedColor:
     case AnimatedEnumeration:
     case AnimatedInteger:
-    case AnimatedNumberList:
     case AnimatedNumberOptionalNumber:
     case AnimatedPath:
     case AnimatedPoints: