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, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2006 Alexey Proskuryakov (ap@nypop.com)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Samuel Weinig (sam@webkit.org)
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Samsung Electronics. All rights reserved.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h"
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionMessages.h"
33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptEventListener.h"
35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/V8DOMActivityLogger.h"
365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSPropertyNames.h"
375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h"
387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/InputTypeNames.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/accessibility/AXObjectCache.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/IdTargetObserver.h"
43e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ElementShadow.h"
44e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/InsertionPoint.h"
45e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h"
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/FrameSelection.h"
4751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/editing/SpellChecker.h"
481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/BeforeTextInsertedEvent.h"
491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/KeyboardEvent.h"
501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/MouseEvent.h"
511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/ScopedEventQueue.h"
521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/TouchEvent.h"
5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/fileapi/FileList.h"
54e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/frame/EventHandlerRegistry.h"
5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/FrameHost.h"
56f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/frame/FrameView.h"
57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/UseCounter.h"
5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLCollection.h"
6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLDataListElement.h"
619e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)#include "core/html/HTMLDataListOptionsCollection.h"
6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFormElement.h"
6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLImageLoader.h"
6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLOptionElement.h"
657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/html/forms/ColorChooser.h"
6606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/ColorInputType.h"
677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/html/forms/DateTimeChooser.h"
6806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/FileInputType.h"
6906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/FormController.h"
7006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/InputType.h"
7106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/SearchInputType.h"
7253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/HTMLParserIdioms.h"
73f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/html/shadow/ShadowElementNames.h"
7451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/page/Chrome.h"
7551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/page/ChromeClient.h"
7653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTextControlSingleLine.h"
7753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTheme.h"
781e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Language.h"
791e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformMouseEvent.h"
805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h"
811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/PlatformLocale.h"
82591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/MathExtras.h"
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)class ListAttributeTargetObserver : public IdTargetObserver {
89f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
91f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    static PassOwnPtrWillBeRawPtr<ListAttributeTargetObserver> create(const AtomicString& id, HTMLInputElement*);
92f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void idTargetChanged() OVERRIDE;
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ListAttributeTargetObserver(const AtomicString& id, HTMLInputElement*);
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
98f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    RawPtrWillBeMember<HTMLInputElement> m_element;
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: According to HTML4, the length attribute's value can be arbitrarily
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// large. However, due to https://bugs.webkit.org/show_bug.cgi?id=14536 things
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// get rather sluggish when a text field has a larger number of characters than
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// this, even when just clicking in the text field.
105f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)const int HTMLInputElement::maximumLength = 524288;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const int defaultSize = 20;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const int maxSavedResults = 256;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)HTMLInputElement::HTMLInputElement(Document& document, HTMLFormElement* form, bool createdByParser)
11051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    : HTMLTextFormControlElement(inputTag, document, form)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_size(defaultSize)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_maxLength(maximumLength)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_maxResults(-1)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isChecked(false)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_reflectsCheckedAttribute(true)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isIndeterminate(false)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isActivatedSubmit(false)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_autocomplete(Uninitialized)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_hasNonEmptyList(false)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_stateRestored(false)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_parsingInProgress(createdByParser)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_valueAttributeWasUpdatedAfterParsing(false)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_canReceiveDroppedFiles(false)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_hasTouchEventHandler(false)
12509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_shouldRevealPassword(false)
126a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    , m_needsToUpdateViewValue(true)
127bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    , m_inputType(InputType::createText(*this))
128c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    , m_inputTypeView(m_inputType)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setHasCustomStyleCallbacks();
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
135323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)PassRefPtrWillBeRawPtr<HTMLInputElement> HTMLInputElement::create(Document& document, HTMLFormElement* form, bool createdByParser)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<HTMLInputElement> inputElement = adoptRefWillBeNoop(new HTMLInputElement(document, form, createdByParser));
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    inputElement->ensureUserAgentShadowRoot();
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return inputElement.release();
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
142323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void HTMLInputElement::trace(Visitor* visitor)
143323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
144323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    visitor->trace(m_inputType);
145323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    visitor->trace(m_inputTypeView);
146f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    visitor->trace(m_listAttributeTargetObserver);
1475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    visitor->trace(m_imageLoader);
148323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    HTMLTextFormControlElement::trace(visitor);
149323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
150323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)HTMLImageLoader* HTMLInputElement::imageLoader()
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_imageLoader)
1545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_imageLoader = HTMLImageLoader::create(this);
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_imageLoader.get();
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::didAddUserAgentShadowRoot(ShadowRoot&)
159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
16051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->createShadowSubtree();
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1636f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochvoid HTMLInputElement::willAddFirstAuthorShadowRoot()
1648abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
16551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->destroyShadowSubtree();
166bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    m_inputTypeView = InputTypeView::create(*this);
16751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    lazyReattachIfAttached();
1688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
1698abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLInputElement::~HTMLInputElement()
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
172f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#if !ENABLE(OILPAN)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Need to remove form association while this is still an HTMLInputElement
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // so that virtual functions are called correctly.
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setForm(0);
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // setForm(0) may register this to a document-level radio button group.
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We should unregister it to avoid accessing a deleted object.
1787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (type() == InputTypeNames::radio)
179d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        document().formController().radioButtonGroupScope().removeButton(this);
180e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (m_hasTouchEventHandler && document().frameHost())
181e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        document().frameHost()->eventHandlerRegistry().didRemoveEventHandler(*this, EventHandlerRegistry::TouchEvent);
182f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& HTMLInputElement::name() const
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_name.isNull() ? emptyAtom : m_name;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Vector<FileChooserFileInfo> HTMLInputElement::filesFromFileInputFormControlState(const FormControlState& state)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return FileInputType::filesFromFormControlState(state);
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::shouldAutocomplete() const
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_autocomplete != Uninitialized)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_autocomplete == On;
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return HTMLTextFormControlElement::shouldAutocomplete();
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isValidValue(const String& value) const
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_inputType->canSetStringValue()) {
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !m_inputType->typeMismatchFor(value)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && !m_inputType->stepMismatch(value)
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && !m_inputType->rangeUnderflow(value)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && !m_inputType->rangeOverflow(value)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && !tooLong(value, IgnoreDirtyFlag)
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && !m_inputType->patternMismatch(value)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && !m_inputType->valueMissing(value);
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::tooLong() const
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return willValidate() && tooLong(value(), CheckDirtyFlag);
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::typeMismatch() const
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return willValidate() && m_inputType->typeMismatch();
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::valueMissing() const
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return willValidate() && m_inputType->valueMissing(value());
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool HTMLInputElement::hasBadInput() const
233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return willValidate() && m_inputType->hasBadInput();
235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::patternMismatch() const
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return willValidate() && m_inputType->patternMismatch(value());
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::tooLong(const String& value, NeedsToCheckDirtyFlag check) const
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_inputType->tooLong(value, check);
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::rangeUnderflow() const
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return willValidate() && m_inputType->rangeUnderflow(value());
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::rangeOverflow() const
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return willValidate() && m_inputType->rangeOverflow(value());
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::validationMessage() const
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!willValidate())
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String();
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (customError())
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return customValidationMessage();
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->validationMessage();
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double HTMLInputElement::minimum() const
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->minimum();
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double HTMLInputElement::maximum() const
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->maximum();
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::stepMismatch() const
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return willValidate() && m_inputType->stepMismatch(value());
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::getAllowedValueStep(Decimal* step) const
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->getAllowedValueStep(step);
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)StepRange HTMLInputElement::createStepRange(AnyStepHandling anyStepHandling) const
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->createStepRange(anyStepHandling);
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Decimal HTMLInputElement::findClosestTickMarkValue(const Decimal& value)
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->findClosestTickMarkValue(value);
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::stepUp(int n, ExceptionState& exceptionState)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputType->stepUp(n, exceptionState);
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::stepDown(int n, ExceptionState& exceptionState)
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
30551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputType->stepUp(-n, exceptionState);
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::blur()
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
310c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->blur();
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::defaultBlur()
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::blur();
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::hasCustomFocusLogic() const
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
320c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return m_inputTypeView->hasCustomFocusLogic();
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
323f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)bool HTMLInputElement::isKeyboardFocusable() const
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
325f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    return m_inputType->isKeyboardFocusable();
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
328591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochbool HTMLInputElement::shouldShowFocusRingOnMouseFocus() const
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
330591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return m_inputType->shouldShowFocusRingOnMouseFocus();
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::updateFocusAppearance(bool restorePreviousSelection)
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isTextField()) {
3366f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (!restorePreviousSelection)
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            select();
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            restoreCachedSelection();
3408abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (document().frame())
3418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            document().frame()->selection().revealSelection();
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HTMLTextFormControlElement::updateFocusAppearance(restorePreviousSelection);
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
346f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void HTMLInputElement::beginEditing()
347f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){
34809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(document().isActive());
34909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!document().isActive())
35009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
35109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
352f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (!isTextField())
353f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return;
354f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
35509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    document().frame()->spellChecker().didBeginEditing(this);
356f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)}
357f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLInputElement::endEditing()
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
36009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(document().isActive());
36109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!document().isActive())
36209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
36309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
364926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!isTextField())
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
367d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = document().frame();
36809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    frame->spellChecker().didEndEditingOnTextField(this);
36909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    frame->host()->chrome().client().didEndEditingOnTextField(*this);
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLInputElement::handleFocusEvent(Element* oldFocusedElement, FocusType type)
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
37409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_inputTypeView->handleFocusEvent(oldFocusedElement, type);
375e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_inputType->enableSecureTextInput();
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid HTMLInputElement::dispatchFocusInEvent(const AtomicString& eventType, Element* oldFocusedElement, FocusType type)
3797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
3807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (eventType == EventTypeNames::DOMFocusIn)
3817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_inputTypeView->handleFocusInEvent(oldFocusedElement, type);
3827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    HTMLFormControlElementWithState::dispatchFocusInEvent(eventType, oldFocusedElement, type);
3837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
3847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::handleBlurEvent()
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
387e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_inputType->disableSecureTextInput();
388c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->handleBlurEvent();
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
391a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void HTMLInputElement::setType(const AtomicString& type)
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
39309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setAttribute(typeAttr, type);
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::updateType()
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    const AtomicString& newTypeName = InputType::normalizeTypeName(fastGetAttribute(typeAttr));
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
400a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (m_inputType->formControlType() == newTypeName)
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
403323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeRawPtr<InputType> newType = InputType::create(*this, newTypeName);
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    removeFromRadioButtonGroup();
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool didStoreValue = m_inputType->storesValueSeparateFromAttribute();
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool didRespectHeightAndWidth = m_inputType->shouldRespectHeightAndWidthAttributes();
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->destroyShadowSubtree();
410f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    lazyReattachIfAttached();
411926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inputType = newType.release();
4138abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (hasAuthorShadowRoot())
414bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        m_inputTypeView = InputTypeView::create(*this);
4158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    else
4168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        m_inputTypeView = m_inputType;
41751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->createShadowSubtree();
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
419c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    bool hasTouchEventHandler = m_inputTypeView->hasTouchEventHandler();
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hasTouchEventHandler != m_hasTouchEventHandler) {
421e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        // If the Document is being or has been stopped, don't register any handlers.
422e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (document().frameHost() && document().lifecycle().state() < DocumentLifecycle::Stopping) {
423e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            EventHandlerRegistry& registry = document().frameHost()->eventHandlerRegistry();
424e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            if (hasTouchEventHandler)
425e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                registry.didAddEventHandler(*this, EventHandlerRegistry::TouchEvent);
426e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            else
427e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                registry.didRemoveEventHandler(*this, EventHandlerRegistry::TouchEvent);
428e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
429926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_hasTouchEventHandler = hasTouchEventHandler;
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsWillValidateCheck();
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool willStoreValue = m_inputType->storesValueSeparateFromAttribute();
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (didStoreValue && !willStoreValue && hasDirtyValue()) {
437a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        setAttribute(valueAttr, AtomicString(m_valueIfDirty));
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_valueIfDirty = String();
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!didStoreValue && willStoreValue) {
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AtomicString valueString = fastGetAttribute(valueAttr);
442e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        m_inputType->warnIfValueIsInvalid(valueString);
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_valueIfDirty = sanitizeValue(valueString);
444e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    } else {
4457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (!hasDirtyValue())
4467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            m_inputType->warnIfValueIsInvalid(fastGetAttribute(valueAttr).string());
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateValueIfNeeded();
448e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
450a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_needsToUpdateViewValue = true;
45151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->updateView();
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (didRespectHeightAndWidth != m_inputType->shouldRespectHeightAndWidthAttributes()) {
454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        ASSERT(elementData());
455c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        AttributeCollection attributes = attributesWithoutUpdate();
456197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (const Attribute* height = attributes.find(heightAttr))
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            attributeChanged(heightAttr, height->value());
458197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (const Attribute* width = attributes.find(widthAttr))
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            attributeChanged(widthAttr, width->value());
460197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (const Attribute* align = attributes.find(alignAttr))
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            attributeChanged(alignAttr, align->value());
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
464f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (document().focusedElement() == this)
465f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        document().updateFocusAppearanceSoon(true /* restore selection */);
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setChangedSinceLastFormControlChangeEvent(false);
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    addToRadioButtonGroup();
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsValidityCheck();
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    notifyFormStateChanged();
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::subtreeHasChanged()
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
477c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->subtreeHasChanged();
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // When typing in an input field, childrenChanged is not called, so we need to force the directionality check.
479926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    calculateAndAdjustDirectionality();
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& HTMLInputElement::formControlType() const
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->formControlType();
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::shouldSaveAndRestoreFormControlState() const
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_inputType->shouldSaveAndRestoreFormControlState())
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return HTMLTextFormControlElement::shouldSaveAndRestoreFormControlState();
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FormControlState HTMLInputElement::saveFormControlState() const
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->saveFormControlState();
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::restoreFormControlState(const FormControlState& state)
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inputType->restoreFormControlState(state);
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_stateRestored = true;
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::canStartSelection() const
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isTextField())
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return HTMLTextFormControlElement::canStartSelection();
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)int HTMLInputElement::selectionStartForBinding(ExceptionState& exceptionState) const
51393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
51409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
515a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
51693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return 0;
51793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
51893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return HTMLTextFormControlElement::selectionStart();
51993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
52093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
52151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)int HTMLInputElement::selectionEndForBinding(ExceptionState& exceptionState) const
52293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
52309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
52409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
52593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return 0;
52693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
52793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return HTMLTextFormControlElement::selectionEnd();
52893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
52993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
53051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String HTMLInputElement::selectionDirectionForBinding(ExceptionState& exceptionState) const
53193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
53209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
533a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
53493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return String();
53593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
53693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return HTMLTextFormControlElement::selectionDirection();
53793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
53893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
53951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setSelectionStartForBinding(int start, ExceptionState& exceptionState)
54093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
54109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
542a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
54393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return;
54493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
54593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    HTMLTextFormControlElement::setSelectionStart(start);
54693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
54793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
54851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setSelectionEndForBinding(int end, ExceptionState& exceptionState)
54993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
55009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
551a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
55293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return;
55393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
55493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    HTMLTextFormControlElement::setSelectionEnd(end);
55593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
55693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
55751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setSelectionDirectionForBinding(const String& direction, ExceptionState& exceptionState)
55893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
55909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
560a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
56193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return;
56293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
56393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    HTMLTextFormControlElement::setSelectionDirection(direction);
56493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
56593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
56651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setSelectionRangeForBinding(int start, int end, ExceptionState& exceptionState)
56793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
56809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
569a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
57093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return;
57193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
57293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    HTMLTextFormControlElement::setSelectionRange(start, end);
57393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
57493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
57551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setSelectionRangeForBinding(int start, int end, const String& direction, ExceptionState& exceptionState)
57693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
57709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
578a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
57993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return;
58093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
58193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    HTMLTextFormControlElement::setSelectionRange(start, end, direction);
58293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
58393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::accessKeyAction(bool sendMouseEvents)
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inputType->accessKeyAction(sendMouseEvents);
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isPresentationAttribute(const QualifiedName& name) const
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME: Remove type check.
5927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (name == vspaceAttr || name == hspaceAttr || name == alignAttr || name == widthAttr || name == heightAttr || (name == borderAttr && type() == InputTypeNames::image))
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return HTMLTextFormControlElement::isPresentationAttribute(name);
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
597926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLInputElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStylePropertySet* style)
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
599926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (name == vspaceAttr) {
600926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        addHTMLLengthToStyle(style, CSSPropertyMarginTop, value);
601926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        addHTMLLengthToStyle(style, CSSPropertyMarginBottom, value);
602926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == hspaceAttr) {
603926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        addHTMLLengthToStyle(style, CSSPropertyMarginLeft, value);
604926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        addHTMLLengthToStyle(style, CSSPropertyMarginRight, value);
605926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == alignAttr) {
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_inputType->shouldRespectAlignAttribute())
607926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            applyAlignmentAttributeToStyle(value, style);
608926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == widthAttr) {
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_inputType->shouldRespectHeightAndWidthAttributes())
610926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            addHTMLLengthToStyle(style, CSSPropertyWidth, value);
611926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == heightAttr) {
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_inputType->shouldRespectHeightAndWidthAttributes())
613926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            addHTMLLengthToStyle(style, CSSPropertyHeight, value);
6147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    } else if (name == borderAttr && type() == InputTypeNames::image) // FIXME: Remove type check.
615926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        applyBorderAttributeToStyle(value, style);
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
617926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLTextFormControlElement::collectStyleForPresentationAttribute(name, value, style);
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
620197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid HTMLInputElement::attributeWillChange(const QualifiedName& name, const AtomicString& oldValue, const AtomicString& newValue)
621197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
622197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (name == formactionAttr && inDocument()) {
623197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        V8DOMActivityLogger* activityLogger = V8DOMActivityLogger::currentActivityLoggerIfIsolatedWorld();
624197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (activityLogger) {
625197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            Vector<String> argv;
626197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            argv.append("input");
627197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            argv.append(formactionAttr.toString());
628197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            argv.append(oldValue);
629197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            argv.append(newValue);
630197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            activityLogger->logEvent("blinkSetAttribute", argv.size(), argv.data());
631197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
632197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
633197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    HTMLTextFormControlElement::attributeWillChange(name, oldValue, newValue);
634197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
635197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLInputElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
638926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (name == nameAttr) {
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        removeFromRadioButtonGroup();
640926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_name = value;
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addToRadioButtonGroup();
642926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLTextFormControlElement::parseAttribute(name, value);
643926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == autocompleteAttr) {
64453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (equalIgnoringCase(value, "off"))
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_autocomplete = Off;
64653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        else {
647926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (value.isEmpty())
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_autocomplete = Uninitialized;
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_autocomplete = On;
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
652926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == typeAttr)
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateType();
654926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == valueAttr) {
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We only need to setChanged if the form is looking at the default value right now.
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!hasDirtyValue()) {
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            updatePlaceholderVisibility(false);
65809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            setNeedsStyleRecalc(SubtreeStyleChange);
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
660a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        m_needsToUpdateViewValue = true;
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setNeedsValidityCheck();
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_valueAttributeWasUpdatedAfterParsing = !m_parsingInProgress;
6637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        m_inputType->warnIfValueIsInvalidAndElementIsVisible(value);
664c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->valueAttributeChanged();
665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == checkedAttr) {
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Another radio button in the same group might be checked by state
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // restore. We shouldn't call setChecked() even if this has the checked
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // attribute. So, delay the setChecked() call until
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // finishParsingChildren() is called if parsing is in progress.
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_parsingInProgress && m_reflectsCheckedAttribute) {
671926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            setChecked(!value.isNull());
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_reflectsCheckedAttribute = true;
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
674926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == maxlengthAttr)
675926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        parseMaxLengthAttribute(value);
676926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == sizeAttr) {
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int oldSize = m_size;
678926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        int valueAsInteger = value.toInt();
679926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_size = valueAsInteger > 0 ? valueAsInteger : defaultSize;
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_size != oldSize && renderer())
6815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            renderer()->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation();
682926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == altAttr)
683c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->altAttributeChanged();
684926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == srcAttr)
685c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->srcAttributeChanged();
686926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == usemapAttr || name == accesskeyAttr) {
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: ignore for the moment
688926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == onsearchAttr) {
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Search field and slider attributes all just cause updateFromElement to be called through style recalcing.
6905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        setAttributeEventListener(EventTypeNames::search, createAttributeEventListener(this, name, value, eventParameterName()));
691926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == resultsAttr) {
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int oldResults = m_maxResults;
693926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_maxResults = !value.isNull() ? std::min(value.toInt(), maxSavedResults) : -1;
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: Detaching just for maxResults change is not ideal.  We should figure out the right
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // time to relayout for this change.
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_maxResults != oldResults && (m_maxResults <= 0 || oldResults <= 0))
69793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            lazyReattachIfAttached();
69809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        setNeedsStyleRecalc(SubtreeStyleChange);
6991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::ResultsAttribute);
700926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == incrementalAttr) {
70109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        setNeedsStyleRecalc(SubtreeStyleChange);
7021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::IncrementalAttribute);
703926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == minAttr) {
704c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->minOrMaxAttributeChanged();
705e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_inputType->sanitizeValueInResponseToMinOrMaxAttributeChange();
706926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setNeedsValidityCheck();
7071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::MinAttribute);
708926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == maxAttr) {
709c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->minOrMaxAttributeChanged();
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setNeedsValidityCheck();
7111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::MaxAttribute);
712926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == multipleAttr) {
713c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->multipleAttributeChanged();
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setNeedsValidityCheck();
715926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == stepAttr) {
716c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->stepAttributeChanged();
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setNeedsValidityCheck();
7181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::StepAttribute);
719926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == patternAttr) {
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setNeedsValidityCheck();
7211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::PatternAttribute);
722926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == disabledAttr) {
723926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLTextFormControlElement::parseAttribute(name, value);
724c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->disabledAttributeChanged();
725926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == readonlyAttr) {
726926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLTextFormControlElement::parseAttribute(name, value);
727c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->readonlyAttributeChanged();
72893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    } else if (name == listAttr) {
729926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_hasNonEmptyList = !value.isEmpty();
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_hasNonEmptyList) {
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            resetListAttributeTargetObserver();
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            listAttributeTargetChanged();
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::ListAttribute);
735323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    } else if (name == webkitdirectoryAttr) {
736926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLTextFormControlElement::parseAttribute(name, value);
7371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::PrefixedDirectoryAttribute);
738926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
740926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLTextFormControlElement::parseAttribute(name, value);
741c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->attributeChanged();
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::finishParsingChildren()
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_parsingInProgress = false;
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::finishParsingChildren();
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_stateRestored) {
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool checked = hasAttribute(checkedAttr);
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (checked)
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setChecked(checked);
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_reflectsCheckedAttribute = true;
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)bool HTMLInputElement::rendererIsNeeded(const RenderStyle& style)
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return m_inputType->rendererIsNeeded() && HTMLTextFormControlElement::rendererIsNeeded(style);
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
761591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochRenderObject* HTMLInputElement::createRenderer(RenderStyle* style)
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
763c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return m_inputTypeView->createRenderer(style);
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
766521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void HTMLInputElement::attach(const AttachContext& context)
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
768521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    HTMLTextFormControlElement::attach(context);
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
77051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->startResourceLoading();
771e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_inputType->countUsage();
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (document().focusedElement() == this)
7748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        document().updateFocusAppearanceSoon(true /* restore selection */);
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
777521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void HTMLInputElement::detach(const AttachContext& context)
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
779521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    HTMLTextFormControlElement::detach(context);
780a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_needsToUpdateViewValue = true;
78151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->closePopupView();
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::altText() const
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // http://www.w3.org/TR/1998/REC-html40-19980424/appendix/notes.html#altgen
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // also heavily discussed by Hixie on bugzilla
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // note this is intentionally different to HTMLImageElement::altText()
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String alt = fastGetAttribute(altAttr);
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // fall back to title attribute
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (alt.isNull())
79209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        alt = fastGetAttribute(titleAttr);
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (alt.isNull())
79409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        alt = fastGetAttribute(valueAttr);
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (alt.isEmpty())
79651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        alt = locale().queryString(blink::WebLocalizedString::InputElementAltText);
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return alt;
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
80051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool HTMLInputElement::canBeSuccessfulSubmitButton() const
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
80251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return m_inputType->canBeSuccessfulSubmitButton();
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isActivatedSubmit() const
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_isActivatedSubmit;
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setActivatedSubmit(bool flag)
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isActivatedSubmit = flag;
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::appendFormData(FormDataList& encoding, bool multipart)
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isFormDataAppendable() && m_inputType->appendFormData(encoding, multipart);
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
820bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)String HTMLInputElement::resultForDialogSubmit()
821bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
822bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return m_inputType->resultForDialogSubmit();
823bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
824bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
8251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void HTMLInputElement::resetImpl()
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
82709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_inputType->storesValueSeparateFromAttribute()) {
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setValue(String());
82909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        setNeedsValidityCheck();
83009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setChecked(hasAttribute(checkedAttr));
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_reflectsCheckedAttribute = true;
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isTextField() const
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isTextField();
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setChecked(bool nowChecked, TextFieldEventBehavior eventBehavior)
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (checked() == nowChecked)
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
846323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLInputElement> protector(this);
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_reflectsCheckedAttribute = false;
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isChecked = nowChecked;
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (RadioButtonGroupScope* scope = radioButtonGroupScope())
85109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        scope->updateCheckedState(this);
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer() && renderer()->style()->hasAppearance())
853d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        RenderTheme::theme().stateChanged(renderer(), CheckedControlState);
854c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsValidityCheck();
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Ideally we'd do this from the render tree (matching
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // RenderTextView), but it's not possible to do it at the moment
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // because of the way the code is structured.
860926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (renderer()) {
8618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (AXObjectCache* cache = renderer()->document().existingAXObjectCache())
862926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            cache->checkedStateChanged(this);
863926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Only send a change event for items in the document (avoid firing during
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // parsing) and don't send a change event for a radio button that's getting
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // unchecked to match other browsers. DOM is not a useful standard for this
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // because it says only to fire change events at "lose focus" time, which is
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // definitely wrong in practice for these types of elements.
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (eventBehavior != DispatchNoEvent && inDocument() && m_inputType->shouldSendChangeEventAfterCheckedChanged()) {
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setTextAsOfLastFormControlChangeEvent(String());
87207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (eventBehavior == DispatchInputAndChangeEvent)
87307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            dispatchFormControlInputEvent();
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dispatchFormControlChangeEvent();
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
876926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    pseudoStateChanged(CSSSelector::PseudoChecked);
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setIndeterminate(bool newValue)
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (indeterminate() == newValue)
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isIndeterminate = newValue;
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    pseudoStateChanged(CSSSelector::PseudoIndeterminate);
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer() && renderer()->style()->hasAppearance())
890d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        RenderTheme::theme().stateChanged(renderer(), CheckedControlState);
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int HTMLInputElement::size() const
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_size;
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::sizeShouldIncludeDecoration(int& preferredSize) const
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
900c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return m_inputTypeView->sizeShouldIncludeDecoration(defaultSize, preferredSize);
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::copyNonAttributePropertiesFromElement(const Element& source)
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const HTMLInputElement& sourceElement = static_cast<const HTMLInputElement&>(source);
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_valueIfDirty = sourceElement.m_valueIfDirty;
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setChecked(sourceElement.m_isChecked);
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_reflectsCheckedAttribute = sourceElement.m_reflectsCheckedAttribute;
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isIndeterminate = sourceElement.m_isIndeterminate;
9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::copyNonAttributePropertiesFromElement(source);
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
914a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_needsToUpdateViewValue = true;
91551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->updateView();
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::value() const
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String value;
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_inputType->getTypeSpecificValue(value))
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return value;
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    value = m_valueIfDirty;
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!value.isNull())
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return value;
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AtomicString valueString = fastGetAttribute(valueAttr);
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    value = sanitizeValue(valueString);
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!value.isNull())
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return value;
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->fallbackValue();
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::valueWithDefault() const
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String value = this->value();
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!value.isNull())
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return value;
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->defaultValue();
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setValueForUser(const String& value)
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Call setValue and make it send a change event.
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValue(value, DispatchChangeEvent);
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const String& HTMLInputElement::suggestedValue() const
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_suggestedValue;
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setSuggestedValue(const String& value)
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_inputType->canSetSuggestedValue())
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
960a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_needsToUpdateViewValue = true;
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_suggestedValue = sanitizeValue(value);
96209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setNeedsStyleRecalc(SubtreeStyleChange);
96351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->updateView();
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setEditingValue(const String& value)
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer() || !isTextField())
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
97076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    setInnerEditorValue(value);
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    subtreeHasChanged();
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned max = value.length();
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (focused())
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setSelectionRange(max, max);
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cacheSelectionInResponseToSetValue(max);
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dispatchInputEvent();
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
98276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)void HTMLInputElement::setInnerEditorValue(const String& value)
983a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
98476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    HTMLTextFormControlElement::setInnerEditorValue(value);
985a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_needsToUpdateViewValue = false;
986a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
987a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
98851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setValue(const String& value, ExceptionState& exceptionState, TextFieldEventBehavior eventBehavior)
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME: Remove type check.
9917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (type() == InputTypeNames::file && !value.isEmpty()) {
99209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "This input element accepts a filename, which may only be programmatically set to the empty string.");
9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValue(value, eventBehavior);
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setValue(const String& value, TextFieldEventBehavior eventBehavior)
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_inputType->warnIfValueIsInvalidAndElementIsVisible(value);
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_inputType->canSetValue(value))
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1004323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLInputElement> protector(this);
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EventQueueScope scope;
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String sanitizedValue = sanitizeValue(value);
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool valueChanged = sanitizedValue != this->value();
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setLastChangeWasNotUserEdit();
1010a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_needsToUpdateViewValue = true;
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_suggestedValue = String(); // Prevent TextFieldInputType::setValue from using the suggested value.
10128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inputType->setValue(sanitizedValue, valueChanged, eventBehavior);
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (valueChanged && eventBehavior == DispatchNoEvent)
10168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        setTextAsOfLastFormControlChangeEvent(sanitizedValue);
10178abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!valueChanged)
10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    notifyFormStateChanged();
10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setValueInternal(const String& sanitizedValue, TextFieldEventBehavior eventBehavior)
10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_valueIfDirty = sanitizedValue;
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsValidityCheck();
1028a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (document().focusedElement() == this)
1029a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        document().frameHost()->chrome().client().didUpdateTextOfFocusedElementByNonUserInput();
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1032d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void HTMLInputElement::updateView()
1033d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1034d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_inputTypeView->updateView();
1035d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1036d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1037a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochdouble HTMLInputElement::valueAsDate(bool& isNull) const
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1039a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    double date =  m_inputType->valueAsDate();
1040a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    isNull = !std::isfinite(date);
1041a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return date;
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
104451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setValueAsDate(double value, ExceptionState& exceptionState)
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
104651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputType->setValueAsDate(value, exceptionState);
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double HTMLInputElement::valueAsNumber() const
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->valueAsDouble();
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setValueAsNumber(double newValue, ExceptionState& exceptionState, TextFieldEventBehavior eventBehavior)
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1056323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-input-element-attributes.html#dom-input-valueasnumber
1057323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    // On setting, if the new value is infinite, then throw a TypeError exception.
105809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (std::isinf(newValue)) {
105909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwTypeError(ExceptionMessages::notAFiniteNumber(newValue));
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
106251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputType->setValueAsDouble(newValue, eventBehavior, exceptionState);
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setValueFromRenderer(const String& value)
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // File upload controls will never use this.
10687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(type() != InputTypeNames::file);
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_suggestedValue = String();
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Renderer and our event handler are responsible for sanitizing values.
10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(value == sanitizeValue(value) || sanitizeValue(value).isEmpty());
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10750019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    m_valueIfDirty = value;
1076a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_needsToUpdateViewValue = false;
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Input event is fired by the Node::defaultEventHandler for editable controls.
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isTextField())
10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dispatchInputEvent();
10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    notifyFormStateChanged();
10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsValidityCheck();
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Clear autofill flag (and yellow background) on user edit.
10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setAutofilled(false);
10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void* HTMLInputElement::preDispatchEventHandler(Event* event)
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10911e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::textInput && m_inputTypeView->shouldSubmitImplicitly(event)) {
10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event->stopPropagation();
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() != EventTypeNames::click)
10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1097591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!event->isMouseEvent() || toMouseEvent(event)->button() != LeftButton)
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1099f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#if ENABLE(OILPAN)
1100f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return m_inputTypeView->willDispatchClick();
1101f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#else
11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Check whether there are any cases where this actually ends up leaking.
1103c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return m_inputTypeView->willDispatchClick().leakPtr();
1104f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#endif
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::postDispatchEventHandler(Event* event, void* dataFromPreDispatch)
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1109f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    OwnPtrWillBeRawPtr<ClickHandlingState> state = adoptPtrWillBeNoop(static_cast<ClickHandlingState*>(dataFromPreDispatch));
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!state)
11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1112c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->didDispatchClick(event, *state);
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::defaultEventHandler(Event* evt)
11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (evt->isMouseEvent() && evt->type() == EventTypeNames::click && toMouseEvent(evt)->button() == LeftButton) {
1118c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->handleClickEvent(toMouseEvent(evt));
11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
112309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (evt->isTouchEvent() && m_inputTypeView->hasTouchEventHandler()) {
112406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        m_inputTypeView->handleTouchEvent(toTouchEvent(evt));
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (evt->isKeyboardEvent() && evt->type() == EventTypeNames::keydown) {
1130c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->handleKeydownEvent(toKeyboardEvent(evt));
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Call the base event handler before any of our own event handling for almost all events in text fields.
11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Makes editing keyboard handling take precedence over the keydown and keypress handling in this function.
11371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool callBaseClassEarly = isTextField() && (evt->type() == EventTypeNames::keydown || evt->type() == EventTypeNames::keypress);
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (callBaseClassEarly) {
11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HTMLTextFormControlElement::defaultEventHandler(evt);
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // DOMActivate events cause the input to be "activated" - in the case of image and submit inputs, this means
11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // actually submitting the form. For reset inputs, the form is reset. These events are sent when the user clicks
11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // on the element, or presses enter while it is the active element. JavaScript code wishing to activate the element
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // must dispatch a DOMActivate event - a click event will not do the job.
11481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (evt->type() == EventTypeNames::DOMActivate) {
11499bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_inputType->handleDOMActivateEvent(evt);
11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Use key press event here since sending simulated mouse events
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // on key down blocks the proper sending of the key press event.
11561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (evt->isKeyboardEvent() && evt->type() == EventTypeNames::keypress) {
1157c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->handleKeypressEvent(toKeyboardEvent(evt));
11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (evt->isKeyboardEvent() && evt->type() == EventTypeNames::keyup) {
1163c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->handleKeyupEvent(toKeyboardEvent(evt));
11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1168c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (m_inputTypeView->shouldSubmitImplicitly(evt)) {
11697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // FIXME: Remove type check.
11707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (type() == InputTypeNames::search)
11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            onSearch();
11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Form submission finishes editing, just as loss of focus does.
11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If there was a change, send the event now.
11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (wasChangedSinceLastFormControlChangeEvent())
11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dispatchFormControlChangeEvent();
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1177f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)        RefPtrWillBeRawPtr<HTMLFormElement> formForSubmission = m_inputTypeView->formForSubmission();
11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Form may never have been present, or may have been destroyed by code responding to the change event.
11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (formForSubmission)
11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            formForSubmission->submitImplicitly(evt, canTriggerImplicitSubmission());
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        evt->setDefaultHandled();
11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (evt->isBeforeTextInsertedEvent())
1187c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->handleBeforeTextInsertedEvent(static_cast<BeforeTextInsertedEvent*>(evt));
11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (evt->isMouseEvent() && evt->type() == EventTypeNames::mousedown) {
1190c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->handleMouseDownEvent(toMouseEvent(evt));
11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1195c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->forwardEvent(evt);
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!callBaseClassEarly && !evt->defaultHandled())
11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HTMLTextFormControlElement::defaultEventHandler(evt);
11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::willRespondToMouseClickEvents()
12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Consider implementing willRespondToMouseClickEvents() in InputType if more accurate results are necessary.
120453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!isDisabledFormControl())
12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return HTMLTextFormControlElement::willRespondToMouseClickEvents();
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isURLAttribute(const Attribute& attribute) const
12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return attribute.name() == srcAttr || attribute.name() == formactionAttr || HTMLTextFormControlElement::isURLAttribute(attribute);
12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
121543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)bool HTMLInputElement::hasLegalLinkAttribute(const QualifiedName& name) const
121643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){
121743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    return m_inputType->hasLegalLinkAttribute(name) || HTMLTextFormControlElement::hasLegalLinkAttribute(name);
121843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)}
121943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
122043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)const QualifiedName& HTMLInputElement::subResourceAttributeName() const
122143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){
122243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    return m_inputType->subResourceAttributeName();
122343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)}
122443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
1225a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const AtomicString& HTMLInputElement::defaultValue() const
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return fastGetAttribute(valueAttr);
12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline bool isRFC2616TokenCharacter(UChar ch)
12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return isASCII(ch) && ch > ' ' && ch != '"' && ch != '(' && ch != ')' && ch != ',' && ch != '/' && (ch < ':' || ch > '@') && (ch < '[' || ch > ']') && ch != '{' && ch != '}' && ch != 0x7f;
12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isValidMIMEType(const String& type)
12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t slashPosition = type.find('/');
123806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if (slashPosition == kNotFound || !slashPosition || slashPosition == type.length() - 1)
12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < type.length(); ++i) {
12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!isRFC2616TokenCharacter(type[i]) && i != slashPosition)
12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isValidFileExtension(const String& type)
12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (type.length() < 2)
12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return type[0] == '.';
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static Vector<String> parseAcceptAttribute(const String& acceptString, bool (*predicate)(const String&))
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<String> types;
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (acceptString.isEmpty())
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return types;
12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<String> splitTypes;
12615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    acceptString.split(',', false, splitTypes);
12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < splitTypes.size(); ++i) {
12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        String trimmedType = stripLeadingAndTrailingHTMLSpaces(splitTypes[i]);
12645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (trimmedType.isEmpty())
12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!predicate(trimmedType))
12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        types.append(trimmedType.lower());
12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return types;
12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Vector<String> HTMLInputElement::acceptMIMETypes()
12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parseAcceptAttribute(fastGetAttribute(acceptAttr), isValidMIMEType);
12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Vector<String> HTMLInputElement::acceptFileExtensions()
12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parseAcceptAttribute(fastGetAttribute(acceptAttr), isValidFileExtension);
12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1284a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const AtomicString& HTMLInputElement::alt() const
12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return fastGetAttribute(altAttr);
12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int HTMLInputElement::maxLength() const
12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_maxLength;
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
129451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setMaxLength(int maxLength, ExceptionState& exceptionState)
12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (maxLength < 0)
1297a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(IndexSizeError, "The value provided (" + String::number(maxLength) + ") is negative.");
12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
129951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        setIntegralAttribute(maxlengthAttr, maxLength);
13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::multiple() const
13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return fastHasAttribute(multipleAttr);
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setSize(unsigned size)
13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
130951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setUnsignedIntegralAttribute(sizeAttr, size);
13105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
131251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setSize(unsigned size, ExceptionState& exceptionState)
13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!size)
1315a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(IndexSizeError, "The value provided is 0, which is an invalid size.");
13165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
13175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setSize(size);
13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)KURL HTMLInputElement::src() const
13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13228abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return document().completeURL(fastGetAttribute(srcAttr));
13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325197021e6b966cfb06891637935ef33fff06433d1Ben MurdochFileList* HTMLInputElement::files()
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->files();
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1330d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void HTMLInputElement::setFiles(PassRefPtrWillBeRawPtr<FileList> files)
13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inputType->setFiles(files);
13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::receiveDroppedFiles(const DragData* dragData)
13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->receiveDroppedFiles(dragData);
13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::droppedFileSystemId()
13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->droppedFileSystemId();
13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::canReceiveDroppedFiles() const
13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_canReceiveDroppedFiles;
13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setCanReceiveDroppedFiles(bool canReceiveDroppedFiles)
13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_canReceiveDroppedFiles == canReceiveDroppedFiles)
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_canReceiveDroppedFiles = canReceiveDroppedFiles;
13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer())
13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        renderer()->updateFromElement();
13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::sanitizeValue(const String& proposedValue) const
13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (proposedValue.isNull())
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return proposedValue;
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->sanitizeValue(proposedValue);
13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::localizeValue(const String& proposedValue) const
13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (proposedValue.isNull())
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return proposedValue;
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->localizeValue(proposedValue);
13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isInRange() const
13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isInRange(value());
13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isOutOfRange() const
13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isOutOfRange(value());
13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isRequiredFormControl() const
13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1385926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_inputType->supportsRequired() && isRequired();
1386926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1387926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1388926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool HTMLInputElement::matchesReadOnlyPseudoClass() const
1389926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
139053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return m_inputType->supportsReadOnly() && isReadOnly();
1391926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1392926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1393926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool HTMLInputElement::matchesReadWritePseudoClass() const
1394926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
139553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return m_inputType->supportsReadOnly() && !isReadOnly();
13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::onSearch()
13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME: Remove type check, and static_cast.
14017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(type() == InputTypeNames::search);
14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_inputType)
14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        static_cast<SearchInputType*>(m_inputType.get())->stopSearchEventTimer();
14041e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    dispatchEvent(Event::createBubble(EventTypeNames::search));
14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1407926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLInputElement::updateClearButtonVisibility()
1408926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1409c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->updateClearButtonVisibility();
1410926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1411926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::willChangeForm()
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    removeFromRadioButtonGroup();
14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::willChangeForm();
14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::didChangeForm()
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::didChangeForm();
14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    addToRadioButtonGroup();
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node::InsertionNotificationRequest HTMLInputElement::insertedInto(ContainerNode* insertionPoint)
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1426197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (insertionPoint->inDocument()) {
1427197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        V8DOMActivityLogger* activityLogger = V8DOMActivityLogger::currentActivityLoggerIfIsolatedWorld();
1428197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (activityLogger) {
1429197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            Vector<String> argv;
1430197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            argv.append("input");
1431197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            argv.append(fastGetAttribute(typeAttr));
1432197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            argv.append(fastGetAttribute(formactionAttr));
1433197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            activityLogger->logEvent("blinkAddElement", argv.size(), argv.data());
1434197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
1435197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::insertedInto(insertionPoint);
1437521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (insertionPoint->inDocument() && !form())
1438521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        addToRadioButtonGroup();
14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resetListAttributeTargetObserver();
1440c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    return InsertionShouldCallDidNotifySubtreeInsertions;
14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::removedFrom(ContainerNode* insertionPoint)
14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (insertionPoint->inDocument() && !form())
14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        removeFromRadioButtonGroup();
14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::removedFrom(insertionPoint);
14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!inDocument());
14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resetListAttributeTargetObserver();
14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void HTMLInputElement::didMoveToNewDocument(Document& oldDocument)
14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (hasImageLoader())
1455926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        imageLoader()->elementDidMoveToNewDocument();
1456926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
14577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME: Remove type check.
14587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (type() == InputTypeNames::radio)
1459d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        oldDocument.formController().radioButtonGroupScope().removeButton(this);
1460926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::didMoveToNewDocument(oldDocument);
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
146409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLInputElement::removeAllEventListeners()
14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
146609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    HTMLTextFormControlElement::removeAllEventListeners();
146709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_hasTouchEventHandler = false;
14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::recalcWillValidate() const
14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->supportsValidation() && HTMLTextFormControlElement::recalcWillValidate();
14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::requiredAttributeChanged()
14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::requiredAttributeChanged();
147809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (RadioButtonGroupScope* scope = radioButtonGroupScope())
147909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        scope->requiredAttributeChanged(this);
1480c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->requiredAttributeChanged();
14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::selectColorInColorChooser(const Color& color)
14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (ColorChooserClient* client = m_inputType->colorChooserClient())
14867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        client->didChooseColor(color);
14877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
14887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
14897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid HTMLInputElement::endColorChooser()
14907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
14917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (ColorChooserClient* client = m_inputType->colorChooserClient())
14927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        client->didEndChooser();
14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
149453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
14955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLElement* HTMLInputElement::list() const
14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return dataList();
14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLDataListElement* HTMLInputElement::dataList() const
15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_hasNonEmptyList)
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_inputType->shouldRespectListAttribute())
15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15088abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Element* element = treeScope().getElementById(fastGetAttribute(listAttr));
15095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!element)
15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1511d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isHTMLDataListElement(*element))
15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15148abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return toHTMLDataListElement(element);
15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
151709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool HTMLInputElement::hasValidDataListOptions() const
151809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
151909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    HTMLDataListElement* dataList = this->dataList();
152009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!dataList)
152109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
15229e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLDataListOptionsCollection> options = dataList->options();
15239e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    for (unsigned i = 0; HTMLOptionElement* option = options->item(i); ++i) {
152409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (isValidValue(option->value()))
152509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return true;
152609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
152709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return false;
152809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
152909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1530f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)void HTMLInputElement::setListAttributeTargetObserver(PassOwnPtrWillBeRawPtr<ListAttributeTargetObserver> newObserver)
1531323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
1532323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (m_listAttributeTargetObserver)
1533323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        m_listAttributeTargetObserver->unregister();
1534323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    m_listAttributeTargetObserver = newObserver;
1535323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
1536323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::resetListAttributeTargetObserver()
15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (inDocument())
1540323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        setListAttributeTargetObserver(ListAttributeTargetObserver::create(fastGetAttribute(listAttr), this));
15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
1542323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        setListAttributeTargetObserver(nullptr);
15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::listAttributeTargetChanged()
15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1547c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->listAttributeTargetChanged();
15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isSteppable() const
15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isSteppable();
15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isTextButton() const
15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isTextButton();
15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isEnumeratable() const
15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isEnumeratable();
15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::supportLabels() const
15665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1567bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return m_inputType->isInteractiveContent();
15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::shouldAppearChecked() const
15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return checked() && m_inputType->isCheckable();
15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::supportsPlaceholder() const
15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->supportsPlaceholder();
15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::updatePlaceholderText()
15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1582d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return m_inputTypeView->updatePlaceholderText();
15835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1585926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLInputElement::parseMaxLengthAttribute(const AtomicString& value)
15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int maxLength;
1588926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!parseHTMLInteger(value, maxLength))
15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        maxLength = maximumLength;
15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (maxLength < 0 || maxLength > maximumLength)
15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        maxLength = maximumLength;
15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int oldMaxLength = m_maxLength;
15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maxLength = maxLength;
15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (oldMaxLength != maxLength)
15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateValueIfNeeded();
159609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setNeedsStyleRecalc(SubtreeStyleChange);
15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsValidityCheck();
15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::updateValueIfNeeded()
16015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String newValue = sanitizeValue(m_valueIfDirty);
16035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_valueIfDirty.isNull() || newValue.isNull());
16045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (newValue != m_valueIfDirty)
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setValue(newValue);
16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::defaultToolTip() const
16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->defaultToolTip();
16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
161353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool HTMLInputElement::shouldAppearIndeterminate() const
16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_inputType->shouldAppearIndeterminate();
16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1618926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool HTMLInputElement::isInRequiredRadioButtonGroup()
16195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME: Remove type check.
16217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    ASSERT(type() == InputTypeNames::radio);
162209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (RadioButtonGroupScope* scope = radioButtonGroupScope())
162309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return scope->isInRequiredGroup(this);
16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciHTMLInputElement* HTMLInputElement::checkedRadioButtonForGroup()
16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (checked())
16307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return this;
163109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (RadioButtonGroupScope* scope = radioButtonGroupScope())
163209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return scope->checkedButtonForGroup(name());
16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
163609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)RadioButtonGroupScope* HTMLInputElement::radioButtonGroupScope() const
16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME: Remove type check.
16397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (type() != InputTypeNames::radio)
16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (HTMLFormElement* formElement = form())
164209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return &formElement->radioButtonGroupScope();
16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (inDocument())
1644d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return &document().formController().radioButtonGroupScope();
16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void HTMLInputElement::addToRadioButtonGroup()
16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
165009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (RadioButtonGroupScope* scope = radioButtonGroupScope())
165109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        scope->addButton(this);
16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void HTMLInputElement::removeFromRadioButtonGroup()
16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
165609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (RadioButtonGroupScope* scope = radioButtonGroupScope())
165709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        scope->removeButton(this);
16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned HTMLInputElement::height() const
16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->height();
16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned HTMLInputElement::width() const
16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->width();
16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setHeight(unsigned height)
16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
167251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setUnsignedIntegralAttribute(heightAttr, height);
16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setWidth(unsigned width)
16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
167751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setUnsignedIntegralAttribute(widthAttr, width);
16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1680f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)PassOwnPtrWillBeRawPtr<ListAttributeTargetObserver> ListAttributeTargetObserver::create(const AtomicString& id, HTMLInputElement* element)
16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1682f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    return adoptPtrWillBeNoop(new ListAttributeTargetObserver(id, element));
16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ListAttributeTargetObserver::ListAttributeTargetObserver(const AtomicString& id, HTMLInputElement* element)
16868abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    : IdTargetObserver(element->treeScope().idTargetObserverRegistry(), id)
16875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_element(element)
16885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1691f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)void ListAttributeTargetObserver::trace(Visitor* visitor)
1692f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles){
1693f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    visitor->trace(m_element);
1694f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    IdTargetObserver::trace(visitor);
1695f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)}
1696f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)
16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ListAttributeTargetObserver::idTargetChanged()
16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_element->listAttributeTargetChanged();
17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
170251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setRangeText(const String& replacement, ExceptionState& exceptionState)
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
1705a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
17065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
170951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    HTMLTextFormControlElement::setRangeText(replacement, exceptionState);
17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
171251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setRangeText(const String& replacement, unsigned start, unsigned end, const String& selectionMode, ExceptionState& exceptionState)
17135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
1715a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
17165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
171951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    HTMLTextFormControlElement::setRangeText(replacement, start, end, selectionMode, exceptionState);
17205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::setupDateTimeChooserParameters(DateTimeChooserParameters& parameters)
17235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17248abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!document().view())
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    parameters.type = type();
17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    parameters.minimum = minimum();
17295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    parameters.maximum = maximum();
1730926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    parameters.required = isRequired();
1731926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!RuntimeEnabledFeatures::langAttributeAwareFormControlUIEnabled())
1732926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        parameters.locale = defaultLanguage();
1733926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else {
1734926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        AtomicString computedLocale = computeInheritedLanguage();
173509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        parameters.locale = computedLocale.isEmpty() ? defaultLanguage() : computedLocale;
1736926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StepRange stepRange = createStepRange(RejectAny);
17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (stepRange.hasStep()) {
17405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parameters.step = stepRange.step().toDouble();
17415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parameters.stepBase = stepRange.stepBase().toDouble();
17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
17435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parameters.step = 1.0;
17445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parameters.stepBase = 0;
17455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    parameters.anchorRectInRootView = document().view()->contentsToRootView(pixelSnappedBoundingBox());
17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    parameters.currentValue = value();
174951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    parameters.doubleValue = m_inputType->valueAsDouble();
1750c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    parameters.isAnchorElementRTL = m_inputType->computedTextDirection() == RTL;
175109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (HTMLDataListElement* dataList = this->dataList()) {
17529e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        RefPtrWillBeRawPtr<HTMLDataListOptionsCollection> options = dataList->options();
17539e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        for (unsigned i = 0; HTMLOptionElement* option = options->item(i); ++i) {
175409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (!isValidValue(option->value()))
175509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                continue;
175609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            DateTimeSuggestion suggestion;
175709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            suggestion.value = m_inputType->parseToNumber(option->value(), Decimal::nan()).toDouble();
175809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (std::isnan(suggestion.value))
175909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                continue;
176009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            suggestion.localizedValue = localizeValue(option->value());
176109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            suggestion.label = option->value() == option->label() ? String() : option->label();
176209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            parameters.suggestions.append(suggestion);
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1768e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochbool HTMLInputElement::supportsInputModeAttribute() const
1769e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
1770e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    return m_inputType->supportsInputModeAttribute();
1771e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
1772e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
177309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLInputElement::setShouldRevealPassword(bool value)
177409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
177509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_shouldRevealPassword == value)
177609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
177709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_shouldRevealPassword = value;
177809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    lazyReattachIfAttached();
177909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
178009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1781bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)bool HTMLInputElement::isInteractiveContent() const
1782bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
1783bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return m_inputType->isInteractiveContent();
1784bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
1785bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
178609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool HTMLInputElement::supportsAutofocus() const
178709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
178809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return m_inputType->isInteractiveContent();
178909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
179009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1791926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
1792926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)PassRefPtr<RenderStyle> HTMLInputElement::customStyleForRenderer()
1793926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1794c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return m_inputTypeView->customStyleForRenderer(originalStyleForRenderer());
1795926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1796926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
1797926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1798323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)bool HTMLInputElement::shouldDispatchFormControlChangeEvent(String& oldValue, String& newValue)
1799323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
1800323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    return m_inputType->shouldDispatchFormControlChangeEvent(oldValue, newValue);
1801323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
1802323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
1803c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void HTMLInputElement::didNotifySubtreeInsertionsToDocument()
1804c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1805c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    listAttributeTargetChanged();
1806c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1807c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
18087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciAXObject* HTMLInputElement::popupRootAXObject()
18097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
18107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return m_inputTypeView->popupRootAXObject();
18117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
18127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
18135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace
1814