Don't attempt to compute animated values when there is no relevant animation
authorbfulgham@apple.com <bfulgham@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 11 Dec 2018 22:34:40 +0000 (22:34 +0000)
committerbfulgham@apple.com <bfulgham@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 11 Dec 2018 22:34:40 +0000 (22:34 +0000)
https://bugs.webkit.org/show_bug.cgi?id=192591
<rdar://problem/34336946>

Reviewed by Dean Jackson.

Source/WebCore:

Check if the property is supposed to be animated, or has animatable features, before
attempting to calculate the current animated value.

Test: svg/animations/avoid-calculating-for-non-animating-elements.html

* svg/SVGAnimateElementBase.cpp:
(WebCore::SVGAnimateElementBase::calculateAnimatedValue):

LayoutTests:

* svg/animations/avoid-calculating-for-non-animating-elements-expected.txt: Added.
* svg/animations/avoid-calculating-for-non-animating-elements.html: Added.

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

LayoutTests/ChangeLog
LayoutTests/svg/animations/avoid-calculating-for-non-animating-elements-expected.txt [new file with mode: 0644]
LayoutTests/svg/animations/avoid-calculating-for-non-animating-elements.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/svg/SVGAnimateElementBase.cpp

index 851ea79..9b7017f 100644 (file)
@@ -1,3 +1,14 @@
+2018-12-11  Brent Fulgham  <bfulgham@apple.com>
+
+        Don't attempt to compute animated values when there is no relevant animation
+        https://bugs.webkit.org/show_bug.cgi?id=192591
+        <rdar://problem/34336946>
+
+        Reviewed by Dean Jackson.
+
+        * svg/animations/avoid-calculating-for-non-animating-elements-expected.txt: Added.
+        * svg/animations/avoid-calculating-for-non-animating-elements.html: Added.
+
 2018-12-11  Chris Dumez  <cdumez@apple.com>
 
         Unreviewed, fix typos in console log from r239087.
diff --git a/LayoutTests/svg/animations/avoid-calculating-for-non-animating-elements-expected.txt b/LayoutTests/svg/animations/avoid-calculating-for-non-animating-elements-expected.txt
new file mode 100644 (file)
index 0000000..ee5be92
--- /dev/null
@@ -0,0 +1,4 @@
+The test passes if it does not crash.
+
+A certain amount of content is needed in the page to trigger the bug. A certain amount of content is needed in the page to trigger the bug. A certain amount of content is needed in the page to trigger the bug. A certain amount of content is needed in the page to trigger the bug. A certain amount of content is needed in the page to trigger the bug. A certain amount of content is needed in the page to trigger the bug. A certain amount of content is needed in the page to trigger the bug. A certain amount of content is needed in the page to trigger the bug. A certain amount of content is needed in the page to trigger the bug. A certain amount of content is needed in the page to trigger the bug. A certain amount of content is needed in the page to trigger the bug. A certain amount of content is needed in the page to trigger the bug.
+
diff --git a/LayoutTests/svg/animations/avoid-calculating-for-non-animating-elements.html b/LayoutTests/svg/animations/avoid-calculating-for-non-animating-elements.html
new file mode 100644 (file)
index 0000000..9d0b0f8
--- /dev/null
@@ -0,0 +1,32 @@
+<!DOCTYPE html> 
+<html>
+<head>
+    <title>Test request animation value for non-animating element</title>
+    <script>
+    if (window.testRunner)
+        testRunner.dumpAsText(true);
+    </script>
+</head>
+<body>
+    <p>The test passes if it does not crash.</p>
+    <div>
+        A certain amount of content is needed in the page to trigger the bug.
+        A certain amount of content is needed in the page to trigger the bug.
+        A certain amount of content is needed in the page to trigger the bug.
+        A certain amount of content is needed in the page to trigger the bug.
+        A certain amount of content is needed in the page to trigger the bug.
+        A certain amount of content is needed in the page to trigger the bug.
+        A certain amount of content is needed in the page to trigger the bug.
+        A certain amount of content is needed in the page to trigger the bug.
+        A certain amount of content is needed in the page to trigger the bug.
+        A certain amount of content is needed in the page to trigger the bug.
+        A certain amount of content is needed in the page to trigger the bug.
+        A certain amount of content is needed in the page to trigger the bug.
+    </div>
+    <svg>
+        <textPath>
+            <animate to="1px" from="0px" attributeName="x" attributeType="XML" />
+        </textPath>
+    </svg>
+</body>
+</html>
index b147efb..a1e98b1 100644 (file)
@@ -1,3 +1,19 @@
+2018-12-11  Brent Fulgham  <bfulgham@apple.com>
+
+        Don't attempt to compute animated values when there is no relevant animation
+        https://bugs.webkit.org/show_bug.cgi?id=192591
+        <rdar://problem/34336946>
+
+        Reviewed by Dean Jackson.
+
+        Check if the property is supposed to be animated, or has animatable features, before
+        attempting to calculate the current animated value.
+
+        Test: svg/animations/avoid-calculating-for-non-animating-elements.html
+
+        * svg/SVGAnimateElementBase.cpp:
+        (WebCore::SVGAnimateElementBase::calculateAnimatedValue):
+
 2018-12-11  Chris Dumez  <cdumez@apple.com>
 
         Unreviewed, fix typos in console log from r239087.
index 2a7e079..a4a24fa 100644 (file)
@@ -91,6 +91,12 @@ void SVGAnimateElementBase::calculateAnimatedValue(float percentage, unsigned re
     if (!targetElement)
         return;
 
+    const QualifiedName& attributeName = this->attributeName();
+    ShouldApplyAnimation shouldApply = shouldApplyAnimation(targetElement.get(), attributeName);
+    
+    if (shouldApply == DontApplyAnimation)
+        return;
+
     ASSERT(m_animatedPropertyType == determineAnimatedPropertyType(*targetElement));
 
     ASSERT(percentage >= 0 && percentage <= 1);
@@ -102,6 +108,12 @@ void SVGAnimateElementBase::calculateAnimatedValue(float percentage, unsigned re
     ASSERT(m_fromType->type() == m_animatedPropertyType);
     ASSERT(m_toType);
 
+    if (shouldApply == ApplyXMLAnimation || shouldApply == ApplyXMLandCSSAnimation) {
+        // SVG DOM animVal animation code-path.
+        if (m_animator->findAnimatedPropertiesForAttributeName(*targetElement, attributeName).isEmpty())
+            return;
+    }
+
     SVGAnimateElementBase& resultAnimationElement = downcast<SVGAnimateElementBase>(*resultElement);
     ASSERT(resultAnimationElement.m_animatedType);
     ASSERT(resultAnimationElement.m_animatedPropertyType == m_animatedPropertyType);