15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999 Antti Koivisto (koivisto@kde.org) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2001 Dirk Mueller (mueller@kde.org) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2006 Alexey Proskuryakov (ap@nypop.com) 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFormControlElement.h" 2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 289e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/dom/ElementTraversal.h" 291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/Event.h" 309e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/frame/UseCounter.h" 3107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "core/html/HTMLDataListElement.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFieldSetElement.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFormElement.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLLegendElement.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/ValidityState.h" 37e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/inspector/ConsoleMessage.h" 38197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/page/Page.h" 39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/page/ValidationMessageClient.h" 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderBox.h" 4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTheme.h" 42e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "platform/text/BidiTextRun.h" 43e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/Vector.h" 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 45c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 498abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)HTMLFormControlElement::HTMLFormControlElement(const QualifiedName& tagName, Document& document, HTMLFormElement* form) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : LabelableElement(tagName, document) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_disabled(false) 521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) , m_isAutofilled(false) 5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) , m_isReadOnly(false) 54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) , m_isRequired(false) 55197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch , m_hasValidationMessage(false) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_ancestorDisabledState(AncestorDisabledStateUnknown) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_dataListAncestorState(Unknown) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_willValidateInitialized(false) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_willValidate(true) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_isValid(true) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_wasChangedSinceLastFormControlChangeEvent(false) 62591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch , m_wasFocusedByMouse(false) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) setHasCustomStyleCallbacks(); 6509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) associateByParser(form); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLFormControlElement::~HTMLFormControlElement() 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 70f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#if !ENABLE(OILPAN) 718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) setForm(0); 72f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 75323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void HTMLFormControlElement::trace(Visitor* visitor) 76323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 77323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) FormAssociatedElement::trace(visitor); 78323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) LabelableElement::trace(visitor); 79323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 80323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLFormControlElement::formEnctype() const 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const AtomicString& formEnctypeAttr = fastGetAttribute(formenctypeAttr); 84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (formEnctypeAttr.isNull()) 85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return emptyString(); 86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return FormSubmission::Attributes::parseEncodingType(formEnctypeAttr); 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 89a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void HTMLFormControlElement::setFormEnctype(const AtomicString& value) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setAttribute(formenctypeAttr, value); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLFormControlElement::formMethod() const 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) const AtomicString& formMethodAttr = fastGetAttribute(formmethodAttr); 97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (formMethodAttr.isNull()) 98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return emptyString(); 99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return FormSubmission::Attributes::methodString(FormSubmission::Attributes::parseMethodType(formMethodAttr)); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 102a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void HTMLFormControlElement::setFormMethod(const AtomicString& value) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setAttribute(formmethodAttr, value); 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLFormControlElement::formNoValidate() const 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return fastHasAttribute(formnovalidateAttr); 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormControlElement::updateAncestorDisabledState() const 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLFieldSetElement* fieldSetAncestor = 0; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ContainerNode* legendAncestor = 0; 11607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch for (HTMLElement* ancestor = Traversal<HTMLElement>::firstAncestor(*this); ancestor; ancestor = Traversal<HTMLElement>::firstAncestor(*ancestor)) { 117d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!legendAncestor && isHTMLLegendElement(*ancestor)) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) legendAncestor = ancestor; 119d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (isHTMLFieldSetElement(*ancestor)) { 1208abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) fieldSetAncestor = toHTMLFieldSetElement(ancestor); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_ancestorDisabledState = (fieldSetAncestor && fieldSetAncestor->isDisabledFormControl() && !(legendAncestor && legendAncestor == fieldSetAncestor->legend())) ? AncestorDisabledStateDisabled : AncestorDisabledStateEnabled; 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormControlElement::ancestorDisabledStateWasChanged() 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_ancestorDisabledState = AncestorDisabledStateUnknown; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) disabledAttributeChanged(); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void HTMLFormControlElement::reset() 1341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 1351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) setAutofilled(false); 1361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) resetImpl(); 1371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 1381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLFormControlElement::parseAttribute(const QualifiedName& name, const AtomicString& value) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (name == formAttr) { 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) formAttributeChanged(); 1431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) UseCounter::count(document(), UseCounter::FormAttribute); 144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else if (name == disabledAttr) { 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool oldDisabled = m_disabled; 146926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_disabled = !value.isNull(); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (oldDisabled != m_disabled) 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) disabledAttributeChanged(); 149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else if (name == readonlyAttr) { 15053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) bool wasReadOnly = m_isReadOnly; 15153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) m_isReadOnly = !value.isNull(); 15253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) if (wasReadOnly != m_isReadOnly) { 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setNeedsWillValidateCheck(); 15409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) setNeedsStyleRecalc(SubtreeStyleChange); 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (renderer() && renderer()->style()->hasAppearance()) 156d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RenderTheme::theme().stateChanged(renderer(), ReadOnlyControlState); 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else if (name == requiredAttr) { 159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) bool wasRequired = m_isRequired; 160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_isRequired = !value.isNull(); 161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (wasRequired != m_isRequired) 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) requiredAttributeChanged(); 1631e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) UseCounter::count(document(), UseCounter::RequiredAttribute); 164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } else if (name == autofocusAttr) { 165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HTMLElement::parseAttribute(name, value); 1661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) UseCounter::count(document(), UseCounter::AutoFocusAttribute); 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else 168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) HTMLElement::parseAttribute(name, value); 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormControlElement::disabledAttributeChanged() 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setNeedsWillValidateCheck(); 1747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci pseudoStateChanged(CSSSelector::PseudoDisabled); 1757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci pseudoStateChanged(CSSSelector::PseudoEnabled); 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (renderer() && renderer()->style()->hasAppearance()) 177d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RenderTheme::theme().stateChanged(renderer(), EnabledControlState); 1788abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) if (isDisabledFormControl() && treeScope().adjustedFocusedElement() == this) { 179f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // We might want to call blur(), but it's dangerous to dispatch events 180f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) // here. 1818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) document().setNeedsFocusedElementCheck(); 182f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) } 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormControlElement::requiredAttributeChanged() 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setNeedsValidityCheck(); 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Style recalculation is needed because style selectors may include 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // :required and :optional pseudo-classes. 19009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) setNeedsStyleRecalc(SubtreeStyleChange); 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool HTMLFormControlElement::supportsAutofocus() const 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 19509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return false; 1961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 1971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 1981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool HTMLFormControlElement::isAutofocusable() const 1991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 20009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return fastHasAttribute(autofocusAttr) && supportsAutofocus(); 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void HTMLFormControlElement::setAutofilled(bool autofilled) 20402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 2051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (autofilled == m_isAutofilled) 2061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return; 2071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 2081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_isAutofilled = autofilled; 20909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) setNeedsStyleRecalc(SubtreeStyleChange); 2101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 2111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 2121e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static bool shouldAutofocusOnAttach(const HTMLFormControlElement* element) 2131e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 2141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (!element->isAutofocusable()) 2151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return false; 2161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (element->document().isSandboxed(SandboxAutomaticFeatures)) { 2171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // FIXME: This message should be moved off the console once a solution to https://bugs.webkit.org/show_bug.cgi?id=103274 exists. 218e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) element->document().addConsoleMessage(ConsoleMessage::create(SecurityMessageSource, ErrorMessageLevel, "Blocked autofocusing on a form control because the form's frame is sandboxed and the 'allow-scripts' permission is not set.")); 2191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return false; 2201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) } 2211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 2221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return true; 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 225521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void HTMLFormControlElement::attach(const AttachContext& context) 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 227521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) HTMLElement::attach(context); 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (!renderer()) 2301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return; 2311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The call to updateFromElement() needs to go after the call through 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to the base class's attach() because that can sometimes do a close 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // on the renderer. 2351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) renderer()->updateFromElement(); 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // FIXME: Autofocus handling should be moved to insertedInto according to 23809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // the standard. 23909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (shouldAutofocusOnAttach(this)) 24009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) document().setAutofocusElement(this); 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void HTMLFormControlElement::didMoveToNewDocument(Document& oldDocument) 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FormAssociatedElement::didMoveToNewDocument(oldDocument); 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLElement::didMoveToNewDocument(oldDocument); 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node::InsertionNotificationRequest HTMLFormControlElement::insertedInto(ContainerNode* insertionPoint) 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_ancestorDisabledState = AncestorDisabledStateUnknown; 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dataListAncestorState = Unknown; 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setNeedsWillValidateCheck(); 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLElement::insertedInto(insertionPoint); 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FormAssociatedElement::insertedInto(insertionPoint); 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return InsertionDone; 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormControlElement::removedFrom(ContainerNode* insertionPoint) 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 261323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) hideVisibleValidationMessage(); 262197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_hasValidationMessage = false; 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_ancestorDisabledState = AncestorDisabledStateUnknown; 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dataListAncestorState = Unknown; 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLElement::removedFrom(insertionPoint); 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FormAssociatedElement::removedFrom(insertionPoint); 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLFormControlElement::setChangedSinceLastFormControlChangeEvent(bool changed) 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 27109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_wasChangedSinceLastFormControlChangeEvent = changed; 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 27409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLFormControlElement::dispatchChangeEvent() 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 27609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) dispatchScopedEvent(Event::createBubble(EventTypeNames::change)); 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormControlElement::dispatchFormControlChangeEvent() 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 28109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) dispatchChangeEvent(); 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setChangedSinceLastFormControlChangeEvent(false); 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormControlElement::dispatchFormControlInputEvent() 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setChangedSinceLastFormControlChangeEvent(true); 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HTMLElement::dispatchInputEvent(); 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)HTMLFormElement* HTMLFormControlElement::formOwner() const 29209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 29309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return FormAssociatedElement::form(); 29409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 29509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 29653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool HTMLFormControlElement::isDisabledFormControl() const 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_disabled) 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_ancestorDisabledState == AncestorDisabledStateUnknown) 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateAncestorDisabledState(); 30393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) return m_ancestorDisabledState == AncestorDisabledStateDisabled; 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool HTMLFormControlElement::isRequired() const 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_isRequired; 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 311bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)String HTMLFormControlElement::resultForDialogSubmit() 312bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 313bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return fastGetAttribute(valueAttr); 314bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 315bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 3168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void HTMLFormControlElement::didRecalcStyle(StyleRecalcChange) 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 31809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (RenderObject* renderer = this->renderer()) 31909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) renderer->updateFromElement(); 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLFormControlElement::supportsFocus() const 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 32453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) return !isDisabledFormControl(); 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 327f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)bool HTMLFormControlElement::isKeyboardFocusable() const 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 329591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch // Skip tabIndex check in a parent class. 330591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return isFocusable(); 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 333591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochbool HTMLFormControlElement::shouldShowFocusRingOnMouseFocus() const 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool HTMLFormControlElement::shouldHaveFocusAppearance() const 3397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 3407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return !m_wasFocusedByMouse || shouldShowFocusRingOnMouseFocus(); 3417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 3427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 34309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLFormControlElement::dispatchFocusEvent(Element* oldFocusedElement, FocusType type) 344591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 34509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (type != FocusTypePage) 34609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_wasFocusedByMouse = type == FocusTypeMouse; 34709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) HTMLElement::dispatchFocusEvent(oldFocusedElement, type); 348591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 349591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 350591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid HTMLFormControlElement::willCallDefaultEventHandler(const Event& event) 351591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{ 352591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (!m_wasFocusedByMouse) 353591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return; 3547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!event.isKeyboardEvent() || event.type() != EventTypeNames::keydown) 3557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 356591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch m_wasFocusedByMouse = false; 357591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (renderer()) 3589e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) renderer()->setShouldDoFullPaintInvalidation(true); 359591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch} 360591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)short HTMLFormControlElement::tabIndex() const 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Skip the supportsFocus check in HTMLElement. 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Element::tabIndex(); 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLFormControlElement::recalcWillValidate() const 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_dataListAncestorState == Unknown) { 37007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (Traversal<HTMLDataListElement>::firstAncestor(*this)) 37107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch m_dataListAncestorState = InsideDataList; 37207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch else 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_dataListAncestorState = NotInsideDataList; 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 375926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return m_dataListAncestorState == NotInsideDataList && !isDisabledOrReadOnly(); 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLFormControlElement::willValidate() const 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_willValidateInitialized || m_dataListAncestorState == Unknown) { 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_willValidateInitialized = true; 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool newWillValidate = recalcWillValidate(); 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_willValidate != newWillValidate) { 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_willValidate = newWillValidate; 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const_cast<HTMLFormControlElement*>(this)->setNeedsValidityCheck(); 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the following assertion fails, setNeedsWillValidateCheck() is not 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // called correctly when something which changes recalcWillValidate() result 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is updated. 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_willValidate == recalcWillValidate()); 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_willValidate; 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormControlElement::setNeedsWillValidateCheck() 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We need to recalculate willValidate immediately because willValidate change can causes style change. 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool newWillValidate = recalcWillValidate(); 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_willValidateInitialized && m_willValidate == newWillValidate) 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_willValidateInitialized = true; 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_willValidate = newWillValidate; 4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setNeedsValidityCheck(); 40509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) setNeedsStyleRecalc(SubtreeStyleChange); 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_willValidate) 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) hideVisibleValidationMessage(); 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 410e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void HTMLFormControlElement::findCustomValidationMessageTextDirection(const String& message, TextDirection &messageDir, String& subMessage, TextDirection &subMessageDir) 411e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){ 412e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) bool hasStrongDirection; 413e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) subMessage = fastGetAttribute(titleAttr); 414e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) messageDir = determineDirectionality(message, hasStrongDirection); 415e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (!subMessage.isEmpty()) 416e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) subMessageDir = renderer()->style()->direction(); 417e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)} 418e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormControlElement::updateVisibleValidationMessage() 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) Page* page = document().page(); 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!page) 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String message; 4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (renderer() && willValidate()) 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) message = validationMessage().stripWhiteSpace(); 427197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 428197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch m_hasValidationMessage = true; 429197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ValidationMessageClient* client = &page->validationMessageClient(); 430e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) TextDirection messageDir = LTR; 431e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) TextDirection subMessageDir = LTR; 432e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) String subMessage = String(); 433197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (message.isEmpty()) 434197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch client->hideValidationMessage(*this); 435197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch else 436e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) findCustomValidationMessageTextDirection(message, messageDir, subMessage, subMessageDir); 437e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) client->showValidationMessage(*this, message, messageDir, subMessage, subMessageDir); 4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormControlElement::hideVisibleValidationMessage() 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 442197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!m_hasValidationMessage) 443197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return; 444197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 445197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (ValidationMessageClient* client = validationMessageClient()) 446197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch client->hideValidationMessage(*this); 447197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 448197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 449197021e6b966cfb06891637935ef33fff06433d1Ben Murdochbool HTMLFormControlElement::isValidationMessageVisible() const 450197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 451197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!m_hasValidationMessage) 452197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return false; 453197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 454197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch ValidationMessageClient* client = validationMessageClient(); 455197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!client) 456197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return false; 457197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 458197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return client->isValidationMessageVisible(*this); 459197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch} 460197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 461197021e6b966cfb06891637935ef33fff06433d1Ben MurdochValidationMessageClient* HTMLFormControlElement::validationMessageClient() const 462197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{ 463197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch Page* page = document().page(); 464197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (!page) 465197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return 0; 466197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 467197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return &page->validationMessageClient(); 4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 470323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)bool HTMLFormControlElement::checkValidity(WillBeHeapVector<RefPtrWillBeMember<FormAssociatedElement> >* unhandledInvalidControls) 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!willValidate() || isValidFormControlElement()) 4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // An event handler can deref this object. 475323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) RefPtrWillBeRawPtr<HTMLFormControlElement> protector(this); 476323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) RefPtrWillBeRawPtr<Document> originalDocument(document()); 4771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) bool needsDefaultAction = dispatchEvent(Event::createCancelable(EventTypeNames::invalid)); 4781e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (needsDefaultAction && unhandledInvalidControls && inDocument() && originalDocument == document()) 4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unhandledInvalidControls->append(this); 4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLFormControlElement::isValidFormControlElement() 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If the following assertion fails, setNeedsValidityCheck() is not called 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // correctly when something which changes validity is updated. 4871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) ASSERT(m_isValid == valid()); 4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_isValid; 4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormControlElement::setNeedsValidityCheck() 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) bool newIsValid = valid(); 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (willValidate() && newIsValid != m_isValid) { 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Update style for pseudo classes such as :valid :invalid. 49609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) setNeedsStyleRecalc(SubtreeStyleChange); 4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_isValid = newIsValid; 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 50009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // Updates only if this control already has a validation message. 501197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (isValidationMessageVisible()) { 5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Calls updateVisibleValidationMessage() even if m_isValid is not 503197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch // changed because a validation message can be changed. 5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) updateVisibleValidationMessage(); 5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLFormControlElement::setCustomValidity(const String& error) 5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FormAssociatedElement::setCustomValidity(error); 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setNeedsValidityCheck(); 5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 51402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochvoid HTMLFormControlElement::dispatchBlurEvent(Element* newFocusedElement) 5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 51602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch HTMLElement::dispatchBlurEvent(newFocusedElement); 5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) hideVisibleValidationMessage(); 5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 52051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool HTMLFormControlElement::isSuccessfulSubmitButton() const 52151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 52251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return canBeSuccessfulSubmitButton() && !isDisabledFormControl(); 52351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 52451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLFormControlElement::isDefaultButtonForForm() const 5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return isSuccessfulSubmitButton() && form() && form()->defaultButton() == this; 5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLFormControlElement* HTMLFormControlElement::enclosingFormControlElement(Node* node) 5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 53207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (!node) 53307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return 0; 53407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch return Traversal<HTMLFormControlElement>::firstAncestorOrSelf(*node); 5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 537a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)String HTMLFormControlElement::nameForAutofill() const 538a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){ 539a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) String fullName = name(); 540a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) String trimmedName = fullName.stripWhiteSpace(); 541a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) if (!trimmedName.isEmpty()) 542a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return trimmedName; 543a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) fullName = getIdAttribute(); 544a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) trimmedName = fullName.stripWhiteSpace(); 545a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return trimmedName; 546a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)} 547a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 54809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLFormControlElement::setFocus(bool flag) 54909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 55009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) LabelableElement::setFocus(flag); 55109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 55209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (!flag && wasChangedSinceLastFormControlChangeEvent()) 55309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) dispatchFormControlChangeEvent(); 55409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 55509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 5567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} // namespace blink 557