| Index: third_party/WebKit/Source/core/svg/SVGAnimateElement.cpp
|
| diff --git a/third_party/WebKit/Source/core/svg/SVGAnimateElement.cpp b/third_party/WebKit/Source/core/svg/SVGAnimateElement.cpp
|
| index 98750224b2ae136853738015b69ef3edd86a8157..c4046985b7b838aad015a5ec28085b9eb0d0ca00 100644
|
| --- a/third_party/WebKit/Source/core/svg/SVGAnimateElement.cpp
|
| +++ b/third_party/WebKit/Source/core/svg/SVGAnimateElement.cpp
|
| @@ -65,7 +65,9 @@ SVGAnimateElement::SVGAnimateElement(const QualifiedName& tagName,
|
| : SVGAnimationElement(tagName, document),
|
| m_animator(this),
|
| m_fromPropertyValueType(RegularPropertyValue),
|
| - m_toPropertyValueType(RegularPropertyValue) {}
|
| + m_toPropertyValueType(RegularPropertyValue),
|
| + m_attributeType(AttributeTypeAuto),
|
| + m_hasInvalidCSSAttributeType(false) {}
|
|
|
| SVGAnimateElement* SVGAnimateElement::create(Document& document) {
|
| return new SVGAnimateElement(SVGNames::animateTag, document);
|
| @@ -95,6 +97,24 @@ bool SVGAnimateElement::isSVGAnimationAttributeSettingJavaScriptURL(
|
| return SVGSMILElement::isSVGAnimationAttributeSettingJavaScriptURL(attribute);
|
| }
|
|
|
| +void SVGAnimateElement::parseAttribute(const QualifiedName& name,
|
| + const AtomicString& oldValue,
|
| + const AtomicString& value) {
|
| + if (name == SVGNames::attributeTypeAttr) {
|
| + setAttributeType(value);
|
| + return;
|
| + }
|
| + SVGAnimationElement::parseAttribute(name, oldValue, value);
|
| +}
|
| +
|
| +void SVGAnimateElement::svgAttributeChanged(const QualifiedName& attrName) {
|
| + if (attrName == SVGNames::attributeTypeAttr) {
|
| + animationAttributeChanged();
|
| + return;
|
| + }
|
| + SVGAnimationElement::svgAttributeChanged(attrName);
|
| +}
|
| +
|
| AnimatedPropertyType SVGAnimateElement::animatedPropertyType() {
|
| if (!targetElement())
|
| return AnimatedUnknown;
|
| @@ -390,14 +410,47 @@ float SVGAnimateElement::calculateDistance(const String& fromString,
|
|
|
| void SVGAnimateElement::setTargetElement(SVGElement* target) {
|
| SVGAnimationElement::setTargetElement(target);
|
| + checkInvalidCSSAttributeType();
|
| resetAnimatedPropertyType();
|
| }
|
|
|
| void SVGAnimateElement::setAttributeName(const QualifiedName& attributeName) {
|
| SVGAnimationElement::setAttributeName(attributeName);
|
| + checkInvalidCSSAttributeType();
|
| resetAnimatedPropertyType();
|
| }
|
|
|
| +void SVGAnimateElement::setAttributeType(const AtomicString& attributeType) {
|
| + if (attributeType == "CSS")
|
| + m_attributeType = AttributeTypeCSS;
|
| + else if (attributeType == "XML")
|
| + m_attributeType = AttributeTypeXML;
|
| + else
|
| + m_attributeType = AttributeTypeAuto;
|
| + checkInvalidCSSAttributeType();
|
| +}
|
| +
|
| +void SVGAnimateElement::checkInvalidCSSAttributeType() {
|
| + bool hasInvalidCSSAttributeType =
|
| + targetElement() && hasValidAttributeName() &&
|
| + getAttributeType() == AttributeTypeCSS &&
|
| + !isTargetAttributeCSSProperty(targetElement(), attributeName());
|
| +
|
| + if (hasInvalidCSSAttributeType != m_hasInvalidCSSAttributeType) {
|
| + if (hasInvalidCSSAttributeType)
|
| + unscheduleIfScheduled();
|
| +
|
| + m_hasInvalidCSSAttributeType = hasInvalidCSSAttributeType;
|
| +
|
| + if (!hasInvalidCSSAttributeType)
|
| + schedule();
|
| + }
|
| +
|
| + // Clear values that may depend on the previous target.
|
| + if (targetElement())
|
| + clearAnimatedType();
|
| +}
|
| +
|
| void SVGAnimateElement::resetAnimatedPropertyType() {
|
| ASSERT(!m_animatedProperty);
|
| m_fromProperty.clear();
|
|
|