void HTMLFormControlsCollection::updateIdNameCache() const { if (hasValidIdNameCache()) return; 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())) { // HTMLFormControlsCollection doesn't support named getter for IMG // elements. However we still need to handle IMG elements here because // HTMLFormElement named getter relies on this. const HeapVector<Member<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); }
void HTMLFormControlsCollection::updateIdNameCache() const { if (hasValidIdNameCache()) return; NamedItemCache* cache = NamedItemCache::create(); HashSet<StringImpl*> foundInputElements; for (const auto& listedElement : listedElements()) { if (listedElement->isEnumeratable()) { HTMLElement* element = toHTMLElement(listedElement); 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()); } } } // HTMLFormControlsCollection doesn't support named getter for IMG // elements. However we still need to handle IMG elements here because // HTMLFormElement named getter relies on this. for (const auto& element : formImageElements()) { 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); }