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