| 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 71ee51eba1df8af4c95f5de1347772df1c2ed709..10eb8e1f14c7e0cf221aed745b80ef63ee6d6e52 100644 | 
| --- a/third_party/WebKit/Source/core/svg/SVGAnimateElement.cpp | 
| +++ b/third_party/WebKit/Source/core/svg/SVGAnimateElement.cpp | 
| @@ -22,6 +22,7 @@ | 
|  | 
| #include "core/svg/SVGAnimateElement.h" | 
|  | 
| +#include "core/XLinkNames.h" | 
| #include "core/css/CSSComputedStyleDeclaration.h" | 
| #include "core/css/StylePropertySet.h" | 
| #include "core/dom/Document.h" | 
| @@ -69,6 +70,32 @@ AnimatedPropertyValueType propertyValueType(const QualifiedName& attributeName, | 
| return InheritValue; | 
| } | 
|  | 
| +QualifiedName constructQualifiedName(const SVGElement& svgElement, | 
| +                                     const AtomicString& attributeName) { | 
| +  if (attributeName.isEmpty()) | 
| +    return anyQName(); | 
| +  if (!attributeName.contains(':')) | 
| +    return QualifiedName(nullAtom, attributeName, nullAtom); | 
| + | 
| +  AtomicString prefix; | 
| +  AtomicString localName; | 
| +  if (!Document::parseQualifiedName(attributeName, prefix, localName, | 
| +                                    IGNORE_EXCEPTION)) | 
| +    return anyQName(); | 
| + | 
| +  const AtomicString& namespaceURI = svgElement.lookupNamespaceURI(prefix); | 
| +  if (namespaceURI.isEmpty()) | 
| +    return anyQName(); | 
| + | 
| +  QualifiedName resolvedAttrName(nullAtom, localName, namespaceURI); | 
| +  // "Animation elements treat attributeName='xlink:href' as being an alias | 
| +  // for targetting the 'href' attribute." | 
| +  // https://svgwg.org/svg2-draft/types.html#__svg__SVGURIReference__href | 
| +  if (resolvedAttrName == XLinkNames::hrefAttr) | 
| +    return SVGNames::hrefAttr; | 
| +  return resolvedAttrName; | 
| +} | 
| + | 
| }  // unnamed namespace | 
|  | 
| SVGAnimateElement::SVGAnimateElement(const QualifiedName& tagName, | 
| @@ -109,6 +136,22 @@ bool SVGAnimateElement::isSVGAnimationAttributeSettingJavaScriptURL( | 
| return SVGSMILElement::isSVGAnimationAttributeSettingJavaScriptURL(attribute); | 
| } | 
|  | 
| +Node::InsertionNotificationRequest SVGAnimateElement::insertedInto( | 
| +    ContainerNode* rootParent) { | 
| +  SVGAnimationElement::insertedInto(rootParent); | 
| +  if (rootParent->isConnected()) { | 
| +    setAttributeName(constructQualifiedName( | 
| +        *this, fastGetAttribute(SVGNames::attributeNameAttr))); | 
| +  } | 
| +  return InsertionDone; | 
| +} | 
| + | 
| +void SVGAnimateElement::removedFrom(ContainerNode* rootParent) { | 
| +  if (rootParent->isConnected()) | 
| +    setAttributeName(anyQName()); | 
| +  SVGAnimationElement::removedFrom(rootParent); | 
| +} | 
| + | 
| void SVGAnimateElement::parseAttribute(const QualifiedName& name, | 
| const AtomicString& oldValue, | 
| const AtomicString& value) { | 
| @@ -121,10 +164,14 @@ void SVGAnimateElement::parseAttribute(const QualifiedName& name, | 
|  | 
| void SVGAnimateElement::svgAttributeChanged(const QualifiedName& attrName) { | 
| if (attrName == SVGNames::attributeTypeAttr) { | 
| -    animationAttributeChanged(); | 
| +  } else if (attrName == SVGNames::attributeNameAttr) { | 
| +    setAttributeName(constructQualifiedName( | 
| +        *this, fastGetAttribute(SVGNames::attributeNameAttr))); | 
| +  } else { | 
| +    SVGAnimationElement::svgAttributeChanged(attrName); | 
| return; | 
| } | 
| -  SVGAnimationElement::svgAttributeChanged(attrName); | 
| +  animationAttributeChanged(); | 
| } | 
|  | 
| void SVGAnimateElement::resolveTargetProperty() { | 
| @@ -516,7 +563,11 @@ void SVGAnimateElement::setTargetElement(SVGElement* target) { | 
| } | 
|  | 
| void SVGAnimateElement::setAttributeName(const QualifiedName& attributeName) { | 
| -  SVGAnimationElement::setAttributeName(attributeName); | 
| +  unscheduleIfScheduled(); | 
| +  if (targetElement()) | 
| +    clearAnimatedType(); | 
| +  m_attributeName = attributeName; | 
| +  schedule(); | 
| checkInvalidCSSAttributeType(); | 
| resetAnimatedPropertyType(); | 
| } | 
|  |