Generate more SVG type checks and conversions.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 10 Sep 2013 03:10:11 +0000 (03:10 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 10 Sep 2013 03:10:11 +0000 (03:10 +0000)
<https://webkit.org/b/121066>

Reviewed by Anders Carlsson.

Switch another slew of SVG elements to auto-generated isFooElement()
and toFooElement() helpers.

Removed now-unnecessary casts and assertions as appropriate.
Converted some simple loops to childrenOfType iteration instead of
traversing child Nodes.

PS. This patch also adds const versions of toFooElement().

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

48 files changed:
Source/WebCore/ChangeLog
Source/WebCore/css/CSSCursorImageValue.cpp
Source/WebCore/dom/DocumentStyleSheetCollection.cpp
Source/WebCore/dom/Element.cpp
Source/WebCore/dom/make_names.pl
Source/WebCore/inspector/InspectorCSSAgent.cpp
Source/WebCore/loader/cache/CachedFont.cpp
Source/WebCore/rendering/svg/RenderSVGEllipse.cpp
Source/WebCore/rendering/svg/RenderSVGForeignObject.cpp
Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp
Source/WebCore/rendering/svg/RenderSVGResourceClipper.h
Source/WebCore/rendering/svg/RenderSVGResourceLinearGradient.cpp
Source/WebCore/rendering/svg/RenderSVGText.cpp
Source/WebCore/rendering/svg/SVGPathData.cpp
Source/WebCore/rendering/svg/SVGRenderTreeAsText.cpp
Source/WebCore/svg/SVGAltGlyphDefElement.cpp
Source/WebCore/svg/SVGAltGlyphElement.cpp
Source/WebCore/svg/SVGAltGlyphItemElement.cpp
Source/WebCore/svg/SVGAnimatedTransformList.cpp
Source/WebCore/svg/SVGDocument.cpp
Source/WebCore/svg/SVGElement.cpp
Source/WebCore/svg/SVGElement.h
Source/WebCore/svg/SVGFEComponentTransferElement.cpp
Source/WebCore/svg/SVGFELightElement.cpp
Source/WebCore/svg/SVGFEMergeElement.cpp
Source/WebCore/svg/SVGFilterElement.h
Source/WebCore/svg/SVGFontData.cpp
Source/WebCore/svg/SVGFontElement.cpp
Source/WebCore/svg/SVGFontFaceElement.cpp
Source/WebCore/svg/SVGFontFaceSrcElement.cpp
Source/WebCore/svg/SVGLengthContext.cpp
Source/WebCore/svg/SVGLinearGradientElement.h
Source/WebCore/svg/SVGMPathElement.cpp
Source/WebCore/svg/SVGMPathElement.h
Source/WebCore/svg/SVGMarkerElement.h
Source/WebCore/svg/SVGMaskElement.h
Source/WebCore/svg/SVGMissingGlyphElement.h
Source/WebCore/svg/SVGPathElement.h
Source/WebCore/svg/SVGPatternElement.cpp
Source/WebCore/svg/SVGPatternElement.h
Source/WebCore/svg/SVGRadialGradientElement.h
Source/WebCore/svg/SVGRectElement.h
Source/WebCore/svg/SVGSVGElement.cpp
Source/WebCore/svg/SVGSVGElement.h
Source/WebCore/svg/SVGTextPathElement.h
Source/WebCore/svg/SVGTitleElement.h
Source/WebCore/svg/SVGUseElement.h
Source/WebCore/svg/svgtags.in

index bccff95..b495cab 100644 (file)
@@ -1,3 +1,19 @@
+2013-09-09  Andreas Kling  <akling@apple.com>
+
+        Generate more SVG type checks and conversions.
+        <https://webkit.org/b/121066>
+
+        Reviewed by Anders Carlsson.
+
+        Switch another slew of SVG elements to auto-generated isFooElement()
+        and toFooElement() helpers.
+
+        Removed now-unnecessary casts and assertions as appropriate.
+        Converted some simple loops to childrenOfType iteration instead of
+        traversing child Nodes.
+
+        PS. This patch also adds const versions of toFooElement().
+
 2013-09-09  Dean Jackson  <dino@apple.com>
 
         [WebGL] Allow multithreaded OpenGL contexts
index d25222c..2040670 100644 (file)
@@ -51,8 +51,8 @@ namespace WebCore {
 static inline SVGCursorElement* resourceReferencedByCursorElement(const String& url, Document* document)
 {
     Element* element = SVGURIReference::targetElementFromIRIString(url, document);
-    if (element && element->hasTagName(SVGNames::cursorTag))
-        return static_cast<SVGCursorElement*>(element);
+    if (element && isSVGCursorElement(element))
+        return toSVGCursorElement(element);
 
     return 0;
 }
index a869890..dde8bd8 100644 (file)
@@ -325,8 +325,8 @@ void DocumentStyleSheetCollection::collectActiveStyleSheets(Vector<RefPtr<StyleS
             // Get the current preferred styleset. This is the
             // set of sheets that will be enabled.
 #if ENABLE(SVG)
-            if (e->hasTagName(SVGNames::styleTag))
-                sheet = static_cast<SVGStyleElement*>(n)->sheet();
+            if (isSVGStyleElement(e))
+                sheet = toSVGStyleElement(e)->sheet();
             else
 #endif
             {
index c6dbc1e..86cf15d 100644 (file)
@@ -380,7 +380,7 @@ inline void Element::synchronizeAttribute(const AtomicString& localName) const
     if (elementData()->m_animatedSVGAttributesAreDirty) {
         // We're not passing a namespace argument on purpose. SVGNames::*Attr are defined w/o namespaces as well.
         ASSERT(isSVGElement());
-        static_cast<const SVGElement*>(this)->synchronizeAnimatedSVGAttribute(QualifiedName(nullAtom, localName, nullAtom));
+        toSVGElement(this)->synchronizeAnimatedSVGAttribute(QualifiedName(nullAtom, localName, nullAtom));
     }
 #endif
 }
@@ -2698,7 +2698,7 @@ bool Element::fastAttributeLookupAllowed(const QualifiedName& name) const
 
 #if ENABLE(SVG)
     if (isSVGElement())
-        return !static_cast<const SVGElement*>(this)->isAnimatableAttribute(name);
+        return !toSVGElement(this)->isAnimatableAttribute(name);
 #endif
 
     return true;
index b8bc99a..d049ef4 100755 (executable)
@@ -637,6 +637,8 @@ sub printTypeHelpers
         print F "template <> inline bool isElementOfType<$class>(const Element* element) { return $checkHelper(element); }\n";
         print F "inline $class* $castingHelper(Node* node) { ASSERT_WITH_SECURITY_IMPLICATION(!node || $checkHelper(node)); return reinterpret_cast<".$class."*>(node); }\n";
         print F "inline $class* $castingHelper(Element* element) { ASSERT_WITH_SECURITY_IMPLICATION(!element || $checkHelper(element)); return reinterpret_cast<".$class."*>(element); }\n";
+        print F "inline const $class* $castingHelper(const Node* node) { ASSERT_WITH_SECURITY_IMPLICATION(!node || $checkHelper(node)); return reinterpret_cast<const ".$class."*>(node); }\n";
+        print F "inline const $class* $castingHelper(const Element* element) { ASSERT_WITH_SECURITY_IMPLICATION(!element || $checkHelper(element)); return reinterpret_cast<const ".$class."*>(element); }\n";
 
         print F "\n";
     }
index 86d4e82..b798517 100644 (file)
@@ -1229,7 +1229,7 @@ InspectorStyleSheet* InspectorCSSAgent::viaInspectorStyleSheet(Document* documen
         cssStyleSheet = toHTMLStyleElement(styleElement.get())->sheet();
 #if ENABLE(SVG)
     else if (styleElement->isSVGElement())
-        cssStyleSheet = static_cast<SVGStyleElement*>(styleElement.get())->sheet();
+        cssStyleSheet = toSVGStyleElement(styleElement.get())->sheet();
 #endif
 
     if (!cssStyleSheet)
index 4248af4..7273b04 100644 (file)
@@ -150,10 +150,10 @@ SVGFontElement* CachedFont::getSVGFontById(const String& fontName) const
 #endif
 
     if (fontName.isEmpty())
-        return static_cast<SVGFontElement*>(list->item(0));
+        return toSVGFontElement(list->item(0));
 
     for (unsigned i = 0; i < listLength; ++i) {
-        SVGFontElement* element = static_cast<SVGFontElement*>(list->item(i));
+        SVGFontElement* element = toSVGFontElement(list->item(i));
         if (element->getIdAttribute() == fontName)
             return element;
     }
index 27a243b..e21aede 100644 (file)
@@ -78,9 +78,9 @@ void RenderSVGEllipse::updateShapeFromElement()
 void RenderSVGEllipse::calculateRadiiAndCenter()
 {
     ASSERT(element());
-    if (element()->hasTagName(SVGNames::circleTag)) {
+    if (isSVGCircleElement(element())) {
 
-        SVGCircleElement* circle = static_cast<SVGCircleElement*>(element());
+        SVGCircleElement* circle = toSVGCircleElement(element());
 
         SVGLengthContext lengthContext(circle);
         float radius = circle->r().value(lengthContext);
@@ -89,8 +89,8 @@ void RenderSVGEllipse::calculateRadiiAndCenter()
         return;
     }
 
-    ASSERT(element()->hasTagName(SVGNames::ellipseTag));
-    SVGEllipseElement* ellipse = static_cast<SVGEllipseElement*>(element());
+    ASSERT(isSVGEllipseElement(element()));
+    SVGEllipseElement* ellipse = toSVGEllipseElement(element());
 
     SVGLengthContext lengthContext(ellipse);
     m_radii = FloatSize(ellipse->rx().value(lengthContext), ellipse->ry().value(lengthContext));
index db78354..aa72e58 100644 (file)
@@ -129,7 +129,7 @@ void RenderSVGForeignObject::layout()
     ASSERT(!view().layoutStateEnabled()); // RenderSVGRoot disables layoutState for the SVG rendering tree.
 
     LayoutRepainter repainter(*this, SVGRenderSupport::checkForSVGRepaintDuringLayout(this));
-    SVGForeignObjectElement* foreign = static_cast<SVGForeignObjectElement*>(element());
+    SVGForeignObjectElement* foreign = toSVGForeignObjectElement(element());
 
     bool updateCachedBoundariesInParents = false;
     if (m_needsTransformUpdate) {
index 6bfe740..1471003 100644 (file)
@@ -134,7 +134,7 @@ bool RenderSVGResourceClipper::pathOnlyClipping(GraphicsContext* context, const
             return false;
     }
     // Only one visible shape/path was found. Directly continue clipping and transform the content to userspace if necessary.
-    if (static_cast<SVGClipPathElement*>(element())->clipPathUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
+    if (toSVGClipPathElement(element())->clipPathUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
         AffineTransform transform;
         transform.translate(objectBoundingBox.x(), objectBoundingBox.y());
         transform.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.height());
@@ -159,7 +159,7 @@ bool RenderSVGResourceClipper::applyClippingToContext(RenderObject* object, cons
         m_clipper.set(object, new ClipperData);
 
     bool shouldCreateClipData = false;
-    AffineTransform animatedLocalTransform = static_cast<SVGClipPathElement*>(element())->animatedLocalTransform();
+    AffineTransform animatedLocalTransform = toSVGClipPathElement(element())->animatedLocalTransform();
     ClipperData* clipperData = m_clipper.get(object);
     if (!clipperData->clipMaskImage) {
         if (pathOnlyClipping(context, animatedLocalTransform, objectBoundingBox))
@@ -214,7 +214,7 @@ bool RenderSVGResourceClipper::drawContentIntoMaskImage(ClipperData* clipperData
     ASSERT(maskContext);
 
     AffineTransform maskContentTransformation;
-    SVGClipPathElement* clipPath = static_cast<SVGClipPathElement*>(element());
+    SVGClipPathElement* clipPath = toSVGClipPathElement(element());
     if (clipPath->clipPathUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
         maskContentTransformation.translate(objectBoundingBox.x(), objectBoundingBox.y());
         maskContentTransformation.scaleNonUniform(objectBoundingBox.width(), objectBoundingBox.height());
@@ -283,7 +283,7 @@ void RenderSVGResourceClipper::calculateClipContentRepaintRect()
              continue;
         m_clipBoundaries.unite(renderer->localToParentTransform().mapRect(renderer->repaintRectInLocalCoordinates()));
     }
-    m_clipBoundaries = static_cast<SVGClipPathElement*>(element())->animatedLocalTransform().mapRect(m_clipBoundaries);
+    m_clipBoundaries = toSVGClipPathElement(element())->animatedLocalTransform().mapRect(m_clipBoundaries);
 }
 
 bool RenderSVGResourceClipper::hitTestClipContent(const FloatRect& objectBoundingBox, const FloatPoint& nodeAtPoint)
@@ -292,7 +292,7 @@ bool RenderSVGResourceClipper::hitTestClipContent(const FloatRect& objectBoundin
     if (!SVGRenderSupport::pointInClippingArea(this, point))
         return false;
 
-    SVGClipPathElement* clipPathElement = static_cast<SVGClipPathElement*>(element());
+    SVGClipPathElement* clipPathElement = toSVGClipPathElement(element());
     if (clipPathElement->clipPathUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
         AffineTransform transform;
         transform.translate(objectBoundingBox.x(), objectBoundingBox.y());
@@ -326,7 +326,7 @@ FloatRect RenderSVGResourceClipper::resourceBoundingBox(RenderObject* object)
     if (m_clipBoundaries.isEmpty())
         calculateClipContentRepaintRect();
 
-    if (static_cast<SVGClipPathElement*>(element())->clipPathUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
+    if (toSVGClipPathElement(element())->clipPathUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) {
         FloatRect objectBoundingBox = object->objectBoundingBox();
         AffineTransform transform;
         transform.translate(objectBoundingBox.x(), objectBoundingBox.y());
index b2451ae..2277ba4 100644 (file)
@@ -62,7 +62,7 @@ public:
     
     bool hitTestClipContent(const FloatRect&, const FloatPoint&);
 
-    SVGUnitTypes::SVGUnitType clipPathUnits() const { return static_cast<SVGClipPathElement*>(element())->clipPathUnits(); }
+    SVGUnitTypes::SVGUnitType clipPathUnits() const { return toSVGClipPathElement(element())->clipPathUnits(); }
 
     static RenderSVGResourceType s_resourceType;
 private:
index d619cde..1e21e42 100644 (file)
@@ -47,12 +47,12 @@ bool RenderSVGResourceLinearGradient::collectGradientAttributes(SVGGradientEleme
 
 FloatPoint RenderSVGResourceLinearGradient::startPoint(const LinearGradientAttributes& attributes) const
 {
-    return SVGLengthContext::resolvePoint(static_cast<const SVGElement*>(element()), attributes.gradientUnits(), attributes.x1(), attributes.y1());
+    return SVGLengthContext::resolvePoint(element(), attributes.gradientUnits(), attributes.x1(), attributes.y1());
 }
 
 FloatPoint RenderSVGResourceLinearGradient::endPoint(const LinearGradientAttributes& attributes) const
 {
-    return SVGLengthContext::resolvePoint(static_cast<const SVGElement*>(element()), attributes.gradientUnits(), attributes.x2(), attributes.y2());
+    return SVGLengthContext::resolvePoint(element(), attributes.gradientUnits(), attributes.x2(), attributes.y2());
 }
 
 void RenderSVGResourceLinearGradient::buildGradient(GradientData* gradientData) const
index 9ce7fe2..c2a26ac 100644 (file)
@@ -354,7 +354,7 @@ void RenderSVGText::layout()
 
     bool updateCachedBoundariesInParents = false;
     if (m_needsTransformUpdate) {
-        SVGTextElement* text = static_cast<SVGTextElement*>(element());
+        SVGTextElement* text = toSVGTextElement(element());
         m_localTransform = text->animatedLocalTransform();
         m_needsTransformUpdate = false;
         updateCachedBoundariesInParents = true;
index 056ecdd..97b5deb 100644 (file)
@@ -37,8 +37,8 @@ namespace WebCore {
 
 static void updatePathFromCircleElement(SVGElement* element, Path& path)
 {
-    ASSERT(element->hasTagName(SVGNames::circleTag));
-    SVGCircleElement* circle = static_cast<SVGCircleElement*>(element);
+    ASSERT(isSVGCircleElement(element));
+    SVGCircleElement* circle = toSVGCircleElement(element);
 
     SVGLengthContext lengthContext(element);
     float r = circle->r().value(lengthContext);
index 61aa2ba..80a2628 100644 (file)
@@ -336,33 +336,33 @@ static TextStream& operator<<(TextStream& ts, const RenderSVGShape& shape)
     SVGElement* svgElement = shape.element();
     SVGLengthContext lengthContext(svgElement);
 
-    if (svgElement->hasTagName(SVGNames::rectTag)) {
+    if (isSVGRectElement(svgElement)) {
         SVGRectElement* element = toSVGRectElement(svgElement);
         writeNameValuePair(ts, "x", element->x().value(lengthContext));
         writeNameValuePair(ts, "y", element->y().value(lengthContext));
         writeNameValuePair(ts, "width", element->width().value(lengthContext));
         writeNameValuePair(ts, "height", element->height().value(lengthContext));
-    } else if (svgElement->hasTagName(SVGNames::lineTag)) {
-        SVGLineElement* element = static_cast<SVGLineElement*>(svgElement);
+    } else if (isSVGLineElement(svgElement)) {
+        SVGLineElement* element = toSVGLineElement(svgElement);
         writeNameValuePair(ts, "x1", element->x1().value(lengthContext));
         writeNameValuePair(ts, "y1", element->y1().value(lengthContext));
         writeNameValuePair(ts, "x2", element->x2().value(lengthContext));
         writeNameValuePair(ts, "y2", element->y2().value(lengthContext));
-    } else if (svgElement->hasTagName(SVGNames::ellipseTag)) {
-        SVGEllipseElement* element = static_cast<SVGEllipseElement*>(svgElement);
+    } else if (isSVGEllipseElement(svgElement)) {
+        SVGEllipseElement* element = toSVGEllipseElement(svgElement);
         writeNameValuePair(ts, "cx", element->cx().value(lengthContext));
         writeNameValuePair(ts, "cy", element->cy().value(lengthContext));
         writeNameValuePair(ts, "rx", element->rx().value(lengthContext));
         writeNameValuePair(ts, "ry", element->ry().value(lengthContext));
-    } else if (svgElement->hasTagName(SVGNames::circleTag)) {
-        SVGCircleElement* element = static_cast<SVGCircleElement*>(svgElement);
+    } else if (isSVGCircleElement(svgElement)) {
+        SVGCircleElement* element = toSVGCircleElement(svgElement);
         writeNameValuePair(ts, "cx", element->cx().value(lengthContext));
         writeNameValuePair(ts, "cy", element->cy().value(lengthContext));
         writeNameValuePair(ts, "r", element->r().value(lengthContext));
     } else if (svgElement->hasTagName(SVGNames::polygonTag) || svgElement->hasTagName(SVGNames::polylineTag)) {
-        SVGPolyElement* element = static_cast<SVGPolyElement*>(svgElement);
+        SVGPolyElement* element = toSVGPolyElement(svgElement);
         writeNameAndQuotedValue(ts, "points", element->pointList().valueAsString());
-    } else if (svgElement->hasTagName(SVGNames::pathTag)) {
+    } else if (isSVGPathElement(svgElement)) {
         SVGPathElement* element = toSVGPathElement(svgElement);
         String pathString;
         // FIXME: We should switch to UnalteredParsing here - this will affect the path dumping output of dozens of tests.
index 4c0a00a..d16a3a7 100644 (file)
@@ -89,11 +89,11 @@ bool SVGAltGlyphDefElement::hasValidGlyphElements(Vector<String>& glyphNames) co
     bool foundFirstAltGlyphItem = false;
 
     for (Node* child = firstChild(); child; child = child->nextSibling()) {
-        if (!foundFirstAltGlyphItem && child->hasTagName(SVGNames::glyphRefTag)) {
+        if (!foundFirstAltGlyphItem && isSVGGlyphRefElement(child)) {
             fountFirstGlyphRef = true;
             String referredGlyphName;
 
-            if (static_cast<SVGGlyphRefElement*>(child)->hasValidGlyphElement(referredGlyphName))
+            if (toSVGGlyphRefElement(child)->hasValidGlyphElement(referredGlyphName))
                 glyphNames.append(referredGlyphName);
             else {
                 // As the spec says "If any of the referenced glyphs are unavailable,
@@ -103,13 +103,12 @@ bool SVGAltGlyphDefElement::hasValidGlyphElements(Vector<String>& glyphNames) co
                 glyphNames.clear();
                 return false;
             }
-        } else if (!fountFirstGlyphRef && child->hasTagName(SVGNames::altGlyphItemTag)) {
+        } else if (!fountFirstGlyphRef && isSVGAltGlyphItemElement(child)) {
             foundFirstAltGlyphItem = true;
-            Vector<String> referredGlyphNames;
 
             // As the spec says "The first 'altGlyphItem' in which all referenced glyphs
             // are available is chosen."
-            if (static_cast<SVGAltGlyphItemElement*>(child)->hasValidGlyphElements(glyphNames) && !glyphNames.isEmpty())
+            if (toSVGAltGlyphItemElement(child)->hasValidGlyphElements(glyphNames) && !glyphNames.isEmpty())
                 return true;
         }
     }
index 7cf3339..f27ef83 100644 (file)
@@ -94,13 +94,13 @@ bool SVGAltGlyphElement::hasValidGlyphElements(Vector<String>& glyphNames) const
     if (!element)
         return false;
 
-    if (element->hasTagName(SVGNames::glyphTag)) {
+    if (isSVGGlyphElement(element)) {
         glyphNames.append(target);
         return true;
     }
 
-    if (element->hasTagName(SVGNames::altGlyphDefTag)
-        && static_cast<SVGAltGlyphDefElement*>(element)->hasValidGlyphElements(glyphNames))
+    if (isSVGAltGlyphDefElement(element)
+        && toSVGAltGlyphDefElement(element)->hasValidGlyphElements(glyphNames))
         return true;
 
     return false;
index cadbf5e..4fd24dc 100644 (file)
@@ -22,6 +22,7 @@
 #if ENABLE(SVG) && ENABLE(SVG_FONTS)
 #include "SVGAltGlyphItemElement.h"
 
+#include "ElementIterator.h"
 #include "SVGGlyphRefElement.h"
 #include "SVGNames.h"
 
@@ -48,15 +49,14 @@ bool SVGAltGlyphItemElement::hasValidGlyphElements(Vector<String>& glyphNames) c
     //
     // Here we fill glyphNames and return true only if all referenced glyphs are valid and
     // there is at least one glyph.
-    for (Node* child = firstChild(); child; child = child->nextSibling()) {
-        if (child->hasTagName(SVGNames::glyphRefTag)) {
-            String referredGlyphName;
-            if (static_cast<SVGGlyphRefElement*>(child)->hasValidGlyphElement(referredGlyphName))
-                glyphNames.append(referredGlyphName);
-            else {
-                glyphNames.clear();
-                return false;
-            }
+
+    for (auto glyphRef = childrenOfType<SVGGlyphRefElement>(this).begin(), end = childrenOfType<SVGGlyphRefElement>(this).end(); glyphRef != end; ++glyphRef) {
+        String referredGlyphName;
+        if (glyphRef->hasValidGlyphElement(referredGlyphName))
+            glyphNames.append(referredGlyphName);
+        else {
+            glyphNames.clear();
+            return false;
         }
     }
     return !glyphNames.isEmpty();
index 72c0e8e..8cbbdb6 100644 (file)
@@ -35,7 +35,7 @@ namespace WebCore {
 
 SVGAnimatedTransformListAnimator::SVGAnimatedTransformListAnimator(SVGAnimationElement* animationElement, SVGElement* contextElement)
     : SVGAnimatedTypeAnimator(AnimatedTransformList, animationElement, contextElement)
-    , m_transformTypeString(SVGTransform::transformTypePrefixForParsing(static_cast<SVGAnimateTransformElement*>(animationElement)->transformType()))
+    , m_transformTypeString(SVGTransform::transformTypePrefixForParsing(toSVGAnimateTransformElement(animationElement)->transformType()))
 {
     // Only <animateTransform> uses this animator, as <animate> doesn't allow to animate transform lists directly.
     ASSERT(animationElement->hasTagName(SVGNames::animateTransformTag));
index 60dbcb3..09efc66 100644 (file)
@@ -95,7 +95,7 @@ void SVGDocument::updatePan(const FloatPoint& pos) const
 
 bool SVGDocument::childShouldCreateRenderer(const Node* child) const
 {
-    if (child->hasTagName(SVGNames::svgTag))
+    if (isSVGSVGElement(child))
         return toSVGSVGElement(child)->isValid();
     return true;
 }
index 2cb17f3..f33f12a 100644 (file)
@@ -220,7 +220,7 @@ SVGElementRareData& SVGElement::ensureSVGRareData()
 
 bool SVGElement::isOutermostSVGSVGElement() const
 {
-    if (!hasTagName(SVGNames::svgTag))
+    if (!isSVGSVGElement(this))
         return false;
 
     // If we're living in a shadow tree, we're a <svg> element that got created as replacement
index f649746..e6b98c4 100644 (file)
@@ -77,7 +77,6 @@ public:
     SVGDocumentExtensions* accessDocumentSVGExtensions();
 
     virtual bool isSVGGraphicsElement() const { return false; }
-    virtual bool isSVGSVGElement() const { return false; }
     virtual bool isFilterEffect() const { return false; }
     virtual bool isGradientStop() const { return false; }
     virtual bool isTextContent() const { return false; }
index 8a4b6f9..ffa757c 100644 (file)
@@ -24,6 +24,7 @@
 #include "SVGFEComponentTransferElement.h"
 
 #include "Attr.h"
+#include "ElementIterator.h"
 #include "FilterEffect.h"
 #include "SVGFEFuncAElement.h"
 #include "SVGFEFuncBElement.h"
@@ -88,16 +89,17 @@ PassRefPtr<FilterEffect> SVGFEComponentTransferElement::build(SVGFilterBuilder*
     ComponentTransferFunction green;
     ComponentTransferFunction blue;
     ComponentTransferFunction alpha;
-    
-    for (Node* node = firstChild(); node; node = node->nextSibling()) {
-        if (node->hasTagName(SVGNames::feFuncRTag))
-            red = static_cast<SVGFEFuncRElement*>(node)->transferFunction();
-        else if (node->hasTagName(SVGNames::feFuncGTag))
-            green = static_cast<SVGFEFuncGElement*>(node)->transferFunction();
-        else if (node->hasTagName(SVGNames::feFuncBTag))
-            blue = static_cast<SVGFEFuncBElement*>(node)->transferFunction();
-        else if (node->hasTagName(SVGNames::feFuncATag))
-            alpha = static_cast<SVGFEFuncAElement*>(node)->transferFunction();
+
+    for (auto child = childrenOfType<SVGElement>(this).begin(), end = childrenOfType<SVGElement>(this).end(); child != end; ++child) {
+        SVGElement* element = &*child;
+        if (isSVGFEFuncRElement(element))
+            red = toSVGFEFuncRElement(element)->transferFunction();
+        else if (isSVGFEFuncGElement(element))
+            green = toSVGFEFuncGElement(element)->transferFunction();
+        else if (isSVGFEFuncBElement(element))
+            blue = toSVGFEFuncBElement(element)->transferFunction();
+        else if (isSVGFEFuncAElement(element))
+            alpha = toSVGFEFuncAElement(element)->transferFunction();
     }
     
     RefPtr<FilterEffect> effect = FEComponentTransfer::create(filter, red, green, blue, alpha);
index 298d56c..4161912 100644 (file)
@@ -25,6 +25,7 @@
 #include "SVGFELightElement.h"
 
 #include "Attribute.h"
+#include "ElementIterator.h"
 #include "RenderObject.h"
 #include "RenderSVGResource.h"
 #include "SVGElementInstance.h"
@@ -70,12 +71,9 @@ SVGFELightElement::SVGFELightElement(const QualifiedName& tagName, Document* doc
 
 SVGFELightElement* SVGFELightElement::findLightElement(const SVGElement* svgElement)
 {
-    for (Node* node = svgElement->firstChild(); node; node = node->nextSibling()) {
-        if (node->hasTagName(SVGNames::feDistantLightTag)
-            || node->hasTagName(SVGNames::fePointLightTag)
-            || node->hasTagName(SVGNames::feSpotLightTag)) {
-            return static_cast<SVGFELightElement*>(node);
-        }
+    for (auto child = childrenOfType<SVGElement>(svgElement).begin(), end = childrenOfType<SVGElement>(svgElement).end(); child != end; ++child) {
+        if (isSVGFEDistantLightElement(*child) || isSVGFEPointLightElement(*child) || isSVGFESpotLightElement(*child))
+            return static_cast<SVGFELightElement*>(const_cast<SVGElement*>(&*child));
     }
     return 0;
 }
index 9da262b..d97b7c0 100644 (file)
@@ -23,6 +23,7 @@
 #if ENABLE(SVG) && ENABLE(FILTERS)
 #include "SVGFEMergeElement.h"
 
+#include "ElementIterator.h"
 #include "FilterEffect.h"
 #include "SVGFEMergeNodeElement.h"
 #include "SVGFilterBuilder.h"
@@ -45,13 +46,12 @@ PassRefPtr<FilterEffect> SVGFEMergeElement::build(SVGFilterBuilder* filterBuilde
 {
     RefPtr<FilterEffect> effect = FEMerge::create(filter);
     FilterEffectVector& mergeInputs = effect->inputEffects();
-    for (Node* node = firstChild(); node; node = node->nextSibling()) {
-        if (node->hasTagName(SVGNames::feMergeNodeTag)) {
-            FilterEffect* mergeEffect = filterBuilder->getEffectById(static_cast<SVGFEMergeNodeElement*>(node)->in1());
-            if (!mergeEffect)
-                return 0;
-            mergeInputs.append(mergeEffect);
-        }
+
+    for (auto mergeNode = childrenOfType<SVGFEMergeNodeElement>(this).begin(), end = childrenOfType<SVGFEMergeNodeElement>(this).end(); mergeNode != end; ++mergeNode) {
+        FilterEffect* mergeEffect = filterBuilder->getEffectById(mergeNode->in1());
+        if (!mergeEffect)
+            return 0;
+        mergeInputs.append(mergeEffect);
     }
 
     if (mergeInputs.isEmpty())
index 86f2bbf..cd774bd 100644 (file)
@@ -76,12 +76,6 @@ private:
     END_DECLARE_ANIMATED_PROPERTIES
 };
 
-inline SVGFilterElement* toSVGFilterElement(Node* node)
-{
-    ASSERT_WITH_SECURITY_IMPLICATION(!node || node->hasTagName(SVGNames::filterTag));
-    return static_cast<SVGFilterElement*>(node);
-}
-
 }
 
 #endif
index 78ca7e2..1a408c0 100644 (file)
@@ -173,8 +173,8 @@ bool SVGFontData::applySVGGlyphSelection(WidthIterator& iterator, GlyphData& gly
         if (Element* parentRenderObjectElement = toElement(parentRenderObject->node())) {
             language = parentRenderObjectElement->getAttribute(XMLNames::langAttr);
 
-            if (parentRenderObjectElement->hasTagName(SVGNames::altGlyphTag)) {
-                SVGAltGlyphElement* altGlyph = static_cast<SVGAltGlyphElement*>(parentRenderObjectElement);
+            if (isSVGAltGlyphElement(parentRenderObjectElement)) {
+                SVGAltGlyphElement* altGlyph = toSVGAltGlyphElement(parentRenderObjectElement);
                 if (!altGlyph->hasValidGlyphElements(altGlyphNames))
                     altGlyphNames.clear();
             }
index cb64387..d56796e 100644 (file)
@@ -25,6 +25,7 @@
 #include "SVGFontElement.h"
 
 #include "Document.h"
+#include "ElementIterator.h"
 #include "Font.h"
 #include "GlyphPageTreeNode.h"
 #include "SVGGlyphElement.h"
@@ -122,9 +123,10 @@ void SVGFontElement::ensureGlyphCache()
 
     SVGMissingGlyphElement* firstMissingGlyphElement = 0;
     Vector<String> ligatures;
-    for (Node* child = firstChild(); child; child = child->nextSibling()) {
-        if (child->hasTagName(SVGNames::glyphTag)) {
-            SVGGlyphElement* glyph = static_cast<SVGGlyphElement*>(child);
+    for (auto child = childrenOfType<SVGElement>(this).begin(), end = childrenOfType<SVGElement>(this).end(); child != end; ++child) {
+        SVGElement* element = &*child;
+        if (isSVGGlyphElement(element)) {
+            SVGGlyphElement* glyph = toSVGGlyphElement(element);
             AtomicString unicode = glyph->fastGetAttribute(SVGNames::unicodeAttr);
             AtomicString glyphId = glyph->getIdAttribute();
             if (glyphId.isEmpty() && unicode.isEmpty())
@@ -135,14 +137,14 @@ void SVGFontElement::ensureGlyphCache()
             // Register ligatures, if needed, don't mix up with surrogate pairs though!
             if (unicode.length() > 1 && !U16_IS_SURROGATE(unicode[0]))
                 ligatures.append(unicode.string());
-        } else if (child->hasTagName(SVGNames::hkernTag)) {
-            SVGHKernElement* hkern = static_cast<SVGHKernElement*>(child);
+        } else if (isSVGHKernElement(element)) {
+            SVGHKernElement* hkern = toSVGHKernElement(element);
             hkern->buildHorizontalKerningPair(m_horizontalKerningPairs);
-        } else if (child->hasTagName(SVGNames::vkernTag)) {
-            SVGVKernElement* vkern = static_cast<SVGVKernElement*>(child);
+        } else if (isSVGVKernElement(element)) {
+            SVGVKernElement* vkern = toSVGVKernElement(element);
             vkern->buildVerticalKerningPair(m_verticalKerningPairs);
-        } else if (child->hasTagName(SVGNames::missing_glyphTag) && !firstMissingGlyphElement)
-            firstMissingGlyphElement = toSVGMissingGlyphElement(child);
+        } else if (isSVGMissingGlyphElement(element) && !firstMissingGlyphElement)
+            firstMissingGlyphElement = toSVGMissingGlyphElement(element);
     }
 
     // Register each character of each ligature, if needed.
index f38e4fa..d24ec64 100644 (file)
@@ -32,6 +32,7 @@
 #include "CSSValueKeywords.h"
 #include "CSSValueList.h"
 #include "Document.h"
+#include "ElementIterator.h"
 #include "Font.h"
 #include "SVGDocumentExtensions.h"
 #include "SVGFontElement.h"
@@ -228,11 +229,9 @@ void SVGFontFaceElement::rebuildFontFace()
 
     // we currently ignore all but the first src element, alternatively we could concat them
     SVGFontFaceSrcElement* srcElement = 0;
-
-    for (Node* child = firstChild(); child && !srcElement; child = child->nextSibling()) {
-        if (child->hasTagName(font_face_srcTag))
-            srcElement = static_cast<SVGFontFaceSrcElement*>(child);
-    }
+    auto firstFontFaceSrcElementChild = childrenOfType<SVGFontFaceSrcElement>(this).begin();
+    if (firstFontFaceSrcElementChild != childrenOfType<SVGFontFaceSrcElement>(this).end())
+        srcElement = &*firstFontFaceSrcElementChild;
 
     bool describesParentFont = isSVGFontElement(parentNode());
     RefPtr<CSSValueList> list;
index 94a92ff..a84aeaf 100644 (file)
@@ -49,10 +49,10 @@ PassRefPtr<CSSValueList> SVGFontFaceSrcElement::srcValue() const
     RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
     for (Node* child = firstChild(); child; child = child->nextSibling()) {
         RefPtr<CSSFontFaceSrcValue> srcValue;
-        if (child->hasTagName(font_face_uriTag))
-            srcValue = static_cast<SVGFontFaceUriElement*>(child)->srcValue();
-        else if (child->hasTagName(font_face_nameTag))
-            srcValue = static_cast<SVGFontFaceNameElement*>(child)->srcValue();
+        if (isSVGFontFaceUriElement(child))
+            srcValue = toSVGFontFaceUriElement(child)->srcValue();
+        else if (isSVGFontFaceNameElement(child))
+            srcValue = toSVGFontFaceNameElement(child)->srcValue();
         if (srcValue && srcValue->resource().length())
             list->append(srcValue);
     }
index e984901..d79001a 100644 (file)
@@ -299,10 +299,10 @@ bool SVGLengthContext::determineViewport(float& width, float& height) const
 
     // Take size from nearest viewport element.
     SVGElement* viewportElement = m_context->viewportElement();
-    if (!viewportElement || !viewportElement->isSVGSVGElement())
+    if (!viewportElement || !isSVGSVGElement(viewportElement))
         return false;
     
-    const SVGSVGElement* svg = static_cast<const SVGSVGElement*>(viewportElement);
+    const SVGSVGElement* svg = toSVGSVGElement(viewportElement);
     FloatSize viewportSize = svg->currentViewBoxRect().size();
     if (viewportSize.isEmpty())
         viewportSize = svg->currentViewportSize();
index f7e43ba..7c42137 100644 (file)
@@ -55,12 +55,6 @@ private:
     END_DECLARE_ANIMATED_PROPERTIES
 };
 
-inline SVGLinearGradientElement* toSVGLinearGradientElement(Node* node)
-{
-    ASSERT_WITH_SECURITY_IMPLICATION(!node || node->hasTagName(SVGNames::linearGradientTag));
-    return static_cast<SVGLinearGradientElement*>(node);
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index 71417fc..271f6c1 100644 (file)
@@ -164,8 +164,8 @@ void SVGMPathElement::targetPathChanged()
 
 void SVGMPathElement::notifyParentOfPathChange(ContainerNode* parent)
 {
-    if (parent && parent->hasTagName(SVGNames::animateMotionTag))
-        static_cast<SVGAnimateMotionElement*>(parent)->updateAnimationPath();
+    if (parent && isSVGAnimateMotionElement(parent))
+        toSVGAnimateMotionElement(parent)->updateAnimationPath();
 }
 
 } // namespace WebCore
index 654cfde..159ed39 100644 (file)
@@ -66,12 +66,6 @@ private:
     END_DECLARE_ANIMATED_PROPERTIES
 };
 
-inline SVGMPathElement* toSVGMPathElement(Node* node)
-{
-    ASSERT_WITH_SECURITY_IMPLICATION(!node || node->hasTagName(SVGNames::mpathTag));
-    return static_cast<SVGMPathElement*>(node);
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index 9acd16b..6ff04a2 100644 (file)
@@ -165,12 +165,6 @@ private:
     mutable SVGSynchronizableAnimatedProperty<SVGMarkerOrientType> m_orientType;
 };
 
-inline SVGMarkerElement* toSVGMarkerElement(Node* node)
-{
-    ASSERT_WITH_SECURITY_IMPLICATION(!node || node->hasTagName(SVGNames::markerTag));
-    return static_cast<SVGMarkerElement*>(node);
-}
-
 }
 
 #endif
index f35e276..5e786dc 100644 (file)
@@ -69,12 +69,6 @@ private:
     virtual void synchronizeSystemLanguage() { SVGTests::synchronizeSystemLanguage(this); }
 };
 
-inline SVGMaskElement* toSVGMaskElement(Node* node)
-{
-    ASSERT_WITH_SECURITY_IMPLICATION(!node || node->hasTagName(SVGNames::maskTag));
-    return static_cast<SVGMaskElement*>(node);
-}
-
 }
 
 #endif
index b71b78d..a44d846 100644 (file)
@@ -36,12 +36,6 @@ private:
     virtual bool rendererIsNeeded(const RenderStyle&) { return false; }
 };
 
-inline SVGMissingGlyphElement* toSVGMissingGlyphElement(Node* node)
-{
-    ASSERT_WITH_SECURITY_IMPLICATION(!node || node->hasTagName(SVGNames::missing_glyphTag));
-    return static_cast<SVGMissingGlyphElement*>(node);
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(SVG_FONTS)
index c81ead1..5e1f3fa 100644 (file)
@@ -131,12 +131,6 @@ private:
     bool m_isAnimValObserved;
 };
 
-inline SVGPathElement* toSVGPathElement(Element* element)
-{
-    ASSERT_WITH_SECURITY_IMPLICATION(!element || element->hasTagName(SVGNames::pathTag));
-    return static_cast<SVGPathElement*>(element);
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index aa4a4cf..61bc084 100644 (file)
@@ -229,9 +229,9 @@ void SVGPatternElement::collectPatternAttributes(PatternAttributes& attributes)
         processedPatterns.add(current);
 
         // Respect xlink:href, take attributes from referenced element
-        Node* refNode = SVGURIReference::targetElementFromIRIString(current->href(), &document());
-        if (refNode && refNode->hasTagName(SVGNames::patternTag)) {
-            current = static_cast<const SVGPatternElement*>(const_cast<const Node*>(refNode));
+        Element* refElement = SVGURIReference::targetElementFromIRIString(current->href(), &document());
+        if (refElement && isSVGPatternElement(refElement)) {
+            current = toSVGPatternElement(refElement);
 
             // Cycle detection
             if (processedPatterns.contains(current)) {
index 1c1596a..c567fb8 100644 (file)
@@ -87,12 +87,6 @@ private:
     virtual void synchronizeSystemLanguage() { SVGTests::synchronizeSystemLanguage(this); }
 };
 
-inline SVGPatternElement* toSVGPatternElement(Node* node)
-{
-    ASSERT_WITH_SECURITY_IMPLICATION(!node || node->hasTagName(SVGNames::patternTag));
-    return static_cast<SVGPatternElement*>(node);
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index ae1dedf..6903e49 100644 (file)
@@ -57,12 +57,6 @@ private:
     END_DECLARE_ANIMATED_PROPERTIES
 };
 
-inline SVGRadialGradientElement* toSVGRadialGradientElement(Node* node)
-{
-    ASSERT_WITH_SECURITY_IMPLICATION(!node || node->hasTagName(SVGNames::radialGradientTag));
-    return static_cast<SVGRadialGradientElement*>(node);
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index b9f9e49..9d801ae 100644 (file)
@@ -60,12 +60,6 @@ private:
     END_DECLARE_ANIMATED_PROPERTIES
 };
 
-inline SVGRectElement* toSVGRectElement(Node* node)
-{
-    ASSERT_WITH_SECURITY_IMPLICATION(!node || node->hasTagName(SVGNames::rectTag));
-    return static_cast<SVGRectElement*>(node);
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index 5ff372c..5929729 100644 (file)
@@ -718,8 +718,8 @@ void SVGSVGElement::setupInitialView(const String& fragmentIdentifier, Element*
     // or MyDrawing.svg#xpointer(id('MyView'))) then the closest ancestor ‘svg’ element is displayed in the viewport.
     // Any view specification attributes included on the given ‘view’ element override the corresponding view specification
     // attributes on the closest ancestor ‘svg’ element.
-    if (anchorNode && anchorNode->hasTagName(SVGNames::viewTag)) {
-        if (SVGViewElement* viewElement = anchorNode->hasTagName(SVGNames::viewTag) ? static_cast<SVGViewElement*>(anchorNode) : 0) {
+    if (anchorNode && isSVGViewElement(anchorNode)) {
+        if (SVGViewElement* viewElement = toSVGViewElement(anchorNode)) {
             SVGElement* element = SVGLocatable::nearestViewportElement(viewElement);
             if (element->hasTagName(SVGNames::svgTag)) {
                 SVGSVGElement* svg = static_cast<SVGSVGElement*>(element);
index 544a2ef..9de8f54 100644 (file)
@@ -140,8 +140,6 @@ private:
     SVGSVGElement(const QualifiedName&, Document*);
     virtual ~SVGSVGElement();
 
-    virtual bool isSVGSVGElement() const OVERRIDE { return true; }
-    
     virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
 
     virtual bool rendererIsNeeded(const RenderStyle&) OVERRIDE;
@@ -185,20 +183,6 @@ private:
     RefPtr<SVGViewSpec> m_viewSpec;
 };
 
-inline SVGSVGElement* toSVGSVGElement(Node* node)
-{
-    ASSERT_WITH_SECURITY_IMPLICATION(!node || node->isSVGElement());
-    ASSERT_WITH_SECURITY_IMPLICATION(!node || toSVGElement(node)->isSVGSVGElement());
-    return static_cast<SVGSVGElement*>(node);
-}
-
-inline const SVGSVGElement* toSVGSVGElement(const Node* node)
-{
-    ASSERT_WITH_SECURITY_IMPLICATION(!node || node->isSVGElement());
-    ASSERT_WITH_SECURITY_IMPLICATION(!node || toSVGElement(node)->isSVGSVGElement());
-    return static_cast<const SVGSVGElement*>(node);
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index b29f6e9..8f58b24 100644 (file)
@@ -141,12 +141,6 @@ private:
     END_DECLARE_ANIMATED_PROPERTIES
 };
 
-inline SVGTextPathElement* toSVGTextPathElement(Node* node)
-{
-    ASSERT_WITH_SECURITY_IMPLICATION(!node || node->hasTagName(SVGNames::textPathTag));
-    return static_cast<SVGTextPathElement*>(node);
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index a49ad9d..5d0c9e3 100644 (file)
@@ -41,8 +41,6 @@ private:
     virtual bool rendererIsNeeded(const RenderStyle&) { return false; }
 };
 
-template <> inline bool isElementOfType<SVGTitleElement>(const Element* element) { return element->hasTagName(SVGNames::titleTag); }
-
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index 5e1dabd..f435e6e 100644 (file)
@@ -128,12 +128,6 @@ private:
     Timer<SVGElement> m_svgLoadEventTimer;
 };
 
-inline SVGUseElement* toSVGUseElement(Node* node)
-{
-    ASSERT_WITH_SECURITY_IMPLICATION(!node || node->hasTagName(SVGNames::useTag));
-    return static_cast<SVGUseElement*>(node);
-}
-
 }
 
 #endif
index bc940db..32b6184 100644 (file)
@@ -6,24 +6,24 @@ fallbackJSInterfaceName="SVGElement"
 
 a
 #if ENABLE_SVG_FONTS
-altGlyph
-altGlyphDef
-altGlyphItem
+altGlyph generateTypeHelpers
+altGlyphDef generateTypeHelpers
+altGlyphItem generateTypeHelpers
 #endif
 animate
 animateColor
-animateMotion
-animateTransform
+animateMotion generateTypeHelpers
+animateTransform generateTypeHelpers
 set
-circle
-clipPath
+circle generateTypeHelpers
+clipPath generateTypeHelpers
 #if 0
 color_profile
 #endif
-cursor
+cursor generateTypeHelpers
 defs
 desc
-ellipse
+ellipse generateTypeHelpers
 #if ENABLE_FILTERS
 feBlend
 feColorMatrix
@@ -32,70 +32,70 @@ feComposite
 feConvolveMatrix
 feDiffuseLighting
 feDisplacementMap
-feDistantLight
+feDistantLight generateTypeHelpers
 feDropShadow
 feFlood
-feFuncA
-feFuncB
-feFuncG
-feFuncR
+feFuncA generateTypeHelpers
+feFuncB generateTypeHelpers
+feFuncG generateTypeHelpers
+feFuncR generateTypeHelpers
 feGaussianBlur
 feImage
 feMerge
-feMergeNode
+feMergeNode generateTypeHelpers
 feMorphology
 feOffset
-fePointLight
+fePointLight generateTypeHelpers
 feSpecularLighting
-feSpotLight
+feSpotLight generateTypeHelpers
 feTile
 feTurbulence
-filter
+filter generateTypeHelpers
 #endif
 #if ENABLE_SVG_FONTS
 font generateTypeHelpers
 font_face generateTypeHelpers
 font_face_format
-font_face_name
-font_face_src
-font_face_uri
+font_face_name generateTypeHelpers
+font_face_src generateTypeHelpers
+font_face_uri generateTypeHelpers
 #endif
 foreignObject generateTypeHelpers
 g
 #if ENABLE_SVG_FONTS
-glyph
-glyphRef
-hkern interfaceName=SVGHKernElement
+glyph generateTypeHelpers
+glyphRef generateTypeHelpers
+hkern interfaceName=SVGHKernElement, generateTypeHelpers
 #endif
 image generateTypeHelpers
-line
-linearGradient
-marker
-mask
+line generateTypeHelpers
+linearGradient generateTypeHelpers
+marker generateTypeHelpers
+mask generateTypeHelpers
 metadata
 #if ENABLE_SVG_FONTS
-missing_glyph
+missing_glyph generateTypeHelpers
 #endif
-mpath interfaceName=SVGMPathElement
-path
-pattern
+mpath interfaceName=SVGMPathElement, generateTypeHelpers
+path generateTypeHelpers
+pattern generateTypeHelpers
 polygon
 polyline
-radialGradient
-rect
+radialGradient generateTypeHelpers
+rect generateTypeHelpers
 script constructorNeedsCreatedByParser, generateTypeHelpers
 stop
-style constructorNeedsCreatedByParser
-svg interfaceName=SVGSVGElement
+style constructorNeedsCreatedByParser, generateTypeHelpers
+svg interfaceName=SVGSVGElement, generateTypeHelpers
 switch
 symbol
-text
-textPath
-title
+text generateTypeHelpers
+textPath generateTypeHelpers
+title generateTypeHelpers
 tref interfaceName=SVGTRefElement
 tspan interfaceName=SVGTSpanElement
-use constructorNeedsCreatedByParser
-view
+use constructorNeedsCreatedByParser, generateTypeHelpers
+view generateTypeHelpers
 #if ENABLE_SVG_FONTS
-vkern interfaceName=SVGVKernElement
+vkern interfaceName=SVGVKernElement, generateTypeHelpers
 #endif