Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / css / SiblingTraversalStrategies.h
index dce3c41..65063ad 100644 (file)
 #include "core/dom/ElementTraversal.h"
 #include "core/rendering/style/RenderStyle.h"
 
-namespace WebCore {
+namespace blink {
 
-struct DOMSiblingTraversalStrategy {
+class DOMSiblingTraversalStrategy {
+public:
     bool isFirstChild(Element&) const;
     bool isLastChild(Element&) const;
     bool isFirstOfType(Element&, const QualifiedName&) const;
@@ -45,6 +46,15 @@ struct DOMSiblingTraversalStrategy {
     int countElementsAfter(Element&) const;
     int countElementsOfTypeBefore(Element&, const QualifiedName&) const;
     int countElementsOfTypeAfter(Element&, const QualifiedName&) const;
+
+private:
+    class HasTagName {
+    public:
+        explicit HasTagName(const QualifiedName& tagName) : m_tagName(tagName) { }
+        bool operator() (const Element& element) const { return element.hasTagName(m_tagName); }
+    private:
+        const QualifiedName& m_tagName;
+    };
 };
 
 inline bool DOMSiblingTraversalStrategy::isFirstChild(Element& element) const
@@ -59,20 +69,12 @@ inline bool DOMSiblingTraversalStrategy::isLastChild(Element& element) const
 
 inline bool DOMSiblingTraversalStrategy::isFirstOfType(Element& element, const QualifiedName& type) const
 {
-    for (const Element* sibling = ElementTraversal::previousSibling(element); sibling; sibling = ElementTraversal::previousSibling(*sibling)) {
-        if (sibling->hasTagName(type))
-            return false;
-    }
-    return true;
+    return !ElementTraversal::previousSibling(element, HasTagName(type));
 }
 
 inline bool DOMSiblingTraversalStrategy::isLastOfType(Element& element, const QualifiedName& type) const
 {
-    for (const Element* sibling = ElementTraversal::nextSibling(element); sibling; sibling = ElementTraversal::nextSibling(*sibling)) {
-        if (sibling->hasTagName(type))
-            return false;
-    }
-    return true;
+    return !ElementTraversal::nextSibling(element, HasTagName(type));
 }
 
 inline int DOMSiblingTraversalStrategy::countElementsBefore(Element& element) const
@@ -87,11 +89,8 @@ inline int DOMSiblingTraversalStrategy::countElementsBefore(Element& element) co
 inline int DOMSiblingTraversalStrategy::countElementsOfTypeBefore(Element& element, const QualifiedName& type) const
 {
     int count = 0;
-    for (const Element* sibling = ElementTraversal::previousSibling(element); sibling; sibling = ElementTraversal::previousSibling(*sibling)) {
-        if (sibling->hasTagName(type))
-            ++count;
-    }
-
+    for (const Element* sibling = ElementTraversal::previousSibling(element, HasTagName(type)); sibling; sibling = ElementTraversal::previousSibling(*sibling, HasTagName(type)))
+        ++count;
     return count;
 }
 
@@ -100,18 +99,14 @@ inline int DOMSiblingTraversalStrategy::countElementsAfter(Element& element) con
     int count = 0;
     for (const Element* sibling = ElementTraversal::nextSibling(element); sibling; sibling = ElementTraversal::nextSibling(*sibling))
         ++count;
-
     return count;
 }
 
 inline int DOMSiblingTraversalStrategy::countElementsOfTypeAfter(Element& element, const QualifiedName& type) const
 {
     int count = 0;
-    for (const Element* sibling = ElementTraversal::nextSibling(element); sibling; sibling = ElementTraversal::nextSibling(*sibling)) {
-        if (sibling->hasTagName(type))
-            ++count;
-    }
-
+    for (const Element* sibling = ElementTraversal::nextSibling(element, HasTagName(type)); sibling; sibling = ElementTraversal::nextSibling(*sibling, HasTagName(type)))
+        ++count;
     return count;
 }
 
@@ -168,7 +163,7 @@ inline bool ShadowDOMSiblingTraversalStrategy::isFirstOfType(Element& element, c
     ASSERT(element == toElement(m_siblings[m_nth]));
 
     for (int i = m_nth - 1; i >= 0; --i) {
-        if (m_siblings[i]->hasTagName(type))
+        if (m_siblings[i]->isElementNode() && toElement(m_siblings[i])->hasTagName(type))
             return false;
     }
 
@@ -180,7 +175,7 @@ inline bool ShadowDOMSiblingTraversalStrategy::isLastOfType(Element& element, co
     ASSERT(element == toElement(m_siblings[m_nth]));
 
     for (size_t i = m_nth + 1; i < m_siblings.size(); ++i) {
-        if (m_siblings[i]->hasTagName(type))
+        if (m_siblings[i]->isElementNode() && toElement(m_siblings[i])->hasTagName(type))
             return false;
     }
 
@@ -219,7 +214,7 @@ inline int ShadowDOMSiblingTraversalStrategy::countElementsOfTypeBefore(Element&
 
     int count = 0;
     for (int i = m_nth - 1; i >= 0; --i) {
-        if (m_siblings[i]->hasTagName(type))
+        if (m_siblings[i]->isElementNode() && toElement(m_siblings[i])->hasTagName(type))
             ++count;
     }
 
@@ -232,7 +227,7 @@ inline int ShadowDOMSiblingTraversalStrategy::countElementsOfTypeAfter(Element&
 
     int count = 0;
     for (size_t i = m_nth + 1; i < m_siblings.size(); ++i) {
-        if (m_siblings[i]->hasTagName(type))
+        if (m_siblings[i]->isElementNode() && toElement(m_siblings[i])->hasTagName(type))
             return ++count;
     }