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