Switch some more code to element child/descendant iterators
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Aug 2013 13:04:21 +0000 (13:04 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Aug 2013 13:04:21 +0000 (13:04 +0000)
https://bugs.webkit.org/show_bug.cgi?id=120355

Reviewed by Andreas Kling.

Move from Traversal<ElementType>::next() and Traversal<ElementType>::nextSibling() to iterators.

* css/CSSFontFaceSource.cpp:
(WebCore::CSSFontFaceSource::getFontData):
* dom/Document.cpp:
(WebCore::Document::removeTitle):
(WebCore::Document::updateBaseURL):
(WebCore::Document::processBaseElement):
* dom/TreeScope.cpp:
(WebCore::TreeScope::labelElementForId):
(WebCore::TreeScope::findAnchor):
* html/HTMLFieldSetElement.cpp:
(WebCore::HTMLFieldSetElement::invalidateDisabledStateUnder):
(WebCore::HTMLFieldSetElement::childrenChanged):
* html/HTMLLabelElement.cpp:
(WebCore::HTMLLabelElement::control):
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::cancelPendingEventsAndCallbacks):
* html/HTMLObjectElement.cpp:
(WebCore::HTMLObjectElement::parametersForPlugin):
* rendering/FilterEffectRenderer.cpp:
(WebCore::FilterEffectRenderer::buildReferenceFilter):
* svg/SVGFilterPrimitiveStandardAttributes.h:
(WebCore::isSVGFilterPrimitiveStandardAttributes):
(WebCore::SVGFilterPrimitiveStandardAttributes):
* svg/animation/SMILTimeContainer.cpp:
(WebCore::SMILTimeContainer::updateDocumentOrderIndexes):
* svg/graphics/SVGImage.cpp:
(WebCore::SVGImage::hasSingleSecurityOrigin):

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

12 files changed:
Source/WebCore/ChangeLog
Source/WebCore/css/CSSFontFaceSource.cpp
Source/WebCore/dom/Document.cpp
Source/WebCore/dom/TreeScope.cpp
Source/WebCore/html/HTMLFieldSetElement.cpp
Source/WebCore/html/HTMLLabelElement.cpp
Source/WebCore/html/HTMLMediaElement.cpp
Source/WebCore/html/HTMLObjectElement.cpp
Source/WebCore/rendering/FilterEffectRenderer.cpp
Source/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h
Source/WebCore/svg/animation/SMILTimeContainer.cpp
Source/WebCore/svg/graphics/SVGImage.cpp

index 4eab7ffed2c02e5c66829fe092395074197c7132..8d1b8347556f75e400f26fbda07c8473220297fc 100644 (file)
@@ -1,3 +1,40 @@
+2013-08-27  Antti Koivisto  <antti@apple.com>
+
+        Switch some more code to element child/descendant iterators
+        https://bugs.webkit.org/show_bug.cgi?id=120355
+
+        Reviewed by Andreas Kling.
+
+        Move from Traversal<ElementType>::next() and Traversal<ElementType>::nextSibling() to iterators.
+
+        * css/CSSFontFaceSource.cpp:
+        (WebCore::CSSFontFaceSource::getFontData):
+        * dom/Document.cpp:
+        (WebCore::Document::removeTitle):
+        (WebCore::Document::updateBaseURL):
+        (WebCore::Document::processBaseElement):
+        * dom/TreeScope.cpp:
+        (WebCore::TreeScope::labelElementForId):
+        (WebCore::TreeScope::findAnchor):
+        * html/HTMLFieldSetElement.cpp:
+        (WebCore::HTMLFieldSetElement::invalidateDisabledStateUnder):
+        (WebCore::HTMLFieldSetElement::childrenChanged):
+        * html/HTMLLabelElement.cpp:
+        (WebCore::HTMLLabelElement::control):
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::cancelPendingEventsAndCallbacks):
+        * html/HTMLObjectElement.cpp:
+        (WebCore::HTMLObjectElement::parametersForPlugin):
+        * rendering/FilterEffectRenderer.cpp:
+        (WebCore::FilterEffectRenderer::buildReferenceFilter):
+        * svg/SVGFilterPrimitiveStandardAttributes.h:
+        (WebCore::isSVGFilterPrimitiveStandardAttributes):
+        (WebCore::SVGFilterPrimitiveStandardAttributes):
+        * svg/animation/SMILTimeContainer.cpp:
+        (WebCore::SMILTimeContainer::updateDocumentOrderIndexes):
+        * svg/graphics/SVGImage.cpp:
+        (WebCore::SVGImage::hasSingleSecurityOrigin):
+
 2013-08-26  Andreas Kling  <akling@apple.com>
 
         FocusController::focusedOrMainFrame() should return a reference.
index 422c00be9e3b35e20d57dc01fa7785f35b6d3b01..a627e563a4c03413390c59441c1380bff5f903fe 100644 (file)
 #include "config.h"
 #include "CSSFontFaceSource.h"
 
-#include "CachedFont.h"
 #include "CSSFontFace.h"
 #include "CSSFontSelector.h"
+#include "CachedFont.h"
 #include "CachedResourceLoader.h"
+#include "ChildIterator.h"
 #include "Document.h"
-#include "ElementTraversal.h"
 #include "FontCache.h"
 #include "FontDescription.h"
 #include "SimpleFontData.h"
@@ -139,14 +139,16 @@ PassRefPtr<SimpleFontData> CSSFontFaceSource::getFontData(const FontDescription&
                 if (!m_externalSVGFontElement)
                     return 0;
 
-                if (auto fontFaceElement = Traversal<SVGFontFaceElement>::firstChild(m_externalSVGFontElement.get())) {
+                auto fontFaceChildren = childrenOfType<SVGFontFaceElement>(m_externalSVGFontElement.get());
+                auto firstFontFace = fontFaceChildren.begin();
+                if (firstFontFace != fontFaceChildren.end()) {
                     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.
-                        m_svgFontFaceElement = fontFaceElement;
+                        m_svgFontFaceElement = &*firstFontFace;
                     }
 
-                    fontData = SimpleFontData::create(SVGFontData::create(fontFaceElement), fontDescription.computedPixelSize(), syntheticBold, syntheticItalic);
+                    fontData = SimpleFontData::create(SVGFontData::create(&*firstFontFace), fontDescription.computedPixelSize(), syntheticBold, syntheticItalic);
                 }
             } else
 #endif
index 84762c0d032ee39529fc4672cf914253adfd52a1..147b6796ab3cbe223a45fec76441c49a8ed56151 100644 (file)
@@ -1565,8 +1565,9 @@ void Document::removeTitle(Element* titleElement)
 
     // Update title based on first title element in the head, if one exists.
     if (HTMLElement* headElement = head()) {
-        if (HTMLTitleElement* titleElement = Traversal<HTMLTitleElement>::firstWithin(headElement))
-            setTitleElement(titleElement->textWithDirection(), titleElement);
+        auto firstTitle = childrenOfType<HTMLTitleElement>(headElement).begin();
+        if (firstTitle != childrenOfType<HTMLTitleElement>(headElement).end())
+            setTitleElement(firstTitle->textWithDirection(), &*firstTitle);
     }
 
     if (!m_titleElement)
@@ -2654,7 +2655,8 @@ 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.
-        for (HTMLAnchorElement* anchor = Traversal<HTMLAnchorElement>::firstWithin(this); anchor; anchor = Traversal<HTMLAnchorElement>::next(anchor))
+        auto anchorDescendants = descendantsOfType<HTMLAnchorElement>(this);
+        for (auto anchor = anchorDescendants.begin(), end = anchorDescendants.end(); anchor != end; ++anchor)
             anchor->invalidateCachedVisitedLinkHash();
     }
 }
@@ -2670,7 +2672,8 @@ void Document::processBaseElement()
     // Find the first href attribute in a base element and the first target attribute in a base element.
     const AtomicString* href = 0;
     const AtomicString* target = 0;
-    for (HTMLBaseElement* base = Traversal<HTMLBaseElement>::firstWithin(this); base && (!href || !target); base = Traversal<HTMLBaseElement>::next(base)) {
+    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);
             if (!value.isNull())
index 50604b21604a91da8ac154418b85f78a09ba099c..2396d7cdd9e98de5b137b9e172695ace5b99aa6c 100644 (file)
@@ -30,9 +30,9 @@
 #include "ContainerNode.h"
 #include "DOMSelection.h"
 #include "DOMWindow.h"
+#include "DescendantIterator.h"
 #include "Document.h"
 #include "Element.h"
-#include "ElementTraversal.h"
 #include "FocusController.h"
 #include "Frame.h"
 #include "FrameView.h"
@@ -298,10 +298,12 @@ HTMLLabelElement* TreeScope::labelElementForId(const AtomicString& forAttributeV
     if (!m_labelsByForAttribute) {
         // Populate the map on first access.
         m_labelsByForAttribute = adoptPtr(new DocumentOrderedMap);
-        for (HTMLLabelElement* label = Traversal<HTMLLabelElement>::firstWithin(rootNode()); label; label = Traversal<HTMLLabelElement>::next(label)) {
+
+        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())
-                addLabel(forValue, label);
+                addLabel(forValue, &*label);
         }
     }
 
@@ -339,15 +341,16 @@ Element* TreeScope::findAnchor(const String& name)
         return 0;
     if (Element* element = getElementById(name))
         return element;
-    for (HTMLAnchorElement* anchor = Traversal<HTMLAnchorElement>::firstWithin(rootNode()); anchor; anchor = Traversal<HTMLAnchorElement>::next(anchor)) {
+    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.
             if (equalIgnoringCase(anchor->name(), name))
-                return anchor;
+                return &*anchor;
         } else {
             // Strict mode, names need to match exactly.
             if (anchor->name() == name)
-                return anchor;
+                return &*anchor;
         }
     }
     return 0;
index 45a5ac5c4c27d8da67be90c3b853671bcfc7bfb5..11078f2f61ca6c6c442379582d8acd43c8a990a1 100644 (file)
@@ -25,7 +25,8 @@
 #include "config.h"
 #include "HTMLFieldSetElement.h"
 
-#include "ElementTraversal.h"
+#include "ChildIterator.h"
+#include "DescendantIterator.h"
 #include "HTMLCollection.h"
 #include "HTMLLegendElement.h"
 #include "HTMLNames.h"
@@ -51,7 +52,8 @@ PassRefPtr<HTMLFieldSetElement> HTMLFieldSetElement::create(const QualifiedName&
 
 void HTMLFieldSetElement::invalidateDisabledStateUnder(Element* base)
 {
-    for (HTMLFormControlElement* control = Traversal<HTMLFormControlElement>::firstWithin(base); control; control = Traversal<HTMLFormControlElement>::next(control, base))
+    auto formControlDescendants = descendantsOfType<HTMLFormControlElement>(base);
+    for (auto control = formControlDescendants.begin(), end = formControlDescendants.end(); control != end; ++control)
         control->ancestorDisabledStateWasChanged();
 }
 
@@ -65,8 +67,10 @@ void HTMLFieldSetElement::disabledAttributeChanged()
 void HTMLFieldSetElement::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta)
 {
     HTMLFormControlElement::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta);
-    for (HTMLLegendElement* legend = Traversal<HTMLLegendElement>::firstChild(this); legend; legend = Traversal<HTMLLegendElement>::nextSibling(legend))
-        invalidateDisabledStateUnder(legend);
+
+    auto legendChildren = childrenOfType<HTMLLegendElement>(this);
+    for (auto legend = legendChildren.begin(), end = legendChildren.end(); legend != end; ++legend)
+        invalidateDisabledStateUnder(&*legend);
 }
 
 bool HTMLFieldSetElement::supportsFocus() const
index c9c089d537781da20a7d3cfbfda180fee3ad7573..05d27e6069909f47eaa14b22047c5ba9280ddd5e 100644 (file)
@@ -25,8 +25,8 @@
 #include "config.h"
 #include "HTMLLabelElement.h"
 
+#include "DescendantIterator.h"
 #include "Document.h"
-#include "ElementTraversal.h"
 #include "Event.h"
 #include "EventNames.h"
 #include "FormAssociatedElement.h"
@@ -69,11 +69,10 @@ 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".
-
-        LabelableElement* labelableElement = Traversal<LabelableElement>::firstWithin(this);
-        for (; labelableElement; labelableElement = Traversal<LabelableElement>::next(labelableElement, this)) {
+        auto labelableDescendants = descendantsOfType<LabelableElement>(this);
+        for (auto labelableElement = labelableDescendants.begin(), end = labelableDescendants.end(); labelableElement != end; ++labelableElement) {
             if (labelableElement->supportLabels())
-                return labelableElement;
+                return &*labelableElement;
         }
         return 0;
     }
index c8c2bffd9d76cc20fe0cc4bf7bd13646c079de4f..2b7db6f48631098e8c29696475187f95226a6778 100644 (file)
@@ -1651,7 +1651,8 @@ void HTMLMediaElement::cancelPendingEventsAndCallbacks()
     LOG(Media, "HTMLMediaElement::cancelPendingEventsAndCallbacks");
     m_asyncEventQueue->cancelAllEvents();
 
-    for (auto source = Traversal<HTMLSourceElement>::firstChild(this); source; source = Traversal<HTMLSourceElement>::nextSibling(source))
+    auto sourceChildren = childrenOfType<HTMLSourceElement>(this);
+    for (auto source = sourceChildren.begin(), end = sourceChildren.end(); source != end; ++source)
         source->cancelPendingErrorEvent();
 }
 
index adad665395d57ab6914f9e8c7d0c6d17028a8d76..1e52b9a3986897b1d646291b4f0896a09f19be96 100644 (file)
@@ -27,9 +27,9 @@
 #include "Attribute.h"
 #include "CSSValueKeywords.h"
 #include "CachedImage.h"
+#include "ChildIterator.h"
 #include "Chrome.h"
 #include "ChromeClient.h"
-#include "ElementTraversal.h"
 #include "EventNames.h"
 #include "ExceptionCode.h"
 #include "FormDataList.h"
@@ -153,7 +153,8 @@ 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.
-    for (auto param = Traversal<HTMLParamElement>::firstChild(this); param; param = Traversal<HTMLParamElement>::nextSibling(param)) {
+    auto paramChildren = childrenOfType<HTMLParamElement>(this);
+    for (auto param = paramChildren.begin(), end = paramChildren.end(); param != end; ++param) {
         String name = param->name();
         if (name.isEmpty())
             continue;
index 6ecd3927097ce77880396a6716837d51b23f37c7..081ea778b27097f0bbd739d6281d1b7428f107f9 100644 (file)
@@ -29,9 +29,9 @@
 
 #include "FilterEffectRenderer.h"
 
+#include "ChildIterator.h"
 #include "ColorSpace.h"
 #include "Document.h"
-#include "ElementTraversal.h"
 #include "FEColorMatrix.h"
 #include "FEComponentTransfer.h"
 #include "FEDropShadow.h"
@@ -159,11 +159,9 @@ PassRefPtr<FilterEffect> FilterEffectRenderer::buildReferenceFilter(RenderObject
     // This may need a spec clarification.
     RefPtr<SVGFilterBuilder> builder = SVGFilterBuilder::create(previousEffect, SourceAlpha::create(this));
 
-    for (SVGElement* svgElement = Traversal<SVGElement>::firstChild(filter); svgElement; svgElement = Traversal<SVGElement>::nextSibling(svgElement)) {
-        if (!svgElement->isFilterEffect())
-            continue;
-        SVGFilterPrimitiveStandardAttributes* effectElement = static_cast<SVGFilterPrimitiveStandardAttributes*>(svgElement);
-
+    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);
         if (!effect)
             continue;
index 98f91d4b85fb9dda84f07e556691208303867ecd..a89747a1bef478f4a776360d987865736a324f7f 100644 (file)
@@ -83,6 +83,14 @@ private:
 
 void invalidateFilterPrimitiveParent(SVGElement*);
 
+inline bool isSVGFilterPrimitiveStandardAttributes(const Node* node)
+{
+    return node->isSVGElement() && toSVGElement(node)->isFilterEffect();
+}
+
+template <> inline bool isElementOfType<SVGFilterPrimitiveStandardAttributes>(const Element* element) { return isSVGFilterPrimitiveStandardAttributes(element); }
+
+
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index c3f90cf08200829cf35fcb1b84874936b0b636d8..4df0ffb26972cc7bfbbb72a4861e74a26b6f4357 100644 (file)
@@ -27,8 +27,8 @@
 #include "SMILTimeContainer.h"
 
 #if ENABLE(SVG)
+#include "DescendantIterator.h"
 #include "Document.h"
-#include "ElementTraversal.h"
 #include "SVGNames.h"
 #include "SVGSMILElement.h"
 #include "SVGSVGElement.h"
@@ -222,9 +222,11 @@ void SMILTimeContainer::timerFired(Timer<SMILTimeContainer>*)
 void SMILTimeContainer::updateDocumentOrderIndexes()
 {
     unsigned timingElementCount = 0;
-    SVGSMILElement* smilElement = Traversal<SVGSMILElement>::firstWithin(m_ownerSVGElement);
-    for (; smilElement; smilElement = Traversal<SVGSMILElement>::next(smilElement, m_ownerSVGElement))
+
+    auto smilDescendants = descendantsOfType<SVGSMILElement>(m_ownerSVGElement);
+    for (auto smilElement = smilDescendants.begin(), end = smilDescendants.end(); smilElement != end; ++smilElement)
         smilElement->setDocumentOrderIndex(timingElementCount++);
+
     m_documentOrderIndexesDirty = false;
 }
 
index 7b24ff9d164d33bae1e9acbe7f439fc8d9a3bfb1..1cf6d076960d0a0703c69b3ab4354696dcc18e61 100644 (file)
@@ -31,8 +31,8 @@
 #include "SVGImage.h"
 
 #include "Chrome.h"
+#include "DescendantIterator.h"
 #include "DocumentLoader.h"
-#include "ElementTraversal.h"
 #include "FrameView.h"
 #include "ImageBuffer.h"
 #include "ImageObserver.h"
@@ -74,7 +74,8 @@ 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 (Traversal<SVGForeignObjectElement>::firstWithin(rootElement))
+    auto foreignObjectDescendants = descendantsOfType<SVGForeignObjectElement>(rootElement);
+    if (foreignObjectDescendants.begin() != foreignObjectDescendants.end())
         return false;
 
     // Because SVG image rendering disallows external resources and links,