Element iterator functions should take reference
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 24 Oct 2013 13:26:06 +0000 (13:26 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 24 Oct 2013 13:26:06 +0000 (13:26 +0000)
https://bugs.webkit.org/show_bug.cgi?id=123267

Reviewed by Andreas Kling.

The argument has to be non-null.

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

49 files changed:
Source/WebCore/ChangeLog
Source/WebCore/accessibility/AccessibilityNodeObject.cpp
Source/WebCore/accessibility/AccessibilityRenderObject.cpp
Source/WebCore/accessibility/AccessibilityTable.cpp
Source/WebCore/accessibility/mac/AccessibilityObjectMac.mm
Source/WebCore/css/CSSFontFaceSource.cpp
Source/WebCore/css/StyleInvalidationAnalysis.cpp
Source/WebCore/css/StyleInvalidationAnalysis.h
Source/WebCore/dom/Document.cpp
Source/WebCore/dom/DocumentStyleSheetCollection.cpp
Source/WebCore/dom/ElementAncestorIterator.h
Source/WebCore/dom/ElementChildIterator.h
Source/WebCore/dom/ElementDescendantIterator.h
Source/WebCore/dom/SelectorQuery.cpp
Source/WebCore/dom/TreeScope.cpp
Source/WebCore/editing/ApplyStyleCommand.cpp
Source/WebCore/editing/ReplaceSelectionCommand.cpp
Source/WebCore/editing/markup.cpp
Source/WebCore/html/HTMLAppletElement.cpp
Source/WebCore/html/HTMLElement.cpp
Source/WebCore/html/HTMLFieldSetElement.cpp
Source/WebCore/html/HTMLFrameSetElement.cpp
Source/WebCore/html/HTMLLabelElement.cpp
Source/WebCore/html/HTMLLegendElement.cpp
Source/WebCore/html/HTMLMapElement.cpp
Source/WebCore/html/HTMLMediaElement.cpp
Source/WebCore/html/HTMLObjectElement.cpp
Source/WebCore/loader/PlaceholderDocument.cpp
Source/WebCore/rendering/FilterEffectRenderer.cpp
Source/WebCore/rendering/svg/RenderSVGResourceClipper.cpp
Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp
Source/WebCore/rendering/svg/RenderSVGResourceMasker.cpp
Source/WebCore/rendering/svg/RenderSVGResourcePattern.cpp
Source/WebCore/svg/SVGAltGlyphDefElement.cpp
Source/WebCore/svg/SVGAltGlyphItemElement.cpp
Source/WebCore/svg/SVGAnimateMotionElement.cpp
Source/WebCore/svg/SVGElement.cpp
Source/WebCore/svg/SVGFEComponentTransferElement.cpp
Source/WebCore/svg/SVGFELightElement.cpp
Source/WebCore/svg/SVGFEMergeElement.cpp
Source/WebCore/svg/SVGFontElement.cpp
Source/WebCore/svg/SVGFontFaceElement.cpp
Source/WebCore/svg/SVGFontFaceSrcElement.cpp
Source/WebCore/svg/SVGGradientElement.cpp
Source/WebCore/svg/SVGSVGElement.cpp
Source/WebCore/svg/SVGSwitchElement.cpp
Source/WebCore/svg/SVGUseElement.cpp
Source/WebCore/svg/animation/SMILTimeContainer.cpp
Source/WebCore/svg/graphics/SVGImage.cpp

index c46df82..5d5cf37 100644 (file)
@@ -1,3 +1,12 @@
+2013-10-24  Antti Koivisto  <antti@apple.com>
+
+        Element iterator functions should take reference
+        https://bugs.webkit.org/show_bug.cgi?id=123267
+
+        Reviewed by Andreas Kling.
+
+        The argument has to be non-null.
+
 2013-10-24  Ryuan Choi  <ryuan.choi@samsung.com>
 
         [EFL] Build break with latest EFL 1.8 libraries.
index b4a6a09..1b38cbb 100644 (file)
@@ -398,7 +398,7 @@ bool AccessibilityNodeObject::canHaveChildren() const
         return false;
     case LegendRole:
         if (Element* element = this->element())
-            return !ancestorsOfType<HTMLFieldSetElement>(element).first();
+            return !ancestorsOfType<HTMLFieldSetElement>(*element).first();
     default:
         return true;
     }
@@ -424,7 +424,7 @@ bool AccessibilityNodeObject::canvasHasFallbackContent() const
     Node* node = this->node();
     if (!node || !node->hasTagName(canvasTag))
         return false;
-    Element* canvasElement = toElement(node);
+    Element& canvasElement = toElement(*node);
     // If it has any children that are elements, we'll assume it might be fallback
     // content. If it has no children or its only children are not elements
     // (e.g. just text nodes), it doesn't have fallback content.
@@ -1141,7 +1141,7 @@ HTMLLabelElement* AccessibilityNodeObject::labelForElement(Element* element) con
             return label;
     }
 
-    return ancestorsOfType<HTMLLabelElement>(element).first();
+    return ancestorsOfType<HTMLLabelElement>(*element).first();
 }
 
 String AccessibilityNodeObject::ariaAccessibilityDescription() const
@@ -1162,7 +1162,8 @@ static Element* siblingWithAriaRole(String role, Node* node)
     ContainerNode* parent = node->parentNode();
     if (!parent)
         return 0;
-    for (auto sibling = elementChildren(parent).begin(), end = elementChildren(parent).end(); sibling != end; ++sibling) {
+    auto children = elementChildren(*parent);
+    for (auto sibling = children.begin(), end = children.end(); sibling != end; ++sibling) {
         const AtomicString& siblingAriaRole = sibling->fastGetAttribute(roleAttr);
         if (equalIgnoringCase(siblingAriaRole, role))
             return &*sibling;
index c33b0f7..fb37d7d 100644 (file)
@@ -2708,7 +2708,8 @@ void AccessibilityRenderObject::addImageMapChildren()
     if (!map)
         return;
 
-    for (auto area = descendantsOfType<HTMLAreaElement>(map).begin(), end = descendantsOfType<HTMLAreaElement>(map).end() ; area != end; ++area) {
+    auto areaDescendants = descendantsOfType<HTMLAreaElement>(*map);
+    for (auto area = areaDescendants.begin(), end = areaDescendants.end() ; area != end; ++area) {
         // add an <area> element for this child if it has a link
         if (!area->isLink())
             continue;
index 63d473a..339529f 100644 (file)
@@ -124,7 +124,8 @@ bool AccessibilityTable::isDataTable() const
         return true;    
 
     // if there's a colgroup or col element, it's probably a data table.
-    for (auto child = elementChildren(tableElement).begin(), end = elementChildren(tableElement).end(); child != end; ++child) {
+    auto tableChildren = elementChildren(*tableElement);
+    for (auto child = tableChildren.begin(), end = tableChildren.end(); child != end; ++child) {
         if (child->hasTagName(colTag) || child->hasTagName(colgroupTag))
             return true;
     }
index 0e95514..773c9c3 100644 (file)
@@ -86,7 +86,7 @@ AccessibilityObjectInclusion AccessibilityObject::accessibilityPlatformIncludesO
         // The legend element is ignored if it lives inside of a fieldset element that uses it to generate alternative text.
         if (renderer->isLegend()) {
             Element* element = this->element();
-            if (element && ancestorsOfType<HTMLFieldSetElement>(element).first())
+            if (element && ancestorsOfType<HTMLFieldSetElement>(*element).first())
                 return IgnoreObject;
         }
     }
index fba309c..7509e92 100644 (file)
@@ -139,7 +139,7 @@ PassRefPtr<SimpleFontData> CSSFontFaceSource::getFontData(const FontDescription&
                 if (!m_externalSVGFontElement)
                     return 0;
 
-                if (auto firstFontFace = childrenOfType<SVGFontFaceElement>(m_externalSVGFontElement.get()).first()) {
+                if (auto firstFontFace = childrenOfType<SVGFontFaceElement>(*m_externalSVGFontElement).first()) {
                     if (!m_svgFontFaceElement) {
                         // We're created using a CSS @font-face rule, that means we're not associated with a SVGFontFaceElement.
                         // Use the imported <font-face> tag as referencing font-face element for these cases.
index ad3c448..d9e5810 100644 (file)
@@ -112,7 +112,7 @@ static bool elementMatchesSelectorScopes(const Element& element, const HashSet<A
     return false;
 }
 
-void StyleInvalidationAnalysis::invalidateStyle(Document* document)
+void StyleInvalidationAnalysis::invalidateStyle(Document& document)
 {
     ASSERT(!m_dirtiesAllStyle);
     if (m_idScopes.isEmpty() && m_classScopes.isEmpty())
index 7ad2cb9..e316663 100644 (file)
@@ -40,7 +40,7 @@ public:
     StyleInvalidationAnalysis(const Vector<StyleSheetContents*>&);
 
     bool dirtiesAllStyle() const { return m_dirtiesAllStyle; }
-    void invalidateStyle(Document*);
+    void invalidateStyle(Document&);
 
 private:
 
index 83bd3c6..da51e33 100644 (file)
@@ -671,7 +671,8 @@ void Document::buildAccessKeyMap(TreeScope* scope)
 {
     ASSERT(scope);
     ContainerNode* rootNode = scope->rootNode();
-    for (auto element = elementDescendants(rootNode).begin(), end = elementDescendants(rootNode).end(); element != end; ++element) {
+    auto descendant = elementDescendants(*rootNode);
+    for (auto element = descendant.begin(), end = descendant.end(); element != end; ++element) {
         const AtomicString& accessKey = element->fastGetAttribute(accesskeyAttr);
         if (!accessKey.isEmpty())
             m_elementsByAccessKey.set(accessKey.impl(), &*element);
@@ -791,7 +792,7 @@ void Document::childrenChanged(const ChildChange& change)
     }
 #endif
 
-    Element* newDocumentElement = elementChildren(this).first();
+    Element* newDocumentElement = elementChildren(*this).first();
 
     if (newDocumentElement == m_documentElement)
         return;
@@ -1519,7 +1520,7 @@ void Document::removeTitle(Element* titleElement)
 
     // Update title based on first title element in the head, if one exists.
     if (HTMLElement* headElement = head()) {
-        if (auto firstTitle = childrenOfType<HTMLTitleElement>(headElement).first())
+        if (auto firstTitle = childrenOfType<HTMLTitleElement>(*headElement).first())
             setTitleElement(firstTitle->textWithDirection(), firstTitle);
     }
 
@@ -2254,9 +2255,9 @@ HTMLElement* Document::body() const
     auto element = documentElement();
     if (!element)
         return nullptr;
-    if (auto frameset = childrenOfType<HTMLFrameSetElement>(element).first())
+    if (auto frameset = childrenOfType<HTMLFrameSetElement>(*element).first())
         return frameset;
-    return childrenOfType<HTMLBodyElement>(element).first();
+    return childrenOfType<HTMLBodyElement>(*element).first();
 }
 
 void Document::setBody(PassRefPtr<HTMLElement> prpNewBody, ExceptionCode& ec)
@@ -2287,7 +2288,7 @@ void Document::setBody(PassRefPtr<HTMLElement> prpNewBody, ExceptionCode& ec)
 HTMLHeadElement* Document::head()
 {
     if (auto element = documentElement())
-        return childrenOfType<HTMLHeadElement>(element).first();
+        return childrenOfType<HTMLHeadElement>(*element).first();
     return nullptr;
 }
 
@@ -2603,7 +2604,7 @@ void Document::updateBaseURL()
     if (!equalIgnoringFragmentIdentifier(oldBaseURL, m_baseURL)) {
         // Base URL change changes any relative visited links.
         // FIXME: There are other URLs in the tree that would need to be re-evaluated on dynamic base URL change. Style should be invalidated too.
-        auto anchorDescendants = descendantsOfType<HTMLAnchorElement>(this);
+        auto anchorDescendants = descendantsOfType<HTMLAnchorElement>(*this);
         for (auto anchor = anchorDescendants.begin(), end = anchorDescendants.end(); anchor != end; ++anchor)
             anchor->invalidateCachedVisitedLinkHash();
     }
@@ -2620,7 +2621,7 @@ void Document::processBaseElement()
     // Find the first href attribute in a base element and the first target attribute in a base element.
     const AtomicString* href = nullptr;
     const AtomicString* target = nullptr;
-    auto baseDescendants = descendantsOfType<HTMLBaseElement>(this);
+    auto baseDescendants = descendantsOfType<HTMLBaseElement>(*this);
     for (auto base = baseDescendants.begin(), end = baseDescendants.end(); base != end && (!href || !target); ++base) {
         if (!href) {
             const AtomicString& value = base->fastGetAttribute(hrefAttr);
index 1ed0b01..c1d6ce5 100644 (file)
@@ -403,7 +403,7 @@ void DocumentStyleSheetCollection::analyzeStyleSheetChange(UpdateFlag updateFlag
     StyleInvalidationAnalysis invalidationAnalysis(addedSheets);
     if (invalidationAnalysis.dirtiesAllStyle())
         return;
-    invalidationAnalysis.invalidateStyle(&m_document);
+    invalidationAnalysis.invalidateStyle(m_document);
     requiresFullStyleRecalc = false;
 }
 
index 85c4664..8c48321 100644 (file)
@@ -49,7 +49,7 @@ public:
 template <typename ElementType>
 class ElementAncestorIteratorAdapter {
 public:
-    explicit ElementAncestorIteratorAdapter(ElementType* descendant);
+    explicit ElementAncestorIteratorAdapter(ElementType* first);
     ElementAncestorIterator<ElementType> begin();
     ElementAncestorIterator<ElementType> end();
     ElementType* first() { return m_first; }
@@ -61,7 +61,7 @@ private:
 template <typename ElementType>
 class ElementAncestorConstIteratorAdapter {
 public:
-    explicit ElementAncestorConstIteratorAdapter(const ElementType* descendant);
+    explicit ElementAncestorConstIteratorAdapter(const ElementType* first);
     ElementAncestorConstIterator<ElementType> begin() const;
     ElementAncestorConstIterator<ElementType> end() const;
     const ElementType* first() const { return m_first; }
@@ -74,10 +74,10 @@ ElementAncestorIteratorAdapter<Element> elementLineage(Element* first);
 ElementAncestorConstIteratorAdapter<Element> elementLineage(const Element* first);
 ElementAncestorIteratorAdapter<Element> elementAncestors(Element* descendant);
 ElementAncestorConstIteratorAdapter<Element> elementAncestors(const Element* descendant);
-template <typename ElementType> ElementAncestorIteratorAdapter<ElementType> lineageOfType(Element* first);
-template <typename ElementType> ElementAncestorConstIteratorAdapter<ElementType> lineageOfType(const Element* first);
-template <typename ElementType> ElementAncestorIteratorAdapter<ElementType> ancestorsOfType(Element* descendant);
-template <typename ElementType> ElementAncestorConstIteratorAdapter<ElementType> ancestorsOfType(const Element* descendant);
+template <typename ElementType> ElementAncestorIteratorAdapter<ElementType> lineageOfType(Element& first);
+template <typename ElementType> ElementAncestorConstIteratorAdapter<ElementType> lineageOfType(const Element& first);
+template <typename ElementType> ElementAncestorIteratorAdapter<ElementType> ancestorsOfType(Element& descendant);
+template <typename ElementType> ElementAncestorConstIteratorAdapter<ElementType> ancestorsOfType(const Element& descendant);
 
 // ElementAncestorIterator
 
@@ -182,28 +182,28 @@ inline ElementAncestorConstIteratorAdapter<Element> elementAncestors(const Eleme
 }
 
 template <typename ElementType>
-inline ElementAncestorIteratorAdapter<ElementType> lineageOfType(ElementType* first)
+inline ElementAncestorIteratorAdapter<ElementType> lineageOfType(ElementType& first)
 {
-    return ElementAncestorIteratorAdapter<ElementType>(first);
+    return ElementAncestorIteratorAdapter<ElementType>(&first);
 }
 
 template <typename ElementType>
-inline ElementAncestorConstIteratorAdapter<ElementType> lineageOfType(const ElementType* first)
+inline ElementAncestorConstIteratorAdapter<ElementType> lineageOfType(const ElementType& first)
 {
-    return ElementAncestorConstIteratorAdapter<ElementType>(first);
+    return ElementAncestorConstIteratorAdapter<ElementType>(&first);
 }
 
 template <typename ElementType>
-inline ElementAncestorIteratorAdapter<ElementType> ancestorsOfType(Element* descendant)
+inline ElementAncestorIteratorAdapter<ElementType> ancestorsOfType(Element& descendant)
 {
-    ElementType* first = findElementAncestorOfType<ElementType>(*descendant);
+    ElementType* first = findElementAncestorOfType<ElementType>(descendant);
     return ElementAncestorIteratorAdapter<ElementType>(first);
 }
 
 template <typename ElementType>
-inline ElementAncestorConstIteratorAdapter<ElementType> ancestorsOfType(const Element* descendant)
+inline ElementAncestorConstIteratorAdapter<ElementType> ancestorsOfType(const Element& descendant)
 {
-    const ElementType* first = findElementAncestorOfType<const ElementType>(*descendant);
+    const ElementType* first = findElementAncestorOfType<const ElementType>(descendant);
     return ElementAncestorConstIteratorAdapter<ElementType>(first);
 }
 
index e1c22d5..c10f278 100644 (file)
@@ -33,61 +33,61 @@ namespace WebCore {
 template <typename ElementType>
 class ElementChildIterator : public ElementIterator<ElementType> {
 public:
-    ElementChildIterator(const ContainerNode* root);
-    ElementChildIterator(const ContainerNode* root, ElementType* current);
+    ElementChildIterator(const ContainerNode& parent);
+    ElementChildIterator(const ContainerNode& parent, ElementType* current);
     ElementChildIterator& operator++();
 };
 
 template <typename ElementType>
 class ElementChildConstIterator : public ElementConstIterator<ElementType> {
 public:
-    ElementChildConstIterator(const ContainerNode* root);
-    ElementChildConstIterator(const ContainerNode* root, const ElementType* current);
+    ElementChildConstIterator(const ContainerNode& parent);
+    ElementChildConstIterator(const ContainerNode& parent, const ElementType* current);
     ElementChildConstIterator& operator++();
 };
 
 template <typename ElementType>
 class ElementChildIteratorAdapter {
 public:
-    ElementChildIteratorAdapter(ContainerNode* root);
+    ElementChildIteratorAdapter(ContainerNode& parent);
     ElementChildIterator<ElementType> begin();
     ElementChildIterator<ElementType> end();
     ElementType* first();
     ElementType* last();
 
 private:
-    const ContainerNode* m_root;
+    ContainerNode& m_parent;
 };
 
 template <typename ElementType>
 class ElementChildConstIteratorAdapter {
 public:
-    ElementChildConstIteratorAdapter(const ContainerNode* root);
+    ElementChildConstIteratorAdapter(const ContainerNode& parent);
     ElementChildConstIterator<ElementType> begin() const;
     ElementChildConstIterator<ElementType> end() const;
     const ElementType* first() const;
     const ElementType* last() const;
 
 private:
-    const ContainerNode* m_root;
+    const ContainerNode& m_parent;
 };
 
-ElementChildIteratorAdapter<Element> elementChildren(ContainerNode* root);
-ElementChildConstIteratorAdapter<Element> elementChildren(const ContainerNode* root);
-template <typename ElementType> ElementChildIteratorAdapter<ElementType> childrenOfType(ContainerNode* root);
-template <typename ElementType> ElementChildConstIteratorAdapter<ElementType> childrenOfType(const ContainerNode* root);
+ElementChildIteratorAdapter<Element> elementChildren(ContainerNode&);
+ElementChildConstIteratorAdapter<Element> elementChildren(const ContainerNode&);
+template <typename ElementType> ElementChildIteratorAdapter<ElementType> childrenOfType(ContainerNode&);
+template <typename ElementType> ElementChildConstIteratorAdapter<ElementType> childrenOfType(const ContainerNode&);
 
 // ElementChildIterator
 
 template <typename ElementType>
-inline ElementChildIterator<ElementType>::ElementChildIterator(const ContainerNode* root)
-    : ElementIterator<ElementType>(root)
+inline ElementChildIterator<ElementType>::ElementChildIterator(const ContainerNode& parent)
+    : ElementIterator<ElementType>(&parent)
 {
 }
 
 template <typename ElementType>
-inline ElementChildIterator<ElementType>::ElementChildIterator(const ContainerNode* root, ElementType* current)
-    : ElementIterator<ElementType>(root, current)
+inline ElementChildIterator<ElementType>::ElementChildIterator(const ContainerNode& parent, ElementType* current)
+    : ElementIterator<ElementType>(&parent, current)
 {
 }
 
@@ -100,14 +100,14 @@ inline ElementChildIterator<ElementType>& ElementChildIterator<ElementType>::ope
 // ElementChildConstIterator
 
 template <typename ElementType>
-inline ElementChildConstIterator<ElementType>::ElementChildConstIterator(const ContainerNode* root)
-    : ElementConstIterator<ElementType>(root)
+inline ElementChildConstIterator<ElementType>::ElementChildConstIterator(const ContainerNode& parent)
+    : ElementConstIterator<ElementType>(&parent)
 {
 }
 
 template <typename ElementType>
-inline ElementChildConstIterator<ElementType>::ElementChildConstIterator(const ContainerNode* root, const ElementType* current)
-    : ElementConstIterator<ElementType>(root, current)
+inline ElementChildConstIterator<ElementType>::ElementChildConstIterator(const ContainerNode& parent, const ElementType* current)
+    : ElementConstIterator<ElementType>(&parent, current)
 {
 }
 
@@ -120,89 +120,89 @@ inline ElementChildConstIterator<ElementType>& ElementChildConstIterator<Element
 // ElementChildIteratorAdapter
 
 template <typename ElementType>
-inline ElementChildIteratorAdapter<ElementType>::ElementChildIteratorAdapter(ContainerNode* root)
-    : m_root(root)
+inline ElementChildIteratorAdapter<ElementType>::ElementChildIteratorAdapter(ContainerNode& parent)
+    : m_parent(parent)
 {
 }
 
 template <typename ElementType>
 inline ElementChildIterator<ElementType> ElementChildIteratorAdapter<ElementType>::begin()
 {
-    return ElementChildIterator<ElementType>(m_root, Traversal<ElementType>::firstChild(m_root));
+    return ElementChildIterator<ElementType>(m_parent, Traversal<ElementType>::firstChild(&m_parent));
 }
 
 template <typename ElementType>
 inline ElementChildIterator<ElementType> ElementChildIteratorAdapter<ElementType>::end()
 {
-    return ElementChildIterator<ElementType>(m_root);
+    return ElementChildIterator<ElementType>(m_parent);
 }
 
 template <typename ElementType>
 inline ElementType* ElementChildIteratorAdapter<ElementType>::first()
 {
-    return Traversal<ElementType>::firstChild(m_root);
+    return Traversal<ElementType>::firstChild(&m_parent);
 }
 
 template <typename ElementType>
 inline ElementType* ElementChildIteratorAdapter<ElementType>::last()
 {
-    return Traversal<ElementType>::lastChild(m_root);
+    return Traversal<ElementType>::lastChild(&m_parent);
 }
 
 // ElementChildConstIteratorAdapter
 
 template <typename ElementType>
-inline ElementChildConstIteratorAdapter<ElementType>::ElementChildConstIteratorAdapter(const ContainerNode* root)
-    : m_root(root)
+inline ElementChildConstIteratorAdapter<ElementType>::ElementChildConstIteratorAdapter(const ContainerNode& parent)
+    : m_parent(parent)
 {
 }
 
 template <typename ElementType>
 inline ElementChildConstIterator<ElementType> ElementChildConstIteratorAdapter<ElementType>::begin() const
 {
-    return ElementChildConstIterator<ElementType>(m_root, Traversal<ElementType>::firstChild(m_root));
+    return ElementChildConstIterator<ElementType>(m_parent, Traversal<ElementType>::firstChild(&m_parent));
 }
 
 template <typename ElementType>
 inline ElementChildConstIterator<ElementType> ElementChildConstIteratorAdapter<ElementType>::end() const
 {
-    return ElementChildConstIterator<ElementType>(m_root);
+    return ElementChildConstIterator<ElementType>(m_parent);
 }
 
 template <typename ElementType>
 inline const ElementType* ElementChildConstIteratorAdapter<ElementType>::first() const
 {
-    return Traversal<ElementType>::firstChild(m_root);
+    return Traversal<ElementType>::firstChild(&m_parent);
 }
 
 template <typename ElementType>
 inline const ElementType* ElementChildConstIteratorAdapter<ElementType>::last() const
 {
-    return Traversal<ElementType>::lastChild(m_root);
+    return Traversal<ElementType>::lastChild(&m_parent);
 }
 
 // Standalone functions
 
-inline ElementChildIteratorAdapter<Element> elementChildren(ContainerNode* root)
+inline ElementChildIteratorAdapter<Element> elementChildren(ContainerNode& parent)
 {
-    return ElementChildIteratorAdapter<Element>(root);
+    return ElementChildIteratorAdapter<Element>(parent);
 }
 
 template <typename ElementType>
-inline ElementChildIteratorAdapter<ElementType> childrenOfType(ContainerNode* root)
+inline ElementChildIteratorAdapter<ElementType> childrenOfType(ContainerNode& parent)
 {
-    return ElementChildIteratorAdapter<ElementType>(root);
+    return ElementChildIteratorAdapter<ElementType>(parent);
 }
 
-inline ElementChildConstIteratorAdapter<Element> elementChildren(const ContainerNode* root)
+inline ElementChildConstIteratorAdapter<Element> elementChildren(const ContainerNode& parent)
 {
-    return ElementChildConstIteratorAdapter<Element>(root);
+    return ElementChildConstIteratorAdapter<Element>(parent);
 }
 
 template <typename ElementType>
-inline ElementChildConstIteratorAdapter<ElementType> childrenOfType(const ContainerNode* root)
+inline ElementChildConstIteratorAdapter<ElementType> childrenOfType(const ContainerNode& parent)
 {
-    return ElementChildConstIteratorAdapter<ElementType>(root);
+    return ElementChildConstIteratorAdapter<ElementType>(parent);
 }
 
 }
index 1d68477..73e2abf 100644 (file)
@@ -33,61 +33,61 @@ namespace WebCore {
 template <typename ElementType>
 class ElementDescendantIterator : public ElementIterator<ElementType> {
 public:
-    ElementDescendantIterator(const ContainerNode* root);
-    ElementDescendantIterator(const ContainerNode* root, ElementType* current);
+    ElementDescendantIterator(const ContainerNode& root);
+    ElementDescendantIterator(const ContainerNode& root, ElementType* current);
     ElementDescendantIterator& operator++();
 };
 
 template <typename ElementType>
 class ElementDescendantConstIterator : public ElementConstIterator<ElementType>  {
 public:
-    ElementDescendantConstIterator(const ContainerNode* root);
-    ElementDescendantConstIterator(const ContainerNode* root, const ElementType* current);
+    ElementDescendantConstIterator(const ContainerNode& root);
+    ElementDescendantConstIterator(const ContainerNode& root, const ElementType* current);
     ElementDescendantConstIterator& operator++();
 };
 
 template <typename ElementType>
 class ElementDescendantIteratorAdapter {
 public:
-    ElementDescendantIteratorAdapter(ContainerNode* root);
+    ElementDescendantIteratorAdapter(ContainerNode& root);
     ElementDescendantIterator<ElementType> begin();
     ElementDescendantIterator<ElementType> end();
     ElementType* first();
     ElementType* last();
 
 private:
-    ContainerNode* m_root;
+    ContainerNode& m_root;
 };
 
 template <typename ElementType>
 class ElementDescendantConstIteratorAdapter {
 public:
-    ElementDescendantConstIteratorAdapter(const ContainerNode* root);
+    ElementDescendantConstIteratorAdapter(const ContainerNode& root);
     ElementDescendantConstIterator<ElementType> begin() const;
     ElementDescendantConstIterator<ElementType> end() const;
     const ElementType* first() const;
     const ElementType* last() const;
 
 private:
-    const ContainerNode* m_root;
+    const ContainerNode& m_root;
 };
 
-ElementDescendantIteratorAdapter<Element> elementDescendants(ContainerNode* root);
-ElementDescendantConstIteratorAdapter<Element> elementDescendants(const ContainerNode* root);
-template <typename ElementType> ElementDescendantIteratorAdapter<ElementType> descendantsOfType(ContainerNode* root);
-template <typename ElementType> ElementDescendantConstIteratorAdapter<ElementType> descendantsOfType(const ContainerNode* root);
+ElementDescendantIteratorAdapter<Element> elementDescendants(ContainerNode&);
+ElementDescendantConstIteratorAdapter<Element> elementDescendants(const ContainerNode&);
+template <typename ElementType> ElementDescendantIteratorAdapter<ElementType> descendantsOfType(ContainerNode&);
+template <typename ElementType> ElementDescendantConstIteratorAdapter<ElementType> descendantsOfType(const ContainerNode&);
 
 // ElementDescendantIterator
 
 template <typename ElementType>
-inline ElementDescendantIterator<ElementType>::ElementDescendantIterator(const ContainerNode* root)
-    : ElementIterator<ElementType>(root)
+inline ElementDescendantIterator<ElementType>::ElementDescendantIterator(const ContainerNode& root)
+    : ElementIterator<ElementType>(&root)
 {
 }
 
 template <typename ElementType>
-inline ElementDescendantIterator<ElementType>::ElementDescendantIterator(const ContainerNode* root, ElementType* current)
-    : ElementIterator<ElementType>(root, current)
+inline ElementDescendantIterator<ElementType>::ElementDescendantIterator(const ContainerNode& root, ElementType* current)
+    : ElementIterator<ElementType>(&root, current)
 {
 }
 
@@ -100,15 +100,15 @@ inline ElementDescendantIterator<ElementType>& ElementDescendantIterator<Element
 // ElementDescendantConstIterator
 
 template <typename ElementType>
-inline ElementDescendantConstIterator<ElementType>::ElementDescendantConstIterator(const ContainerNode* root)
-    : ElementConstIterator<ElementType>(root)
+inline ElementDescendantConstIterator<ElementType>::ElementDescendantConstIterator(const ContainerNode& root)
+    : ElementConstIterator<ElementType>(&root)
 
 {
 }
 
 template <typename ElementType>
-inline ElementDescendantConstIterator<ElementType>::ElementDescendantConstIterator(const ContainerNode* root, const ElementType* current)
-    : ElementConstIterator<ElementType>(root, current)
+inline ElementDescendantConstIterator<ElementType>::ElementDescendantConstIterator(const ContainerNode& root, const ElementType* current)
+    : ElementConstIterator<ElementType>(&root, current)
 {
 }
 
@@ -121,7 +121,7 @@ inline ElementDescendantConstIterator<ElementType>& ElementDescendantConstIterat
 // ElementDescendantIteratorAdapter
 
 template <typename ElementType>
-inline ElementDescendantIteratorAdapter<ElementType>::ElementDescendantIteratorAdapter(ContainerNode* root)
+inline ElementDescendantIteratorAdapter<ElementType>::ElementDescendantIteratorAdapter(ContainerNode& root)
     : m_root(root)
 {
 }
@@ -129,7 +129,7 @@ inline ElementDescendantIteratorAdapter<ElementType>::ElementDescendantIteratorA
 template <typename ElementType>
 inline ElementDescendantIterator<ElementType> ElementDescendantIteratorAdapter<ElementType>::begin()
 {
-    return ElementDescendantIterator<ElementType>(m_root, Traversal<ElementType>::firstWithin(m_root));
+    return ElementDescendantIterator<ElementType>(m_root, Traversal<ElementType>::firstWithin(&m_root));
 }
 
 template <typename ElementType>
@@ -141,19 +141,19 @@ inline ElementDescendantIterator<ElementType> ElementDescendantIteratorAdapter<E
 template <typename ElementType>
 inline ElementType* ElementDescendantIteratorAdapter<ElementType>::first()
 {
-    return Traversal<ElementType>::firstWithin(m_root);
+    return Traversal<ElementType>::firstWithin(&m_root);
 }
 
 template <typename ElementType>
 inline ElementType* ElementDescendantIteratorAdapter<ElementType>::last()
 {
-    return Traversal<ElementType>::lastWithin(m_root);
+    return Traversal<ElementType>::lastWithin(&m_root);
 }
 
 // ElementDescendantConstIteratorAdapter
 
 template <typename ElementType>
-inline ElementDescendantConstIteratorAdapter<ElementType>::ElementDescendantConstIteratorAdapter(const ContainerNode* root)
+inline ElementDescendantConstIteratorAdapter<ElementType>::ElementDescendantConstIteratorAdapter(const ContainerNode& root)
     : m_root(root)
 {
 }
@@ -161,7 +161,7 @@ inline ElementDescendantConstIteratorAdapter<ElementType>::ElementDescendantCons
 template <typename ElementType>
 inline ElementDescendantConstIterator<ElementType> ElementDescendantConstIteratorAdapter<ElementType>::begin() const
 {
-    return ElementDescendantConstIterator<ElementType>(m_root, Traversal<ElementType>::firstWithin(m_root));
+    return ElementDescendantConstIterator<ElementType>(m_root, Traversal<ElementType>::firstWithin(&m_root));
 }
 
 template <typename ElementType>
@@ -173,35 +173,35 @@ inline ElementDescendantConstIterator<ElementType> ElementDescendantConstIterato
 template <typename ElementType>
 inline const ElementType* ElementDescendantConstIteratorAdapter<ElementType>::first() const
 {
-    return Traversal<ElementType>::firstWithin(m_root);
+    return Traversal<ElementType>::firstWithin(&m_root);
 }
 
 template <typename ElementType>
 inline const ElementType* ElementDescendantConstIteratorAdapter<ElementType>::last() const
 {
-    return Traversal<ElementType>::lastWithin(m_root);
+    return Traversal<ElementType>::lastWithin(&m_root);
 }
 
 // Standalone functions
 
-inline ElementDescendantIteratorAdapter<Element> elementDescendants(ContainerNode* root)
+inline ElementDescendantIteratorAdapter<Element> elementDescendants(ContainerNode& root)
 {
     return ElementDescendantIteratorAdapter<Element>(root);
 }
 
 template <typename ElementType>
-inline ElementDescendantIteratorAdapter<ElementType> descendantsOfType(ContainerNode* root)
+inline ElementDescendantIteratorAdapter<ElementType> descendantsOfType(ContainerNode& root)
 {
     return ElementDescendantIteratorAdapter<ElementType>(root);
 }
 
-inline ElementDescendantConstIteratorAdapter<Element> elementDescendants(const ContainerNode* root)
+inline ElementDescendantConstIteratorAdapter<Element> elementDescendants(const ContainerNode& root)
 {
     return ElementDescendantConstIteratorAdapter<Element>(root);
 }
 
 template <typename ElementType>
-inline ElementDescendantConstIteratorAdapter<ElementType> descendantsOfType(const ContainerNode* root)
+inline ElementDescendantConstIteratorAdapter<ElementType> descendantsOfType(const ContainerNode& root)
 {
     return ElementDescendantConstIteratorAdapter<ElementType>(root);
 }
index 0a27dab..ab31590 100644 (file)
@@ -167,7 +167,7 @@ static bool isSingleTagNameSelector(const CSSSelector& selector)
 template <typename SelectorQueryTrait>
 static inline void elementsForLocalName(const ContainerNode& rootNode, const AtomicString& localName, typename SelectorQueryTrait::OutputType& output)
 {
-    auto descendants = elementDescendants(&const_cast<ContainerNode&>(rootNode));
+    auto descendants = elementDescendants(const_cast<ContainerNode&>(rootNode));
     for (auto element = descendants.begin(), end = descendants.end(); element != end; ++element) {
         if (element->tagQName().localName() == localName) {
             SelectorQueryTrait::appendOutputForElement(output, &*element);
@@ -180,7 +180,7 @@ static inline void elementsForLocalName(const ContainerNode& rootNode, const Ato
 template <typename SelectorQueryTrait>
 static inline void anyElement(const ContainerNode& rootNode, typename SelectorQueryTrait::OutputType& output)
 {
-    auto descendants = elementDescendants(&const_cast<ContainerNode&>(rootNode));
+    auto descendants = elementDescendants(const_cast<ContainerNode&>(rootNode));
     for (auto element = descendants.begin(), end = descendants.end(); element != end; ++element) {
         SelectorQueryTrait::appendOutputForElement(output, &*element);
         if (SelectorQueryTrait::shouldOnlyMatchFirstElement)
@@ -209,7 +209,7 @@ ALWAYS_INLINE void SelectorDataList::executeSingleTagNameSelectorData(const Cont
         }
     } else {
         // Fallback: NamespaceURI is set, selectorLocalName may be starAtom.
-        auto descendants = elementDescendants(&const_cast<ContainerNode&>(rootNode));
+        auto descendants = elementDescendants(const_cast<ContainerNode&>(rootNode));
         for (auto element = descendants.begin(), end = descendants.end(); element != end; ++element) {
             if (element->namespaceURI() == selectorNamespaceURI && (selectorLocalName == starAtom || element->tagQName().localName() == selectorLocalName)) {
                 SelectorQueryTrait::appendOutputForElement(output, &*element);
@@ -232,7 +232,7 @@ ALWAYS_INLINE void SelectorDataList::executeSingleClassNameSelectorData(const Co
     ASSERT(isSingleClassNameSelector(*selectorData.selector));
 
     const AtomicString& className = selectorData.selector->value();
-    auto descendants = elementDescendants(&const_cast<ContainerNode&>(rootNode));
+    auto descendants = elementDescendants(const_cast<ContainerNode&>(rootNode));
     for (auto element = descendants.begin(), end = descendants.end(); element != end; ++element) {
         if (element->hasClass() && element->classNames().contains(className)) {
             SelectorQueryTrait::appendOutputForElement(output, &*element);
@@ -247,7 +247,7 @@ ALWAYS_INLINE void SelectorDataList::executeSingleSelectorData(const ContainerNo
 {
     ASSERT(m_selectors.size() == 1);
 
-    auto descendants = elementDescendants(&const_cast<ContainerNode&>(rootNode));
+    auto descendants = elementDescendants(const_cast<ContainerNode&>(rootNode));
     for (auto element = descendants.begin(), end = descendants.end(); element != end; ++element) {
         if (selectorMatches(selectorData, *element, rootNode)) {
             SelectorQueryTrait::appendOutputForElement(output, &*element);
@@ -261,7 +261,7 @@ template <typename SelectorQueryTrait>
 ALWAYS_INLINE void SelectorDataList::executeSingleMultiSelectorData(const ContainerNode& rootNode, typename SelectorQueryTrait::OutputType& output) const
 {
     unsigned selectorCount = m_selectors.size();
-    auto descendants = elementDescendants(&const_cast<ContainerNode&>(rootNode));
+    auto descendants = elementDescendants(const_cast<ContainerNode&>(rootNode));
     for (auto element = descendants.begin(), end = descendants.end(); element != end; ++element) {
         for (unsigned i = 0; i < selectorCount; ++i) {
             if (selectorMatches(m_selectors[i], *element, rootNode)) {
index 6913f15..9678e18 100644 (file)
@@ -300,7 +300,7 @@ HTMLLabelElement* TreeScope::labelElementForId(const AtomicString& forAttributeV
         // Populate the map on first access.
         m_labelsByForAttribute = adoptPtr(new DocumentOrderedMap);
 
-        auto labelDescendants = descendantsOfType<HTMLLabelElement>(rootNode());
+        auto labelDescendants = descendantsOfType<HTMLLabelElement>(*rootNode());
         for (auto label = labelDescendants.begin(), end = labelDescendants.end(); label != end; ++label) {
             const AtomicString& forValue = label->fastGetAttribute(forAttr);
             if (!forValue.isEmpty())
@@ -342,7 +342,7 @@ Element* TreeScope::findAnchor(const String& name)
         return nullptr;
     if (Element* element = getElementById(name))
         return element;
-    auto anchorDescendants = descendantsOfType<HTMLAnchorElement>(rootNode());
+    auto anchorDescendants = descendantsOfType<HTMLAnchorElement>(*rootNode());
     for (auto anchor = anchorDescendants.begin(), end = anchorDescendants.end(); anchor != end; ++anchor) {
         if (rootNode()->document().inQuirksMode()) {
             // Quirks mode, case insensitive comparison of names.
index 405de9d..c8a3554 100644 (file)
@@ -444,7 +444,8 @@ void ApplyStyleCommand::cleanupUnstyledAppleStyleSpans(ContainerNode* dummySpanA
     // all the children of the dummy's parent
 
     Vector<Element*> toRemove;
-    for (auto child = elementChildren(dummySpanAncestor).begin(), end = elementChildren(dummySpanAncestor).end(); child != end; ++child) {
+    auto children = elementChildren(*dummySpanAncestor);
+    for (auto child = children.begin(), end = children.end(); child != end; ++child) {
         if (isSpanWithoutAttributesOrUnstyledStyleSpan(&*child))
             toRemove.append(&*child);
     }
index 75426cb..6d27f90 100644 (file)
@@ -712,8 +712,8 @@ static void removeHeadContents(ReplacementFragment& fragment)
 
     Vector<Element*> toRemove;
 
-    auto it = elementDescendants(fragment.fragment()).begin();
-    auto end = elementDescendants(fragment.fragment()).end();
+    auto it = elementDescendants(*fragment.fragment()).begin();
+    auto end = elementDescendants(*fragment.fragment()).end();
     while (it != end) {
         if (it->hasTagName(baseTag) || it->hasTagName(linkTag) || it->hasTagName(metaTag) || it->hasTagName(styleTag) || isHTMLTitleElement(*it)) {
             toRemove.append(&*it);
index e1d2294..70b54fe 100644 (file)
@@ -101,7 +101,8 @@ static void completeURLs(DocumentFragment* fragment, const String& baseURL)
 
     URL parsedBaseURL(ParsedURLString, baseURL);
 
-    for (auto element = elementDescendants(fragment).begin(), end = elementDescendants(fragment).end(); element != end; ++element) {
+    auto descendants = elementDescendants(*fragment);
+    for (auto element = descendants.begin(), end = descendants.end(); element != end; ++element) {
         if (!element->hasAttributes())
             continue;
         unsigned length = element->attributeCount();
index 07893f3..feac0fe 100644 (file)
@@ -148,7 +148,7 @@ void HTMLAppletElement::updateWidget(PluginCreationOption pluginCreationOption)
         paramValues.append(mayScript.string());
     }
 
-    auto paramChildren = childrenOfType<HTMLParamElement>(this);
+    auto paramChildren = childrenOfType<HTMLParamElement>(*this);
     for (auto param = paramChildren.begin(), end = paramChildren.end(); param != end; ++param) {
         if (param->name().isEmpty())
             continue;
index 4e786b9..69705de 100644 (file)
@@ -747,7 +747,7 @@ TranslateAttributeMode HTMLElement::translateAttributeMode() const
 
 bool HTMLElement::translate() const
 {
-    auto lineage = lineageOfType<HTMLElement>(this);
+    auto lineage = lineageOfType<HTMLElement>(*this);
     for (auto element = lineage.begin(), end = lineage.end(); element != end; ++element) {
         TranslateAttributeMode mode = element->translateAttributeMode();
         if (mode == TranslateAttributeInherit)
@@ -954,7 +954,7 @@ void HTMLElement::adjustDirectionalityIfNeededAfterChildrenChanged(Element* befo
     if (oldMarkedNode)
         setHasDirAutoFlagRecursively(oldMarkedNode, false);
 
-    auto lineage = lineageOfType<HTMLElement>(this);
+    auto lineage = lineageOfType<HTMLElement>(*this);
     for (auto elementToAdjust = lineage.begin(), end = lineage.end(); elementToAdjust != end; ++elementToAdjust) {
         if (elementAffectsDirectionality(&*elementToAdjust)) {
             elementToAdjust->calculateAndAdjustDirectionality();
index 169ed7a..9689dfd 100644 (file)
@@ -51,7 +51,7 @@ PassRefPtr<HTMLFieldSetElement> HTMLFieldSetElement::create(const QualifiedName&
 
 void HTMLFieldSetElement::invalidateDisabledStateUnder(Element* base)
 {
-    auto formControlDescendants = descendantsOfType<HTMLFormControlElement>(base);
+    auto formControlDescendants = descendantsOfType<HTMLFormControlElement>(*base);
     for (auto control = formControlDescendants.begin(), end = formControlDescendants.end(); control != end; ++control)
         control->ancestorDisabledStateWasChanged();
 }
@@ -67,7 +67,7 @@ void HTMLFieldSetElement::childrenChanged(const ChildChange& change)
 {
     HTMLFormControlElement::childrenChanged(change);
 
-    auto legendChildren = childrenOfType<HTMLLegendElement>(this);
+    auto legendChildren = childrenOfType<HTMLLegendElement>(*this);
     for (auto legend = legendChildren.begin(), end = legendChildren.end(); legend != end; ++legend)
         invalidateDisabledStateUnder(&*legend);
 }
@@ -90,7 +90,7 @@ RenderElement* HTMLFieldSetElement::createRenderer(RenderStyle&)
 
 HTMLLegendElement* HTMLFieldSetElement::legend() const
 {
-    return const_cast<HTMLLegendElement*>(descendantsOfType<HTMLLegendElement>(this).first());
+    return const_cast<HTMLLegendElement*>(descendantsOfType<HTMLLegendElement>(*this).first());
 }
 
 PassRefPtr<HTMLCollection> HTMLFieldSetElement::elements()
@@ -108,7 +108,7 @@ void HTMLFieldSetElement::refreshElementsIfNeeded() const
 
     m_associatedElements.clear();
 
-    auto descendants = elementDescendants(const_cast<HTMLFieldSetElement*>(this));
+    auto descendants = elementDescendants(const_cast<HTMLFieldSetElement&>(*this));
     for (auto element = descendants.begin(), end = descendants.end(); element != end; ++element) {
         if (element->hasTagName(objectTag))
             m_associatedElements.append(&toHTMLObjectElement(*element));
index 482ee98..d0c8b72 100644 (file)
@@ -165,7 +165,7 @@ RenderElement* HTMLFrameSetElement::createRenderer(RenderStyle& style)
 
 HTMLFrameSetElement* HTMLFrameSetElement::findContaining(Element* descendant)
 {
-    return ancestorsOfType<HTMLFrameSetElement>(descendant).first();
+    return ancestorsOfType<HTMLFrameSetElement>(*descendant).first();
 }
 
 void HTMLFrameSetElement::willAttachRenderers()
index 0d6c8f6..537d575 100644 (file)
@@ -67,7 +67,7 @@ LabelableElement* HTMLLabelElement::control()
         // Search the children and descendants of the label element for a form element.
         // per http://dev.w3.org/html5/spec/Overview.html#the-label-element
         // the form element must be "labelable form-associated element".
-        auto labelableDescendants = descendantsOfType<LabelableElement>(this);
+        auto labelableDescendants = descendantsOfType<LabelableElement>(*this);
         for (auto labelableElement = labelableDescendants.begin(), end = labelableDescendants.end(); labelableElement != end; ++labelableElement) {
             if (labelableElement->supportLabels())
                 return &*labelableElement;
index 87818a8..55b04d6 100644 (file)
@@ -49,13 +49,13 @@ PassRefPtr<HTMLLegendElement> HTMLLegendElement::create(const QualifiedName& tag
 HTMLFormControlElement* HTMLLegendElement::associatedControl()
 {
     // Check if there's a fieldset belonging to this legend.
-    auto enclosingFieldset = ancestorsOfType<HTMLFieldSetElement>(this).first();
+    auto enclosingFieldset = ancestorsOfType<HTMLFieldSetElement>(*this).first();
     if (!enclosingFieldset)
         return nullptr;
 
     // Find first form element inside the fieldset that is not a legend element.
     // FIXME: Should we consider tabindex?
-    return descendantsOfType<HTMLFormControlElement>(enclosingFieldset).first();
+    return descendantsOfType<HTMLFormControlElement>(*enclosingFieldset).first();
 }
 
 void HTMLLegendElement::focus(bool, FocusDirection direction)
index 396c7ab..00adc30 100644 (file)
@@ -62,7 +62,8 @@ bool HTMLMapElement::mapMouseEvent(LayoutPoint location, const LayoutSize& size,
 {
     HTMLAreaElement* defaultArea = 0;
 
-    for (auto area = descendantsOfType<HTMLAreaElement>(this).begin(), end = descendantsOfType<HTMLAreaElement>(this).end(); area != end; ++area) {
+    auto areaDescendants = descendantsOfType<HTMLAreaElement>(*this);
+    for (auto area = areaDescendants.begin(), end = areaDescendants.end(); area != end; ++area) {
         if (area->isDefault()) {
             if (!defaultArea)
                 defaultArea = &*area;
index 7637033..563ed48 100644 (file)
@@ -558,7 +558,7 @@ void HTMLMediaElement::finishParsingChildren()
     if (!RuntimeEnabledFeatures::sharedFeatures().webkitVideoTrackEnabled())
         return;
 
-    if (descendantsOfType<HTMLTrackElement>(this).first())
+    if (descendantsOfType<HTMLTrackElement>(*this).first())
         scheduleDelayedAction(ConfigureTextTracks);
 #endif
 }
@@ -948,7 +948,7 @@ void HTMLMediaElement::selectMediaResource()
         // Otherwise, if the media element does not have a src attribute but has a source 
         // element child, then let mode be children and let candidate be the first such 
         // source element child in tree order.
-        if (auto firstSource = childrenOfType<HTMLSourceElement>(this).first()) {
+        if (auto firstSource = childrenOfType<HTMLSourceElement>(*this).first()) {
             mode = children;
             m_nextChildNodeToConsider = firstSource;
             m_currentSourceNode = 0;
@@ -1444,8 +1444,8 @@ void HTMLMediaElement::textTrackModeChanged(TextTrack* track)
     bool trackIsLoaded = true;
     if (track->trackType() == TextTrack::TrackElement) {
         trackIsLoaded = false;
-        auto end = childrenOfType<HTMLTrackElement>(this).end();
-        for (auto trackElement = childrenOfType<HTMLTrackElement>(this).begin(); trackElement != end; ++trackElement) {
+        auto trackChildren = childrenOfType<HTMLTrackElement>(*this);
+        for (auto trackElement = trackChildren.begin(), end = trackChildren.end(); trackElement != end; ++trackElement) {
             if (trackElement->track() == track) {
                 if (trackElement->readyState() == HTMLTrackElement::LOADING || trackElement->readyState() == HTMLTrackElement::LOADED)
                     trackIsLoaded = true;
@@ -1677,7 +1677,7 @@ void HTMLMediaElement::cancelPendingEventsAndCallbacks()
     LOG(Media, "HTMLMediaElement::cancelPendingEventsAndCallbacks");
     m_asyncEventQueue.cancelAllEvents();
 
-    auto sourceChildren = childrenOfType<HTMLSourceElement>(this);
+    auto sourceChildren = childrenOfType<HTMLSourceElement>(*this);
     for (auto source = sourceChildren.begin(), end = sourceChildren.end(); source != end; ++source)
         source->cancelPendingErrorEvent();
 }
index 277235d..9a133ce 100644 (file)
@@ -154,7 +154,7 @@ void HTMLObjectElement::parametersForPlugin(Vector<String>& paramNames, Vector<S
     
     // Scan the PARAM children and store their name/value pairs.
     // Get the URL and type from the params if we don't already have them.
-    auto paramChildren = childrenOfType<HTMLParamElement>(this);
+    auto paramChildren = childrenOfType<HTMLParamElement>(*this);
     for (auto param = paramChildren.begin(), end = paramChildren.end(); param != end; ++param) {
         String name = param->name();
         if (name.isEmpty())
@@ -448,7 +448,8 @@ bool HTMLObjectElement::containsJavaApplet() const
     if (MIMETypeRegistry::isJavaAppletMIMEType(getAttribute(typeAttr)))
         return true;
 
-    for (auto child = elementChildren(this).begin(), end = elementChildren(this).end(); child != end; ++child) {
+    auto children = elementChildren(*this);
+    for (auto child = children.begin(), end = children.end(); child != end; ++child) {
         if (child->hasTagName(paramTag) && equalIgnoringCase(child->getNameAttribute(), "type")
             && MIMETypeRegistry::isJavaAppletMIMEType(child->getAttribute(valueAttr).string()))
             return true;
index 9a8f3a0..866f381 100644 (file)
@@ -34,7 +34,7 @@ void PlaceholderDocument::createRenderTree()
 {
     ASSERT(!attached());
 
-    auto children = elementChildren(this);
+    auto children = elementChildren(*this);
     for (auto child = children.begin(), end = children.end(); child != end; ++child)
         Style::attachRenderTree(*child);
 
index 4069103..a8804f2 100644 (file)
@@ -161,7 +161,7 @@ PassRefPtr<FilterEffect> FilterEffectRenderer::buildReferenceFilter(RenderElemen
     // This may need a spec clarification.
     auto builder = std::make_unique<SVGFilterBuilder>(previousEffect, SourceAlpha::create(this));
 
-    auto attributesChildren = childrenOfType<SVGFilterPrimitiveStandardAttributes>(filter);
+    auto attributesChildren = childrenOfType<SVGFilterPrimitiveStandardAttributes>(*filter);
     for (auto it = attributesChildren.begin(), end = attributesChildren.end(); it != end; ++it) {
         SVGFilterPrimitiveStandardAttributes* effectElement = &*it;
         effect = effectElement->build(builder.get(), this);
index 3def190..f035d67 100644 (file)
@@ -221,7 +221,7 @@ bool RenderSVGResourceClipper::drawContentIntoMaskImage(ClipperData* clipperData
     view().frameView().setPaintBehavior(oldBehavior | PaintBehaviorRenderingSVGMask);
 
     // Draw all clipPath children into a global mask.
-    auto children = childrenOfType<SVGElement>(&clipPathElement());
+    auto children = childrenOfType<SVGElement>(clipPathElement());
     for (auto it = children.begin(), end = children.end(); it != end; ++it) {
         SVGElement& child = *it;
         auto renderer = child.renderer();
index 20dd60f..88718ce 100644 (file)
@@ -95,7 +95,7 @@ std::unique_ptr<SVGFilterBuilder> RenderSVGResourceFilter::buildPrimitives(SVGFi
 
     // Add effects to the builder
     auto builder = std::make_unique<SVGFilterBuilder>(SourceGraphic::create(filter), SourceAlpha::create(filter));
-    auto children = childrenOfType<SVGFilterPrimitiveStandardAttributes>(&filterElement());
+    auto children = childrenOfType<SVGFilterPrimitiveStandardAttributes>(filterElement());
     for (auto element = children.begin(), end = children.end(); element != end; ++element) {
         RefPtr<FilterEffect> effect = element->build(builder.get(), filter);
         if (!effect) {
index d928ac4..b94b532 100644 (file)
@@ -119,7 +119,7 @@ bool RenderSVGResourceMasker::drawContentIntoMaskImage(MaskerData* maskerData, C
     }
 
     // Draw the content into the ImageBuffer.
-    auto children = childrenOfType<SVGElement>(&maskElement());
+    auto children = childrenOfType<SVGElement>(maskElement());
     for (auto it = children.begin(), end = children.end(); it != end; ++it) {
         SVGElement& child = *it;
         auto renderer = child.renderer();
index eee8951..14511e6 100644 (file)
@@ -272,7 +272,7 @@ PassOwnPtr<ImageBuffer> RenderSVGResourcePattern::createTileImage(const PatternA
         contentTransformation = tileImageTransform;
 
     // Draw the content into the ImageBuffer.
-    auto children = childrenOfType<SVGElement>(attributes.patternContentElement());
+    auto children = childrenOfType<SVGElement>(*attributes.patternContentElement());
     for (auto it = children.begin(), end = children.end(); it != end; ++it) {
         const SVGElement& child = *it;
         if (!child.renderer())
index 1fcc166..6312cc6 100644 (file)
@@ -89,7 +89,7 @@ bool SVGAltGlyphDefElement::hasValidGlyphElements(Vector<String>& glyphNames) co
     bool fountFirstGlyphRef = false;
     bool foundFirstAltGlyphItem = false;
 
-    auto svgChildren = childrenOfType<SVGElement>(this);
+    auto svgChildren = childrenOfType<SVGElement>(*this);
     for (auto it = svgChildren.begin(), end = svgChildren.end(); it != end; ++it) {
         const SVGElement& child = *it;
         if (!foundFirstAltGlyphItem && isSVGGlyphRefElement(child)) {
index f921287..a770d46 100644 (file)
@@ -50,7 +50,8 @@ 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 (auto glyphRef = childrenOfType<SVGGlyphRefElement>(this).begin(), end = childrenOfType<SVGGlyphRefElement>(this).end(); glyphRef != end; ++glyphRef) {
+    auto glyphChildren = childrenOfType<SVGGlyphRefElement>(*this);
+    for (auto glyphRef = glyphChildren.begin(), end = glyphChildren.end(); glyphRef != end; ++glyphRef) {
         String referredGlyphName;
         if (glyphRef->hasValidGlyphElement(referredGlyphName))
             glyphNames.append(referredGlyphName);
index 4deea7e..56598a7 100644 (file)
@@ -139,7 +139,7 @@ void SVGAnimateMotionElement::updateAnimationPath()
     m_animationPath = Path();
     bool foundMPath = false;
 
-    auto mPathChildren = childrenOfType<SVGMPathElement>(this);
+    auto mPathChildren = childrenOfType<SVGMPathElement>(*this);
     for (auto mPath = mPathChildren.begin(), end = mPathChildren.end(); mPath != end; ++mPath) {
         SVGPathElement* pathElement = mPath->pathElement();
         if (pathElement) {
index df3b8c5..c601c49 100644 (file)
@@ -510,7 +510,7 @@ void SVGElement::animatedPropertyTypeForAttribute(const QualifiedName& attribute
 
 bool SVGElement::haveLoadedRequiredResources()
 {
-    auto svgChildren = childrenOfType<SVGElement>(this);
+    auto svgChildren = childrenOfType<SVGElement>(*this);
     for (auto child = svgChildren.begin(), end = svgChildren.end(); child != end; ++child) {
         if (!child->haveLoadedRequiredResources())
             return false;
@@ -925,7 +925,7 @@ String SVGElement::title() const
 
     // If we aren't an instance in a <use> or the <use> title was not found, then find the first
     // <title> child of this element.
-    auto firstTitle = descendantsOfType<SVGTitleElement>(this).first();
+    auto firstTitle = descendantsOfType<SVGTitleElement>(*this).first();
     return firstTitle ? const_cast<SVGTitleElement*>(firstTitle)->innerText() : String();
 }
 
index ab3e343..23cf42c 100644 (file)
@@ -90,7 +90,8 @@ PassRefPtr<FilterEffect> SVGFEComponentTransferElement::build(SVGFilterBuilder*
     ComponentTransferFunction blue;
     ComponentTransferFunction alpha;
 
-    for (auto child = childrenOfType<SVGElement>(this).begin(), end = childrenOfType<SVGElement>(this).end(); child != end; ++child) {
+    auto children = childrenOfType<SVGElement>(*this);
+    for (auto child = children.begin(), end = children.end(); child != end; ++child) {
         SVGElement* element = &*child;
         if (isSVGFEFuncRElement(element))
             red = toSVGFEFuncRElement(element)->transferFunction();
index 421e5f8..1bd725c 100644 (file)
@@ -71,7 +71,8 @@ SVGFELightElement::SVGFELightElement(const QualifiedName& tagName, Document& doc
 
 SVGFELightElement* SVGFELightElement::findLightElement(const SVGElement* svgElement)
 {
-    for (auto child = childrenOfType<SVGElement>(svgElement).begin(), end = childrenOfType<SVGElement>(svgElement).end(); child != end; ++child) {
+    auto children = childrenOfType<SVGElement>(*svgElement);
+    for (auto child = children.begin(), end = children.end(); child != end; ++child) {
         if (isSVGFEDistantLightElement(*child) || isSVGFEPointLightElement(*child) || isSVGFESpotLightElement(*child))
             return static_cast<SVGFELightElement*>(const_cast<SVGElement*>(&*child));
     }
index 6895491..bfebaf6 100644 (file)
@@ -47,7 +47,8 @@ PassRefPtr<FilterEffect> SVGFEMergeElement::build(SVGFilterBuilder* filterBuilde
     RefPtr<FilterEffect> effect = FEMerge::create(filter);
     FilterEffectVector& mergeInputs = effect->inputEffects();
 
-    for (auto mergeNode = childrenOfType<SVGFEMergeNodeElement>(this).begin(), end = childrenOfType<SVGFEMergeNodeElement>(this).end(); mergeNode != end; ++mergeNode) {
+    auto children = childrenOfType<SVGFEMergeNodeElement>(*this);
+    for (auto mergeNode = children.begin(), end = children.end(); mergeNode != end; ++mergeNode) {
         FilterEffect* mergeEffect = filterBuilder->getEffectById(mergeNode->in1());
         if (!mergeEffect)
             return 0;
index c8c6e0a..ef3ba98 100644 (file)
@@ -71,7 +71,7 @@ void SVGFontElement::invalidateGlyphCache()
 
 const SVGMissingGlyphElement* SVGFontElement::firstMissingGlyphElement() const
 {
-    return childrenOfType<SVGMissingGlyphElement>(this).first();
+    return childrenOfType<SVGMissingGlyphElement>(*this).first();
 }
 
 void SVGFontElement::registerLigaturesInGlyphCache(Vector<String>& ligatures)
@@ -118,7 +118,8 @@ void SVGFontElement::ensureGlyphCache()
 
     const SVGMissingGlyphElement* firstMissingGlyphElement = nullptr;
     Vector<String> ligatures;
-    for (auto child = childrenOfType<SVGElement>(this).begin(), end = childrenOfType<SVGElement>(this).end(); child != end; ++child) {
+    auto children = childrenOfType<SVGElement>(*this);
+    for (auto child = children.begin(), end = children.end(); child != end; ++child) {
         SVGElement* element = &*child;
         if (isSVGGlyphElement(element)) {
             SVGGlyphElement* glyph = toSVGGlyphElement(element);
index 8f766ca..0856f84 100644 (file)
@@ -228,7 +228,7 @@ void SVGFontFaceElement::rebuildFontFace()
     }
 
     // we currently ignore all but the first src element, alternatively we could concat them
-    auto srcElement = childrenOfType<SVGFontFaceSrcElement>(this).first();
+    auto srcElement = childrenOfType<SVGFontFaceSrcElement>(*this).first();
 
     bool describesParentFont = isSVGFontElement(parentNode());
     RefPtr<CSSValueList> list;
index 7bcadd9..9f67107 100644 (file)
@@ -48,7 +48,7 @@ PassRefPtr<SVGFontFaceSrcElement> SVGFontFaceSrcElement::create(const QualifiedN
 PassRefPtr<CSSValueList> SVGFontFaceSrcElement::srcValue() const
 {
     RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();
-    auto svgChildren = childrenOfType<SVGElement>(this);
+    auto svgChildren = childrenOfType<SVGElement>(*this);
     for (auto child = svgChildren.begin(), end = svgChildren.end(); child != end; ++child) {
         RefPtr<CSSFontFaceSrcValue> srcValue;
         if (isSVGFontFaceUriElement(*child))
index f262398..c5b014b 100644 (file)
@@ -141,7 +141,7 @@ Vector<Gradient::ColorStop> SVGGradientElement::buildStops()
 {
     Vector<Gradient::ColorStop> stops;
 
-    auto stopChildren = childrenOfType<SVGStopElement>(this);
+    auto stopChildren = childrenOfType<SVGStopElement>(*this);
     float previousOffset = 0.0f;
 
     for (auto stop = stopChildren.begin(), end = stopChildren.end(); stop != end; ++stop) {
index 89ca006..a40b959 100644 (file)
@@ -337,7 +337,7 @@ PassRefPtr<NodeList> SVGSVGElement::collectIntersectionOrEnclosureList(const Flo
 {
     Vector<Ref<Element>> elements;
 
-    auto svgDescendants = descendantsOfType<SVGElement>(referenceElement ? referenceElement : this);
+    auto svgDescendants = descendantsOfType<SVGElement>(*(referenceElement ? referenceElement : this));
     for (auto it = svgDescendants.begin(), end = svgDescendants.end(); it != end; ++it) {
         const SVGElement* svgElement = &*it;
         if (collect == CollectIntersectionList) {
@@ -777,7 +777,8 @@ Element* SVGSVGElement::getElementById(const AtomicString& id)
 
     // Fall back to traversing our subtree. Duplicate ids are allowed, the first found will
     // be returned.
-    for (auto element = elementDescendants(this).begin(), end = elementDescendants(this).end(); element != end; ++element) {
+    auto descendants = elementDescendants(*this);
+    for (auto element = descendants.begin(), end = descendants.end(); element != end; ++element) {
         if (element->getIdAttribute() == id)
             return &*element;
     }
index 19ff800..c66b2bd 100644 (file)
@@ -53,7 +53,7 @@ bool SVGSwitchElement::childShouldCreateRenderer(const Node* child) const
 {
     // FIXME: This function does not do what the comment below implies it does.
     // It will create a renderer for any valid SVG element children, not just the first one.
-    auto svgChildren = childrenOfType<SVGElement>(this);
+    auto svgChildren = childrenOfType<SVGElement>(*this);
     for (auto element = svgChildren.begin(), end = svgChildren.end(); element != end; ++element) {
         if (!element->isValid())
             continue;
index 47b317b..a24cd8b 100644 (file)
@@ -369,7 +369,7 @@ static bool isDisallowedElement(const Element& element)
 
 static bool subtreeContainsDisallowedElement(SVGElement& start)
 {
-    auto descendants = elementDescendants(&start);
+    auto descendants = elementDescendants(start);
     for (auto element = descendants.begin(), end = descendants.end(); element != end; ++element) {
         if (isDisallowedElement(*element))
             return true;
@@ -606,7 +606,7 @@ void SVGUseElement::buildInstanceTree(SVGElement* target, SVGElementInstance* ta
     // is the SVGGElement object for the 'g', and then two child SVGElementInstance objects, each of which has
     // its correspondingElement that is an SVGRectElement object.
 
-    auto svgChildren = childrenOfType<SVGElement>(target);
+    auto svgChildren = childrenOfType<SVGElement>(*target);
     for (auto element = svgChildren.begin(), end = svgChildren.end(); element != end; ++element) {
         // Skip any non-svg nodes or any disallowed element.
         if (isDisallowedElement(*element))
@@ -664,8 +664,8 @@ static inline void removeDisallowedElementsFromSubtree(SVGElement& subtree)
 {
     ASSERT(!subtree.inDocument());
     Vector<Element*> toRemove;
-    auto it = elementDescendants(&subtree).begin();
-    auto end = elementDescendants(&subtree).end();
+    auto it = elementDescendants(subtree).begin();
+    auto end = elementDescendants(subtree).end();
     while (it != end) {
         if (isDisallowedElement(*it)) {
             toRemove.append(&*it);
index 82ad317..4691578 100644 (file)
@@ -223,7 +223,7 @@ void SMILTimeContainer::updateDocumentOrderIndexes()
 {
     unsigned timingElementCount = 0;
 
-    auto smilDescendants = descendantsOfType<SVGSMILElement>(m_ownerSVGElement);
+    auto smilDescendants = descendantsOfType<SVGSMILElement>(*m_ownerSVGElement);
     for (auto smilElement = smilDescendants.begin(), end = smilDescendants.end(); smilElement != end; ++smilElement)
         smilElement->setDocumentOrderIndex(timingElementCount++);
 
index 1ecaa6f..4c5f5f1 100644 (file)
@@ -75,7 +75,7 @@ bool SVGImage::hasSingleSecurityOrigin() const
         return true;
 
     // Don't allow foreignObject elements since they can leak information with arbitrary HTML (like spellcheck or control theme).
-    if (descendantsOfType<SVGForeignObjectElement>(rootElement).first())
+    if (descendantsOfType<SVGForeignObjectElement>(*rootElement).first())
         return false;
 
     // Because SVG image rendering disallows external resources and links,