Node* HTMLCollection::namedItem(const AtomicString& name) const { // http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/nameditem.asp // This method first searches for an object with a matching id // attribute. If a match is not found, the method then searches for an // object with a matching name attribute, but only on those elements // that are allowed a name attribute. ContainerNode* root = rootContainerNode(); if (name.isEmpty() || !root) return 0; if (!overridesItemAfter() && root->isInTreeScope()) { TreeScope* treeScope = root->treeScope(); Element* candidate = 0; if (treeScope->hasElementWithId(name.impl())) { if (!treeScope->containsMultipleElementsWithId(name)) candidate = treeScope->getElementById(name); } else if (treeScope->hasElementWithName(name.impl())) { if (!treeScope->containsMultipleElementsWithName(name)) { candidate = treeScope->getElementByName(name); if (candidate && type() == DocAll && (!candidate->isHTMLElement() || !nameShouldBeVisibleInDocumentAll(toHTMLElement(candidate)))) candidate = 0; } } else return 0; if (candidate && isMatchingElement(this, candidate) && (shouldOnlyIncludeDirectChildren() ? candidate->parentNode() == root : candidate->isDescendantOf(root))) return candidate; } // The pathological case. We need to walk the entire subtree. updateNameCache(); if (Vector<Element*>* idResults = idCache(name)) { if (idResults->size()) return idResults->at(0); } if (Vector<Element*>* nameResults = nameCache(name)) { if (nameResults->size()) return nameResults->at(0); } return 0; }