Title: [105188] branches/safari-534.54-branch

Diff

Modified: branches/safari-534.54-branch/LayoutTests/ChangeLog (105187 => 105188)


--- branches/safari-534.54-branch/LayoutTests/ChangeLog	2012-01-17 21:04:21 UTC (rev 105187)
+++ branches/safari-534.54-branch/LayoutTests/ChangeLog	2012-01-17 21:31:18 UTC (rev 105188)
@@ -1,3 +1,24 @@
+2011-1-17  Lucas Forschler  <lforsch...@apple.com>
+
+    Merge 91148
+
+    2011-07-16  Kulanthaivel Palanichamy  <kulanthai...@codeaurora.org>
+
+            Reviewed by Nikolas Zimmermann.
+
+            SVG animation API crashes on SVGAnimateTransform
+            https://bugs.webkit.org/show_bug.cgi?id=64104
+
+            Added the test to cover assertion in AnimatedTransform list where its
+            value and wrapper length mismatch occurs.
+
+            * svg/animations/script-tests/svgtransform-animation-discrete.js: Added.
+            (sample1):
+            (sample2):
+            (executeTest):
+            * svg/animations/svgtransform-animation-discrete-expected.txt: Added.
+            * svg/animations/svgtransform-animation-discrete.html: Added.
+
 2012-01-17  Mark Rowe  <mr...@apple.com>
 
         Merge r101543.

Copied: branches/safari-534.54-branch/LayoutTests/svg/animations/script-tests/svgtransform-animation-discrete.js (from rev 91148, trunk/LayoutTests/svg/animations/script-tests/svgtransform-animation-discrete.js) (0 => 105188)


--- branches/safari-534.54-branch/LayoutTests/svg/animations/script-tests/svgtransform-animation-discrete.js	                        (rev 0)
+++ branches/safari-534.54-branch/LayoutTests/svg/animations/script-tests/svgtransform-animation-discrete.js	2012-01-17 21:31:18 UTC (rev 105188)
@@ -0,0 +1,66 @@
+description("Test calcMode=discrete animation on SVGAnimateTransform.");
+createSVGTestCase();
+
+// Setup test document
+var rect = createSVGElement("rect");
+rect.setAttribute("id", "rect");
+rect.setAttribute("width", "100");
+rect.setAttribute("height", "100");
+rect.setAttribute("x", "0");
+rect.setAttribute("y", "0");
+rect.setAttribute("fill", "green");
+rect.setAttribute("onclick", "executeTest()");
+
+var animate = createSVGElement("animateTransform");
+animate.setAttribute("id", "animation");
+animate.setAttribute("attributeName", "transform");
+animate.setAttribute("type", "translate");
+animate.setAttribute("from", "100,100");
+animate.setAttribute("to", "0,0");
+animate.setAttribute("type", "translate");
+animate.setAttribute("calcMode", "discrete");
+animate.setAttribute("begin", "click");
+animate.setAttribute("dur", "4s");
+rect.appendChild(animate);
+rootSVGElement.appendChild(rect);
+
+// Setup animation test
+
+function sample1() {
+    // Check initial/end conditions
+    shouldBe("rect.transform.animVal.numberOfItems", "0");
+    shouldBeCloseEnough("document.defaultView.getComputedStyle(rect).getPropertyValue('x')", "0", 0.01);
+    shouldBeCloseEnough("document.defaultView.getComputedStyle(rect).getPropertyValue('y')", "0", 0.01);
+}
+
+function sample2() {
+    // Check initial/end conditions
+    shouldBe("rect.transform.animVal.numberOfItems", "1");
+    shouldBe("rect.transform.animVal.getItem(0).type", "SVGTransform.SVG_TRANSFORM_TRANSLATE");
+    shouldBeCloseEnough("rect.transform.animVal.getItem(0).matrix.e", "100", 0.01);
+    shouldBeCloseEnough("rect.transform.animVal.getItem(0).matrix.f", "100", 0.01);
+}
+
+function sample3() {
+    shouldBe("rect.transform.animVal.numberOfItems", "1");
+    shouldBe("rect.transform.animVal.getItem(0).type", "SVGTransform.SVG_TRANSFORM_TRANSLATE");
+    shouldBeCloseEnough("rect.transform.animVal.getItem(0).matrix.e", "0", 0.01);
+    shouldBeCloseEnough("rect.transform.animVal.getItem(0).matrix.f", "0", 0.01);
+}
+
+function executeTest() {
+    const expectedValues = [
+        // [animationId, time, elementId, sampleCallback]
+        ["animation", 0.0,  "rect", sample1],
+        ["animation", 0.001,  "rect", sample2],
+        ["animation", 1.0,    "rect", sample2],
+        ["animation", 3.0,    "rect", sample3],
+        ["animation", 3.9999, "rect", sample3],
+    ];
+
+    runAnimationTest(expectedValues);
+}
+
+// Begin test async
+window.setTimeout("triggerUpdate(50, 50)", 0);
+var successfullyParsed = true;

Copied: branches/safari-534.54-branch/LayoutTests/svg/animations/svgtransform-animation-discrete-expected.txt (from rev 91148, trunk/LayoutTests/svg/animations/svgtransform-animation-discrete-expected.txt) (0 => 105188)


--- branches/safari-534.54-branch/LayoutTests/svg/animations/svgtransform-animation-discrete-expected.txt	                        (rev 0)
+++ branches/safari-534.54-branch/LayoutTests/svg/animations/svgtransform-animation-discrete-expected.txt	2012-01-17 21:31:18 UTC (rev 105188)
@@ -0,0 +1,30 @@
+SVG 1.1 transform animation tests
+
+Test calcMode=discrete animation on SVGAnimateTransform.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS rect.transform.animVal.numberOfItems is 0
+PASS document.defaultView.getComputedStyle(rect).getPropertyValue('x') is 0
+PASS document.defaultView.getComputedStyle(rect).getPropertyValue('y') is 0
+PASS rect.transform.animVal.numberOfItems is 1
+PASS rect.transform.animVal.getItem(0).type is SVGTransform.SVG_TRANSFORM_TRANSLATE
+PASS rect.transform.animVal.getItem(0).matrix.e is 100
+PASS rect.transform.animVal.getItem(0).matrix.f is 100
+PASS rect.transform.animVal.numberOfItems is 1
+PASS rect.transform.animVal.getItem(0).type is SVGTransform.SVG_TRANSFORM_TRANSLATE
+PASS rect.transform.animVal.getItem(0).matrix.e is 100
+PASS rect.transform.animVal.getItem(0).matrix.f is 100
+PASS rect.transform.animVal.numberOfItems is 1
+PASS rect.transform.animVal.getItem(0).type is SVGTransform.SVG_TRANSFORM_TRANSLATE
+PASS rect.transform.animVal.getItem(0).matrix.e is 0
+PASS rect.transform.animVal.getItem(0).matrix.f is 0
+PASS rect.transform.animVal.numberOfItems is 1
+PASS rect.transform.animVal.getItem(0).type is SVGTransform.SVG_TRANSFORM_TRANSLATE
+PASS rect.transform.animVal.getItem(0).matrix.e is 0
+PASS rect.transform.animVal.getItem(0).matrix.f is 0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Copied: branches/safari-534.54-branch/LayoutTests/svg/animations/svgtransform-animation-discrete.html (from rev 91148, trunk/LayoutTests/svg/animations/svgtransform-animation-discrete.html) (0 => 105188)


--- branches/safari-534.54-branch/LayoutTests/svg/animations/svgtransform-animation-discrete.html	                        (rev 0)
+++ branches/safari-534.54-branch/LayoutTests/svg/animations/svgtransform-animation-discrete.html	2012-01-17 21:31:18 UTC (rev 105188)
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href=""
+<script src=""
+<script src=""
+<script src=""
+</head>
+<body>
+<h1>SVG 1.1 transform animation tests</h1>
+<p id="description"></p>
+<div id="console"></div>
+<script src=""
+</body>
+</html>

Modified: branches/safari-534.54-branch/Source/WebCore/ChangeLog (105187 => 105188)


--- branches/safari-534.54-branch/Source/WebCore/ChangeLog	2012-01-17 21:04:21 UTC (rev 105187)
+++ branches/safari-534.54-branch/Source/WebCore/ChangeLog	2012-01-17 21:31:18 UTC (rev 105188)
@@ -1,3 +1,25 @@
+2011-1-17  Lucas Forschler  <lforsch...@apple.com>
+
+    Merge 91148
+
+    2011-07-16  Kulanthaivel Palanichamy  <kulanthai...@codeaurora.org>
+
+            Reviewed by Nikolas Zimmermann.
+
+            SVG animation API crashes on SVGAnimateTransform
+            https://bugs.webkit.org/show_bug.cgi?id=64104
+
+            This patch ensures the update in AnimatedTransform list in
+            SVGAnimateTransformElement.cpp is in sync with its wrapper list.
+
+            Test: svg/animations/svgtransform-animation-discrete.html
+
+            * svg/SVGAnimateTransformElement.cpp:
+            (WebCore::animatedTransformListFor):
+            (WebCore::SVGAnimateTransformElement::resetToBaseValue):
+            (WebCore::SVGAnimateTransformElement::calculateAnimatedValue):
+            (WebCore::SVGAnimateTransformElement::applyResultsToTarget):
+
 2012-01-17  Mark Rowe  <mr...@apple.com>
 
         Merge r94107.

Modified: branches/safari-534.54-branch/Source/WebCore/svg/SVGAnimateTransformElement.cpp (105187 => 105188)


--- branches/safari-534.54-branch/Source/WebCore/svg/SVGAnimateTransformElement.cpp	2012-01-17 21:04:21 UTC (rev 105187)
+++ branches/safari-534.54-branch/Source/WebCore/svg/SVGAnimateTransformElement.cpp	2012-01-17 21:31:18 UTC (rev 105188)
@@ -98,17 +98,15 @@
         SVGAnimationElement::parseMappedAttribute(attr);
 }
 
-    
-static SVGTransformList* transformListFor(SVGElement* element)
+static PassRefPtr<SVGAnimatedTransformList> animatedTransformListFor(SVGElement* element)
 {
     ASSERT(element);
     if (element->isStyledTransformable())
-        return &static_cast<SVGStyledTransformableElement*>(element)->transform();
+        return static_cast<SVGStyledTransformableElement*>(element)->transformAnimated();
     if (element->hasTagName(SVGNames::textTag))
-        return &static_cast<SVGTextElement*>(element)->transform();
+        return static_cast<SVGTextElement*>(element)->transformAnimated();
     if (element->hasTagName(SVGNames::linearGradientTag) || element->hasTagName(SVGNames::radialGradientTag))
-        return &static_cast<SVGGradientElement*>(element)->gradientTransform();
-    // FIXME: Handle patternTransform, which is obviously missing!
+        return static_cast<SVGGradientElement*>(element)->gradientTransformAnimated();
     return 0;
 }
     
@@ -124,8 +122,10 @@
     }
 
     if (baseValue.isEmpty()) {
-        if (SVGTransformList* list = transformListFor(targetElement))
-            list->clear();
+        if (RefPtr<SVGAnimatedTransformList> list = animatedTransformListFor(targetElement)) {
+            list->detachListWrappers(0);
+            list->values().clear();
+        }
     } else
         targetElement->setAttribute(SVGNames::transformAttr, baseValue);
 }
@@ -135,17 +135,20 @@
     SVGElement* targetElement = this->targetElement();
     if (!targetElement || determineAnimatedAttributeType(targetElement) == AnimatedUnknown)
         return;
-    SVGTransformList* transformList = transformListFor(targetElement);
-    ASSERT(transformList);
+    RefPtr<SVGAnimatedTransformList> animatedList = animatedTransformListFor(targetElement);
+    ASSERT(animatedList);
 
-    if (!isAdditive())
-        transformList->clear();
+    if (!isAdditive()) {
+        animatedList->detachListWrappers(0);
+        animatedList->values().clear();
+    }
     if (isAccumulated() && repeat) {
         SVGTransform accumulatedTransform = SVGTransformDistance(m_fromTransform, m_toTransform).scaledDistance(repeat).addToSVGTransform(SVGTransform());
-        transformList->append(accumulatedTransform);
+        animatedList->values().append(accumulatedTransform);
     }
     SVGTransform transform = SVGTransformDistance(m_fromTransform, m_toTransform).scaledDistance(percentage).addToSVGTransform(m_fromTransform);
-    transformList->append(transform);
+    animatedList->values().append(transform);
+    animatedList->wrappers().append(RefPtr<SVGPropertyTearOff<SVGTransform> >());
 }
     
 bool SVGAnimateTransformElement::calculateFromAndToValues(const String& fromString, const String& toString)
@@ -191,9 +194,10 @@
     }
 
     // ...except in case where we have additional instances in <use> trees.
-    SVGTransformList* transformList = transformListFor(targetElement);
-    if (!transformList)
+    RefPtr<SVGAnimatedTransformList> animatedList = animatedTransformListFor(targetElement);
+    if (!animatedList)
         return;
+    SVGTransformList* transformList = &animatedList->values();
 
     const HashSet<SVGElementInstance*>& instances = targetElement->instancesForElement();
     const HashSet<SVGElementInstance*>::const_iterator end = instances.end();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to