Index: Source/core/html/HTMLCollection.cpp |
diff --git a/Source/core/html/HTMLCollection.cpp b/Source/core/html/HTMLCollection.cpp |
index e3c01c9a1607b704c995286a8f063870c3ff5b44..3c8e3e439675c191a3c88568853eb476e531dd75 100644 |
--- a/Source/core/html/HTMLCollection.cpp |
+++ b/Source/core/html/HTMLCollection.cpp |
@@ -287,7 +287,7 @@ ALWAYS_INLINE Node* LiveNodeListBase::iterateForPreviousNode(Node* current) cons |
CollectionType collectionType = type(); |
Node& rootNode = this->rootNode(); |
for (; current; current = previousNode(rootNode, *current, onlyIncludeDirectChildren)) { |
- if (isNodeList(collectionType)) { |
+ if (isLiveNodeListType(collectionType)) { |
if (current->isElementNode() && isMatchingElement(static_cast<const LiveNodeList*>(this), toElement(current))) |
return toElement(current); |
} else { |
@@ -342,14 +342,13 @@ inline Element* traverseMatchingElementsForwardToOffset(const NodeListType* node |
return 0; |
} |
-// FIXME: This should be in ChildNodeList |
-inline Node* LiveNodeListBase::traverseChildNodeListForwardToOffset(unsigned offset, Node* currentNode, unsigned& currentOffset) const |
+static inline Node* traverseSiblingsForwardToOffset(unsigned offset, Node& currentNode, unsigned& currentOffset) |
{ |
- ASSERT(type() == ChildNodeListType); |
ASSERT(currentOffset < offset); |
- while ((currentNode = currentNode->nextSibling())) { |
+ Node* next = ¤tNode; |
+ while ((next = next->nextSibling())) { |
if (++currentOffset == offset) |
- return currentNode; |
+ return next; |
} |
return 0; |
} |
@@ -357,7 +356,7 @@ inline Node* LiveNodeListBase::traverseChildNodeListForwardToOffset(unsigned off |
// FIXME: This should be in LiveNodeList |
inline Element* LiveNodeListBase::traverseLiveNodeListFirstElement(ContainerNode& root) const |
{ |
- ASSERT(isNodeList(type())); |
+ ASSERT(isLiveNodeListType(type())); |
ASSERT(type() != ChildNodeListType); |
if (type() == HTMLTagNodeListType) |
return firstMatchingElement(static_cast<const HTMLTagNodeList*>(this), root); |
@@ -366,16 +365,20 @@ inline Element* LiveNodeListBase::traverseLiveNodeListFirstElement(ContainerNode |
return firstMatchingElement(static_cast<const LiveNodeList*>(this), root); |
} |
-// FIXME: This should be in LiveNodeList |
-inline Element* LiveNodeListBase::traverseLiveNodeListForwardToOffset(unsigned offset, Element& currentElement, unsigned& currentOffset, ContainerNode* root) const |
+// FIXME: This should be in LiveNodeList.cpp but it needs to stay here until traverseMatchingElementsForwardToOffset() |
+// and others are moved to a separate header. |
+inline Node* LiveNodeList::traverseForwardToOffset(unsigned offset, Node& currentNode, unsigned& currentOffset, ContainerNode* root) const |
{ |
- ASSERT(isNodeList(type())); |
- ASSERT(type() != ChildNodeListType); |
- if (type() == HTMLTagNodeListType) |
- return traverseMatchingElementsForwardToOffset(static_cast<const HTMLTagNodeList*>(this), offset, currentElement, currentOffset, root); |
- if (type() == ClassNodeListType) |
- return traverseMatchingElementsForwardToOffset(static_cast<const ClassNodeList*>(this), offset, currentElement, currentOffset, root); |
- return traverseMatchingElementsForwardToOffset(static_cast<const LiveNodeList*>(this), offset, currentElement, currentOffset, root); |
+ switch (type()) { |
+ case ChildNodeListType: |
+ return traverseSiblingsForwardToOffset(offset, currentNode, currentOffset); |
+ case HTMLTagNodeListType: |
+ return traverseMatchingElementsForwardToOffset(static_cast<const HTMLTagNodeList*>(this), offset, toElement(currentNode), currentOffset, root); |
+ case ClassNodeListType: |
+ return traverseMatchingElementsForwardToOffset(static_cast<const ClassNodeList*>(this), offset, toElement(currentNode), currentOffset, root); |
+ default: |
+ return traverseMatchingElementsForwardToOffset(this, offset, toElement(currentNode), currentOffset, root); |
+ } |
} |
bool ALWAYS_INLINE LiveNodeListBase::isLastItemCloserThanLastOrCachedItem(unsigned offset) const |
@@ -433,7 +436,7 @@ Node* LiveNodeListBase::item(unsigned offset) const |
Node* firstItem; |
if (type() == ChildNodeListType) |
firstItem = root->firstChild(); |
- else if (isNodeList(type())) |
+ else if (isLiveNodeListType(type())) |
firstItem = traverseLiveNodeListFirstElement(*root); |
else |
firstItem = static_cast<const HTMLCollection*>(this)->traverseFirstElement(*root); |
@@ -473,10 +476,8 @@ inline Node* LiveNodeListBase::itemBeforeOrAfterCachedItem(unsigned offset, Cont |
return 0; |
} |
- if (type() == ChildNodeListType) |
- currentItem = traverseChildNodeListForwardToOffset(offset, currentItem, currentOffset); |
- else if (isNodeList(type())) |
- currentItem = traverseLiveNodeListForwardToOffset(offset, toElement(*currentItem), currentOffset, root); |
+ if (isLiveNodeListType(type())) |
+ currentItem = static_cast<const LiveNodeList*>(this)->traverseForwardToOffset(offset, *currentItem, currentOffset, root); |
else |
currentItem = static_cast<const HTMLCollection*>(this)->traverseForwardToOffset(offset, toElement(*currentItem), currentOffset, root); |