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)
3251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "bindings/v8/ExceptionMessages.h"
33df95704c49daea886ddad70775bda23618d6274dBen Murdoch#include "bindings/v8/ExceptionState.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptEventListener.h"
355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSPropertyNames.h"
365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/accessibility/AXObjectCache.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/IdTargetObserver.h"
41e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ElementShadow.h"
42e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/InsertionPoint.h"
43e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/FrameSelection.h"
4551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/editing/SpellChecker.h"
461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/BeforeTextInsertedEvent.h"
471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/KeyboardEvent.h"
481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/MouseEvent.h"
491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/ScopedEventQueue.h"
501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/events/TouchEvent.h"
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/fileapi/FileList.h"
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/FrameHost.h"
53f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/frame/FrameView.h"
54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/UseCounter.h"
5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLCollection.h"
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLDataListElement.h"
5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFormElement.h"
5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLImageLoader.h"
6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLOptionElement.h"
6106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/ColorInputType.h"
6206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/FileInputType.h"
6306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/FormController.h"
6406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/InputType.h"
6506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/SearchInputType.h"
6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/HTMLParserIdioms.h"
67f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/html/shadow/ShadowElementNames.h"
6851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/page/Chrome.h"
6951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/page/ChromeClient.h"
7053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTextControlSingleLine.h"
7153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTheme.h"
725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/ColorChooser.h"
7319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "platform/DateTimeChooser.h"
741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Language.h"
751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/PlatformMouseEvent.h"
765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h"
771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/PlatformLocale.h"
78591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/MathExtras.h"
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)class ListAttributeTargetObserver : public IdTargetObserver {
85f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
87f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    static PassOwnPtrWillBeRawPtr<ListAttributeTargetObserver> create(const AtomicString& id, HTMLInputElement*);
88f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void idTargetChanged() OVERRIDE;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ListAttributeTargetObserver(const AtomicString& id, HTMLInputElement*);
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
94f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    RawPtrWillBeMember<HTMLInputElement> m_element;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: According to HTML4, the length attribute's value can be arbitrarily
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// large. However, due to https://bugs.webkit.org/show_bug.cgi?id=14536 things
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// get rather sluggish when a text field has a larger number of characters than
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// this, even when just clicking in the text field.
101f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)const int HTMLInputElement::maximumLength = 524288;
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const int defaultSize = 20;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const int maxSavedResults = 256;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)HTMLInputElement::HTMLInputElement(Document& document, HTMLFormElement* form, bool createdByParser)
10651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    : HTMLTextFormControlElement(inputTag, document, form)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_size(defaultSize)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_maxLength(maximumLength)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_maxResults(-1)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isChecked(false)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_reflectsCheckedAttribute(true)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isIndeterminate(false)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isActivatedSubmit(false)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_autocomplete(Uninitialized)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_hasNonEmptyList(false)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_stateRestored(false)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_parsingInProgress(createdByParser)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_valueAttributeWasUpdatedAfterParsing(false)
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_canReceiveDroppedFiles(false)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_hasTouchEventHandler(false)
12109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_shouldRevealPassword(false)
122a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    , m_needsToUpdateViewValue(true)
123bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    , m_inputType(InputType::createText(*this))
124c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    , m_inputTypeView(m_inputType)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setHasCustomStyleCallbacks();
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
12953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ScriptWrappable::init(this);
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
132323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)PassRefPtrWillBeRawPtr<HTMLInputElement> HTMLInputElement::create(Document& document, HTMLFormElement* form, bool createdByParser)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<HTMLInputElement> inputElement = adoptRefWillBeNoop(new HTMLInputElement(document, form, createdByParser));
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    inputElement->ensureUserAgentShadowRoot();
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return inputElement.release();
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
139323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void HTMLInputElement::trace(Visitor* visitor)
140323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
141323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    visitor->trace(m_inputType);
142323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    visitor->trace(m_inputTypeView);
143f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    visitor->trace(m_listAttributeTargetObserver);
1445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    visitor->trace(m_imageLoader);
145323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    HTMLTextFormControlElement::trace(visitor);
146323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
147323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)HTMLImageLoader* HTMLInputElement::imageLoader()
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!m_imageLoader)
1515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        m_imageLoader = HTMLImageLoader::create(this);
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_imageLoader.get();
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::didAddUserAgentShadowRoot(ShadowRoot&)
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
15751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->createShadowSubtree();
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1606f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochvoid HTMLInputElement::willAddFirstAuthorShadowRoot()
1618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
16251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->destroyShadowSubtree();
163bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    m_inputTypeView = InputTypeView::create(*this);
16451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    lazyReattachIfAttached();
1658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
1668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLInputElement::~HTMLInputElement()
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
169f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#if !ENABLE(OILPAN)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Need to remove form association while this is still an HTMLInputElement
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // so that virtual functions are called correctly.
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setForm(0);
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // setForm(0) may register this to a document-level radio button group.
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We should unregister it to avoid accessing a deleted object.
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isRadioButton())
176d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        document().formController().radioButtonGroupScope().removeButton(this);
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_hasTouchEventHandler)
17809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        document().didRemoveTouchEventHandler(this);
179f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#endif
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& HTMLInputElement::name() const
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_name.isNull() ? emptyAtom : m_name;
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Vector<FileChooserFileInfo> HTMLInputElement::filesFromFileInputFormControlState(const FormControlState& state)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return FileInputType::filesFromFormControlState(state);
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::shouldAutocomplete() const
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_autocomplete != Uninitialized)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_autocomplete == On;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return HTMLTextFormControlElement::shouldAutocomplete();
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isValidValue(const String& value) const
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_inputType->canSetStringValue()) {
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !m_inputType->typeMismatchFor(value)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && !m_inputType->stepMismatch(value)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && !m_inputType->rangeUnderflow(value)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && !m_inputType->rangeOverflow(value)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && !tooLong(value, IgnoreDirtyFlag)
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && !m_inputType->patternMismatch(value)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && !m_inputType->valueMissing(value);
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::tooLong() const
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return willValidate() && tooLong(value(), CheckDirtyFlag);
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::typeMismatch() const
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return willValidate() && m_inputType->typeMismatch();
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::valueMissing() const
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return willValidate() && m_inputType->valueMissing(value());
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool HTMLInputElement::hasBadInput() const
230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return willValidate() && m_inputType->hasBadInput();
232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::patternMismatch() const
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return willValidate() && m_inputType->patternMismatch(value());
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::tooLong(const String& value, NeedsToCheckDirtyFlag check) const
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We use isTextType() instead of supportsMaxLength() because of the
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 'virtual' overhead.
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isTextType())
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int max = maxLength();
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (max < 0)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (check == CheckDirtyFlag) {
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Return false for the default value or a value set by a script even if
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // it is longer than maxLength.
251a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (!hasDirtyValue() || !lastChangeWasUserEdit())
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
25406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return value.length() > static_cast<unsigned>(max);
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::rangeUnderflow() const
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return willValidate() && m_inputType->rangeUnderflow(value());
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::rangeOverflow() const
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return willValidate() && m_inputType->rangeOverflow(value());
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::validationMessage() const
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!willValidate())
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String();
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (customError())
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return customValidationMessage();
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->validationMessage();
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double HTMLInputElement::minimum() const
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->minimum();
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double HTMLInputElement::maximum() const
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->maximum();
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::stepMismatch() const
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return willValidate() && m_inputType->stepMismatch(value());
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::getAllowedValueStep(Decimal* step) const
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->getAllowedValueStep(step);
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)StepRange HTMLInputElement::createStepRange(AnyStepHandling anyStepHandling) const
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->createStepRange(anyStepHandling);
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Decimal HTMLInputElement::findClosestTickMarkValue(const Decimal& value)
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->findClosestTickMarkValue(value);
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::stepUp(int n, ExceptionState& exceptionState)
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
31051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputType->stepUp(n, exceptionState);
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::stepDown(int n, ExceptionState& exceptionState)
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
31551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputType->stepUp(-n, exceptionState);
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::blur()
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
320c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->blur();
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::defaultBlur()
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::blur();
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::hasCustomFocusLogic() const
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
330c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return m_inputTypeView->hasCustomFocusLogic();
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
333f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)bool HTMLInputElement::isKeyboardFocusable() const
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
335f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    return m_inputType->isKeyboardFocusable();
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
338591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochbool HTMLInputElement::shouldShowFocusRingOnMouseFocus() const
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
340591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return m_inputType->shouldShowFocusRingOnMouseFocus();
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::updateFocusAppearance(bool restorePreviousSelection)
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isTextField()) {
3466f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        if (!restorePreviousSelection)
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            select();
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            restoreCachedSelection();
3508abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (document().frame())
3518abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            document().frame()->selection().revealSelection();
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HTMLTextFormControlElement::updateFocusAppearance(restorePreviousSelection);
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
356f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)void HTMLInputElement::beginEditing()
357f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){
35809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(document().isActive());
35909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!document().isActive())
36009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
36109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
362f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    if (!isTextField())
363f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return;
364f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
36509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    document().frame()->spellChecker().didBeginEditing(this);
366f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)}
367f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
368926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLInputElement::endEditing()
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
37009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(document().isActive());
37109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!document().isActive())
37209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
37309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
374926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!isTextField())
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
377d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = document().frame();
37809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    frame->spellChecker().didEndEditingOnTextField(this);
37909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    frame->host()->chrome().client().didEndEditingOnTextField(*this);
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::shouldUseInputMethod()
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->shouldUseInputMethod();
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLInputElement::handleFocusEvent(Element* oldFocusedElement, FocusType type)
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
38909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_inputTypeView->handleFocusEvent(oldFocusedElement, type);
390e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_inputType->enableSecureTextInput();
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::handleBlurEvent()
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
395e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_inputType->disableSecureTextInput();
396c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->handleBlurEvent();
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
399a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void HTMLInputElement::setType(const AtomicString& type)
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
40109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setAttribute(typeAttr, type);
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::updateType()
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4068abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    const AtomicString& newTypeName = InputType::normalizeTypeName(fastGetAttribute(typeAttr));
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
408a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (m_inputType->formControlType() == newTypeName)
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
411323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeRawPtr<InputType> newType = InputType::create(*this, newTypeName);
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    removeFromRadioButtonGroup();
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool didStoreValue = m_inputType->storesValueSeparateFromAttribute();
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool didRespectHeightAndWidth = m_inputType->shouldRespectHeightAndWidthAttributes();
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
41751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->destroyShadowSubtree();
418f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    lazyReattachIfAttached();
419926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inputType = newType.release();
4218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (hasAuthorShadowRoot())
422bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        m_inputTypeView = InputTypeView::create(*this);
4238abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    else
4248abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        m_inputTypeView = m_inputType;
42551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->createShadowSubtree();
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
427c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    bool hasTouchEventHandler = m_inputTypeView->hasTouchEventHandler();
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hasTouchEventHandler != m_hasTouchEventHandler) {
429926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (hasTouchEventHandler)
4301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            document().didAddTouchEventHandler(this);
431926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        else
4321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            document().didRemoveTouchEventHandler(this);
433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_hasTouchEventHandler = hasTouchEventHandler;
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsWillValidateCheck();
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool willStoreValue = m_inputType->storesValueSeparateFromAttribute();
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (didStoreValue && !willStoreValue && hasDirtyValue()) {
441a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        setAttribute(valueAttr, AtomicString(m_valueIfDirty));
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_valueIfDirty = String();
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!didStoreValue && willStoreValue) {
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AtomicString valueString = fastGetAttribute(valueAttr);
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_valueIfDirty = sanitizeValue(valueString);
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateValueIfNeeded();
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());
455f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        if (const Attribute* height = findAttributeByName(heightAttr))
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            attributeChanged(heightAttr, height->value());
457f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        if (const Attribute* width = findAttributeByName(widthAttr))
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            attributeChanged(widthAttr, width->value());
459f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        if (const Attribute* align = findAttributeByName(alignAttr))
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            attributeChanged(alignAttr, align->value());
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
463f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (document().focusedElement() == this)
464f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        document().updateFocusAppearanceSoon(true /* restore selection */);
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setChangedSinceLastFormControlChangeEvent(false);
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    addToRadioButtonGroup();
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsValidityCheck();
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    notifyFormStateChanged();
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::subtreeHasChanged()
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
476c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->subtreeHasChanged();
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // When typing in an input field, childrenChanged is not called, so we need to force the directionality check.
478926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    calculateAndAdjustDirectionality();
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& HTMLInputElement::formControlType() const
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->formControlType();
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::shouldSaveAndRestoreFormControlState() const
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_inputType->shouldSaveAndRestoreFormControlState())
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return HTMLTextFormControlElement::shouldSaveAndRestoreFormControlState();
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FormControlState HTMLInputElement::saveFormControlState() const
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->saveFormControlState();
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::restoreFormControlState(const FormControlState& state)
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inputType->restoreFormControlState(state);
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_stateRestored = true;
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::canStartSelection() const
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isTextField())
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return HTMLTextFormControlElement::canStartSelection();
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)int HTMLInputElement::selectionStartForBinding(ExceptionState& exceptionState) const
51293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
51309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
514a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
51593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return 0;
51693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
51793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return HTMLTextFormControlElement::selectionStart();
51893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
51993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
52051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)int HTMLInputElement::selectionEndForBinding(ExceptionState& exceptionState) const
52193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
52209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
52309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
52493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return 0;
52593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
52693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return HTMLTextFormControlElement::selectionEnd();
52793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
52893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
52951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)String HTMLInputElement::selectionDirectionForBinding(ExceptionState& exceptionState) const
53093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
53109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
532a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
53393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return String();
53493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
53593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return HTMLTextFormControlElement::selectionDirection();
53693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
53793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
53851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setSelectionStartForBinding(int start, ExceptionState& exceptionState)
53993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
54009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
541a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
54293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return;
54393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
54493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    HTMLTextFormControlElement::setSelectionStart(start);
54593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
54693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
54751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setSelectionEndForBinding(int end, ExceptionState& exceptionState)
54893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
54909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
550a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
55193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return;
55293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
55393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    HTMLTextFormControlElement::setSelectionEnd(end);
55493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
55593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
55651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setSelectionDirectionForBinding(const String& direction, ExceptionState& exceptionState)
55793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
55809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
559a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
56093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return;
56193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
56293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    HTMLTextFormControlElement::setSelectionDirection(direction);
56393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
56493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
56551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setSelectionRangeForBinding(int start, int end, ExceptionState& exceptionState)
56693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
56709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
568a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
56993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return;
57093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
57193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    HTMLTextFormControlElement::setSelectionRange(start, end);
57293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
57393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
57451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setSelectionRangeForBinding(int start, int end, const String& direction, ExceptionState& exceptionState)
57593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
57609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
577a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
57893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return;
57993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
58093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    HTMLTextFormControlElement::setSelectionRange(start, end, direction);
58193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
58293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::accessKeyAction(bool sendMouseEvents)
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inputType->accessKeyAction(sendMouseEvents);
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isPresentationAttribute(const QualifiedName& name) const
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (name == vspaceAttr || name == hspaceAttr || name == alignAttr || name == widthAttr || name == heightAttr || (name == borderAttr && isImageButton()))
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return HTMLTextFormControlElement::isPresentationAttribute(name);
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLInputElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStylePropertySet* style)
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
597926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (name == vspaceAttr) {
598926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        addHTMLLengthToStyle(style, CSSPropertyMarginTop, value);
599926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        addHTMLLengthToStyle(style, CSSPropertyMarginBottom, value);
600926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == hspaceAttr) {
601926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        addHTMLLengthToStyle(style, CSSPropertyMarginLeft, value);
602926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        addHTMLLengthToStyle(style, CSSPropertyMarginRight, value);
603926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == alignAttr) {
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_inputType->shouldRespectAlignAttribute())
605926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            applyAlignmentAttributeToStyle(value, style);
606926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == widthAttr) {
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_inputType->shouldRespectHeightAndWidthAttributes())
608926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            addHTMLLengthToStyle(style, CSSPropertyWidth, value);
609926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == heightAttr) {
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_inputType->shouldRespectHeightAndWidthAttributes())
611926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            addHTMLLengthToStyle(style, CSSPropertyHeight, value);
612926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == borderAttr && isImageButton())
613926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        applyBorderAttributeToStyle(value, style);
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
615926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLTextFormControlElement::collectStyleForPresentationAttribute(name, value, style);
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
618926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLInputElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
620926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (name == nameAttr) {
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        removeFromRadioButtonGroup();
622926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_name = value;
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        addToRadioButtonGroup();
624926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLTextFormControlElement::parseAttribute(name, value);
625926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == autocompleteAttr) {
62653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (equalIgnoringCase(value, "off"))
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_autocomplete = Off;
62853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        else {
629926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (value.isEmpty())
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_autocomplete = Uninitialized;
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_autocomplete = On;
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
634926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == typeAttr)
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateType();
636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == valueAttr) {
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We only need to setChanged if the form is looking at the default value right now.
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!hasDirtyValue()) {
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            updatePlaceholderVisibility(false);
64009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            setNeedsStyleRecalc(SubtreeStyleChange);
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
642a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        m_needsToUpdateViewValue = true;
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setNeedsValidityCheck();
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_valueAttributeWasUpdatedAfterParsing = !m_parsingInProgress;
645c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->valueAttributeChanged();
646926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == checkedAttr) {
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Another radio button in the same group might be checked by state
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // restore. We shouldn't call setChecked() even if this has the checked
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // attribute. So, delay the setChecked() call until
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // finishParsingChildren() is called if parsing is in progress.
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_parsingInProgress && m_reflectsCheckedAttribute) {
652926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            setChecked(!value.isNull());
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_reflectsCheckedAttribute = true;
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
655926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == maxlengthAttr)
656926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        parseMaxLengthAttribute(value);
657926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == sizeAttr) {
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int oldSize = m_size;
659926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        int valueAsInteger = value.toInt();
660926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_size = valueAsInteger > 0 ? valueAsInteger : defaultSize;
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_size != oldSize && renderer())
6625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            renderer()->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation();
663926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == altAttr)
664c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->altAttributeChanged();
665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == srcAttr)
666c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->srcAttributeChanged();
667926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (name == usemapAttr || name == accesskeyAttr) {
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: ignore for the moment
669926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == onsearchAttr) {
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Search field and slider attributes all just cause updateFromElement to be called through style recalcing.
6715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        setAttributeEventListener(EventTypeNames::search, createAttributeEventListener(this, name, value, eventParameterName()));
672926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == resultsAttr) {
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int oldResults = m_maxResults;
674926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_maxResults = !value.isNull() ? std::min(value.toInt(), maxSavedResults) : -1;
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: Detaching just for maxResults change is not ideal.  We should figure out the right
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // time to relayout for this change.
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_maxResults != oldResults && (m_maxResults <= 0 || oldResults <= 0))
67893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            lazyReattachIfAttached();
67909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        setNeedsStyleRecalc(SubtreeStyleChange);
6801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::ResultsAttribute);
681926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == incrementalAttr) {
68209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        setNeedsStyleRecalc(SubtreeStyleChange);
6831e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::IncrementalAttribute);
684926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == minAttr) {
685c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->minOrMaxAttributeChanged();
686e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        m_inputType->sanitizeValueInResponseToMinOrMaxAttributeChange();
687926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        setNeedsValidityCheck();
6881e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::MinAttribute);
689926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == maxAttr) {
690c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->minOrMaxAttributeChanged();
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setNeedsValidityCheck();
6921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::MaxAttribute);
693926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == multipleAttr) {
694c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->multipleAttributeChanged();
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setNeedsValidityCheck();
696926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == stepAttr) {
697c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->stepAttributeChanged();
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setNeedsValidityCheck();
6991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::StepAttribute);
700926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == patternAttr) {
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setNeedsValidityCheck();
7021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::PatternAttribute);
703926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == disabledAttr) {
704926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLTextFormControlElement::parseAttribute(name, value);
705c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->disabledAttributeChanged();
706926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == readonlyAttr) {
707926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLTextFormControlElement::parseAttribute(name, value);
708c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->readonlyAttributeChanged();
70993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    } else if (name == listAttr) {
710926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_hasNonEmptyList = !value.isEmpty();
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_hasNonEmptyList) {
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            resetListAttributeTargetObserver();
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            listAttributeTargetChanged();
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::ListAttribute);
716323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    } else if (name == webkitdirectoryAttr) {
717926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLTextFormControlElement::parseAttribute(name, value);
7181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        UseCounter::count(document(), UseCounter::PrefixedDirectoryAttribute);
719926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
721926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLTextFormControlElement::parseAttribute(name, value);
722c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->attributeChanged();
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::finishParsingChildren()
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_parsingInProgress = false;
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::finishParsingChildren();
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_stateRestored) {
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool checked = hasAttribute(checkedAttr);
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (checked)
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            setChecked(checked);
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_reflectsCheckedAttribute = true;
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7378abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)bool HTMLInputElement::rendererIsNeeded(const RenderStyle& style)
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return m_inputType->rendererIsNeeded() && HTMLTextFormControlElement::rendererIsNeeded(style);
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
742591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochRenderObject* HTMLInputElement::createRenderer(RenderStyle* style)
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
744c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return m_inputTypeView->createRenderer(style);
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
747521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void HTMLInputElement::attach(const AttachContext& context)
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
749521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    HTMLTextFormControlElement::attach(context);
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->startResourceLoading();
752e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    m_inputType->countUsage();
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (document().focusedElement() == this)
7558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        document().updateFocusAppearanceSoon(true /* restore selection */);
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
758521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void HTMLInputElement::detach(const AttachContext& context)
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
760521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    HTMLTextFormControlElement::detach(context);
761a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_needsToUpdateViewValue = true;
76251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->closePopupView();
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::altText() const
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // http://www.w3.org/TR/1998/REC-html40-19980424/appendix/notes.html#altgen
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // also heavily discussed by Hixie on bugzilla
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // note this is intentionally different to HTMLImageElement::altText()
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String alt = fastGetAttribute(altAttr);
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // fall back to title attribute
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (alt.isNull())
77309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        alt = fastGetAttribute(titleAttr);
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (alt.isNull())
77509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        alt = fastGetAttribute(valueAttr);
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (alt.isEmpty())
77751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        alt = locale().queryString(blink::WebLocalizedString::InputElementAltText);
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return alt;
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
78151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool HTMLInputElement::canBeSuccessfulSubmitButton() const
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
78351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return m_inputType->canBeSuccessfulSubmitButton();
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isActivatedSubmit() const
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_isActivatedSubmit;
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setActivatedSubmit(bool flag)
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isActivatedSubmit = flag;
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::appendFormData(FormDataList& encoding, bool multipart)
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isFormDataAppendable() && m_inputType->appendFormData(encoding, multipart);
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
801bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)String HTMLInputElement::resultForDialogSubmit()
802bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
803bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return m_inputType->resultForDialogSubmit();
804bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
805bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
8061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void HTMLInputElement::resetImpl()
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
80809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_inputType->storesValueSeparateFromAttribute()) {
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setValue(String());
81009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        setNeedsValidityCheck();
81109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setChecked(hasAttribute(checkedAttr));
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_reflectsCheckedAttribute = true;
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isTextField() const
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isTextField();
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isTextType() const
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isTextType();
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setChecked(bool nowChecked, TextFieldEventBehavior eventBehavior)
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (checked() == nowChecked)
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
832323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLInputElement> protector(this);
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_reflectsCheckedAttribute = false;
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isChecked = nowChecked;
83509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setNeedsStyleRecalc(SubtreeStyleChange);
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
83709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (RadioButtonGroupScope* scope = radioButtonGroupScope())
83809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        scope->updateCheckedState(this);
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer() && renderer()->style()->hasAppearance())
840d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        RenderTheme::theme().stateChanged(renderer(), CheckedControlState);
841c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsValidityCheck();
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Ideally we'd do this from the render tree (matching
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // RenderTextView), but it's not possible to do it at the moment
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // because of the way the code is structured.
847926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (renderer()) {
8488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (AXObjectCache* cache = renderer()->document().existingAXObjectCache())
849926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            cache->checkedStateChanged(this);
850926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Only send a change event for items in the document (avoid firing during
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // parsing) and don't send a change event for a radio button that's getting
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // unchecked to match other browsers. DOM is not a useful standard for this
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // because it says only to fire change events at "lose focus" time, which is
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // definitely wrong in practice for these types of elements.
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (eventBehavior != DispatchNoEvent && inDocument() && m_inputType->shouldSendChangeEventAfterCheckedChanged()) {
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setTextAsOfLastFormControlChangeEvent(String());
85907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (eventBehavior == DispatchInputAndChangeEvent)
86007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            dispatchFormControlInputEvent();
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dispatchFormControlChangeEvent();
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
863926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
864926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    didAffectSelector(AffectedSelectorChecked);
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setIndeterminate(bool newValue)
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (indeterminate() == newValue)
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isIndeterminate = newValue;
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
874926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    didAffectSelector(AffectedSelectorIndeterminate);
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer() && renderer()->style()->hasAppearance())
877d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        RenderTheme::theme().stateChanged(renderer(), CheckedControlState);
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int HTMLInputElement::size() const
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_size;
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::sizeShouldIncludeDecoration(int& preferredSize) const
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
887c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return m_inputTypeView->sizeShouldIncludeDecoration(defaultSize, preferredSize);
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::copyNonAttributePropertiesFromElement(const Element& source)
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const HTMLInputElement& sourceElement = static_cast<const HTMLInputElement&>(source);
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_valueIfDirty = sourceElement.m_valueIfDirty;
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setChecked(sourceElement.m_isChecked);
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_reflectsCheckedAttribute = sourceElement.m_reflectsCheckedAttribute;
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isIndeterminate = sourceElement.m_isIndeterminate;
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::copyNonAttributePropertiesFromElement(source);
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
901a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_needsToUpdateViewValue = true;
90251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->updateView();
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::value() const
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String value;
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_inputType->getTypeSpecificValue(value))
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return value;
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    value = m_valueIfDirty;
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!value.isNull())
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return value;
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AtomicString valueString = fastGetAttribute(valueAttr);
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    value = sanitizeValue(valueString);
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!value.isNull())
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return value;
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->fallbackValue();
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::valueWithDefault() const
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String value = this->value();
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!value.isNull())
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return value;
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->defaultValue();
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setValueForUser(const String& value)
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Call setValue and make it send a change event.
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValue(value, DispatchChangeEvent);
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const String& HTMLInputElement::suggestedValue() const
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_suggestedValue;
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setSuggestedValue(const String& value)
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_inputType->canSetSuggestedValue())
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
947a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_needsToUpdateViewValue = true;
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_suggestedValue = sanitizeValue(value);
94909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setNeedsStyleRecalc(SubtreeStyleChange);
95051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputTypeView->updateView();
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setEditingValue(const String& value)
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!renderer() || !isTextField())
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
95776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    setInnerEditorValue(value);
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    subtreeHasChanged();
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned max = value.length();
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (focused())
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setSelectionRange(max, max);
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cacheSelectionInResponseToSetValue(max);
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dispatchInputEvent();
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
96976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)void HTMLInputElement::setInnerEditorValue(const String& value)
970a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
97176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    HTMLTextFormControlElement::setInnerEditorValue(value);
972a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_needsToUpdateViewValue = false;
973a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
974a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
97551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setValue(const String& value, ExceptionState& exceptionState, TextFieldEventBehavior eventBehavior)
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isFileUpload() && !value.isEmpty()) {
97809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "This input element accepts a filename, which may only be programmatically set to the empty string.");
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setValue(value, eventBehavior);
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setValue(const String& value, TextFieldEventBehavior eventBehavior)
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_inputType->canSetValue(value))
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
989323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLInputElement> protector(this);
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    EventQueueScope scope;
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String sanitizedValue = sanitizeValue(value);
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool valueChanged = sanitizedValue != this->value();
9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setLastChangeWasNotUserEdit();
995a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_needsToUpdateViewValue = true;
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_suggestedValue = String(); // Prevent TextFieldInputType::setValue from using the suggested value.
9978abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inputType->setValue(sanitizedValue, valueChanged, eventBehavior);
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10008abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (valueChanged && eventBehavior == DispatchNoEvent)
10018abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        setTextAsOfLastFormControlChangeEvent(sanitizedValue);
10028abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!valueChanged)
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    notifyFormStateChanged();
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setValueInternal(const String& sanitizedValue, TextFieldEventBehavior eventBehavior)
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_valueIfDirty = sanitizedValue;
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsValidityCheck();
1013a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (document().focusedElement() == this)
1014a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        document().frameHost()->chrome().client().didUpdateTextOfFocusedElementByNonUserInput();
10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1017d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void HTMLInputElement::updateView()
1018d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1019d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_inputTypeView->updateView();
1020d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1021d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1022a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochdouble HTMLInputElement::valueAsDate(bool& isNull) const
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1024a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    double date =  m_inputType->valueAsDate();
1025a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    isNull = !std::isfinite(date);
1026a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    return date;
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
102951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setValueAsDate(double value, ExceptionState& exceptionState)
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
103151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputType->setValueAsDate(value, exceptionState);
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double HTMLInputElement::valueAsNumber() const
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->valueAsDouble();
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
103951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setValueAsNumber(double newValue, ExceptionState& exceptionState, TextFieldEventBehavior eventBehavior)
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1041323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-input-element-attributes.html#dom-input-valueasnumber
1042323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    // On setting, if the new value is infinite, then throw a TypeError exception.
104309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (std::isinf(newValue)) {
104409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwTypeError(ExceptionMessages::notAFiniteNumber(newValue));
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
104751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_inputType->setValueAsDouble(newValue, eventBehavior, exceptionState);
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setValueFromRenderer(const String& value)
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // File upload controls will never use this.
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!isFileUpload());
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_suggestedValue = String();
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Renderer and our event handler are responsible for sanitizing values.
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(value == sanitizeValue(value) || sanitizeValue(value).isEmpty());
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10600019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch    m_valueIfDirty = value;
1061a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    m_needsToUpdateViewValue = false;
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Input event is fired by the Node::defaultEventHandler for editable controls.
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isTextField())
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dispatchInputEvent();
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    notifyFormStateChanged();
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsValidityCheck();
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Clear autofill flag (and yellow background) on user edit.
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setAutofilled(false);
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void* HTMLInputElement::preDispatchEventHandler(Event* event)
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() == EventTypeNames::textInput && m_inputTypeView->shouldSubmitImplicitly(event)) {
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        event->stopPropagation();
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (event->type() != EventTypeNames::click)
10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1082591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!event->isMouseEvent() || toMouseEvent(event)->button() != LeftButton)
10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1084f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#if ENABLE(OILPAN)
1085f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    return m_inputTypeView->willDispatchClick();
1086f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#else
10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Check whether there are any cases where this actually ends up leaking.
1088c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return m_inputTypeView->willDispatchClick().leakPtr();
1089f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#endif
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::postDispatchEventHandler(Event* event, void* dataFromPreDispatch)
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1094f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    OwnPtrWillBeRawPtr<ClickHandlingState> state = adoptPtrWillBeNoop(static_cast<ClickHandlingState*>(dataFromPreDispatch));
10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!state)
10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1097c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->didDispatchClick(event, *state);
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::defaultEventHandler(Event* evt)
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (evt->isMouseEvent() && evt->type() == EventTypeNames::click && toMouseEvent(evt)->button() == LeftButton) {
1103c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->handleClickEvent(toMouseEvent(evt));
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
110809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (evt->isTouchEvent() && m_inputTypeView->hasTouchEventHandler()) {
110906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        m_inputTypeView->handleTouchEvent(toTouchEvent(evt));
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11141e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (evt->isKeyboardEvent() && evt->type() == EventTypeNames::keydown) {
1115c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->handleKeydownEvent(toKeyboardEvent(evt));
11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Call the base event handler before any of our own event handling for almost all events in text fields.
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Makes editing keyboard handling take precedence over the keydown and keypress handling in this function.
11221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    bool callBaseClassEarly = isTextField() && (evt->type() == EventTypeNames::keydown || evt->type() == EventTypeNames::keypress);
11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (callBaseClassEarly) {
11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HTMLTextFormControlElement::defaultEventHandler(evt);
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // DOMActivate events cause the input to be "activated" - in the case of image and submit inputs, this means
11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // actually submitting the form. For reset inputs, the form is reset. These events are sent when the user clicks
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // on the element, or presses enter while it is the active element. JavaScript code wishing to activate the element
11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // must dispatch a DOMActivate event - a click event will not do the job.
11331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (evt->type() == EventTypeNames::DOMActivate) {
11349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_inputType->handleDOMActivateEvent(evt);
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Use key press event here since sending simulated mouse events
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // on key down blocks the proper sending of the key press event.
11411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (evt->isKeyboardEvent() && evt->type() == EventTypeNames::keypress) {
1142c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->handleKeypressEvent(toKeyboardEvent(evt));
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (evt->isKeyboardEvent() && evt->type() == EventTypeNames::keyup) {
1148c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->handleKeyupEvent(toKeyboardEvent(evt));
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1153c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (m_inputTypeView->shouldSubmitImplicitly(evt)) {
115481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        if (isSearchField())
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            onSearch();
11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Form submission finishes editing, just as loss of focus does.
11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If there was a change, send the event now.
11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (wasChangedSinceLastFormControlChangeEvent())
11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dispatchFormControlChangeEvent();
11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1161f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)        RefPtrWillBeRawPtr<HTMLFormElement> formForSubmission = m_inputTypeView->formForSubmission();
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Form may never have been present, or may have been destroyed by code responding to the change event.
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (formForSubmission)
11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            formForSubmission->submitImplicitly(evt, canTriggerImplicitSubmission());
11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        evt->setDefaultHandled();
11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (evt->isBeforeTextInsertedEvent())
1171c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->handleBeforeTextInsertedEvent(static_cast<BeforeTextInsertedEvent*>(evt));
11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (evt->isMouseEvent() && evt->type() == EventTypeNames::mousedown) {
1174c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        m_inputTypeView->handleMouseDownEvent(toMouseEvent(evt));
11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (evt->defaultHandled())
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1179c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->forwardEvent(evt);
11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!callBaseClassEarly && !evt->defaultHandled())
11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        HTMLTextFormControlElement::defaultEventHandler(evt);
11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::willRespondToMouseClickEvents()
11865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: Consider implementing willRespondToMouseClickEvents() in InputType if more accurate results are necessary.
118853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!isDisabledFormControl())
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return HTMLTextFormControlElement::willRespondToMouseClickEvents();
11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isURLAttribute(const Attribute& attribute) const
11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return attribute.name() == srcAttr || attribute.name() == formactionAttr || HTMLTextFormControlElement::isURLAttribute(attribute);
11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
119943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)bool HTMLInputElement::hasLegalLinkAttribute(const QualifiedName& name) const
120043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){
120143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    return m_inputType->hasLegalLinkAttribute(name) || HTMLTextFormControlElement::hasLegalLinkAttribute(name);
120243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)}
120343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
120443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)const QualifiedName& HTMLInputElement::subResourceAttributeName() const
120543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){
120643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    return m_inputType->subResourceAttributeName();
120743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)}
120843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
1209a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const AtomicString& HTMLInputElement::defaultValue() const
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return fastGetAttribute(valueAttr);
12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1214a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void HTMLInputElement::setDefaultValue(const AtomicString& value)
12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setAttribute(valueAttr, value);
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline bool isRFC2616TokenCharacter(UChar ch)
12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return isASCII(ch) && ch > ' ' && ch != '"' && ch != '(' && ch != ')' && ch != ',' && ch != '/' && (ch < ':' || ch > '@') && (ch < '[' || ch > ']') && ch != '{' && ch != '}' && ch != 0x7f;
12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isValidMIMEType(const String& type)
12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t slashPosition = type.find('/');
122706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if (slashPosition == kNotFound || !slashPosition || slashPosition == type.length() - 1)
12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < type.length(); ++i) {
12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!isRFC2616TokenCharacter(type[i]) && i != slashPosition)
12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
12325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isValidFileExtension(const String& type)
12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (type.length() < 2)
12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return type[0] == '.';
12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static Vector<String> parseAcceptAttribute(const String& acceptString, bool (*predicate)(const String&))
12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<String> types;
12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (acceptString.isEmpty())
12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return types;
12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<String> splitTypes;
12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    acceptString.split(',', false, splitTypes);
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < splitTypes.size(); ++i) {
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        String trimmedType = stripLeadingAndTrailingHTMLSpaces(splitTypes[i]);
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (trimmedType.isEmpty())
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!predicate(trimmedType))
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        types.append(trimmedType.lower());
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return types;
12615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Vector<String> HTMLInputElement::acceptMIMETypes()
12645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parseAcceptAttribute(fastGetAttribute(acceptAttr), isValidMIMEType);
12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Vector<String> HTMLInputElement::acceptFileExtensions()
12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return parseAcceptAttribute(fastGetAttribute(acceptAttr), isValidFileExtension);
12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1273a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const AtomicString& HTMLInputElement::alt() const
12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return fastGetAttribute(altAttr);
12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int HTMLInputElement::maxLength() const
12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_maxLength;
12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
128351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setMaxLength(int maxLength, ExceptionState& exceptionState)
12845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (maxLength < 0)
1286a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(IndexSizeError, "The value provided (" + String::number(maxLength) + ") is negative.");
12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
128851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        setIntegralAttribute(maxlengthAttr, maxLength);
12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::multiple() const
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return fastHasAttribute(multipleAttr);
12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setSize(unsigned size)
12975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
129851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setUnsignedIntegralAttribute(sizeAttr, size);
12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
130151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setSize(unsigned size, ExceptionState& exceptionState)
13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!size)
1304a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(IndexSizeError, "The value provided is 0, which is an invalid size.");
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setSize(size);
13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)KURL HTMLInputElement::src() const
13105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return document().completeURL(fastGetAttribute(srcAttr));
13125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1314c664b83e7394be007e9ef2430bed7d73b50e0da7Bo LiuFileList* HTMLInputElement::files()
13155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->files();
13175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1319d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void HTMLInputElement::setFiles(PassRefPtrWillBeRawPtr<FileList> files)
13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inputType->setFiles(files);
13225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::receiveDroppedFiles(const DragData* dragData)
13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->receiveDroppedFiles(dragData);
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::droppedFileSystemId()
13305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->droppedFileSystemId();
13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::canReceiveDroppedFiles() const
13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_canReceiveDroppedFiles;
13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setCanReceiveDroppedFiles(bool canReceiveDroppedFiles)
13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_canReceiveDroppedFiles == canReceiveDroppedFiles)
13425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_canReceiveDroppedFiles = canReceiveDroppedFiles;
13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer())
13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        renderer()->updateFromElement();
13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::sanitizeValue(const String& proposedValue) const
13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (proposedValue.isNull())
13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return proposedValue;
13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->sanitizeValue(proposedValue);
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::localizeValue(const String& proposedValue) const
13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (proposedValue.isNull())
13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return proposedValue;
13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->localizeValue(proposedValue);
13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isInRange() const
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isInRange(value());
13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isOutOfRange() const
13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isOutOfRange(value());
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isRequiredFormControl() const
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1374926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_inputType->supportsRequired() && isRequired();
1375926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1376926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1377926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool HTMLInputElement::matchesReadOnlyPseudoClass() const
1378926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
137953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return m_inputType->supportsReadOnly() && isReadOnly();
1380926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1381926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1382926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool HTMLInputElement::matchesReadWritePseudoClass() const
1383926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
138453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return m_inputType->supportsReadOnly() && !isReadOnly();
13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::onSearch()
13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(isSearchField());
13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_inputType)
13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        static_cast<SearchInputType*>(m_inputType.get())->stopSearchEventTimer();
13921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    dispatchEvent(Event::createBubble(EventTypeNames::search));
13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1395926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLInputElement::updateClearButtonVisibility()
1396926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1397c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->updateClearButtonVisibility();
1398926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1399926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::willChangeForm()
14015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    removeFromRadioButtonGroup();
14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::willChangeForm();
14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::didChangeForm()
14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::didChangeForm();
14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    addToRadioButtonGroup();
14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node::InsertionNotificationRequest HTMLInputElement::insertedInto(ContainerNode* insertionPoint)
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::insertedInto(insertionPoint);
1415521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (insertionPoint->inDocument() && !form())
1416521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        addToRadioButtonGroup();
14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resetListAttributeTargetObserver();
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return InsertionDone;
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::removedFrom(ContainerNode* insertionPoint)
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (insertionPoint->inDocument() && !form())
14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        removeFromRadioButtonGroup();
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::removedFrom(insertionPoint);
14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!inDocument());
14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resetListAttributeTargetObserver();
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void HTMLInputElement::didMoveToNewDocument(Document& oldDocument)
14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1432926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (hasImageLoader())
1433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        imageLoader()->elementDidMoveToNewDocument();
1434926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
14351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (isRadioButton())
1436d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        oldDocument.formController().radioButtonGroupScope().removeButton(this);
14371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (m_hasTouchEventHandler)
143809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        oldDocument.didRemoveTouchEventHandler(this);
14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1440926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_hasTouchEventHandler)
14411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        document().didAddTouchEventHandler(this);
1442926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::didMoveToNewDocument(oldDocument);
14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
144609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLInputElement::removeAllEventListeners()
14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
144809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    HTMLTextFormControlElement::removeAllEventListeners();
144909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_hasTouchEventHandler = false;
14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::recalcWillValidate() const
14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->supportsValidation() && HTMLTextFormControlElement::recalcWillValidate();
14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::requiredAttributeChanged()
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLTextFormControlElement::requiredAttributeChanged();
146009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (RadioButtonGroupScope* scope = radioButtonGroupScope())
146109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        scope->requiredAttributeChanged(this);
1462c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->requiredAttributeChanged();
14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::selectColorInColorChooser(const Color& color)
14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_inputType->isColorControl())
14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static_cast<ColorInputType*>(m_inputType.get())->didChooseColor(color);
14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
147153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLElement* HTMLInputElement::list() const
14735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return dataList();
14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLDataListElement* HTMLInputElement::dataList() const
14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_hasNonEmptyList)
14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_inputType->shouldRespectListAttribute())
14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Element* element = treeScope().getElementById(fastGetAttribute(listAttr));
14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!element)
14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1488d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!isHTMLDataListElement(*element))
14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return toHTMLDataListElement(element);
14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
149409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool HTMLInputElement::hasValidDataListOptions() const
149509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
149609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    HTMLDataListElement* dataList = this->dataList();
149709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!dataList)
149809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
1499d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLCollection> options = dataList->options();
150009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (unsigned i = 0; HTMLOptionElement* option = toHTMLOptionElement(options->item(i)); ++i) {
150109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (isValidValue(option->value()))
150209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return true;
150309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
150409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return false;
150509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
150609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1507f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)void HTMLInputElement::setListAttributeTargetObserver(PassOwnPtrWillBeRawPtr<ListAttributeTargetObserver> newObserver)
1508323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
1509323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    if (m_listAttributeTargetObserver)
1510323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        m_listAttributeTargetObserver->unregister();
1511323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    m_listAttributeTargetObserver = newObserver;
1512323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
1513323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::resetListAttributeTargetObserver()
15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (inDocument())
1517323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        setListAttributeTargetObserver(ListAttributeTargetObserver::create(fastGetAttribute(listAttr), this));
15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
1519323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        setListAttributeTargetObserver(nullptr);
15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::listAttributeTargetChanged()
15235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1524c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    m_inputTypeView->listAttributeTargetChanged();
15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isSteppable() const
15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isSteppable();
15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isTextButton() const
15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isTextButton();
15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isRadioButton() const
15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isRadioButton();
15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isSearchField() const
15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isSearchField();
15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isInputTypeHidden() const
15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isHiddenType();
15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isPasswordField() const
15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isPasswordField();
15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isCheckbox() const
15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isCheckbox();
15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isRangeControl() const
15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isRangeControl();
15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isText() const
15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isTextType();
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isEmailField() const
15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isEmailField();
15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isFileUpload() const
15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isFileUpload();
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isImageButton() const
15835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isImageButton();
15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isNumberField() const
15885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isNumberField();
15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isTelephoneField() const
15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isTelephoneField();
15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isURLField() const
15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isURLField();
16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isDateField() const
16035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isDateField();
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isDateTimeLocalField() const
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isDateTimeLocalField();
16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isMonthField() const
16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isMonthField();
16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isTimeField() const
16185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isTimeField();
16205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isWeekField() const
16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isWeekField();
16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::isEnumeratable() const
16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->isEnumeratable();
16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::supportLabels() const
16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1634bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return m_inputType->isInteractiveContent();
16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::shouldAppearChecked() const
16385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return checked() && m_inputType->isCheckable();
16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::supportsPlaceholder() const
16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->supportsPlaceholder();
16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::updatePlaceholderText()
16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1649d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return m_inputTypeView->updatePlaceholderText();
16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1652926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLInputElement::parseMaxLengthAttribute(const AtomicString& value)
16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int maxLength;
1655926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!parseHTMLInteger(value, maxLength))
16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        maxLength = maximumLength;
16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (maxLength < 0 || maxLength > maximumLength)
16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        maxLength = maximumLength;
16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int oldMaxLength = m_maxLength;
16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_maxLength = maxLength;
16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (oldMaxLength != maxLength)
16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        updateValueIfNeeded();
166309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setNeedsStyleRecalc(SubtreeStyleChange);
16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setNeedsValidityCheck();
16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::updateValueIfNeeded()
16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String newValue = sanitizeValue(m_valueIfDirty);
16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(!m_valueIfDirty.isNull() || newValue.isNull());
16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (newValue != m_valueIfDirty)
16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        setValue(newValue);
16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLInputElement::defaultToolTip() const
16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->defaultToolTip();
16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
168053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool HTMLInputElement::shouldAppearIndeterminate() const
16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->supportsIndeterminateAppearance() && indeterminate();
16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1685926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool HTMLInputElement::isInRequiredRadioButtonGroup()
16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(isRadioButton());
168809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (RadioButtonGroupScope* scope = radioButtonGroupScope())
168909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return scope->isInRequiredGroup(this);
16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
16915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLInputElement* HTMLInputElement::checkedRadioButtonForGroup() const
16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
169509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (RadioButtonGroupScope* scope = radioButtonGroupScope())
169609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return scope->checkedButtonForGroup(name());
16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
170009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)RadioButtonGroupScope* HTMLInputElement::radioButtonGroupScope() const
17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isRadioButton())
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (HTMLFormElement* formElement = form())
170509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return &formElement->radioButtonGroupScope();
17065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (inDocument())
1707d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return &document().formController().radioButtonGroupScope();
17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void HTMLInputElement::addToRadioButtonGroup()
17125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
171309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (RadioButtonGroupScope* scope = radioButtonGroupScope())
171409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        scope->addButton(this);
17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline void HTMLInputElement::removeFromRadioButtonGroup()
17185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
171909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (RadioButtonGroupScope* scope = radioButtonGroupScope())
172009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        scope->removeButton(this);
17215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned HTMLInputElement::height() const
17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->height();
17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned HTMLInputElement::width() const
17295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inputType->width();
17315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setHeight(unsigned height)
17345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
173551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setUnsignedIntegralAttribute(heightAttr, height);
17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLInputElement::setWidth(unsigned width)
17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
174051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setUnsignedIntegralAttribute(widthAttr, width);
17415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1743f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)PassOwnPtrWillBeRawPtr<ListAttributeTargetObserver> ListAttributeTargetObserver::create(const AtomicString& id, HTMLInputElement* element)
17445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1745f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    return adoptPtrWillBeNoop(new ListAttributeTargetObserver(id, element));
17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ListAttributeTargetObserver::ListAttributeTargetObserver(const AtomicString& id, HTMLInputElement* element)
17498abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    : IdTargetObserver(element->treeScope().idTargetObserverRegistry(), id)
17505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_element(element)
17515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1754f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)void ListAttributeTargetObserver::trace(Visitor* visitor)
1755f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles){
1756f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    visitor->trace(m_element);
1757f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    IdTargetObserver::trace(visitor);
1758f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)}
1759f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)
17605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ListAttributeTargetObserver::idTargetChanged()
17615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_element->listAttributeTargetChanged();
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
176551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setRangeText(const String& replacement, ExceptionState& exceptionState)
17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
1768a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
17695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
177251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    HTMLTextFormControlElement::setRangeText(replacement, exceptionState);
17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
177551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLInputElement::setRangeText(const String& replacement, unsigned start, unsigned end, const String& selectionMode, ExceptionState& exceptionState)
17765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_inputType->supportsSelectionAPI()) {
1778a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        exceptionState.throwDOMException(InvalidStateError, "The input element's type ('" + m_inputType->formControlType() + "') does not support selection.");
17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
17805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
17815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
178251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    HTMLTextFormControlElement::setRangeText(replacement, start, end, selectionMode, exceptionState);
17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HTMLInputElement::setupDateTimeChooserParameters(DateTimeChooserParameters& parameters)
17865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17878abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!document().view())
17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
17895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    parameters.type = type();
17915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    parameters.minimum = minimum();
17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    parameters.maximum = maximum();
1793926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    parameters.required = isRequired();
1794926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!RuntimeEnabledFeatures::langAttributeAwareFormControlUIEnabled())
1795926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        parameters.locale = defaultLanguage();
1796926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else {
1797926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        AtomicString computedLocale = computeInheritedLanguage();
179809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        parameters.locale = computedLocale.isEmpty() ? defaultLanguage() : computedLocale;
1799926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
18005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StepRange stepRange = createStepRange(RejectAny);
18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (stepRange.hasStep()) {
18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parameters.step = stepRange.step().toDouble();
18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parameters.stepBase = stepRange.stepBase().toDouble();
18055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parameters.step = 1.0;
18075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parameters.stepBase = 0;
18085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18108abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    parameters.anchorRectInRootView = document().view()->contentsToRootView(pixelSnappedBoundingBox());
18115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    parameters.currentValue = value();
181251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    parameters.doubleValue = m_inputType->valueAsDouble();
18135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    parameters.isAnchorElementRTL = computedStyle()->direction() == RTL;
181409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (HTMLDataListElement* dataList = this->dataList()) {
1815d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        RefPtrWillBeRawPtr<HTMLCollection> options = dataList->options();
181609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        for (unsigned i = 0; HTMLOptionElement* option = toHTMLOptionElement(options->item(i)); ++i) {
181709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (!isValidValue(option->value()))
181809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                continue;
181909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            DateTimeSuggestion suggestion;
182009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            suggestion.value = m_inputType->parseToNumber(option->value(), Decimal::nan()).toDouble();
182109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            if (std::isnan(suggestion.value))
182209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                continue;
182309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            suggestion.localizedValue = localizeValue(option->value());
182409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            suggestion.label = option->value() == option->label() ? String() : option->label();
182509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            parameters.suggestions.append(suggestion);
18265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
18275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
18295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1831e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochbool HTMLInputElement::supportsInputModeAttribute() const
1832e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch{
1833e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    return m_inputType->supportsInputModeAttribute();
1834e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
1835e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
183609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void HTMLInputElement::setShouldRevealPassword(bool value)
183709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
183809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_shouldRevealPassword == value)
183909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
184009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_shouldRevealPassword = value;
184109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    lazyReattachIfAttached();
184209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
184309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1844bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)bool HTMLInputElement::isInteractiveContent() const
1845bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
1846bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return m_inputType->isInteractiveContent();
1847bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
1848bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
184909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool HTMLInputElement::supportsAutofocus() const
185009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
185109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return m_inputType->isInteractiveContent();
185209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
185309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1854926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
1855926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)PassRefPtr<RenderStyle> HTMLInputElement::customStyleForRenderer()
1856926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1857c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return m_inputTypeView->customStyleForRenderer(originalStyleForRenderer());
1858926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1859926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
1860926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1861323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)bool HTMLInputElement::shouldDispatchFormControlChangeEvent(String& oldValue, String& newValue)
1862323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
1863323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    return m_inputType->shouldDispatchFormControlChangeEvent(oldValue, newValue);
1864323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
1865323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
18665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace
1867