Do not attempt to synchronize attributes when no Simple Selector could match an anima...
authorbenjamin@webkit.org <benjamin@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 14 Feb 2014 20:58:28 +0000 (20:58 +0000)
committerbenjamin@webkit.org <benjamin@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 14 Feb 2014 20:58:28 +0000 (20:58 +0000)
https://bugs.webkit.org/show_bug.cgi?id=128728

Reviewed by Andreas Kling.

In most cases, we don't even need to test for the flag animatedSVGAttributesNotDirty.
If the selector filter could never match an animatable attribute, there is no point in testing for one.

* cssjit/SelectorCompiler.cpp:
(WebCore::SelectorCompiler::canMatchStyleAttribute):
Skip the second test when the local name is equal to canonicalLocalName. That is the common case.

(WebCore::SelectorCompiler::canMatchAnimatableSVGAttribute):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementAttributesMatching):

* svg/SVGElement.cpp:
(WebCore::addQualifiedName):
(WebCore::SVGElement::animatableAttributeForName):
(WebCore::SVGElement::isAnimatableAttribute):
(WebCore::SVGElement::filterOutAnimatableAttribute):
* svg/SVGElement.h:
* svg/SVGScriptElement.cpp:
(WebCore::SVGScriptElement::filterOutAnimatableAttribute):
* svg/SVGScriptElement.h:
Move the list of animatable attribute to a static function available in Release.
Selector matching is a lot more flexible than normal name matching. Since the local name must
always match, it is used as a key to get the full QualifiedName to compare to the selector.

Separating the list of animatable attributes between Selectors and SVGElement::isAnimatableAttribute
would be error prone. Instead, SVGElement::isAnimatableAttribute() is modified to use
SVGElement::animatableAttributeForName so that the two never get out of sync.

Since SVGScriptElement has one additional restriction to isAnimatableAttribute(), the function
filterOutAnimatableAttribute() is added to remove a qualified name from the complete list of animatable attributes.
This ensure SVGElement::animatableAttributeForName() always has the complete list, and subclasses of SVGElement
can only remove QualifiedNames, not add them.

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

Source/WebCore/ChangeLog
Source/WebCore/cssjit/SelectorCompiler.cpp
Source/WebCore/svg/SVGElement.cpp
Source/WebCore/svg/SVGElement.h
Source/WebCore/svg/SVGScriptElement.cpp
Source/WebCore/svg/SVGScriptElement.h

index 817bc58..a84df26 100644 (file)
@@ -1,5 +1,44 @@
 2014-02-14  Benjamin Poulain  <benjamin@webkit.org>
 
+        Do not attempt to synchronize attributes when no Simple Selector could match an animatable attribute
+        https://bugs.webkit.org/show_bug.cgi?id=128728
+
+        Reviewed by Andreas Kling.
+
+        In most cases, we don't even need to test for the flag animatedSVGAttributesNotDirty.
+        If the selector filter could never match an animatable attribute, there is no point in testing for one.
+
+        * cssjit/SelectorCompiler.cpp:
+        (WebCore::SelectorCompiler::canMatchStyleAttribute):
+        Skip the second test when the local name is equal to canonicalLocalName. That is the common case.
+
+        (WebCore::SelectorCompiler::canMatchAnimatableSVGAttribute):
+        (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementAttributesMatching):
+
+        * svg/SVGElement.cpp:
+        (WebCore::addQualifiedName):
+        (WebCore::SVGElement::animatableAttributeForName):
+        (WebCore::SVGElement::isAnimatableAttribute):
+        (WebCore::SVGElement::filterOutAnimatableAttribute):
+        * svg/SVGElement.h:
+        * svg/SVGScriptElement.cpp:
+        (WebCore::SVGScriptElement::filterOutAnimatableAttribute):
+        * svg/SVGScriptElement.h:
+        Move the list of animatable attribute to a static function available in Release.
+        Selector matching is a lot more flexible than normal name matching. Since the local name must
+        always match, it is used as a key to get the full QualifiedName to compare to the selector.
+
+        Separating the list of animatable attributes between Selectors and SVGElement::isAnimatableAttribute
+        would be error prone. Instead, SVGElement::isAnimatableAttribute() is modified to use
+        SVGElement::animatableAttributeForName so that the two never get out of sync.
+
+        Since SVGScriptElement has one additional restriction to isAnimatableAttribute(), the function
+        filterOutAnimatableAttribute() is added to remove a qualified name from the complete list of animatable attributes.
+        This ensure SVGElement::animatableAttributeForName() always has the complete list, and subclasses of SVGElement
+        can only remove QualifiedNames, not add them.
+
+2014-02-14  Benjamin Poulain  <benjamin@webkit.org>
+
         Make code generation of the unoptimized pseudo classes separate
         https://bugs.webkit.org/show_bug.cgi?id=128704
 
index 2c9aa93..6cb49a6 100644 (file)
@@ -942,8 +942,12 @@ static inline bool canMatchStyleAttribute(const SelectorFragment& fragment)
     for (unsigned i = 0; i < fragment.attributes.size(); ++i) {
         const CSSSelector* attributeSelector = fragment.attributes[i];
         const QualifiedName& attributeName = attributeSelector->attribute();
-        if (Attribute::nameMatchesFilter(HTMLNames::styleAttr, attributeName.prefix(), attributeName.localName(), attributeName.namespaceURI())
-            || Attribute::nameMatchesFilter(HTMLNames::styleAttr, attributeName.prefix(), attributeSelector->attributeCanonicalLocalName(), attributeName.namespaceURI())) {
+        if (Attribute::nameMatchesFilter(HTMLNames::styleAttr, attributeName.prefix(), attributeName.localName(), attributeName.namespaceURI()))
+            return true;
+
+        const AtomicString& canonicalLocalName = attributeSelector->attributeCanonicalLocalName();
+        if (attributeName.localName() != canonicalLocalName
+            && Attribute::nameMatchesFilter(HTMLNames::styleAttr, attributeName.prefix(), attributeSelector->attributeCanonicalLocalName(), attributeName.namespaceURI())) {
             return true;
         }
     }
@@ -964,6 +968,26 @@ void SelectorCodeGenerator::generateSynchronizeStyleAttribute(Assembler::Registe
     styleAttributeNotDirty.link(&m_assembler);
 }
 
+static inline bool canMatchAnimatableSVGAttribute(const SelectorFragment& fragment)
+{
+    for (unsigned i = 0; i < fragment.attributes.size(); ++i) {
+        const CSSSelector* attributeSelector = fragment.attributes[i];
+        const QualifiedName& selectorAttributeName = attributeSelector->attribute();
+
+        const QualifiedName& candidateForLocalName = SVGElement::animatableAttributeForName(selectorAttributeName.localName());
+        if (Attribute::nameMatchesFilter(candidateForLocalName, selectorAttributeName.prefix(), selectorAttributeName.localName(), selectorAttributeName.namespaceURI()))
+            return true;
+
+        const AtomicString& canonicalLocalName = attributeSelector->attributeCanonicalLocalName();
+        if (selectorAttributeName.localName() != canonicalLocalName) {
+            const QualifiedName& candidateForCanonicalLocalName = SVGElement::animatableAttributeForName(selectorAttributeName.localName());
+            if (Attribute::nameMatchesFilter(candidateForCanonicalLocalName, selectorAttributeName.prefix(), selectorAttributeName.localName(), selectorAttributeName.namespaceURI()))
+                return true;
+        }
+    }
+    return false;
+}
+
 void SelectorCodeGenerator::generateSynchronizeAllAnimatedSVGAttribute(Assembler::RegisterID elementDataArraySizeAndFlags)
 {
     // SVG attributes can be updated lazily depending on the flag AnimatedSVGAttributesAreDirty. We need to check
@@ -990,9 +1014,8 @@ void SelectorCodeGenerator::generateElementAttributesMatching(Assembler::JumpLis
     if (canMatchStyleAttribute(fragment))
         generateSynchronizeStyleAttribute(elementDataArraySizeAndFlags);
 
-    // FIXME: Systematically generating the function call for animatable SVG attributes causes a runtime penaltly. We should instead
-    // filter from the list of SVGElement::isAnimatableAttribute at runtime when compiling.
-    generateSynchronizeAllAnimatedSVGAttribute(elementDataArraySizeAndFlags);
+    if (canMatchAnimatableSVGAttribute(fragment))
+        generateSynchronizeAllAnimatedSVGAttribute(elementDataArraySizeAndFlags);
 
     // Attributes can be stored either in a separate vector for UniqueElementData, or after the elementData itself
     // for ShareableElementData.
index dc752bd..3e929c2 100644 (file)
@@ -814,110 +814,127 @@ RenderStyle* SVGElement::computedStyle(PseudoId pseudoElementSpecifier)
     return m_svgRareData->overrideComputedStyle(this, parentStyle);
 }
 
-#ifndef NDEBUG
-bool SVGElement::isAnimatableAttribute(const QualifiedName& name) const
+static void addQualifiedName(HashMap<AtomicString, QualifiedName>& map, const QualifiedName& name)
 {
-    static NeverDestroyed<HashSet<QualifiedName>> neverDestroyedAnimatableAttributes;
-    HashSet<QualifiedName>& animatableAttributes = neverDestroyedAnimatableAttributes;
+    HashMap<AtomicString, QualifiedName>::AddResult addResult = map.add(name.localName(), name);
+    ASSERT_UNUSED(addResult, addResult.isNewEntry);
+}
+
+QualifiedName SVGElement::animatableAttributeForName(const AtomicString& localName)
+{
+    static NeverDestroyed<HashMap<AtomicString, QualifiedName>> neverDestroyedAnimatableAttributes;
+    HashMap<AtomicString, QualifiedName>& animatableAttributes = neverDestroyedAnimatableAttributes;
 
     if (animatableAttributes.isEmpty()) {
-        animatableAttributes.add(HTMLNames::classAttr);
-        animatableAttributes.add(SVGNames::amplitudeAttr);
-        animatableAttributes.add(SVGNames::azimuthAttr);
-        animatableAttributes.add(SVGNames::baseFrequencyAttr);
-        animatableAttributes.add(SVGNames::biasAttr);
-        animatableAttributes.add(SVGNames::clipPathUnitsAttr);
-        animatableAttributes.add(SVGNames::cxAttr);
-        animatableAttributes.add(SVGNames::cyAttr);
-        animatableAttributes.add(SVGNames::diffuseConstantAttr);
-        animatableAttributes.add(SVGNames::divisorAttr);
-        animatableAttributes.add(SVGNames::dxAttr);
-        animatableAttributes.add(SVGNames::dyAttr);
-        animatableAttributes.add(SVGNames::edgeModeAttr);
-        animatableAttributes.add(SVGNames::elevationAttr);
-        animatableAttributes.add(SVGNames::exponentAttr);
-        animatableAttributes.add(SVGNames::externalResourcesRequiredAttr);
-        animatableAttributes.add(SVGNames::filterResAttr);
-        animatableAttributes.add(SVGNames::filterUnitsAttr);
-        animatableAttributes.add(SVGNames::fxAttr);
-        animatableAttributes.add(SVGNames::fyAttr);
-        animatableAttributes.add(SVGNames::gradientTransformAttr);
-        animatableAttributes.add(SVGNames::gradientUnitsAttr);
-        animatableAttributes.add(SVGNames::heightAttr);
-        animatableAttributes.add(SVGNames::in2Attr);
-        animatableAttributes.add(SVGNames::inAttr);
-        animatableAttributes.add(SVGNames::interceptAttr);
-        animatableAttributes.add(SVGNames::k1Attr);
-        animatableAttributes.add(SVGNames::k2Attr);
-        animatableAttributes.add(SVGNames::k3Attr);
-        animatableAttributes.add(SVGNames::k4Attr);
-        animatableAttributes.add(SVGNames::kernelMatrixAttr);
-        animatableAttributes.add(SVGNames::kernelUnitLengthAttr);
-        animatableAttributes.add(SVGNames::lengthAdjustAttr);
-        animatableAttributes.add(SVGNames::limitingConeAngleAttr);
-        animatableAttributes.add(SVGNames::markerHeightAttr);
-        animatableAttributes.add(SVGNames::markerUnitsAttr);
-        animatableAttributes.add(SVGNames::markerWidthAttr);
-        animatableAttributes.add(SVGNames::maskContentUnitsAttr);
-        animatableAttributes.add(SVGNames::maskUnitsAttr);
-        animatableAttributes.add(SVGNames::methodAttr);
-        animatableAttributes.add(SVGNames::modeAttr);
-        animatableAttributes.add(SVGNames::numOctavesAttr);
-        animatableAttributes.add(SVGNames::offsetAttr);
-        animatableAttributes.add(SVGNames::operatorAttr);
-        animatableAttributes.add(SVGNames::orderAttr);
-        animatableAttributes.add(SVGNames::orientAttr);
-        animatableAttributes.add(SVGNames::pathLengthAttr);
-        animatableAttributes.add(SVGNames::patternContentUnitsAttr);
-        animatableAttributes.add(SVGNames::patternTransformAttr);
-        animatableAttributes.add(SVGNames::patternUnitsAttr);
-        animatableAttributes.add(SVGNames::pointsAtXAttr);
-        animatableAttributes.add(SVGNames::pointsAtYAttr);
-        animatableAttributes.add(SVGNames::pointsAtZAttr);
-        animatableAttributes.add(SVGNames::preserveAlphaAttr);
-        animatableAttributes.add(SVGNames::preserveAspectRatioAttr);
-        animatableAttributes.add(SVGNames::primitiveUnitsAttr);
-        animatableAttributes.add(SVGNames::radiusAttr);
-        animatableAttributes.add(SVGNames::rAttr);
-        animatableAttributes.add(SVGNames::refXAttr);
-        animatableAttributes.add(SVGNames::refYAttr);
-        animatableAttributes.add(SVGNames::resultAttr);
-        animatableAttributes.add(SVGNames::rotateAttr);
-        animatableAttributes.add(SVGNames::rxAttr);
-        animatableAttributes.add(SVGNames::ryAttr);
-        animatableAttributes.add(SVGNames::scaleAttr);
-        animatableAttributes.add(SVGNames::seedAttr);
-        animatableAttributes.add(SVGNames::slopeAttr);
-        animatableAttributes.add(SVGNames::spacingAttr);
-        animatableAttributes.add(SVGNames::specularConstantAttr);
-        animatableAttributes.add(SVGNames::specularExponentAttr);
-        animatableAttributes.add(SVGNames::spreadMethodAttr);
-        animatableAttributes.add(SVGNames::startOffsetAttr);
-        animatableAttributes.add(SVGNames::stdDeviationAttr);
-        animatableAttributes.add(SVGNames::stitchTilesAttr);
-        animatableAttributes.add(SVGNames::surfaceScaleAttr);
-        animatableAttributes.add(SVGNames::tableValuesAttr);
-        animatableAttributes.add(SVGNames::targetAttr);
-        animatableAttributes.add(SVGNames::targetXAttr);
-        animatableAttributes.add(SVGNames::targetYAttr);
-        animatableAttributes.add(SVGNames::transformAttr);
-        animatableAttributes.add(SVGNames::typeAttr);
-        animatableAttributes.add(SVGNames::valuesAttr);
-        animatableAttributes.add(SVGNames::viewBoxAttr);
-        animatableAttributes.add(SVGNames::widthAttr);
-        animatableAttributes.add(SVGNames::x1Attr);
-        animatableAttributes.add(SVGNames::x2Attr);
-        animatableAttributes.add(SVGNames::xAttr);
-        animatableAttributes.add(SVGNames::xChannelSelectorAttr);
-        animatableAttributes.add(SVGNames::y1Attr);
-        animatableAttributes.add(SVGNames::y2Attr);
-        animatableAttributes.add(SVGNames::yAttr);
-        animatableAttributes.add(SVGNames::yChannelSelectorAttr);
-        animatableAttributes.add(SVGNames::zAttr);
-        animatableAttributes.add(XLinkNames::hrefAttr);
+        addQualifiedName(animatableAttributes, HTMLNames::classAttr);
+        addQualifiedName(animatableAttributes, SVGNames::amplitudeAttr);
+        addQualifiedName(animatableAttributes, SVGNames::azimuthAttr);
+        addQualifiedName(animatableAttributes, SVGNames::baseFrequencyAttr);
+        addQualifiedName(animatableAttributes, SVGNames::biasAttr);
+        addQualifiedName(animatableAttributes, SVGNames::clipPathUnitsAttr);
+        addQualifiedName(animatableAttributes, SVGNames::cxAttr);
+        addQualifiedName(animatableAttributes, SVGNames::cyAttr);
+        addQualifiedName(animatableAttributes, SVGNames::diffuseConstantAttr);
+        addQualifiedName(animatableAttributes, SVGNames::divisorAttr);
+        addQualifiedName(animatableAttributes, SVGNames::dxAttr);
+        addQualifiedName(animatableAttributes, SVGNames::dyAttr);
+        addQualifiedName(animatableAttributes, SVGNames::edgeModeAttr);
+        addQualifiedName(animatableAttributes, SVGNames::elevationAttr);
+        addQualifiedName(animatableAttributes, SVGNames::exponentAttr);
+        addQualifiedName(animatableAttributes, SVGNames::externalResourcesRequiredAttr);
+        addQualifiedName(animatableAttributes, SVGNames::filterResAttr);
+        addQualifiedName(animatableAttributes, SVGNames::filterUnitsAttr);
+        addQualifiedName(animatableAttributes, SVGNames::fxAttr);
+        addQualifiedName(animatableAttributes, SVGNames::fyAttr);
+        addQualifiedName(animatableAttributes, SVGNames::gradientTransformAttr);
+        addQualifiedName(animatableAttributes, SVGNames::gradientUnitsAttr);
+        addQualifiedName(animatableAttributes, SVGNames::heightAttr);
+        addQualifiedName(animatableAttributes, SVGNames::in2Attr);
+        addQualifiedName(animatableAttributes, SVGNames::inAttr);
+        addQualifiedName(animatableAttributes, SVGNames::interceptAttr);
+        addQualifiedName(animatableAttributes, SVGNames::k1Attr);
+        addQualifiedName(animatableAttributes, SVGNames::k2Attr);
+        addQualifiedName(animatableAttributes, SVGNames::k3Attr);
+        addQualifiedName(animatableAttributes, SVGNames::k4Attr);
+        addQualifiedName(animatableAttributes, SVGNames::kernelMatrixAttr);
+        addQualifiedName(animatableAttributes, SVGNames::kernelUnitLengthAttr);
+        addQualifiedName(animatableAttributes, SVGNames::lengthAdjustAttr);
+        addQualifiedName(animatableAttributes, SVGNames::limitingConeAngleAttr);
+        addQualifiedName(animatableAttributes, SVGNames::markerHeightAttr);
+        addQualifiedName(animatableAttributes, SVGNames::markerUnitsAttr);
+        addQualifiedName(animatableAttributes, SVGNames::markerWidthAttr);
+        addQualifiedName(animatableAttributes, SVGNames::maskContentUnitsAttr);
+        addQualifiedName(animatableAttributes, SVGNames::maskUnitsAttr);
+        addQualifiedName(animatableAttributes, SVGNames::methodAttr);
+        addQualifiedName(animatableAttributes, SVGNames::modeAttr);
+        addQualifiedName(animatableAttributes, SVGNames::numOctavesAttr);
+        addQualifiedName(animatableAttributes, SVGNames::offsetAttr);
+        addQualifiedName(animatableAttributes, SVGNames::operatorAttr);
+        addQualifiedName(animatableAttributes, SVGNames::orderAttr);
+        addQualifiedName(animatableAttributes, SVGNames::orientAttr);
+        addQualifiedName(animatableAttributes, SVGNames::pathLengthAttr);
+        addQualifiedName(animatableAttributes, SVGNames::patternContentUnitsAttr);
+        addQualifiedName(animatableAttributes, SVGNames::patternTransformAttr);
+        addQualifiedName(animatableAttributes, SVGNames::patternUnitsAttr);
+        addQualifiedName(animatableAttributes, SVGNames::pointsAtXAttr);
+        addQualifiedName(animatableAttributes, SVGNames::pointsAtYAttr);
+        addQualifiedName(animatableAttributes, SVGNames::pointsAtZAttr);
+        addQualifiedName(animatableAttributes, SVGNames::preserveAlphaAttr);
+        addQualifiedName(animatableAttributes, SVGNames::preserveAspectRatioAttr);
+        addQualifiedName(animatableAttributes, SVGNames::primitiveUnitsAttr);
+        addQualifiedName(animatableAttributes, SVGNames::radiusAttr);
+        addQualifiedName(animatableAttributes, SVGNames::rAttr);
+        addQualifiedName(animatableAttributes, SVGNames::refXAttr);
+        addQualifiedName(animatableAttributes, SVGNames::refYAttr);
+        addQualifiedName(animatableAttributes, SVGNames::resultAttr);
+        addQualifiedName(animatableAttributes, SVGNames::rotateAttr);
+        addQualifiedName(animatableAttributes, SVGNames::rxAttr);
+        addQualifiedName(animatableAttributes, SVGNames::ryAttr);
+        addQualifiedName(animatableAttributes, SVGNames::scaleAttr);
+        addQualifiedName(animatableAttributes, SVGNames::seedAttr);
+        addQualifiedName(animatableAttributes, SVGNames::slopeAttr);
+        addQualifiedName(animatableAttributes, SVGNames::spacingAttr);
+        addQualifiedName(animatableAttributes, SVGNames::specularConstantAttr);
+        addQualifiedName(animatableAttributes, SVGNames::specularExponentAttr);
+        addQualifiedName(animatableAttributes, SVGNames::spreadMethodAttr);
+        addQualifiedName(animatableAttributes, SVGNames::startOffsetAttr);
+        addQualifiedName(animatableAttributes, SVGNames::stdDeviationAttr);
+        addQualifiedName(animatableAttributes, SVGNames::stitchTilesAttr);
+        addQualifiedName(animatableAttributes, SVGNames::surfaceScaleAttr);
+        addQualifiedName(animatableAttributes, SVGNames::tableValuesAttr);
+        addQualifiedName(animatableAttributes, SVGNames::targetAttr);
+        addQualifiedName(animatableAttributes, SVGNames::targetXAttr);
+        addQualifiedName(animatableAttributes, SVGNames::targetYAttr);
+        addQualifiedName(animatableAttributes, SVGNames::transformAttr);
+        addQualifiedName(animatableAttributes, SVGNames::typeAttr);
+        addQualifiedName(animatableAttributes, SVGNames::valuesAttr);
+        addQualifiedName(animatableAttributes, SVGNames::viewBoxAttr);
+        addQualifiedName(animatableAttributes, SVGNames::widthAttr);
+        addQualifiedName(animatableAttributes, SVGNames::x1Attr);
+        addQualifiedName(animatableAttributes, SVGNames::x2Attr);
+        addQualifiedName(animatableAttributes, SVGNames::xAttr);
+        addQualifiedName(animatableAttributes, SVGNames::xChannelSelectorAttr);
+        addQualifiedName(animatableAttributes, SVGNames::y1Attr);
+        addQualifiedName(animatableAttributes, SVGNames::y2Attr);
+        addQualifiedName(animatableAttributes, SVGNames::yAttr);
+        addQualifiedName(animatableAttributes, SVGNames::yChannelSelectorAttr);
+        addQualifiedName(animatableAttributes, SVGNames::zAttr);
+        addQualifiedName(animatableAttributes, XLinkNames::hrefAttr);
     }
+    return animatableAttributes.get(localName);
+}
+
+#ifndef NDEBUG
+bool SVGElement::isAnimatableAttribute(const QualifiedName& name) const
+{
+    if (SVGElement::animatableAttributeForName(name.localName()) == name)
+        return !filterOutAnimatableAttribute(name);
+    return false;
+}
 
-    return animatableAttributes.contains(name);
+bool SVGElement::filterOutAnimatableAttribute(const QualifiedName&) const
+{
+    return false;
 }
 #endif
 
index 9bc8df1..a43f73d 100644 (file)
@@ -122,8 +122,9 @@ public:
     virtual void synchronizeRequiredExtensions() { }
     virtual void synchronizeSystemLanguage() { }
 
+    static QualifiedName animatableAttributeForName(const AtomicString&);
 #ifndef NDEBUG
-    virtual bool isAnimatableAttribute(const QualifiedName&) const;
+    bool isAnimatableAttribute(const QualifiedName&) const;
 #endif
 
     MutableStyleProperties* animatedSMILStyleProperties() const;
@@ -184,6 +185,10 @@ private:
     virtual bool isMouseFocusable() const override;
     virtual void accessKeyAction(bool sendMouseEvents) override;
 
+#ifndef NDEBUG
+    virtual bool filterOutAnimatableAttribute(const QualifiedName&) const;
+#endif
+
     std::unique_ptr<SVGElementRareData> m_svgRareData;
 
     HashSet<SVGElement*> m_elementsWithRelativeLengths;
index 74ce5d6..14705aa 100644 (file)
@@ -197,12 +197,9 @@ PassRefPtr<Element> SVGScriptElement::cloneElementWithoutAttributesAndChildren()
 }
 
 #ifndef NDEBUG
-bool SVGScriptElement::isAnimatableAttribute(const QualifiedName& name) const
+bool SVGScriptElement::filterOutAnimatableAttribute(const QualifiedName& name) const
 {
-    if (name == SVGNames::typeAttr)
-        return false;
-
-    return SVGElement::isAnimatableAttribute(name);
+    return name == SVGNames::typeAttr;
 }
 #endif
 
index fb42c5c..572f79d 100644 (file)
@@ -37,10 +37,6 @@ class SVGScriptElement final : public SVGElement
 public:
     static PassRefPtr<SVGScriptElement> create(const QualifiedName&, Document&, bool wasInsertedByParser);
 
-#ifndef NDEBUG
-    virtual bool isAnimatableAttribute(const QualifiedName&) const override;
-#endif
-
 private:
     SVGScriptElement(const QualifiedName&, Document&, bool wasInsertedByParser, bool alreadyStarted);
 
@@ -78,6 +74,10 @@ private:
     virtual bool haveFiredLoadEvent() const override { return ScriptElement::haveFiredLoadEvent(); }
     virtual Timer<SVGElement>* svgLoadEventTimer() override { return &m_svgLoadEventTimer; }
 
+#ifndef NDEBUG
+    virtual bool filterOutAnimatableAttribute(const QualifiedName&) const override;
+#endif
+
     BEGIN_DECLARE_ANIMATED_PROPERTIES(SVGScriptElement)
         DECLARE_ANIMATED_STRING(Href, href)
         DECLARE_ANIMATED_BOOLEAN(ExternalResourcesRequired, externalResourcesRequired)