void HTMLFormControlsCollection::updateIdNameCache() const { if (hasValidIdNameCache()) return; OwnPtrWillBeRawPtr<NamedItemCache> cache = NamedItemCache::create(); HashSet<StringImpl*> foundInputElements; const FormAssociatedElement::List& elementsArray = formControlElements(); for (unsigned i = 0; i < elementsArray.size(); ++i) { FormAssociatedElement* associatedElement = elementsArray[i]; if (associatedElement->isEnumeratable()) { HTMLElement* element = toHTMLElement(associatedElement); const AtomicString& idAttrVal = element->getIdAttribute(); const AtomicString& nameAttrVal = element->getNameAttribute(); if (!idAttrVal.isEmpty()) { cache->addElementWithId(idAttrVal, element); foundInputElements.add(idAttrVal.impl()); } if (!nameAttrVal.isEmpty() && idAttrVal != nameAttrVal) { cache->addElementWithName(nameAttrVal, element); foundInputElements.add(nameAttrVal.impl()); } } } if (isHTMLFormElement(ownerNode())) { const WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement>>& imageElementsArray = formImageElements(); for (unsigned i = 0; i < imageElementsArray.size(); ++i) { HTMLImageElement* element = imageElementsArray[i]; const AtomicString& idAttrVal = element->getIdAttribute(); const AtomicString& nameAttrVal = element->getNameAttribute(); if (!idAttrVal.isEmpty() && !foundInputElements.contains(idAttrVal.impl())) cache->addElementWithId(idAttrVal, element); if (!nameAttrVal.isEmpty() && idAttrVal != nameAttrVal && !foundInputElements.contains(nameAttrVal.impl())) cache->addElementWithName(nameAttrVal, element); } } // Set the named item cache last as traversing the tree may cause cache invalidation. setNamedItemCache(cache.release()); }
void HTMLCollection::updateIdNameCache() const { if (hasValidIdNameCache()) return; OwnPtrWillBeRawPtr<NamedItemCache> cache = NamedItemCache::create(); unsigned length = this->length(); for (unsigned i = 0; i < length; ++i) { Element* element = item(i); const AtomicString& idAttrVal = element->getIdAttribute(); if (!idAttrVal.isEmpty()) cache->addElementWithId(idAttrVal, element); if (!element->isHTMLElement()) continue; const AtomicString& nameAttrVal = element->getNameAttribute(); if (!nameAttrVal.isEmpty() && idAttrVal != nameAttrVal && (type() != DocAll || nameShouldBeVisibleInDocumentAll(toHTMLElement(*element)))) cache->addElementWithName(nameAttrVal, element); } // Set the named item cache last as traversing the tree may cause cache invalidation. setNamedItemCache(cache.release()); }