18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 1999 Antti Koivisto (koivisto@kde.org)
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 2001 Dirk Mueller (mueller@kde.org)
55f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 2006 Alexey Proskuryakov (ap@nypop.com)
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLFormElement.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "Attribute.h"
29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "DOMFormData.h"
30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "DOMWindow.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Document.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Event.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "EventNames.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FileList.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FileSystem.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FormData.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FormDataList.h"
385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "FormState.h"
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Frame.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FrameLoader.h"
4121939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "FrameLoaderClient.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLDocument.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLFormCollection.h"
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLImageElement.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLInputElement.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MIMETypeRegistry.h"
480617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "Page.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RenderTextControl.h"
50e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "ScriptEventListener.h"
510617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#include "Settings.h"
52231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "ValidityState.h"
535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <limits>
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(WX)
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/defs.h>
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wx/filename.h>
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianusing namespace std;
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames;
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
665af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeHTMLFormElement::HTMLFormElement(const QualifiedName& tagName, Document* document)
675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    : HTMLElement(tagName, document)
686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    , m_associatedElementsBeforeIndex(0)
696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    , m_associatedElementsAfterIndex(0)
7068513a70bcd92384395513322f1b801e7bf9c729Steve Block    , m_wasUserSubmitted(false)
71cad810f21b803229eb11403f9209855525a25d57Steve Block    , m_isSubmittingOrPreparingForSubmission(false)
72cad810f21b803229eb11403f9209855525a25d57Steve Block    , m_shouldSubmit(false)
73cad810f21b803229eb11403f9209855525a25d57Steve Block    , m_isInResetFunction(false)
74cad810f21b803229eb11403f9209855525a25d57Steve Block    , m_wasMalformed(false)
75cad810f21b803229eb11403f9209855525a25d57Steve Block    , m_wasDemoted(false)
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(hasTagName(formTag));
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
805af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkePassRefPtr<HTMLFormElement> HTMLFormElement::create(Document* document)
815af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
8206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return adoptRef(new HTMLFormElement(formTag, document));
835af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
845af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
855af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkePassRefPtr<HTMLFormElement> HTMLFormElement::create(const QualifiedName& tagName, Document* document)
865af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{
8706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return adoptRef(new HTMLFormElement(tagName, document));
885af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke}
895af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectHTMLFormElement::~HTMLFormElement()
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
92cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!autoComplete())
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        document()->unregisterForDocumentActivationCallbacks(this);
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
955af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    for (unsigned i = 0; i < m_associatedElements.size(); ++i)
965af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        m_associatedElements[i]->formDestroyed();
975af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    for (unsigned i = 0; i < m_imageElements.size(); ++i)
985af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        m_imageElements[i]->m_form = 0;
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool HTMLFormElement::formWouldHaveSecureSubmission(const String& url)
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return document()->completeURL(url).protocolIs("https");
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianbool HTMLFormElement::rendererIsNeeded(RenderStyle* style)
1075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
108cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!m_wasDemoted)
1095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return HTMLElement::rendererIsNeeded(style);
11068513a70bcd92384395513322f1b801e7bf9c729Steve Block
111a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ContainerNode* node = parentNode();
1125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    RenderObject* parentRenderer = node->renderer();
1135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    bool parentIsTableElementPart = (parentRenderer->isTable() && node->hasTagName(tableTag))
1145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        || (parentRenderer->isTableRow() && node->hasTagName(trTag))
1155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        || (parentRenderer->isTableSection() && node->hasTagName(tbodyTag))
11668513a70bcd92384395513322f1b801e7bf9c729Steve Block        || (parentRenderer->isTableCol() && node->hasTagName(colTag))
1175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        || (parentRenderer->isTableCell() && node->hasTagName(trTag));
1185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!parentIsTableElementPart)
1205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return true;
1215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    EDisplay display = style->display();
1235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    bool formIsTablePart = display == TABLE || display == INLINE_TABLE || display == TABLE_ROW_GROUP
1245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        || display == TABLE_HEADER_GROUP || display == TABLE_FOOTER_GROUP || display == TABLE_ROW
1255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        || display == TABLE_COLUMN_GROUP || display == TABLE_COLUMN || display == TABLE_CELL
1265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        || display == TABLE_CAPTION;
1275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return formIsTablePart;
1295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
1305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::insertedIntoDocument()
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (document()->isHTMLDocument())
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static_cast<HTMLDocument*>(document())->addNamedItem(m_name);
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HTMLElement::insertedIntoDocument();
1376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
1386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (hasID())
1396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        document()->resetFormElementsOwner(this);
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::removedFromDocument()
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (document()->isHTMLDocument())
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static_cast<HTMLDocument*>(document())->removeNamedItem(m_name);
14668513a70bcd92384395513322f1b801e7bf9c729Steve Block
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HTMLElement::removedFromDocument();
1486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
1496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (hasID())
1506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        document()->resetFormElementsOwner(0);
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
153231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid HTMLFormElement::handleLocalEvents(Event* event)
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1558f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    Node* targetNode = event->target()->toNode();
156231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (event->eventPhase() != Event::CAPTURING_PHASE && targetNode && targetNode != this && (event->type() == eventNames().submitEvent || event->type() == eventNames().resetEvent)) {
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        event->stopPropagation();
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
160231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    HTMLElement::handleLocalEvents(event);
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned HTMLFormElement::length() const
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1655af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    unsigned len = 0;
1665af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    for (unsigned i = 0; i < m_associatedElements.size(); ++i)
1675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (m_associatedElements[i]->isEnumeratable())
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++len;
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return len;
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNode* HTMLFormElement::item(unsigned index)
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return elements()->item(index);
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenvoid HTMLFormElement::submitImplicitly(Event* event, bool fromImplicitSubmissionTrigger)
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    int submissionTriggerCount = 0;
1805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    for (unsigned i = 0; i < m_associatedElements.size(); ++i) {
181f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        FormAssociatedElement* formAssociatedElement = m_associatedElements[i];
182f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (!formAssociatedElement->isFormControlElement())
183f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            continue;
184f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        HTMLFormControlElement* formElement = static_cast<HTMLFormControlElement*>(formAssociatedElement);
1856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        if (formElement->isSuccessfulSubmitButton()) {
1866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            if (formElement->renderer()) {
1876c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                formElement->dispatchSimulatedClick(event);
18821939df44de1705786c545cd1bf519d47250322dBen Murdoch                return;
1896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            }
1906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        } else if (formElement->canTriggerImplicitSubmission())
1916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            ++submissionTriggerCount;
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (fromImplicitSubmissionTrigger && submissionTriggerCount == 1)
194cad810f21b803229eb11403f9209855525a25d57Steve Block        prepareForSubmission(event);
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
197dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic inline HTMLFormControlElement* submitElementFromEvent(const Event* event)
198dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
199dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Node* targetNode = event->target()->toNode();
200dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!targetNode || !targetNode->isElementNode())
201dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
202dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Element* targetElement = static_cast<Element*>(targetNode);
203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!targetElement->isFormControlElement())
204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return static_cast<HTMLFormControlElement*>(targetElement);
206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool HTMLFormElement::validateInteractively(Event* event)
209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(event);
2110617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    if (!document()->page() || !document()->page()->settings()->interactiveFormValidationEnabled() || noValidate())
212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
214dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    HTMLFormControlElement* submitElement = submitElementFromEvent(event);
215dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (submitElement && submitElement->formNoValidate())
216dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
217dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
218f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (unsigned i = 0; i < m_associatedElements.size(); ++i) {
219f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (m_associatedElements[i]->isFormControlElement())
220f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            static_cast<HTMLFormControlElement*>(m_associatedElements[i])->hideVisibleValidationMessage();
221f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
22228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu
223f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Vector<RefPtr<FormAssociatedElement> > unhandledInvalidControls;
2242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (!checkInvalidControlsAndCollectUnhandled(unhandledInvalidControls))
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
2262bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Because the form has invalid controls, we abort the form submission and
2272bde8e466a4451c7319e3a072d118917957d6554Steve Block    // show a validation message on a focusable form control.
2282bde8e466a4451c7319e3a072d118917957d6554Steve Block
2292bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Needs to update layout now because we'd like to call isFocusable(), which
2302bde8e466a4451c7319e3a072d118917957d6554Steve Block    // has !renderer()->needsLayout() assertion.
2312bde8e466a4451c7319e3a072d118917957d6554Steve Block    document()->updateLayoutIgnorePendingStylesheets();
232dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
233dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<HTMLFormElement> protector(this);
23428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // Focus on the first focusable control and show a validation message.
235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (unsigned i = 0; i < unhandledInvalidControls.size(); ++i) {
236f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        FormAssociatedElement* unhandledAssociatedElement = unhandledInvalidControls[i].get();
237f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        HTMLElement* unhandled = toHTMLElement(unhandledAssociatedElement);
238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (unhandled->isFocusable() && unhandled->inDocument()) {
239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            unhandled->scrollIntoViewIfNeeded(false);
2402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            unhandled->focus();
2412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (unhandled->isFormControlElement())
2422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                static_cast<HTMLFormControlElement*>(unhandled)->updateVisibleValidationMessage();
2432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Warn about all of unfocusable controls.
247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (Frame* frame = document()->frame()) {
248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        for (unsigned i = 0; i < unhandledInvalidControls.size(); ++i) {
249f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            FormAssociatedElement* unhandledAssociatedElement = unhandledInvalidControls[i].get();
250f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            HTMLElement* unhandled = toHTMLElement(unhandledAssociatedElement);
251dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (unhandled->isFocusable() && unhandled->inDocument())
252dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                continue;
253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            String message("An invalid form control with name='%name' is not focusable.");
254f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            message.replace("%name", unhandledAssociatedElement->name());
255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            frame->domWindow()->console()->addMessage(HTMLMessageSource, LogMessageType, ErrorMessageLevel, message, 0, document()->url().string());
256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return false;
259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
261cad810f21b803229eb11403f9209855525a25d57Steve Blockbool HTMLFormElement::prepareForSubmission(Event* event)
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = document()->frame();
264cad810f21b803229eb11403f9209855525a25d57Steve Block    if (m_isSubmittingOrPreparingForSubmission || !frame)
265cad810f21b803229eb11403f9209855525a25d57Steve Block        return m_isSubmittingOrPreparingForSubmission;
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
267cad810f21b803229eb11403f9209855525a25d57Steve Block    m_isSubmittingOrPreparingForSubmission = true;
268cad810f21b803229eb11403f9209855525a25d57Steve Block    m_shouldSubmit = false;
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
270dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Interactive validation must be done before dispatching the submit event.
271cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!validateInteractively(event)) {
272cad810f21b803229eb11403f9209855525a25d57Steve Block        m_isSubmittingOrPreparingForSubmission = false;
273dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
274cad810f21b803229eb11403f9209855525a25d57Steve Block    }
275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
27621939df44de1705786c545cd1bf519d47250322dBen Murdoch    frame->loader()->client()->dispatchWillSendSubmitEvent(this);
27721939df44de1705786c545cd1bf519d47250322dBen Murdoch
278cad810f21b803229eb11403f9209855525a25d57Steve Block    if (dispatchEvent(Event::create(eventNames().submitEvent, true, true)))
279cad810f21b803229eb11403f9209855525a25d57Steve Block        m_shouldSubmit = true;
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
281cad810f21b803229eb11403f9209855525a25d57Steve Block    m_isSubmittingOrPreparingForSubmission = false;
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
283cad810f21b803229eb11403f9209855525a25d57Steve Block    if (m_shouldSubmit)
28468513a70bcd92384395513322f1b801e7bf9c729Steve Block        submit(event, true, true, NotSubmittedByJavaScript);
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
286cad810f21b803229eb11403f9209855525a25d57Steve Block    return m_shouldSubmit;
287cad810f21b803229eb11403f9209855525a25d57Steve Block}
288cad810f21b803229eb11403f9209855525a25d57Steve Block
289cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid HTMLFormElement::submit()
290cad810f21b803229eb11403f9209855525a25d57Steve Block{
291cad810f21b803229eb11403f9209855525a25d57Steve Block    submit(0, false, true, NotSubmittedByJavaScript);
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
294cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid HTMLFormElement::submitFromJavaScript()
295d0825bca7fe65beaee391d30da42e937db621564Steve Block{
296cad810f21b803229eb11403f9209855525a25d57Steve Block    Frame* frame = document()->frame();
297cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!frame)
298cad810f21b803229eb11403f9209855525a25d57Steve Block        return;
299cad810f21b803229eb11403f9209855525a25d57Steve Block    submit(0, false, frame->script()->anyPageIsProcessingUserGesture(), SubmittedByJavaScript);
300d0825bca7fe65beaee391d30da42e937db621564Steve Block}
301d0825bca7fe65beaee391d30da42e937db621564Steve Block
30268513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid HTMLFormElement::submit(Event* event, bool activateSubmitButton, bool processingUserGesture, FormSubmissionTrigger formSubmissionTrigger)
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameView* view = document()->view();
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = document()->frame();
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!view || !frame)
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
309cad810f21b803229eb11403f9209855525a25d57Steve Block    if (m_isSubmittingOrPreparingForSubmission) {
310cad810f21b803229eb11403f9209855525a25d57Steve Block        m_shouldSubmit = true;
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
314cad810f21b803229eb11403f9209855525a25d57Steve Block    m_isSubmittingOrPreparingForSubmission = true;
31568513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_wasUserSubmitted = processingUserGesture;
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HTMLFormControlElement* firstSuccessfulSubmitButton = 0;
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool needButtonActivation = activateSubmitButton; // do we need to activate a submit button?
31968513a70bcd92384395513322f1b801e7bf9c729Steve Block
3205af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    for (unsigned i = 0; i < m_associatedElements.size(); ++i) {
321f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        FormAssociatedElement* associatedElement = m_associatedElements[i];
322f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (!associatedElement->isFormControlElement())
323f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            continue;
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (needButtonActivation) {
325f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            HTMLFormControlElement* control = static_cast<HTMLFormControlElement*>(associatedElement);
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (control->isActivatedSubmit())
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                needButtonActivation = false;
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (firstSuccessfulSubmitButton == 0 && control->isSuccessfulSubmitButton())
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                firstSuccessfulSubmitButton = control;
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (needButtonActivation && firstSuccessfulSubmitButton)
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        firstSuccessfulSubmitButton->setActivatedSubmit(true);
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33668513a70bcd92384395513322f1b801e7bf9c729Steve Block    frame->loader()->submitForm(FormSubmission::create(this, m_attributes, event, !processingUserGesture, formSubmissionTrigger));
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (needButtonActivation && firstSuccessfulSubmitButton)
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        firstSuccessfulSubmitButton->setActivatedSubmit(false);
34068513a70bcd92384395513322f1b801e7bf9c729Steve Block
341cad810f21b803229eb11403f9209855525a25d57Steve Block    m_shouldSubmit = false;
342cad810f21b803229eb11403f9209855525a25d57Steve Block    m_isSubmittingOrPreparingForSubmission = false;
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::reset()
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = document()->frame();
348cad810f21b803229eb11403f9209855525a25d57Steve Block    if (m_isInResetFunction || !frame)
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
351cad810f21b803229eb11403f9209855525a25d57Steve Block    m_isInResetFunction = true;
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
353231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!dispatchEvent(Event::create(eventNames().resetEvent, true, true))) {
354cad810f21b803229eb11403f9209855525a25d57Steve Block        m_isInResetFunction = false;
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
358f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (unsigned i = 0; i < m_associatedElements.size(); ++i) {
359f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (m_associatedElements[i]->isFormControlElement())
360f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            static_cast<HTMLFormControlElement*>(m_associatedElements[i])->reset();
361f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
363cad810f21b803229eb11403f9209855525a25d57Steve Block    m_isInResetFunction = false;
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
366e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid HTMLFormElement::parseMappedAttribute(Attribute* attr)
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (attr->name() == actionAttr)
3690617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        m_attributes.parseAction(attr->value());
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attr->name() == targetAttr)
3710617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        m_attributes.setTarget(attr->value());
372635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else if (attr->name() == methodAttr)
3730617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        m_attributes.parseMethodType(attr->value());
374635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else if (attr->name() == enctypeAttr)
3750617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        m_attributes.parseEncodingType(attr->value());
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attr->name() == accept_charsetAttr)
3770617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        m_attributes.setAcceptCharset(attr->value());
378cad810f21b803229eb11403f9209855525a25d57Steve Block    else if (attr->name() == autocompleteAttr) {
379cad810f21b803229eb11403f9209855525a25d57Steve Block        if (!autoComplete())
38068513a70bcd92384395513322f1b801e7bf9c729Steve Block            document()->registerForDocumentActivationCallbacks(this);
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            document()->unregisterForDocumentActivationCallbacks(this);
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (attr->name() == onsubmitAttr)
3845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        setAttributeEventListener(eventNames().submitEvent, createAttributeEventListener(this, attr));
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attr->name() == onresetAttr)
3865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        setAttributeEventListener(eventNames().resetEvent, createAttributeEventListener(this, attr));
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attr->name() == nameAttr) {
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const AtomicString& newName = attr->value();
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (inDocument() && document()->isHTMLDocument()) {
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HTMLDocument* document = static_cast<HTMLDocument*>(this->document());
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            document->removeNamedItem(m_name);
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            document->addNamedItem(newName);
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_name = newName;
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HTMLElement::parseMappedAttribute(attr);
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttemplate<class T, size_t n> static void removeFromVector(Vector<T*, n> & vec, T* item)
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    size_t size = vec.size();
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (size_t i = 0; i != size; ++i)
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (vec[i] == item) {
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vec.remove(i);
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
409f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochunsigned HTMLFormElement::formElementIndexWithFormAttribute(Element* element)
4106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
4116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Compares the position of the form element and the inserted element.
4126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Updates the indeces in order to the relation of the position:
4136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    unsigned short position = compareDocumentPosition(element);
4142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (position & (DOCUMENT_POSITION_CONTAINS | DOCUMENT_POSITION_CONTAINED_BY))
4156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        ++m_associatedElementsAfterIndex;
4166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    else if (position & DOCUMENT_POSITION_PRECEDING) {
4176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        ++m_associatedElementsBeforeIndex;
4186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        ++m_associatedElementsAfterIndex;
4196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
4206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
4216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (m_associatedElements.isEmpty())
4226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return 0;
4236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
4246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Does binary search on m_associatedElements in order to find the index
4256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // to be inserted.
4266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    unsigned left = 0, right = m_associatedElements.size() - 1;
4276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    while (left != right) {
4286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        unsigned middle = left + ((right - left) / 2);
429f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        position = element->compareDocumentPosition(toHTMLElement(m_associatedElements[middle]));
4306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (position & DOCUMENT_POSITION_FOLLOWING)
4316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            right = middle;
4326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        else
4336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            left = middle + 1;
4346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
4356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
436f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    position = element->compareDocumentPosition(toHTMLElement(m_associatedElements[left]));
4376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (position & DOCUMENT_POSITION_FOLLOWING)
4386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return left;
4396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return left + 1;
4406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
4416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
442f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochunsigned HTMLFormElement::formElementIndex(FormAssociatedElement* associatedElement)
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
444f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    HTMLElement* element = toHTMLElement(associatedElement);
4456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Treats separately the case where this element has the form attribute
4466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // for performance consideration.
447f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (element->fastHasAttribute(formAttr))
448f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return formElementIndexWithFormAttribute(element);
4496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check for the special case where this element is the very last thing in
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the form's tree of children; we don't want to walk the entire tree in that
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // common case that occurs during parsing; instead we'll just return a value
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // that says "add this form element to the end of the array".
454f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (element->traverseNextNode(this)) {
4556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        unsigned i = m_associatedElementsBeforeIndex;
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (Node* node = this; node; node = node->traverseNextNode(this)) {
457f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (node == element) {
4586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                ++m_associatedElementsAfterIndex;
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return i;
4606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (node->isHTMLElement()
462f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    && (static_cast<Element*>(node)->isFormControlElement()
463f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        || node->hasTagName(objectTag))
4642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    && toHTMLElement(node)->form() == this)
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ++i;
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return m_associatedElementsAfterIndex++;
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
471f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid HTMLFormElement::registerFormElement(FormAssociatedElement* e)
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
473f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (e->isFormControlElement()) {
474f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        HTMLFormControlElement* element = static_cast<HTMLFormControlElement*>(e);
475f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        document()->checkedRadioButtons().removeButton(element);
476f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_checkedRadioButtons.addButton(element);
477f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
4785af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    m_associatedElements.insert(formElementIndex(e), e);
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
481f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid HTMLFormElement::removeFormElement(FormAssociatedElement* e)
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
483f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (e->isFormControlElement())
484f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_checkedRadioButtons.removeButton(static_cast<HTMLFormControlElement*>(e));
4852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    unsigned index;
4862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    for (index = 0; index < m_associatedElements.size(); ++index) {
4872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (m_associatedElements[index] == e)
4882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            break;
4892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
4902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(index < m_associatedElements.size());
4912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (index < m_associatedElementsBeforeIndex)
4922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        --m_associatedElementsBeforeIndex;
4932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (index < m_associatedElementsAfterIndex)
4946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        --m_associatedElementsAfterIndex;
4955af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    removeFromVector(m_associatedElements, e);
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool HTMLFormElement::isURLAttribute(Attribute* attr) const
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return attr->name() == actionAttr;
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::registerImgElement(HTMLImageElement* e)
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5055af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ASSERT(m_imageElements.find(e) == notFound);
5065af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    m_imageElements.append(e);
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::removeImgElement(HTMLImageElement* e)
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5115af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ASSERT(m_imageElements.find(e) != notFound);
5125af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    removeFromVector(m_imageElements, e);
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<HTMLCollection> HTMLFormElement::elements()
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return HTMLFormCollection::create(this);
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString HTMLFormElement::name() const
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getAttribute(nameAttr);
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
525231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool HTMLFormElement::noValidate() const
526231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
527f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return fastHasAttribute(novalidateAttr);
528231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
529231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
5305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// FIXME: This function should be removed because it does not do the same thing as the
5315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// JavaScript binding for action, which treats action as a URL attribute. Last time I
5325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// (Darin Adler) removed this, someone added it back, so I am leaving it in for now.
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString HTMLFormElement::action() const
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getAttribute(actionAttr);
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::setAction(const String &value)
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setAttribute(actionAttr, value);
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::setEnctype(const String &value)
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setAttribute(enctypeAttr, value);
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString HTMLFormElement::method() const
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getAttribute(methodAttr);
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::setMethod(const String &value)
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setAttribute(methodAttr, value);
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString HTMLFormElement::target() const
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getAttribute(targetAttr);
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56368513a70bcd92384395513322f1b801e7bf9c729Steve Blockbool HTMLFormElement::wasUserSubmitted() const
564967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
56568513a70bcd92384395513322f1b801e7bf9c729Steve Block    return m_wasUserSubmitted;
566967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
567967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
568231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockHTMLFormControlElement* HTMLFormElement::defaultButton() const
569231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
5705af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    for (unsigned i = 0; i < m_associatedElements.size(); ++i) {
571f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (!m_associatedElements[i]->isFormControlElement())
572f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            continue;
573f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        HTMLFormControlElement* control = static_cast<HTMLFormControlElement*>(m_associatedElements[i]);
574231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (control->isSuccessfulSubmitButton())
575231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return control;
576231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
577231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
578231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return 0;
579231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
580231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
581231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool HTMLFormElement::checkValidity()
582231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
583f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Vector<RefPtr<FormAssociatedElement> > controls;
5842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return !checkInvalidControlsAndCollectUnhandled(controls);
585dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
586231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
5872fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool HTMLFormElement::checkInvalidControlsAndCollectUnhandled(Vector<RefPtr<FormAssociatedElement> >& unhandledInvalidControls)
588dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
589dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<HTMLFormElement> protector(this);
5905af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // Copy m_associatedElements because event handlers called from
5915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // HTMLFormControlElement::checkValidity() might change m_associatedElements.
592f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Vector<RefPtr<FormAssociatedElement> > elements;
5935af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    elements.reserveCapacity(m_associatedElements.size());
5945af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    for (unsigned i = 0; i < m_associatedElements.size(); ++i)
5955af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        elements.append(m_associatedElements[i]);
5962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    bool hasInvalidControls = false;
597dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (unsigned i = 0; i < elements.size(); ++i) {
5982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        if (elements[i]->form() == this && elements[i]->isFormControlElement()) {
5992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            HTMLFormControlElement* control = static_cast<HTMLFormControlElement*>(elements[i].get());
6002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            if (!control->checkValidity(&unhandledInvalidControls) && control->form() == this)
6012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                hasInvalidControls = true;
6022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        }
603231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
6042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return hasInvalidControls;
605231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
606231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
607cad810f21b803229eb11403f9209855525a25d57Steve BlockHTMLFormControlElement* HTMLFormElement::elementForAlias(const AtomicString& alias)
6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (alias.isEmpty() || !m_elementAliases)
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
611cad810f21b803229eb11403f9209855525a25d57Steve Block    return m_elementAliases->get(alias.impl()).get();
6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::addElementAlias(HTMLFormControlElement* element, const AtomicString& alias)
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (alias.isEmpty())
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_elementAliases)
619e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_elementAliases = adoptPtr(new AliasMap);
6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_elementAliases->set(alias.impl(), element);
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::getNamedElements(const AtomicString& name, Vector<RefPtr<Node> >& namedItems)
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    elements()->namedItems(name, namedItems);
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
627cad810f21b803229eb11403f9209855525a25d57Steve Block    HTMLFormControlElement* aliasElement = elementForAlias(name);
628cad810f21b803229eb11403f9209855525a25d57Steve Block    if (aliasElement) {
629cad810f21b803229eb11403f9209855525a25d57Steve Block        if (namedItems.find(aliasElement) == notFound) {
630cad810f21b803229eb11403f9209855525a25d57Steve Block            // We have seen it before but it is gone now. Still, we need to return it.
631cad810f21b803229eb11403f9209855525a25d57Steve Block            // FIXME: The above comment is not clear enough; it does not say why we need to do this.
632cad810f21b803229eb11403f9209855525a25d57Steve Block            namedItems.append(aliasElement);
6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
635cad810f21b803229eb11403f9209855525a25d57Steve Block    if (namedItems.size() && namedItems.first() != aliasElement)
63668513a70bcd92384395513322f1b801e7bf9c729Steve Block        addElementAlias(static_cast<HTMLFormControlElement*>(namedItems.first().get()), name);
6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::documentDidBecomeActive()
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
641cad810f21b803229eb11403f9209855525a25d57Steve Block    ASSERT(!autoComplete());
64268513a70bcd92384395513322f1b801e7bf9c729Steve Block
643f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (unsigned i = 0; i < m_associatedElements.size(); ++i) {
644f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (m_associatedElements[i]->isFormControlElement())
645f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            static_cast<HTMLFormControlElement*>(m_associatedElements[i])->reset();
646f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::willMoveToNewOwnerDocument()
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
651cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!autoComplete())
6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        document()->unregisterForDocumentActivationCallbacks(this);
6535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    HTMLElement::willMoveToNewOwnerDocument();
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::didMoveToNewOwnerDocument()
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
658cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!autoComplete())
6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        document()->registerForDocumentActivationCallbacks(this);
6605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    HTMLElement::didMoveToNewOwnerDocument();
6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
663cad810f21b803229eb11403f9209855525a25d57Steve Blockbool HTMLFormElement::autoComplete() const
664cad810f21b803229eb11403f9209855525a25d57Steve Block{
665cad810f21b803229eb11403f9209855525a25d57Steve Block    return !equalIgnoringCase(fastGetAttribute(autocompleteAttr), "off");
666cad810f21b803229eb11403f9209855525a25d57Steve Block}
667cad810f21b803229eb11403f9209855525a25d57Steve Block
6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace
669