Index: Source/core/html/HTMLCollection.cpp |
diff --git a/Source/core/html/HTMLCollection.cpp b/Source/core/html/HTMLCollection.cpp |
index accf901833c48542b8503b15bc05aa708bcc4142..103efabd3e558610b093314e26ed079158043ff3 100644 |
--- a/Source/core/html/HTMLCollection.cpp |
+++ b/Source/core/html/HTMLCollection.cpp |
@@ -160,7 +160,7 @@ static NodeListInvalidationType invalidationTypeExcludingIdAndNameAttributes(Col |
return DoNotInvalidateOnAttributeChanges; |
} |
-HTMLCollection::HTMLCollection(Node* ownerNode, CollectionType type, ItemAfterOverrideType itemAfterOverrideType) |
+HTMLCollection::HTMLCollection(ContainerNode* ownerNode, CollectionType type, ItemAfterOverrideType itemAfterOverrideType) |
: LiveNodeListBase(ownerNode, rootTypeFromCollectionType(type), invalidationTypeExcludingIdAndNameAttributes(type), |
WebCore::shouldOnlyIncludeDirectChildren(type), type, itemAfterOverrideType) |
, m_isNameCacheValid(false) |
@@ -168,7 +168,7 @@ HTMLCollection::HTMLCollection(Node* ownerNode, CollectionType type, ItemAfterOv |
ScriptWrappable::init(this); |
} |
-PassRefPtr<HTMLCollection> HTMLCollection::create(Node* base, CollectionType type) |
+PassRefPtr<HTMLCollection> HTMLCollection::create(ContainerNode* base, CollectionType type) |
{ |
return adoptRef(new HTMLCollection(base, type, DoesNotOverrideItemAfter)); |
} |
@@ -426,13 +426,7 @@ Node* LiveNodeListBase::item(unsigned offset) const |
if (isLengthCacheValid() && cachedLength() <= offset) |
return 0; |
- ContainerNode* root = rootContainerNode(); |
- if (!root) { |
- // FIMXE: In someTextNode.childNodes case the root is Text. We shouldn't even make a LiveNodeList for that. |
- setLengthCache(0); |
- return 0; |
- } |
- |
+ ContainerNode& root = rootNode(); |
if (isLengthCacheValid() && !overridesItemAfter() && isLastItemCloserThanLastOrCachedItem(offset)) { |
Node* lastItem = itemBefore(0); |
ASSERT(lastItem); |
@@ -440,9 +434,9 @@ Node* LiveNodeListBase::item(unsigned offset) const |
} else if (!cachedItem() || isFirstItemCloserThanCachedItem(offset) || (overridesItemAfter() && offset < cachedItemOffset())) { |
Node* firstItem; |
if (isLiveNodeListType(type())) |
- firstItem = static_cast<const LiveNodeList*>(this)->traverseToFirstElement(*root); |
+ firstItem = static_cast<const LiveNodeList*>(this)->traverseToFirstElement(root); |
else |
- firstItem = static_cast<const HTMLCollection*>(this)->traverseToFirstElement(*root); |
+ firstItem = static_cast<const HTMLCollection*>(this)->traverseToFirstElement(root); |
if (!firstItem) { |
setLengthCache(0); |
@@ -455,7 +449,7 @@ Node* LiveNodeListBase::item(unsigned offset) const |
if (cachedItemOffset() == offset) |
return cachedItem(); |
- return itemBeforeOrAfterCachedItem(offset, *root); |
+ return itemBeforeOrAfterCachedItem(offset, root); |
} |
inline Node* LiveNodeListBase::itemBeforeOrAfterCachedItem(unsigned offset, const ContainerNode& root) const |
@@ -592,12 +586,9 @@ Node* HTMLCollection::namedItem(const AtomicString& name) const |
// object with a matching name attribute, but only on those elements |
// that are allowed a name attribute. |
- ContainerNode* root = rootContainerNode(); |
- if (!root) |
- return 0; |
- |
+ ContainerNode& root = rootNode(); |
unsigned i = 0; |
- for (Element* element = traverseToFirstElement(*root); element; element = traverseNextElement(*element, *root)) { |
+ for (Element* element = traverseToFirstElement(root); element; element = traverseNextElement(*element, root)) { |
if (checkForNameMatch(*element, /* checkName */ false, name)) { |
setItemCache(element, i); |
return element; |
@@ -606,7 +597,7 @@ Node* HTMLCollection::namedItem(const AtomicString& name) const |
} |
i = 0; |
- for (Element* element = traverseToFirstElement(*root); element; element = traverseNextElement(*element, *root)) { |
+ for (Element* element = traverseToFirstElement(root); element; element = traverseNextElement(*element, root)) { |
if (checkForNameMatch(*element, /* checkName */ true, name)) { |
setItemCache(element, i); |
return element; |
@@ -622,11 +613,8 @@ void HTMLCollection::updateNameCache() const |
if (hasNameCache()) |
return; |
- ContainerNode* root = rootContainerNode(); |
- if (!root) |
- return; |
- |
- for (Element* element = traverseToFirstElement(*root); element; element = traverseNextElement(*element, *root)) { |
+ ContainerNode& root = rootNode(); |
+ for (Element* element = traverseToFirstElement(root); element; element = traverseNextElement(*element, root)) { |
const AtomicString& idAttrVal = element->getIdAttribute(); |
if (!idAttrVal.isEmpty()) |
appendIdCache(idAttrVal, element); |