| 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);
|
|
|