Index: Source/core/html/HTMLCollection.cpp |
diff --git a/Source/core/html/HTMLCollection.cpp b/Source/core/html/HTMLCollection.cpp |
index 4d2fbc0fea46e920e95ed2ce9a19118196f81a9a..12574b936ccf69480f342f8f8b7f4bbde8d46cb8 100644 |
--- a/Source/core/html/HTMLCollection.cpp |
+++ b/Source/core/html/HTMLCollection.cpp |
@@ -269,6 +269,16 @@ template <> inline bool isMatchingElement(const HTMLCollection& htmlCollection, |
return false; |
} |
+template <> inline bool isMatchingElement(const ClassCollection& collection, const Element& element) |
+{ |
+ return collection.elementMatches(element); |
+} |
+ |
+template <> inline bool isMatchingElement(const HTMLTagCollection& collection, const Element& element) |
+{ |
+ return collection.elementMatches(element); |
+} |
+ |
template <> inline bool isMatchingElement(const LiveNodeList& nodeList, const Element& element) |
{ |
return nodeList.nodeMatches(element); |
@@ -448,11 +458,18 @@ inline Element* nextMatchingChildElement(const HTMLCollection& nodeList, Element |
Element* HTMLCollection::traverseToFirstElement(const ContainerNode& root) const |
{ |
- if (overridesItemAfter()) |
- return virtualItemAfter(0); |
- if (shouldOnlyIncludeDirectChildren()) |
- return firstMatchingChildElement(*this, root); |
- return firstMatchingElement(*this, root); |
+ switch (type()) { |
+ case HTMLTagCollectionType: |
+ return firstMatchingElement(static_cast<const HTMLTagCollection&>(*this), root); |
+ case ClassCollectionType: |
+ return firstMatchingElement(static_cast<const ClassCollection&>(*this), root); |
+ default: |
+ if (overridesItemAfter()) |
+ return virtualItemAfter(0); |
+ if (shouldOnlyIncludeDirectChildren()) |
+ return firstMatchingChildElement(*this, root); |
+ return firstMatchingElement(*this, root); |
+ } |
} |
inline Element* HTMLCollection::traverseNextElement(Element& previous, const ContainerNode& root) const |
@@ -467,23 +484,30 @@ inline Element* HTMLCollection::traverseNextElement(Element& previous, const Con |
Element* HTMLCollection::traverseForwardToOffset(unsigned offset, Element& currentElement, unsigned& currentOffset, const ContainerNode& root) const |
{ |
ASSERT(currentOffset < offset); |
- if (overridesItemAfter()) { |
- Element* next = ¤tElement; |
- while ((next = virtualItemAfter(next))) { |
- if (++currentOffset == offset) |
- return next; |
+ switch (type()) { |
+ case HTMLTagCollectionType: |
+ return traverseMatchingElementsForwardToOffset(static_cast<const HTMLTagCollection&>(*this), offset, currentElement, currentOffset, root); |
+ case ClassCollectionType: |
+ return traverseMatchingElementsForwardToOffset(static_cast<const ClassCollection&>(*this), offset, currentElement, currentOffset, root); |
+ default: |
+ if (overridesItemAfter()) { |
+ Element* next = ¤tElement; |
+ while ((next = virtualItemAfter(next))) { |
+ if (++currentOffset == offset) |
+ return next; |
+ } |
+ return 0; |
} |
- return 0; |
- } |
- if (shouldOnlyIncludeDirectChildren()) { |
- Element* next = ¤tElement; |
- while ((next = nextMatchingChildElement(*this, *next, root))) { |
- if (++currentOffset == offset) |
- return next; |
+ if (shouldOnlyIncludeDirectChildren()) { |
+ Element* next = ¤tElement; |
+ while ((next = nextMatchingChildElement(*this, *next, root))) { |
+ if (++currentOffset == offset) |
+ return next; |
+ } |
+ return 0; |
} |
- return 0; |
+ return traverseMatchingElementsForwardToOffset(*this, offset, currentElement, currentOffset, root); |
} |
- return traverseMatchingElementsForwardToOffset(*this, offset, currentElement, currentOffset, root); |
} |
Element* HTMLCollection::namedItem(const AtomicString& name) const |