void HTMLFormControlsCollection::namedGetter( const AtomicString& name, RadioNodeListOrElement& returnValue) { HeapVector<Member<Element>> namedItems; this->namedItems(name, namedItems); if (namedItems.isEmpty()) return; if (namedItems.size() == 1) { if (!isHTMLImageElement(*namedItems[0])) returnValue.setElement(namedItems.at(0)); return; } // This path never returns a RadioNodeList for <img> because // onlyMatchingImgElements flag is false by default. returnValue.setRadioNodeList(ownerNode().radioNodeList(name)); }
void HTMLFormElement::anonymousNamedGetter(const AtomicString& name, RadioNodeListOrElement& returnValue) { // Call getNamedElements twice, first time check if it has a value // and let HTMLFormElement update its cache. // See issue: 867404 { WillBeHeapVector<RefPtrWillBeMember<Element>> elements; getNamedElements(name, elements); if (elements.isEmpty()) return; } // Second call may return different results from the first call, // but if the first the size cannot be zero. WillBeHeapVector<RefPtrWillBeMember<Element>> elements; getNamedElements(name, elements); ASSERT(!elements.isEmpty()); bool onlyMatchImg = !elements.isEmpty() && isHTMLImageElement(*elements.first()); if (onlyMatchImg) { UseCounter::count(document(), UseCounter::FormNameAccessForImageElement); // The following code has performance impact, but it should be small // because <img> access via <form> name getter is rarely used. for (auto& element : elements) { if (isHTMLImageElement(*element) && !element->isDescendantOf(this)) { UseCounter::count(document(), UseCounter::FormNameAccessForNonDescendantImageElement); break; } } } if (elements.size() == 1) { returnValue.setElement(elements.at(0)); return; } returnValue.setRadioNodeList(radioNodeList(name, onlyMatchImg)); }