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