15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 1999 Antti Koivisto (koivisto@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2001 Dirk Mueller (mueller@kde.org)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2006 Alexey Proskuryakov (ap@nypop.com)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFormElement.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptController.h"
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptEventListener.h"
30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/V8DOMActivityLogger.h"
315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Attribute.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
34e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/dom/ElementTraversal.h"
3509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/dom/IdTargetObserverRegistry.h"
36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/dom/NodeListsNodeData.h"
371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/AutocompleteErrorEvent.h"
381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/Event.h"
39f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "core/events/GenericEventQueue.h"
40bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/events/ScopedEventQueue.h"
4176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/frame/LocalDOMWindow.h"
425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/frame/LocalFrame.h"
435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/frame/UseCounter.h"
445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/frame/csp/ContentSecurityPolicy.h"
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLCollection.h"
461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/html/HTMLDialogElement.h"
4776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/html/HTMLFormControlsCollection.h"
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLImageElement.h"
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h"
508abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "core/html/HTMLObjectElement.h"
5109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/html/RadioNodeList.h"
5206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/FormController.h"
53e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/inspector/ConsoleMessage.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoader.h"
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/FrameLoaderClient.h"
565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/loader/MixedContentChecker.h"
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTextControl.h"
581e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/UserGestureIndicator.h"
595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "wtf/text/AtomicString.h"
60197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include <limits>
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
62c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)HTMLFormElement::HTMLFormElement(Document& document)
6751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    : HTMLElement(formTag, document)
68d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_weakPtrFactory(this)
70d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_associatedElementsAreDirty(false)
7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_imageElementsAreDirty(false)
7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_hasElementsAssociatedByParser(false)
7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_didFinishParsingChildren(false)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_wasUserSubmitted(false)
76e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    , m_isSubmittingOrInUserJSSubmitEvent(false)
77e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    , m_shouldSubmit(false)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isInResetFunction(false)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_wasDemoted(false)
80f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    , m_pendingAutocompleteEventsQueue(GenericEventQueue::create(this))
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)PassRefPtrWillBeRawPtr<HTMLFormElement> HTMLFormElement::create(Document& document)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    UseCounter::count(document, UseCounter::FormElement);
875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return adoptRefWillBeNoop(new HTMLFormElement(document));
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLFormElement::~HTMLFormElement()
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
92f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#if !ENABLE(OILPAN)
93f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // With Oilpan, either removedFrom is called or the document and
94f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // form controller are dead as well and there is no need to remove
95f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    // this form element from it.
96d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    document().formController().willDeleteForm(this);
97f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
100323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void HTMLFormElement::trace(Visitor* visitor)
101323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
102323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#if ENABLE(OILPAN)
103f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    visitor->trace(m_pastNamesMap);
104d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    visitor->trace(m_radioButtonGroupScope);
105323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    visitor->trace(m_associatedElements);
106d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    visitor->trace(m_imageElements);
1075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    visitor->trace(m_pendingAutocompleteEventsQueue);
108323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#endif
109323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    HTMLElement::trace(visitor);
110323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
111323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
1128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)bool HTMLFormElement::rendererIsNeeded(const RenderStyle& style)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_wasDemoted)
1158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return HTMLElement::rendererIsNeeded(style);
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ContainerNode* node = parentNode();
118a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (!node || !node->renderer())
119a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return HTMLElement::rendererIsNeeded(style);
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* parentRenderer = node->renderer();
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Shouldn't we also check for table caption (see |formIsTablePart| below).
1228abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    // FIXME: This check is not correct for Shadow DOM.
123d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool parentIsTableElementPart = (parentRenderer->isTable() && isHTMLTableElement(*node))
124d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        || (parentRenderer->isTableRow() && isHTMLTableRowElement(*node))
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || (parentRenderer->isTableSection() && node->hasTagName(tbodyTag))
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || (parentRenderer->isRenderTableCol() && node->hasTagName(colTag))
127d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        || (parentRenderer->isTableCell() && isHTMLTableRowElement(*node));
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!parentIsTableElementPart)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    EDisplay display = style.display();
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool formIsTablePart = display == TABLE || display == INLINE_TABLE || display == TABLE_ROW_GROUP
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || display == TABLE_HEADER_GROUP || display == TABLE_FOOTER_GROUP || display == TABLE_ROW
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || display == TABLE_COLUMN_GROUP || display == TABLE_COLUMN || display == TABLE_CELL
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        || display == TABLE_CAPTION;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return formIsTablePart;
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node::InsertionNotificationRequest HTMLFormElement::insertedInto(ContainerNode* insertionPoint)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
143197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (insertionPoint->inDocument()) {
144197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        V8DOMActivityLogger* activityLogger = V8DOMActivityLogger::currentActivityLoggerIfIsolatedWorld();
145197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (activityLogger) {
146197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            Vector<String> argv;
147197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            argv.append("form");
148197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            argv.append(fastGetAttribute(methodAttr));
149197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            argv.append(fastGetAttribute(actionAttr));
150197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            activityLogger->logEvent("blinkAddElement", argv.size(), argv.data());
151197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
152197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLElement::insertedInto(insertionPoint);
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (insertionPoint->inDocument())
1558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        this->document().didAssociateFormControl(this);
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return InsertionDone;
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)template<class T>
160323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void notifyFormRemovedFromTree(const T& elements, Node& root)
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    size_t size = elements.size();
16309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (size_t i = 0; i < size; ++i)
16409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        elements[i]->formRemovedFromTree(root);
16509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(elements.size() == size);
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormElement::removedFrom(ContainerNode* insertionPoint)
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // We don't need to take care of form association by 'form' content
17109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // attribute becuse IdTargetObserver handles it.
17209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_hasElementsAssociatedByParser) {
173c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        Node& root = NodeTraversal::highestAncestorOrSelf(*this);
17409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!m_associatedElementsAreDirty) {
175323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            FormAssociatedElement::List elements(associatedElements());
17609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            notifyFormRemovedFromTree(elements, root);
17709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        } else {
178323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            FormAssociatedElement::List elements;
179c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            collectAssociatedElements(NodeTraversal::highestAncestorOrSelf(*insertionPoint), elements);
18009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            notifyFormRemovedFromTree(elements, root);
18109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            collectAssociatedElements(root, elements);
18209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            notifyFormRemovedFromTree(elements, root);
18309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
18409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
18509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!m_imageElementsAreDirty) {
186d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement> > images(imageElements());
18709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            notifyFormRemovedFromTree(images, root);
18809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        } else {
189d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement> > images;
190c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            collectImageElements(NodeTraversal::highestAncestorOrSelf(*insertionPoint), images);
19109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            notifyFormRemovedFromTree(images, root);
19209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            collectImageElements(root, images);
19309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            notifyFormRemovedFromTree(images, root);
19409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
19509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
196f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#if ENABLE(OILPAN)
197f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    document().formController().willDeleteForm(this);
198f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLElement::removedFrom(insertionPoint);
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormElement::handleLocalEvents(Event* event)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* targetNode = event->target()->toNode();
2051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->eventPhase() != Event::CAPTURING_PHASE && targetNode && targetNode != this && (event->type() == EventTypeNames::submit || event->type() == EventTypeNames::reset)) {
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event->stopPropagation();
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLElement::handleLocalEvents(event);
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned HTMLFormElement::length() const
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
214323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    const FormAssociatedElement::List& elements = associatedElements();
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned len = 0;
21609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (unsigned i = 0; i < elements.size(); ++i) {
21709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (elements[i]->isEnumeratable())
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ++len;
21909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return len;
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2239e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)HTMLElement* HTMLFormElement::item(unsigned index)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return elements()->item(index);
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormElement::submitImplicitly(Event* event, bool fromImplicitSubmissionTrigger)
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int submissionTriggerCount = 0;
23151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool seenDefaultButton = false;
232323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    const FormAssociatedElement::List& elements = associatedElements();
23309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (unsigned i = 0; i < elements.size(); ++i) {
23409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        FormAssociatedElement* formAssociatedElement = elements[i];
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!formAssociatedElement->isFormControlElement())
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
237591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        HTMLFormControlElement* control = toHTMLFormControlElement(formAssociatedElement);
23851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (!seenDefaultButton && control->canBeSuccessfulSubmitButton()) {
23951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            if (fromImplicitSubmissionTrigger)
24051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)                seenDefaultButton = true;
24151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            if (control->isSuccessfulSubmitButton()) {
242d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                control->dispatchSimulatedClick(event);
243d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                return;
24451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            } else if (fromImplicitSubmissionTrigger) {
24551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)                // Default (submit) button is not activated; no implicit submission.
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
24851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        } else if (control->canTriggerImplicitSubmission()) {
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ++submissionTriggerCount;
25051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        }
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (fromImplicitSubmissionTrigger && submissionTriggerCount == 1)
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        prepareForSubmission(event);
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)// FIXME: Consolidate this and similar code in FormSubmission.cpp.
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline HTMLFormControlElement* submitElementFromEvent(const Event* event)
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    for (Node* node = event->target()->toNode(); node; node = node->parentOrShadowHostNode()) {
260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (node->isElementNode() && toElement(node)->isFormControlElement())
261591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return toHTMLFormControlElement(node);
262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return 0;
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLFormElement::validateInteractively(Event* event)
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(event);
2698abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!document().page() || noValidate())
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLFormControlElement* submitElement = submitElementFromEvent(event);
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (submitElement && submitElement->formNoValidate())
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
276323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    const FormAssociatedElement::List& elements = associatedElements();
27709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (unsigned i = 0; i < elements.size(); ++i) {
27809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (elements[i]->isFormControlElement())
27909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            toHTMLFormControlElement(elements[i])->hideVisibleValidationMessage();
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
282323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    WillBeHeapVector<RefPtrWillBeMember<FormAssociatedElement> > unhandledInvalidControls;
283591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!checkInvalidControlsAndCollectUnhandled(&unhandledInvalidControls))
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Because the form has invalid controls, we abort the form submission and
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // show a validation message on a focusable form control.
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Needs to update layout now because we'd like to call isFocusable(), which
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // has !renderer()->needsLayout() assertion.
2908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    document().updateLayoutIgnorePendingStylesheets();
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
292f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLFormElement> protector(this);
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Focus on the first focusable control and show a validation message.
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < unhandledInvalidControls.size(); ++i) {
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        FormAssociatedElement* unhandledAssociatedElement = unhandledInvalidControls[i].get();
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HTMLElement* unhandled = toHTMLElement(unhandledAssociatedElement);
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (unhandled->isFocusable() && unhandled->inDocument()) {
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            unhandled->scrollIntoViewIfNeeded(false);
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            unhandled->focus();
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (unhandled->isFormControlElement())
301591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                toHTMLFormControlElement(unhandled)->updateVisibleValidationMessage();
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Warn about all of unfocusable controls.
3068abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (document().frame()) {
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (unsigned i = 0; i < unhandledInvalidControls.size(); ++i) {
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            FormAssociatedElement* unhandledAssociatedElement = unhandledInvalidControls[i].get();
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            HTMLElement* unhandled = toHTMLElement(unhandledAssociatedElement);
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (unhandled->isFocusable() && unhandled->inDocument())
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                continue;
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            String message("An invalid form control with name='%name' is not focusable.");
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            message.replace("%name", unhandledAssociatedElement->name());
314e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            document().addConsoleMessage(ConsoleMessage::create(RenderingMessageSource, ErrorMessageLevel, message));
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
320a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochvoid HTMLFormElement::prepareForSubmission(Event* event)
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
322f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLFormElement> protector(this);
323d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = document().frame();
324e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!frame || m_isSubmittingOrInUserJSSubmitEvent)
325a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return;
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Interactive validation must be done before dispatching the submit event.
328aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    if (!validateInteractively(event))
329a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return;
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
331e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    m_isSubmittingOrInUserJSSubmitEvent = true;
332e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    m_shouldSubmit = false;
333e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
334d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    frame->loader().client()->dispatchWillSendSubmitEvent(this);
335d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
3361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (dispatchEvent(Event::createCancelableBubble(EventTypeNames::submit)))
337e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        m_shouldSubmit = true;
338e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
339e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    m_isSubmittingOrInUserJSSubmitEvent = false;
340e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
341e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (m_shouldSubmit)
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        submit(event, true, true, NotSubmittedByJavaScript);
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormElement::submit()
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    submit(0, false, true, NotSubmittedByJavaScript);
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormElement::submitFromJavaScript()
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    submit(0, false, UserGestureIndicator::processingUserGesture(), SubmittedByJavaScript);
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void HTMLFormElement::submitDialog(PassRefPtrWillBeRawPtr<FormSubmission> formSubmission)
3561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
3571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    for (Node* node = this; node; node = node->parentOrShadowHostNode()) {
358d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (isHTMLDialogElement(*node)) {
359d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            toHTMLDialogElement(*node).closeDialog(formSubmission->result());
3601e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            return;
3611e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        }
3621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    }
3631e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
3641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormElement::submit(Event* event, bool activateSubmitButton, bool processingUserGesture, FormSubmissionTrigger formSubmissionTrigger)
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3678abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    FrameView* view = document().view();
368d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = document().frame();
369c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (!view || !frame || !frame->page())
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
372e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (m_isSubmittingOrInUserJSSubmitEvent) {
373e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        m_shouldSubmit = true;
374e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return;
375e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
376e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
377e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    m_isSubmittingOrInUserJSSubmitEvent = true;
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_wasUserSubmitted = processingUserGesture;
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
380323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLFormControlElement> firstSuccessfulSubmitButton = nullptr;
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool needButtonActivation = activateSubmitButton; // do we need to activate a submit button?
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
383323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    const FormAssociatedElement::List& elements = associatedElements();
38409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (unsigned i = 0; i < elements.size(); ++i) {
38509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        FormAssociatedElement* associatedElement = elements[i];
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!associatedElement->isFormControlElement())
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (needButtonActivation) {
389591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            HTMLFormControlElement* control = toHTMLFormControlElement(associatedElement);
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (control->isActivatedSubmit())
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                needButtonActivation = false;
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else if (firstSuccessfulSubmitButton == 0 && control->isSuccessfulSubmitButton())
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                firstSuccessfulSubmitButton = control;
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (needButtonActivation && firstSuccessfulSubmitButton)
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        firstSuccessfulSubmitButton->setActivatedSubmit(true);
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<FormSubmission> formSubmission = FormSubmission::create(this, m_attributes, event, formSubmissionTrigger);
401bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    EventQueueScope scopeForDialogClose; // Delay dispatching 'close' to dialog until done submitting.
4021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (formSubmission->method() == FormSubmission::DialogMethod)
4031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        submitDialog(formSubmission.release());
4041e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    else
4051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        scheduleFormSubmission(formSubmission.release());
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (needButtonActivation && firstSuccessfulSubmitButton)
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        firstSuccessfulSubmitButton->setActivatedSubmit(false);
409e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
410e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    m_shouldSubmit = false;
411e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    m_isSubmittingOrInUserJSSubmitEvent = false;
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void HTMLFormElement::scheduleFormSubmission(PassRefPtrWillBeRawPtr<FormSubmission> submission)
415c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
416c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    ASSERT(submission->method() == FormSubmission::PostMethod || submission->method() == FormSubmission::GetMethod);
417c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    ASSERT(submission->data());
418c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    ASSERT(submission->state());
419c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (submission->action().isEmpty())
420c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        return;
4218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (document().isSandboxed(SandboxForms)) {
422c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        // FIXME: This message should be moved off the console once a solution to https://bugs.webkit.org/show_bug.cgi?id=103274 exists.
423e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        document().addConsoleMessage(ConsoleMessage::create(SecurityMessageSource, ErrorMessageLevel, "Blocked form submission to '" + submission->action().elidedString() + "' because the form's frame is sandboxed and the 'allow-forms' permission is not set."));
424c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        return;
425c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    }
426c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
427c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (protocolIsJavaScript(submission->action())) {
4285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (!document().contentSecurityPolicy()->allowFormAction(submission->action()))
429c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)            return;
430f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        document().frame()->script().executeScriptIfJavaScriptURL(submission->action());
431c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        return;
432c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    }
43351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
434d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* targetFrame = document().frame()->loader().findFrameForNavigation(submission->target(), submission->state()->sourceDocument());
43551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!targetFrame) {
43676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        if (!LocalDOMWindow::allowPopUp(*document().frame()) && !UserGestureIndicator::processingUserGesture())
43751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            return;
43851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        targetFrame = document().frame();
43951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    } else {
44051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        submission->clearTarget();
44151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
44251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!targetFrame->page())
44351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return;
44451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
4455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (MixedContentChecker::isMixedContent(document().securityOrigin(), submission->action())) {
4465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        UseCounter::count(document(), UseCounter::MixedContentFormsSubmitted);
4475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (!document().frame()->loader().mixedContentChecker()->canSubmitToInsecureForm(document().securityOrigin(), submission->action()))
4485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return;
4495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    } else {
4505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        UseCounter::count(document(), UseCounter::FormsSubmitted);
4515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
4525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
45309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    submission->setReferrer(Referrer(document().outgoingReferrer(), document().referrerPolicy()));
45409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    submission->setOrigin(document().outgoingOrigin());
455c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
45651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    targetFrame->navigationScheduler().scheduleFormSubmission(submission);
457c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
458c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormElement::reset()
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
461d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = document().frame();
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_isInResetFunction || !frame)
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isInResetFunction = true;
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!dispatchEvent(Event::createCancelableBubble(EventTypeNames::reset))) {
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_isInResetFunction = false;
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
472323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    const FormAssociatedElement::List& elements = associatedElements();
47309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (unsigned i = 0; i < elements.size(); ++i) {
47409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (elements[i]->isFormControlElement())
47509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            toHTMLFormControlElement(elements[i])->reset();
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isInResetFunction = false;
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
481f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void HTMLFormElement::requestAutocomplete()
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
48310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    String errorMessage;
48410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
48510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (!document().frame())
48610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        errorMessage = "requestAutocomplete: form is not owned by a displayed document.";
48710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    else if (!shouldAutocomplete())
48810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        errorMessage = "requestAutocomplete: form autocomplete attribute is set to off.";
48910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    else if (!UserGestureIndicator::processingUserGesture())
49010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        errorMessage = "requestAutocomplete: must be called in response to a user gesture.";
49110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
49210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (!errorMessage.isEmpty()) {
493e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        document().addConsoleMessage(ConsoleMessage::create(RenderingMessageSource, LogMessageLevel, errorMessage));
494926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        finishRequestAutocomplete(AutocompleteResultErrorDisabled);
49510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    } else {
496f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        document().frame()->loader().client()->didRequestAutocomplete(this);
49710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormElement::finishRequestAutocomplete(AutocompleteResult result)
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
502a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    RefPtrWillBeRawPtr<Event> event = nullptr;
503926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (result == AutocompleteResultSuccess)
504a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        event = Event::createBubble(EventTypeNames::autocomplete);
505926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (result == AutocompleteResultErrorDisabled)
506926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        event = AutocompleteErrorEvent::create("disabled");
507926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (result == AutocompleteResultErrorCancel)
508926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        event = AutocompleteErrorEvent::create("cancel");
509926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (result == AutocompleteResultErrorInvalid)
510926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        event = AutocompleteErrorEvent::create("invalid");
511a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    else
512a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        ASSERT_NOT_REACHED();
513926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event->setTarget(this);
515f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    m_pendingAutocompleteEventsQueue->enqueueEvent(event.release());
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
518926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLFormElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
519926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
5205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (name == actionAttr) {
521197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_attributes.parseAction(value);
5225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // If the new action attribute is pointing to insecure "action" location from a secure page
5235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        // it is marked as "passive" mixed content.
524197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        KURL actionURL = document().completeURL(m_attributes.action().isEmpty() ? document().url().string() : m_attributes.action());
525c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        if (document().frame() && MixedContentChecker::isMixedContent(document().securityOrigin(), actionURL))
5265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            document().frame()->loader().mixedContentChecker()->canSubmitToInsecureForm(document().securityOrigin(), actionURL);
5275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    } else if (name == targetAttr)
528926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_attributes.setTarget(value);
529926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == methodAttr)
530926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_attributes.updateMethodType(value);
531926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == enctypeAttr)
532926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_attributes.updateEncodingType(value);
533926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == accept_charsetAttr)
534926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_attributes.setAcceptCharset(value);
535926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == onautocompleteAttr)
5365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        setAttributeEventListener(EventTypeNames::autocomplete, createAttributeEventListener(this, name, value, eventParameterName()));
537926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == onautocompleteerrorAttr)
5385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        setAttributeEventListener(EventTypeNames::autocompleteerror, createAttributeEventListener(this, name, value, eventParameterName()));
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
540926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLElement::parseAttribute(name, value);
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
543197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid HTMLFormElement::attributeWillChange(const QualifiedName& name, const AtomicString& oldValue, const AtomicString& newValue)
544197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
545197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (name == actionAttr && inDocument()) {
546197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        V8DOMActivityLogger* activityLogger = V8DOMActivityLogger::currentActivityLoggerIfIsolatedWorld();
547197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (activityLogger) {
548197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            Vector<String> argv;
549197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            argv.append("form");
550197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            argv.append(actionAttr.toString());
551197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            argv.append(oldValue);
552197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            argv.append(newValue);
553197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            activityLogger->logEvent("blinkSetAttribute", argv.size(), argv.data());
554197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
555197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
556197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    HTMLElement::attributeWillChange(name, oldValue, newValue);
557197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
558197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
55909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLFormElement::associate(FormAssociatedElement& e)
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
56109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_associatedElementsAreDirty = true;
56209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_associatedElements.clear();
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLFormElement::disassociate(FormAssociatedElement& e)
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
56709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_associatedElementsAreDirty = true;
56809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_associatedElements.clear();
56909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    removeFromPastNamesMap(toHTMLElement(e));
57009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool HTMLFormElement::isURLAttribute(const Attribute& attribute) const
57309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
57409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return attribute.name() == actionAttr || HTMLElement::isURLAttribute(attribute);
57509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
57602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
57743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)bool HTMLFormElement::hasLegalLinkAttribute(const QualifiedName& name) const
57843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){
57943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    return name == actionAttr || HTMLElement::hasLegalLinkAttribute(name);
58043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)}
58143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
58209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLFormElement::associate(HTMLImageElement& e)
58309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
58409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_imageElementsAreDirty = true;
58509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_imageElements.clear();
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLFormElement::disassociate(HTMLImageElement& e)
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
59009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_imageElementsAreDirty = true;
59109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_imageElements.clear();
59209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    removeFromPastNamesMap(e);
59309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
59609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WeakPtr<HTMLFormElement> HTMLFormElement::createWeakPtr()
59709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
59809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return m_weakPtrFactory.createWeakPtr();
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
600d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLFormElement::didAssociateByParser()
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
60409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_didFinishParsingChildren)
60509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
60609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_hasElementsAssociatedByParser = true;
60709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    UseCounter::count(document(), UseCounter::FormAssociationByParser);
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
61076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)PassRefPtrWillBeRawPtr<HTMLFormControlsCollection> HTMLFormElement::elements()
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
612c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return ensureCachedCollection<HTMLFormControlsCollection>(FormControls);
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void HTMLFormElement::collectAssociatedElements(Node& root, FormAssociatedElement::List& elements) const
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
61709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    elements.clear();
618d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (HTMLElement* element = Traversal<HTMLElement>::firstWithin(root); element; element = Traversal<HTMLElement>::next(*element)) {
619d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        FormAssociatedElement* associatedElement = 0;
620d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (element->isFormControlElement())
621d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            associatedElement = toHTMLFormControlElement(element);
622d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        else if (isHTMLObjectElement(*element))
623d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            associatedElement = toHTMLObjectElement(element);
62409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        else
62509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            continue;
626d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (associatedElement->form()== this)
627d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            elements.append(associatedElement);
62809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
63109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// This function should be const conceptually. However we update some fields
63209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// because of lazy evaluation.
633323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)const FormAssociatedElement::List& HTMLFormElement::associatedElements() const
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
63509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_associatedElementsAreDirty)
63609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return m_associatedElements;
63709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    HTMLFormElement* mutableThis = const_cast<HTMLFormElement*>(this);
63809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Node* scope = mutableThis;
63909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_hasElementsAssociatedByParser)
640c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        scope = &NodeTraversal::highestAncestorOrSelf(*mutableThis);
64109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (inDocument() && treeScope().idTargetObserverRegistry().hasObservers(fastGetAttribute(idAttr)))
64209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        scope = &treeScope().rootNode();
643d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(scope);
644d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    collectAssociatedElements(*scope, mutableThis->m_associatedElements);
64509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    mutableThis->m_associatedElementsAreDirty = false;
64609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return m_associatedElements;
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
649d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void HTMLFormElement::collectImageElements(Node& root, WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement> >& elements)
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
65109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    elements.clear();
652d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    for (HTMLImageElement* image = Traversal<HTMLImageElement>::firstWithin(root); image; image = Traversal<HTMLImageElement>::next(*image)) {
653d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (image->formOwner() == this)
654d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            elements.append(image);
65509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
658d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)const WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement> >& HTMLFormElement::imageElements()
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
66009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_imageElementsAreDirty)
66109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return m_imageElements;
662c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    collectImageElements(m_hasElementsAssociatedByParser ? NodeTraversal::highestAncestorOrSelf(*this) : *this, m_imageElements);
66309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_imageElementsAreDirty = false;
66409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return m_imageElements;
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLFormElement::name() const
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return getNameAttribute();
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLFormElement::noValidate() const
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return fastHasAttribute(novalidateAttr);
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: This function should be removed because it does not do the same thing as the
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// JavaScript binding for action, which treats action as a URL attribute. Last time I
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// (Darin Adler) removed this, someone added it back, so I am leaving it in for now.
680a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const AtomicString& HTMLFormElement::action() const
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return getAttribute(actionAttr);
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void HTMLFormElement::setEnctype(const AtomicString& value)
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setAttribute(enctypeAttr, value);
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLFormElement::method() const
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return FormSubmission::Attributes::methodString(m_attributes.method());
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void HTMLFormElement::setMethod(const AtomicString& value)
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setAttribute(methodAttr, value);
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLFormElement::wasUserSubmitted() const
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_wasUserSubmitted;
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLFormControlElement* HTMLFormElement::defaultButton() const
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
707323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    const FormAssociatedElement::List& elements = associatedElements();
70809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (unsigned i = 0; i < elements.size(); ++i) {
70909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!elements[i]->isFormControlElement())
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
71109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        HTMLFormControlElement* control = toHTMLFormControlElement(elements[i]);
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (control->isSuccessfulSubmitButton())
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return control;
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLFormElement::checkValidity()
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
72110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return !checkInvalidControlsAndCollectUnhandled(0);
722591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
723591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
724323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)bool HTMLFormElement::checkInvalidControlsAndCollectUnhandled(WillBeHeapVector<RefPtrWillBeMember<FormAssociatedElement> >* unhandledInvalidControls)
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
726f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLFormElement> protector(this);
72709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // Copy associatedElements because event handlers called from
72809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // HTMLFormControlElement::checkValidity() might change associatedElements.
729323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    const FormAssociatedElement::List& associatedElements = this->associatedElements();
730323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    WillBeHeapVector<RefPtrWillBeMember<FormAssociatedElement> > elements;
73109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    elements.reserveCapacity(associatedElements.size());
73209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (unsigned i = 0; i < associatedElements.size(); ++i)
73309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        elements.append(associatedElements[i]);
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasInvalidControls = false;
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (unsigned i = 0; i < elements.size(); ++i) {
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (elements[i]->form() == this && elements[i]->isFormControlElement()) {
737591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            HTMLFormControlElement* control = toHTMLFormControlElement(elements[i].get());
73810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            if (!control->checkValidity(unhandledInvalidControls) && control->formOwner() == this)
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                hasInvalidControls = true;
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return hasInvalidControls;
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
74509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)Element* HTMLFormElement::elementFromPastNamesMap(const AtomicString& pastName)
746c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
7478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (pastName.isEmpty() || !m_pastNamesMap)
748c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        return 0;
74909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Element* element = m_pastNamesMap->get(pastName);
750197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
75109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!element)
7528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return 0;
75309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(toHTMLElement(element)->formOwner() == this);
754d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isHTMLImageElement(*element)) {
75509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ASSERT_WITH_SECURITY_IMPLICATION(imageElements().find(element) != kNotFound);
756d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else if (isHTMLObjectElement(*element)) {
75709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ASSERT_WITH_SECURITY_IMPLICATION(associatedElements().find(toHTMLObjectElement(element)) != kNotFound);
7588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    } else {
75909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ASSERT_WITH_SECURITY_IMPLICATION(associatedElements().find(toHTMLFormControlElement(element)) != kNotFound);
7608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    }
7618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#endif
76209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return element;
7638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
7648abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
76509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLFormElement::addToPastNamesMap(Element* element, const AtomicString& pastName)
7668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
7678abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (pastName.isEmpty())
7688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return;
7698abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!m_pastNamesMap)
770f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)        m_pastNamesMap = adoptPtrWillBeNoop(new PastNamesMap);
771a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_pastNamesMap->set(pastName, element);
772c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
773c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
7748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void HTMLFormElement::removeFromPastNamesMap(HTMLElement& element)
775c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
7768abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!m_pastNamesMap)
777c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        return;
7788abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    PastNamesMap::iterator end = m_pastNamesMap->end();
7798abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    for (PastNamesMap::iterator it = m_pastNamesMap->begin(); it != end; ++it) {
780d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        if (it->value == &element) {
781f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)            it->value = nullptr;
7828abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            // Keep looping. Single element can have multiple names.
7838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        }
7848abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    }
785c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
786c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
787d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void HTMLFormElement::getNamedElements(const AtomicString& name, WillBeHeapVector<RefPtrWillBeMember<Element> >& namedItems)
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    // http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#dom-form-nameditem
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    elements()->namedItems(name, namedItems);
791c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
79209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Element* elementFromPast = elementFromPastNamesMap(name);
79309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (namedItems.size() && namedItems.first() != elementFromPast) {
7948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        addToPastNamesMap(namedItems.first().get(), name);
79509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    } else if (elementFromPast && namedItems.isEmpty()) {
7968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        namedItems.append(elementFromPast);
79709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        UseCounter::count(document(), UseCounter::FormNameAccessForPastNamesMap);
79809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLFormElement::shouldAutocomplete() const
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !equalIgnoringCase(fastGetAttribute(autocompleteAttr), "off");
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormElement::finishParsingChildren()
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLElement::finishParsingChildren();
809d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    document().formController().restoreControlStateIn(*this);
81009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_didFinishParsingChildren = true;
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormElement::copyNonAttributePropertiesFromElement(const Element& source)
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_wasDemoted = static_cast<const HTMLFormElement&>(source).m_wasDemoted;
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLElement::copyNonAttributePropertiesFromElement(source);
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
819e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void HTMLFormElement::anonymousNamedGetter(const AtomicString& name, RefPtrWillBeRawPtr<RadioNodeList>& returnValue0, RefPtrWillBeRawPtr<Element>& returnValue1)
82093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
82193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Call getNamedElements twice, first time check if it has a value
82293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // and let HTMLFormElement update its cache.
82393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // See issue: 867404
82493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
825d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        WillBeHeapVector<RefPtrWillBeMember<Element> > elements;
82693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        getNamedElements(name, elements);
82793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        if (elements.isEmpty())
82893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            return;
82993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
83093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
83193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // Second call may return different results from the first call,
83293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // but if the first the size cannot be zero.
833d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    WillBeHeapVector<RefPtrWillBeMember<Element> > elements;
83493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    getNamedElements(name, elements);
83593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ASSERT(!elements.isEmpty());
83693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
83793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (elements.size() == 1) {
83893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        returnValue1 = elements.at(0);
83993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return;
84093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
84193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
842d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool onlyMatchImg = !elements.isEmpty() && isHTMLImageElement(*elements.first());
84309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    returnValue0 = radioNodeList(name, onlyMatchImg);
84493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
84593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
846e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochvoid HTMLFormElement::setDemoted(bool demoted)
847e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
848e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (demoted)
8491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::DemotedFormElement);
850e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    m_wasDemoted = demoted;
851e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
852e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace
854