| Index: Source/core/svg/SVGFontElement.cpp
 | 
| diff --git a/Source/core/svg/SVGFontElement.cpp b/Source/core/svg/SVGFontElement.cpp
 | 
| index 862526d5cdd35b67e8cf528895af9dbdeabbfee7..17fbfefb8bcbf85015f1a2f5e5ff4613587bc5f1 100644
 | 
| --- a/Source/core/svg/SVGFontElement.cpp
 | 
| +++ b/Source/core/svg/SVGFontElement.cpp
 | 
| @@ -24,6 +24,7 @@
 | 
|  #if ENABLE(SVG_FONTS)
 | 
|  #include "core/svg/SVGFontElement.h"
 | 
|  
 | 
| +#include "core/dom/ElementTraversal.h"
 | 
|  #include "core/frame/UseCounter.h"
 | 
|  #include "core/svg/SVGGlyphElement.h"
 | 
|  #include "core/svg/SVGHKernElement.h"
 | 
| @@ -60,12 +61,7 @@ void SVGFontElement::invalidateGlyphCache()
 | 
|  
 | 
|  SVGMissingGlyphElement* SVGFontElement::firstMissingGlyphElement() const
 | 
|  {
 | 
| -    for (Node* child = firstChild(); child; child = child->nextSibling()) {
 | 
| -        if (child->hasTagName(SVGNames::missing_glyphTag))
 | 
| -            return toSVGMissingGlyphElement(child);
 | 
| -    }
 | 
| -
 | 
| -    return 0;
 | 
| +    return Traversal<SVGMissingGlyphElement>::firstChild(*this);
 | 
|  }
 | 
|  
 | 
|  void SVGFontElement::registerLigaturesInGlyphCache(Vector<String>& ligatures)
 | 
| @@ -169,25 +165,25 @@ void SVGFontElement::ensureGlyphCache()
 | 
|  
 | 
|      SVGMissingGlyphElement* firstMissingGlyphElement = 0;
 | 
|      Vector<String> ligatures;
 | 
| -    for (Node* child = firstChild(); child; child = child->nextSibling()) {
 | 
| -        if (child->hasTagName(SVGNames::glyphTag)) {
 | 
| -            SVGGlyphElement* glyph = toSVGGlyphElement(child);
 | 
| -            AtomicString unicode = glyph->fastGetAttribute(SVGNames::unicodeAttr);
 | 
| -            AtomicString glyphId = glyph->getIdAttribute();
 | 
| +    for (SVGElement* element = Traversal<SVGElement>::firstChild(*this); element; element = Traversal<SVGElement>::nextSibling(*element)) {
 | 
| +        if (isSVGGlyphElement(*element)) {
 | 
| +            SVGGlyphElement& glyph = toSVGGlyphElement(*element);
 | 
| +            AtomicString unicode = glyph.fastGetAttribute(SVGNames::unicodeAttr);
 | 
| +            AtomicString glyphId = glyph.getIdAttribute();
 | 
|              if (glyphId.isEmpty() && unicode.isEmpty())
 | 
|                  continue;
 | 
|  
 | 
| -            m_glyphMap.addGlyph(glyphId, unicode, glyph->buildGlyphIdentifier());
 | 
| +            m_glyphMap.addGlyph(glyphId, unicode, glyph.buildGlyphIdentifier());
 | 
|  
 | 
|              // 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)) {
 | 
| -            toSVGHKernElement(child)->buildHorizontalKerningPair(horizontalKerningPairs);
 | 
| -        } else if (child->hasTagName(SVGNames::vkernTag)) {
 | 
| -            toSVGVKernElement(child)->buildVerticalKerningPair(verticalKerningPairs);
 | 
| -        } else if (child->hasTagName(SVGNames::missing_glyphTag) && !firstMissingGlyphElement) {
 | 
| -            firstMissingGlyphElement = toSVGMissingGlyphElement(child);
 | 
| +        } else if (isSVGHKernElement(*element)) {
 | 
| +            toSVGHKernElement(*element).buildHorizontalKerningPair(horizontalKerningPairs);
 | 
| +        } else if (isSVGVKernElement(*element)) {
 | 
| +            toSVGVKernElement(*element).buildVerticalKerningPair(verticalKerningPairs);
 | 
| +        } else if (isSVGMissingGlyphElement(*element) && !firstMissingGlyphElement) {
 | 
| +            firstMissingGlyphElement = toSVGMissingGlyphElement(element);
 | 
|          }
 | 
|      }
 | 
|  
 | 
| 
 |