size_t size = elements.size();
for (size_t i = 0; i < size; ++i)
elements[i]->formRemovedFromTree(root);
+ ASSERT(elements.size() == size);
}
void HTMLFormElement::removedFrom(ContainerNode* insertionPoint)
if (m_hasElementsAssociatedByParser) {
Node* root = highestAncestor();
if (!m_associatedElementsAreDirty) {
- notifyFormRemovedFromTree(associatedElements(), root);
+ Vector<FormAssociatedElement*> elements(associatedElements());
+ notifyFormRemovedFromTree(elements, root);
} else {
Vector<FormAssociatedElement*> elements;
collectAssociatedElements(insertionPoint->highestAncestor(), elements);
return len;
}
-Node* HTMLFormElement::item(unsigned index)
+Element* HTMLFormElement::item(unsigned index)
{
return elements()->item(index);
}
if (!targetFrame->page())
return;
- submission->setReferrer(document().outgoingReferrer());
+ submission->setReferrer(Referrer(document().outgoingReferrer(), document().referrerPolicy()));
submission->setOrigin(document().outgoingOrigin());
targetFrame->navigationScheduler().scheduleFormSubmission(submission);
void HTMLFormElement::didAssociateByParser()
{
- if (m_didFinishParsingChildren)
- m_hasElementsAssociatedByParser = true;
+ if (!m_didFinishParsingChildren)
+ return;
+ m_hasElementsAssociatedByParser = true;
+ UseCounter::count(document(), UseCounter::FormAssociationByParser);
}
PassRefPtr<HTMLCollection> HTMLFormElement::elements()
return hasInvalidControls;
}
-Node* HTMLFormElement::elementFromPastNamesMap(const AtomicString& pastName)
+Element* HTMLFormElement::elementFromPastNamesMap(const AtomicString& pastName)
{
if (pastName.isEmpty() || !m_pastNamesMap)
return 0;
- Node* node = m_pastNamesMap->get(pastName);
+ Element* element = m_pastNamesMap->get(pastName);
#if !ASSERT_DISABLED
- if (!node)
+ if (!element)
return 0;
- ASSERT_WITH_SECURITY_IMPLICATION(toHTMLElement(node)->formOwner() == this);
- if (node->hasTagName(imgTag)) {
- ASSERT_WITH_SECURITY_IMPLICATION(imageElements().find(node) != kNotFound);
- } else if (node->hasTagName(objectTag)) {
- ASSERT_WITH_SECURITY_IMPLICATION(associatedElements().find(toHTMLObjectElement(node)) != kNotFound);
+ ASSERT_WITH_SECURITY_IMPLICATION(toHTMLElement(element)->formOwner() == this);
+ if (element->hasTagName(imgTag)) {
+ ASSERT_WITH_SECURITY_IMPLICATION(imageElements().find(element) != kNotFound);
+ } else if (element->hasTagName(objectTag)) {
+ ASSERT_WITH_SECURITY_IMPLICATION(associatedElements().find(toHTMLObjectElement(element)) != kNotFound);
} else {
- ASSERT_WITH_SECURITY_IMPLICATION(associatedElements().find(toHTMLFormControlElement(node)) != kNotFound);
+ ASSERT_WITH_SECURITY_IMPLICATION(associatedElements().find(toHTMLFormControlElement(element)) != kNotFound);
}
#endif
- return node;
+ return element;
}
-void HTMLFormElement::addToPastNamesMap(Node* element, const AtomicString& pastName)
+void HTMLFormElement::addToPastNamesMap(Element* element, const AtomicString& pastName)
{
if (pastName.isEmpty())
return;
}
}
-void HTMLFormElement::getNamedElements(const AtomicString& name, Vector<RefPtr<Node> >& namedItems)
+void HTMLFormElement::getNamedElements(const AtomicString& name, Vector<RefPtr<Element> >& namedItems)
{
// http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#dom-form-nameditem
elements()->namedItems(name, namedItems);
- Node* elementFromPast = elementFromPastNamesMap(name);
- if (namedItems.size() && namedItems.first() != elementFromPast)
+ Element* elementFromPast = elementFromPastNamesMap(name);
+ if (namedItems.size() && namedItems.first() != elementFromPast) {
addToPastNamesMap(namedItems.first().get(), name);
- else if (elementFromPast && namedItems.isEmpty())
+ } else if (elementFromPast && namedItems.isEmpty()) {
namedItems.append(elementFromPast);
+ UseCounter::count(document(), UseCounter::FormNameAccessForPastNamesMap);
+ }
}
bool HTMLFormElement::shouldAutocomplete() const
HTMLElement::copyNonAttributePropertiesFromElement(source);
}
-void HTMLFormElement::anonymousNamedGetter(const AtomicString& name, bool& returnValue0Enabled, RefPtr<RadioNodeList>& returnValue0, bool& returnValue1Enabled, RefPtr<Node>& returnValue1)
+void HTMLFormElement::anonymousNamedGetter(const AtomicString& name, bool& returnValue0Enabled, RefPtr<RadioNodeList>& returnValue0, bool& returnValue1Enabled, RefPtr<Element>& returnValue1)
{
// Call getNamedElements twice, first time check if it has a value
// and let HTMLFormElement update its cache.
// See issue: 867404
{
- Vector<RefPtr<Node> > elements;
+ Vector<RefPtr<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.
- Vector<RefPtr<Node> > elements;
+ Vector<RefPtr<Element> > elements;
getNamedElements(name, elements);
ASSERT(!elements.isEmpty());