DocumentOrderedMap should use iterator
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 9 Jan 2014 20:22:06 +0000 (20:22 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 9 Jan 2014 20:22:06 +0000 (20:22 +0000)
https://bugs.webkit.org/show_bug.cgi?id=126696

Reviewed by Andreas Kling.

* dom/DocumentOrderedMap.cpp:
(WebCore::keyMatchesId):
(WebCore::keyMatchesName):
(WebCore::keyMatchesMapName):
(WebCore::keyMatchesLowercasedMapName):
(WebCore::keyMatchesLowercasedUsemap):
(WebCore::keyMatchesLabelForAttribute):
(WebCore::keyMatchesWindowNamedItem):
(WebCore::keyMatchesDocumentNamedItem):

    Switch to Element references.

(WebCore::DocumentOrderedMap::add):
(WebCore::DocumentOrderedMap::remove):
(WebCore::DocumentOrderedMap::get):
(WebCore::DocumentOrderedMap::getAllElementsById):

     Use element iterator instead of ElementTraversal.

* dom/DocumentOrderedMap.h:

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

Source/WebCore/ChangeLog
Source/WebCore/dom/DocumentOrderedMap.cpp
Source/WebCore/dom/DocumentOrderedMap.h

index b300811e28e18c4037871268fcaa6179c21b5f52..9e09c78baa1932f4c61d9e4c0f1ff9054c432903 100644 (file)
@@ -1,3 +1,31 @@
+2014-01-09  Antti Koivisto  <antti@apple.com>
+
+        DocumentOrderedMap should use iterator
+        https://bugs.webkit.org/show_bug.cgi?id=126696
+
+        Reviewed by Andreas Kling.
+
+        * dom/DocumentOrderedMap.cpp:
+        (WebCore::keyMatchesId):
+        (WebCore::keyMatchesName):
+        (WebCore::keyMatchesMapName):
+        (WebCore::keyMatchesLowercasedMapName):
+        (WebCore::keyMatchesLowercasedUsemap):
+        (WebCore::keyMatchesLabelForAttribute):
+        (WebCore::keyMatchesWindowNamedItem):
+        (WebCore::keyMatchesDocumentNamedItem):
+        
+            Switch to Element references.
+
+        (WebCore::DocumentOrderedMap::add):
+        (WebCore::DocumentOrderedMap::remove):
+        (WebCore::DocumentOrderedMap::get):
+        (WebCore::DocumentOrderedMap::getAllElementsById):
+        
+             Use element iterator instead of ElementTraversal.
+
+        * dom/DocumentOrderedMap.h:
+
 2014-01-09  Beth Dakin  <bdakin@apple.com>
 
         Margin tiles are not repainted when background color changes
index b11ed7debf65e55906644f658ad729a9b761cc7a..1cd8c659a2acf80b8ea509a4d03e126d85e0726a 100644 (file)
@@ -31,7 +31,7 @@
 #include "config.h"
 #include "DocumentOrderedMap.h"
 
-#include "ElementTraversal.h"
+#include "ElementIterator.h"
 #include "HTMLImageElement.h"
 #include "HTMLLabelElement.h"
 #include "HTMLMapElement.h"
@@ -41,45 +41,45 @@ namespace WebCore {
 
 using namespace HTMLNames;
 
-inline bool keyMatchesId(const AtomicStringImpl& key, Element* element)
+inline bool keyMatchesId(const AtomicStringImpl& key, const Element& element)
 {
-    return element->getIdAttribute().impl() == &key;
+    return element.getIdAttribute().impl() == &key;
 }
 
-inline bool keyMatchesName(const AtomicStringImpl& key, Element* element)
+inline bool keyMatchesName(const AtomicStringImpl& key, const Element& element)
 {
-    return element->getNameAttribute().impl() == &key;
+    return element.getNameAttribute().impl() == &key;
 }
 
-inline bool keyMatchesMapName(const AtomicStringImpl& key, Element* element)
+inline bool keyMatchesMapName(const AtomicStringImpl& key, const Element& element)
 {
-    return isHTMLMapElement(element) && toHTMLMapElement(element)->getName().impl() == &key;
+    return isHTMLMapElement(element) && toHTMLMapElement(element).getName().impl() == &key;
 }
 
-inline bool keyMatchesLowercasedMapName(const AtomicStringImpl& key, Element* element)
+inline bool keyMatchesLowercasedMapName(const AtomicStringImpl& key, const Element& element)
 {
-    return isHTMLMapElement(element) && toHTMLMapElement(element)->getName().lower().impl() == &key;
+    return isHTMLMapElement(element) && toHTMLMapElement(element).getName().lower().impl() == &key;
 }
 
-inline bool keyMatchesLowercasedUsemap(const AtomicStringImpl& key, Element* element)
+inline bool keyMatchesLowercasedUsemap(const AtomicStringImpl& key, const Element& element)
 {
     // FIXME: HTML5 specification says we should match both image and object elements.
-    return isHTMLImageElement(element) && toHTMLImageElement(element)->matchesLowercasedUsemap(key);
+    return isHTMLImageElement(element) && toHTMLImageElement(element).matchesLowercasedUsemap(key);
 }
 
-inline bool keyMatchesLabelForAttribute(const AtomicStringImpl& key, Element* element)
+inline bool keyMatchesLabelForAttribute(const AtomicStringImpl& key, const Element& element)
 {
-    return isHTMLLabelElement(element) && element->getAttribute(forAttr).impl() == &key;
+    return isHTMLLabelElement(element) && element.getAttribute(forAttr).impl() == &key;
 }
 
-inline bool keyMatchesWindowNamedItem(const AtomicStringImpl& key, Element* element)
+inline bool keyMatchesWindowNamedItem(const AtomicStringImpl& key, const Element& element)
 {
-    return WindowNameCollection::nodeMatches(element, &key);
+    return WindowNameCollection::nodeMatches(const_cast<Element*>(&element), &key);
 }
 
-inline bool keyMatchesDocumentNamedItem(const AtomicStringImpl& key, Element* element)
+inline bool keyMatchesDocumentNamedItem(const AtomicStringImpl& key, const Element& element)
 {
-    return DocumentNameCollection::nodeMatches(element, &key);
+    return DocumentNameCollection::nodeMatches(const_cast<Element*>(&element), &key);
 }
 
 void DocumentOrderedMap::clear()
@@ -99,7 +99,7 @@ void DocumentOrderedMap::add(const AtomicStringImpl& key, Element& element, cons
 
     MapEntry& entry = addResult.iterator->value;
     ASSERT_WITH_SECURITY_IMPLICATION(entry.count);
-    entry.element = 0;
+    entry.element = nullptr;
     entry.count++;
     entry.orderedList.clear();
 }
@@ -119,20 +119,20 @@ void DocumentOrderedMap::remove(const AtomicStringImpl& key, Element& element)
         m_map.remove(it);
     } else {
         if (entry.element == &element)
-            entry.element = 0;
+            entry.element = nullptr;
         entry.count--;
         entry.orderedList.clear(); // FIXME: Remove the element instead if there are only few items left.
     }
 }
 
-template<bool keyMatches(const AtomicStringImpl&, Element*)>
+template<bool keyMatches(const AtomicStringImpl&, const Element&)>
 inline Element* DocumentOrderedMap::get(const AtomicStringImpl& key, const TreeScope& scope) const
 {
     m_map.checkConsistency();
 
     auto it = m_map.find(&key);
     if (it == m_map.end())
-        return 0;
+        return nullptr;
 
     MapEntry& entry = it->value;
     ASSERT(entry.count);
@@ -143,16 +143,16 @@ inline Element* DocumentOrderedMap::get(const AtomicStringImpl& key, const TreeS
     }
 
     // We know there's at least one node that matches; iterate to find the first one.
-    for (Element* element = ElementTraversal::firstWithin(scope.rootNode()); element; element = ElementTraversal::next(element)) {
+    for (auto& element : descendantsOfType<Element>(*scope.rootNode())) {
         if (!keyMatches(key, element))
             continue;
-        entry.element = element;
-        ASSERT_WITH_SECURITY_IMPLICATION(element->isInTreeScope());
-        ASSERT_WITH_SECURITY_IMPLICATION(&element->treeScope() == &scope);
-        return element;
+        entry.element = &element;
+        ASSERT_WITH_SECURITY_IMPLICATION(element.isInTreeScope());
+        ASSERT_WITH_SECURITY_IMPLICATION(&element.treeScope() == &scope);
+        return &element;
     }
     ASSERT_NOT_REACHED();
-    return 0;
+    return nullptr;
 }
 
 Element* DocumentOrderedMap::getElementById(const AtomicStringImpl& key, const TreeScope& scope) const
@@ -201,19 +201,23 @@ const Vector<Element*>* DocumentOrderedMap::getAllElementsById(const AtomicStrin
 
     auto it = m_map.find(&key);
     if (it == m_map.end())
-        return 0;
+        return nullptr;
 
     MapEntry& entry = it->value;
     ASSERT_WITH_SECURITY_IMPLICATION(entry.count);
     if (!entry.count)
-        return 0;
+        return nullptr;
 
     if (entry.orderedList.isEmpty()) {
         entry.orderedList.reserveCapacity(entry.count);
-        for (Element* element = entry.element ? entry.element : ElementTraversal::firstWithin(scope.rootNode()); element; element = ElementTraversal::next(element)) {
+        auto elementDescandents = descendantsOfType<Element>(*scope.rootNode());
+        auto it = entry.element ? elementDescandents.find(*entry.element) : elementDescandents.begin();
+        auto end = elementDescandents.end();
+        for (; it != end; ++it) {
+            auto& element = *it;
             if (!keyMatchesId(key, element))
                 continue;
-            entry.orderedList.append(element);
+            entry.orderedList.append(&element);
         }
         ASSERT(entry.orderedList.size() == entry.count);
     }
index 3b224a21531bce4f63f6b87c54bd845b4f691824..221297bdd8f208c94f20e34b03e32b2e8af6432e 100644 (file)
@@ -67,7 +67,7 @@ public:
     const Vector<Element*>* getAllElementsById(const AtomicStringImpl&, const TreeScope&) const;
 
 private:
-    template<bool keyMatches(const AtomicStringImpl&, Element*)> Element* get(const AtomicStringImpl&, const TreeScope&) const;
+    template<bool keyMatches(const AtomicStringImpl&, const Element&)> Element* get(const AtomicStringImpl&, const TreeScope&) const;
 
     struct MapEntry {
         MapEntry()