HTMLFormElement.cpp revision cad810f21b803229eb11403f9209855525a25d57
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;
224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    collectUnhandledInvalidControls(unhandledInvalidControls);
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (unhandledInvalidControls.isEmpty())
226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // If the form has invalid controls, abort submission.
228dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<HTMLFormElement> protector(this);
23028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu    // Focus on the first focusable control and show a validation message.
231dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (unsigned i = 0; i < unhandledInvalidControls.size(); ++i) {
232f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        FormAssociatedElement* unhandledAssociatedElement = unhandledInvalidControls[i].get();
233f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        HTMLElement* unhandled = toHTMLElement(unhandledAssociatedElement);
234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (unhandled->isFocusable() && unhandled->inDocument()) {
235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            RefPtr<Document> originalDocument(unhandled->document());
236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            unhandled->scrollIntoViewIfNeeded(false);
237dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // scrollIntoViewIfNeeded() dispatches events, so the state
238dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // of 'unhandled' might be changed so it's no longer focusable or
239dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            // moved to another document.
240dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (unhandled->isFocusable() && unhandled->inDocument() && originalDocument == unhandled->document()) {
241dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                unhandled->focus();
242f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                if (unhandled->isFormControlElement())
243f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    static_cast<HTMLFormControlElement*>(unhandled)->updateVisibleValidationMessage();
244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                break;
245dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            }
246dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Warn about all of unfocusable controls.
249dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (Frame* frame = document()->frame()) {
250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        for (unsigned i = 0; i < unhandledInvalidControls.size(); ++i) {
251f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            FormAssociatedElement* unhandledAssociatedElement = unhandledInvalidControls[i].get();
252f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            HTMLElement* unhandled = toHTMLElement(unhandledAssociatedElement);
253dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (unhandled->isFocusable() && unhandled->inDocument())
254dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                continue;
255dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            String message("An invalid form control with name='%name' is not focusable.");
256f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            message.replace("%name", unhandledAssociatedElement->name());
257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            frame->domWindow()->console()->addMessage(HTMLMessageSource, LogMessageType, ErrorMessageLevel, message, 0, document()->url().string());
258dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
259dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
260dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return false;
261dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
262dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
263cad810f21b803229eb11403f9209855525a25d57Steve Blockbool HTMLFormElement::prepareForSubmission(Event* event)
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = document()->frame();
266cad810f21b803229eb11403f9209855525a25d57Steve Block    if (m_isSubmittingOrPreparingForSubmission || !frame)
267cad810f21b803229eb11403f9209855525a25d57Steve Block        return m_isSubmittingOrPreparingForSubmission;
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
269cad810f21b803229eb11403f9209855525a25d57Steve Block    m_isSubmittingOrPreparingForSubmission = true;
270cad810f21b803229eb11403f9209855525a25d57Steve Block    m_shouldSubmit = false;
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
272dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Interactive validation must be done before dispatching the submit event.
273cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!validateInteractively(event)) {
274cad810f21b803229eb11403f9209855525a25d57Steve Block        m_isSubmittingOrPreparingForSubmission = false;
275dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
276cad810f21b803229eb11403f9209855525a25d57Steve Block    }
277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
27821939df44de1705786c545cd1bf519d47250322dBen Murdoch    frame->loader()->client()->dispatchWillSendSubmitEvent(this);
27921939df44de1705786c545cd1bf519d47250322dBen Murdoch
280cad810f21b803229eb11403f9209855525a25d57Steve Block    if (dispatchEvent(Event::create(eventNames().submitEvent, true, true)))
281cad810f21b803229eb11403f9209855525a25d57Steve Block        m_shouldSubmit = true;
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
283cad810f21b803229eb11403f9209855525a25d57Steve Block    m_isSubmittingOrPreparingForSubmission = false;
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
285cad810f21b803229eb11403f9209855525a25d57Steve Block    if (m_shouldSubmit)
28668513a70bcd92384395513322f1b801e7bf9c729Steve Block        submit(event, true, true, NotSubmittedByJavaScript);
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288cad810f21b803229eb11403f9209855525a25d57Steve Block    return m_shouldSubmit;
289cad810f21b803229eb11403f9209855525a25d57Steve Block}
290cad810f21b803229eb11403f9209855525a25d57Steve Block
291cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid HTMLFormElement::submit()
292cad810f21b803229eb11403f9209855525a25d57Steve Block{
293cad810f21b803229eb11403f9209855525a25d57Steve Block    submit(0, false, true, NotSubmittedByJavaScript);
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
296cad810f21b803229eb11403f9209855525a25d57Steve Blockvoid HTMLFormElement::submitFromJavaScript()
297d0825bca7fe65beaee391d30da42e937db621564Steve Block{
298cad810f21b803229eb11403f9209855525a25d57Steve Block    Frame* frame = document()->frame();
299cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!frame)
300cad810f21b803229eb11403f9209855525a25d57Steve Block        return;
301cad810f21b803229eb11403f9209855525a25d57Steve Block    submit(0, false, frame->script()->anyPageIsProcessingUserGesture(), SubmittedByJavaScript);
302d0825bca7fe65beaee391d30da42e937db621564Steve Block}
303d0825bca7fe65beaee391d30da42e937db621564Steve Block
30468513a70bcd92384395513322f1b801e7bf9c729Steve Blockvoid HTMLFormElement::submit(Event* event, bool activateSubmitButton, bool processingUserGesture, FormSubmissionTrigger formSubmissionTrigger)
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameView* view = document()->view();
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = document()->frame();
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!view || !frame)
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
311cad810f21b803229eb11403f9209855525a25d57Steve Block    if (m_isSubmittingOrPreparingForSubmission) {
312cad810f21b803229eb11403f9209855525a25d57Steve Block        m_shouldSubmit = true;
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
316cad810f21b803229eb11403f9209855525a25d57Steve Block    m_isSubmittingOrPreparingForSubmission = true;
31768513a70bcd92384395513322f1b801e7bf9c729Steve Block    m_wasUserSubmitted = processingUserGesture;
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HTMLFormControlElement* firstSuccessfulSubmitButton = 0;
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool needButtonActivation = activateSubmitButton; // do we need to activate a submit button?
32168513a70bcd92384395513322f1b801e7bf9c729Steve Block
3225af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    for (unsigned i = 0; i < m_associatedElements.size(); ++i) {
323f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        FormAssociatedElement* associatedElement = m_associatedElements[i];
324f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (!associatedElement->isFormControlElement())
325f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            continue;
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (needButtonActivation) {
327f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            HTMLFormControlElement* control = static_cast<HTMLFormControlElement*>(associatedElement);
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (control->isActivatedSubmit())
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                needButtonActivation = false;
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else if (firstSuccessfulSubmitButton == 0 && control->isSuccessfulSubmitButton())
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                firstSuccessfulSubmitButton = control;
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (needButtonActivation && firstSuccessfulSubmitButton)
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        firstSuccessfulSubmitButton->setActivatedSubmit(true);
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33868513a70bcd92384395513322f1b801e7bf9c729Steve Block    frame->loader()->submitForm(FormSubmission::create(this, m_attributes, event, !processingUserGesture, formSubmissionTrigger));
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (needButtonActivation && firstSuccessfulSubmitButton)
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        firstSuccessfulSubmitButton->setActivatedSubmit(false);
34268513a70bcd92384395513322f1b801e7bf9c729Steve Block
343cad810f21b803229eb11403f9209855525a25d57Steve Block    m_shouldSubmit = false;
344cad810f21b803229eb11403f9209855525a25d57Steve Block    m_isSubmittingOrPreparingForSubmission = false;
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::reset()
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Frame* frame = document()->frame();
350cad810f21b803229eb11403f9209855525a25d57Steve Block    if (m_isInResetFunction || !frame)
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
353cad810f21b803229eb11403f9209855525a25d57Steve Block    m_isInResetFunction = true;
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
355231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!dispatchEvent(Event::create(eventNames().resetEvent, true, true))) {
356cad810f21b803229eb11403f9209855525a25d57Steve Block        m_isInResetFunction = false;
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
360f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (unsigned i = 0; i < m_associatedElements.size(); ++i) {
361f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (m_associatedElements[i]->isFormControlElement())
362f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            static_cast<HTMLFormControlElement*>(m_associatedElements[i])->reset();
363f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
365cad810f21b803229eb11403f9209855525a25d57Steve Block    m_isInResetFunction = false;
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid HTMLFormElement::parseMappedAttribute(Attribute* attr)
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (attr->name() == actionAttr)
3710617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        m_attributes.parseAction(attr->value());
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attr->name() == targetAttr)
3730617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        m_attributes.setTarget(attr->value());
374635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else if (attr->name() == methodAttr)
3750617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        m_attributes.parseMethodType(attr->value());
376635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else if (attr->name() == enctypeAttr)
3770617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        m_attributes.parseEncodingType(attr->value());
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attr->name() == accept_charsetAttr)
3790617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen        m_attributes.setAcceptCharset(attr->value());
380cad810f21b803229eb11403f9209855525a25d57Steve Block    else if (attr->name() == autocompleteAttr) {
381cad810f21b803229eb11403f9209855525a25d57Steve Block        if (!autoComplete())
38268513a70bcd92384395513322f1b801e7bf9c729Steve Block            document()->registerForDocumentActivationCallbacks(this);
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            document()->unregisterForDocumentActivationCallbacks(this);
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if (attr->name() == onsubmitAttr)
3865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        setAttributeEventListener(eventNames().submitEvent, createAttributeEventListener(this, attr));
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attr->name() == onresetAttr)
3885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        setAttributeEventListener(eventNames().resetEvent, createAttributeEventListener(this, attr));
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else if (attr->name() == nameAttr) {
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const AtomicString& newName = attr->value();
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (inDocument() && document()->isHTMLDocument()) {
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            HTMLDocument* document = static_cast<HTMLDocument*>(this->document());
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            document->removeNamedItem(m_name);
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            document->addNamedItem(newName);
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_name = newName;
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HTMLElement::parseMappedAttribute(attr);
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttemplate<class T, size_t n> static void removeFromVector(Vector<T*, n> & vec, T* item)
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    size_t size = vec.size();
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (size_t i = 0; i != size; ++i)
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (vec[i] == item) {
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vec.remove(i);
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
411f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochunsigned HTMLFormElement::formElementIndexWithFormAttribute(Element* element)
4126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
4136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Compares the position of the form element and the inserted element.
4146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Updates the indeces in order to the relation of the position:
4156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    unsigned short position = compareDocumentPosition(element);
4166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (position & DOCUMENT_POSITION_CONTAINS)
4176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        ++m_associatedElementsAfterIndex;
4186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    else if (position & DOCUMENT_POSITION_PRECEDING) {
4196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        ++m_associatedElementsBeforeIndex;
4206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        ++m_associatedElementsAfterIndex;
4216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
4226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
4236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (m_associatedElements.isEmpty())
4246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return 0;
4256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
4266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Does binary search on m_associatedElements in order to find the index
4276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // to be inserted.
4286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    unsigned left = 0, right = m_associatedElements.size() - 1;
4296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    while (left != right) {
4306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        unsigned middle = left + ((right - left) / 2);
431f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        position = element->compareDocumentPosition(toHTMLElement(m_associatedElements[middle]));
4326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (position & DOCUMENT_POSITION_FOLLOWING)
4336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            right = middle;
4346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        else
4356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            left = middle + 1;
4366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
4376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
438f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    position = element->compareDocumentPosition(toHTMLElement(m_associatedElements[left]));
4396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (position & DOCUMENT_POSITION_FOLLOWING)
4406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return left;
4416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return left + 1;
4426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
4436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
444f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochunsigned HTMLFormElement::formElementIndex(FormAssociatedElement* associatedElement)
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
446f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    HTMLElement* element = toHTMLElement(associatedElement);
4476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Treats separately the case where this element has the form attribute
4486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // for performance consideration.
449f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (element->fastHasAttribute(formAttr))
450f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        return formElementIndexWithFormAttribute(element);
4516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check for the special case where this element is the very last thing in
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the form's tree of children; we don't want to walk the entire tree in that
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // common case that occurs during parsing; instead we'll just return a value
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // that says "add this form element to the end of the array".
456f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (element->traverseNextNode(this)) {
4576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        unsigned i = m_associatedElementsBeforeIndex;
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (Node* node = this; node; node = node->traverseNextNode(this)) {
459f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            if (node == element) {
4606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                ++m_associatedElementsAfterIndex;
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return i;
4626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            }
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (node->isHTMLElement()
464f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    && (static_cast<Element*>(node)->isFormControlElement()
465f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                        || node->hasTagName(objectTag))
466f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch                    && static_cast<HTMLElement*>(node)->form() == this)
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ++i;
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return m_associatedElementsAfterIndex++;
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
473f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid HTMLFormElement::registerFormElement(FormAssociatedElement* e)
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
475f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (e->isFormControlElement()) {
476f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        HTMLFormControlElement* element = static_cast<HTMLFormControlElement*>(e);
477f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        document()->checkedRadioButtons().removeButton(element);
478f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_checkedRadioButtons.addButton(element);
479f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
4805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    m_associatedElements.insert(formElementIndex(e), e);
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
483f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid HTMLFormElement::removeFormElement(FormAssociatedElement* e)
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
485f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (e->isFormControlElement())
486f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_checkedRadioButtons.removeButton(static_cast<HTMLFormControlElement*>(e));
487f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    HTMLElement* element = toHTMLElement(e);
488f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (element->fastHasAttribute(formAttr)) {
4896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        unsigned index;
4906b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        for (index = 0; index < m_associatedElements.size(); ++index)
4916b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            if (m_associatedElements[index] == e)
4926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                break;
4936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        ASSERT(index < m_associatedElements.size());
4946b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (index < m_associatedElementsBeforeIndex)
4956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            --m_associatedElementsBeforeIndex;
4966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (index < m_associatedElementsAfterIndex)
4976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            --m_associatedElementsAfterIndex;
4986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    } else
4996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        --m_associatedElementsAfterIndex;
5005af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    removeFromVector(m_associatedElements, e);
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool HTMLFormElement::isURLAttribute(Attribute* attr) const
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return attr->name() == actionAttr;
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::registerImgElement(HTMLImageElement* e)
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5105af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ASSERT(m_imageElements.find(e) == notFound);
5115af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    m_imageElements.append(e);
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::removeImgElement(HTMLImageElement* e)
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5165af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ASSERT(m_imageElements.find(e) != notFound);
5175af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    removeFromVector(m_imageElements, e);
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPassRefPtr<HTMLCollection> HTMLFormElement::elements()
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return HTMLFormCollection::create(this);
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString HTMLFormElement::name() const
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getAttribute(nameAttr);
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
530231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool HTMLFormElement::noValidate() const
531231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
532f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return fastHasAttribute(novalidateAttr);
533231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
534231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
5355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// FIXME: This function should be removed because it does not do the same thing as the
5365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// JavaScript binding for action, which treats action as a URL attribute. Last time I
5375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen// (Darin Adler) removed this, someone added it back, so I am leaving it in for now.
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString HTMLFormElement::action() const
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getAttribute(actionAttr);
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::setAction(const String &value)
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setAttribute(actionAttr, value);
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::setEnctype(const String &value)
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setAttribute(enctypeAttr, value);
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString HTMLFormElement::method() const
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getAttribute(methodAttr);
5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::setMethod(const String &value)
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setAttribute(methodAttr, value);
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectString HTMLFormElement::target() const
5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return getAttribute(targetAttr);
5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
56868513a70bcd92384395513322f1b801e7bf9c729Steve Blockbool HTMLFormElement::wasUserSubmitted() const
569967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
57068513a70bcd92384395513322f1b801e7bf9c729Steve Block    return m_wasUserSubmitted;
571967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
572967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
573231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockHTMLFormControlElement* HTMLFormElement::defaultButton() const
574231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
5755af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    for (unsigned i = 0; i < m_associatedElements.size(); ++i) {
576f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (!m_associatedElements[i]->isFormControlElement())
577f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            continue;
578f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        HTMLFormControlElement* control = static_cast<HTMLFormControlElement*>(m_associatedElements[i]);
579231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (control->isSuccessfulSubmitButton())
580231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return control;
581231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
582231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
583231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return 0;
584231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
585231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
586231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool HTMLFormElement::checkValidity()
587231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
588f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Vector<RefPtr<FormAssociatedElement> > controls;
589dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    collectUnhandledInvalidControls(controls);
590dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return controls.isEmpty();
591dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
592231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
593f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochvoid HTMLFormElement::collectUnhandledInvalidControls(Vector<RefPtr<FormAssociatedElement> >& unhandledInvalidControls)
594dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
595dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<HTMLFormElement> protector(this);
5965af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // Copy m_associatedElements because event handlers called from
5975af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // HTMLFormControlElement::checkValidity() might change m_associatedElements.
598f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    Vector<RefPtr<FormAssociatedElement> > elements;
5995af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    elements.reserveCapacity(m_associatedElements.size());
6005af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    for (unsigned i = 0; i < m_associatedElements.size(); ++i)
6015af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        elements.append(m_associatedElements[i]);
602dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    for (unsigned i = 0; i < elements.size(); ++i) {
603f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (elements[i]->form() == this && elements[i]->isFormControlElement())
604f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            static_cast<HTMLFormControlElement*>(elements[i].get())->checkValidity(&unhandledInvalidControls);
605231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
606231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
607231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
608cad810f21b803229eb11403f9209855525a25d57Steve BlockHTMLFormControlElement* HTMLFormElement::elementForAlias(const AtomicString& alias)
6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (alias.isEmpty() || !m_elementAliases)
6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
612cad810f21b803229eb11403f9209855525a25d57Steve Block    return m_elementAliases->get(alias.impl()).get();
6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::addElementAlias(HTMLFormControlElement* element, const AtomicString& alias)
6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (alias.isEmpty())
6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_elementAliases)
620e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block        m_elementAliases = adoptPtr(new AliasMap);
6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_elementAliases->set(alias.impl(), element);
6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::getNamedElements(const AtomicString& name, Vector<RefPtr<Node> >& namedItems)
6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    elements()->namedItems(name, namedItems);
6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
628cad810f21b803229eb11403f9209855525a25d57Steve Block    HTMLFormControlElement* aliasElement = elementForAlias(name);
629cad810f21b803229eb11403f9209855525a25d57Steve Block    if (aliasElement) {
630cad810f21b803229eb11403f9209855525a25d57Steve Block        if (namedItems.find(aliasElement) == notFound) {
631cad810f21b803229eb11403f9209855525a25d57Steve Block            // We have seen it before but it is gone now. Still, we need to return it.
632cad810f21b803229eb11403f9209855525a25d57Steve Block            // FIXME: The above comment is not clear enough; it does not say why we need to do this.
633cad810f21b803229eb11403f9209855525a25d57Steve Block            namedItems.append(aliasElement);
6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
636cad810f21b803229eb11403f9209855525a25d57Steve Block    if (namedItems.size() && namedItems.first() != aliasElement)
63768513a70bcd92384395513322f1b801e7bf9c729Steve Block        addElementAlias(static_cast<HTMLFormControlElement*>(namedItems.first().get()), name);
6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::documentDidBecomeActive()
6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
642cad810f21b803229eb11403f9209855525a25d57Steve Block    ASSERT(!autoComplete());
64368513a70bcd92384395513322f1b801e7bf9c729Steve Block
644f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (unsigned i = 0; i < m_associatedElements.size(); ++i) {
645f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        if (m_associatedElements[i]->isFormControlElement())
646f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            static_cast<HTMLFormControlElement*>(m_associatedElements[i])->reset();
647f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::willMoveToNewOwnerDocument()
6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
652cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!autoComplete())
6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        document()->unregisterForDocumentActivationCallbacks(this);
6545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    HTMLElement::willMoveToNewOwnerDocument();
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLFormElement::didMoveToNewOwnerDocument()
6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
659cad810f21b803229eb11403f9209855525a25d57Steve Block    if (!autoComplete())
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        document()->registerForDocumentActivationCallbacks(this);
6615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    HTMLElement::didMoveToNewOwnerDocument();
6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
664cad810f21b803229eb11403f9209855525a25d57Steve Blockbool HTMLFormElement::autoComplete() const
665cad810f21b803229eb11403f9209855525a25d57Steve Block{
666cad810f21b803229eb11403f9209855525a25d57Steve Block    return !equalIgnoringCase(fastGetAttribute(autocompleteAttr), "off");
667cad810f21b803229eb11403f9209855525a25d57Steve Block}
668cad810f21b803229eb11403f9209855525a25d57Steve Block
6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace
670