15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Apple Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
3306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/TextFieldInputType.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionStatePlaceholder.h"
365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeRenderStyle.h"
38e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/FrameSelection.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/TextIterator.h"
4109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/events/BeforeTextInsertedEvent.h"
4209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/events/KeyboardEvent.h"
4309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/events/TextEvent.h"
4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/FrameHost.h"
45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
46bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/html/FormDataList.h"
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h"
48e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/html/shadow/ShadowElementNames.h"
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/shadow/TextControlInnerElements.h"
5051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/page/Chrome.h"
5151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/page/ChromeClient.h"
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/rendering/RenderDetailsMarker.h"
5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderLayer.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTextControlSingleLine.h"
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTheme.h"
56e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/text/WTFString.h"
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class DataListIndicatorElement FINAL : public HTMLDivElement {
6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)private:
6409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    inline DataListIndicatorElement(Document& document) : HTMLDivElement(document) { }
6509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    inline HTMLInputElement* hostInput() const { return toHTMLInputElement(shadowHost()); }
6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE
6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return new RenderDetailsMarker(this);
7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void* preDispatchEventHandler(Event* event) OVERRIDE
7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // Chromium opens autofill popup in a mousedown event listener
7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // associated to the document. We don't want to open it in this case
7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // because we opens a datalist chooser later.
7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // FIXME: We should dispatch mousedown events even in such case.
7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (event->type() == EventTypeNames::mousedown)
7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            event->stopPropagation();
8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return 0;
8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void defaultEventHandler(Event* event) OVERRIDE
8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ASSERT(document().isActive());
8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (event->type() != EventTypeNames::click)
8709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return;
8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        HTMLInputElement* host = hostInput();
8909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (host && !host->isDisabledOrReadOnly()) {
9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            document().frameHost()->chrome().openTextDataListChooser(*host);
9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            event->setDefaultHandled();
9209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
9309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
9409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool willRespondToMouseClickEvents() OVERRIDE
9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
9709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return hostInput() && !hostInput()->isDisabledOrReadOnly() && document().isActive();
9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
9909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)public:
101323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    static PassRefPtrWillBeRawPtr<DataListIndicatorElement> create(Document& document)
10209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
1035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        RefPtrWillBeRawPtr<DataListIndicatorElement> element = adoptRefWillBeNoop(new DataListIndicatorElement(document));
10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        element->setShadowPseudoId(AtomicString("-webkit-calendar-picker-indicator", AtomicString::ConstructFromLiteral));
10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        element->setAttribute(idAttr, ShadowElementNames::pickerIndicator());
10609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return element.release();
10709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
10909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)};
11009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
111bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)TextFieldInputType::TextFieldInputType(HTMLInputElement& element)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : InputType(element)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TextFieldInputType::~TextFieldInputType()
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
118323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#if !ENABLE(OILPAN)
119e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (SpinButtonElement* spinButton = spinButtonElement())
120e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        spinButton->removeSpinButtonOwner();
121323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#endif
122e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)}
123e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
124e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)SpinButtonElement* TextFieldInputType::spinButtonElement() const
125e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){
126bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return toSpinButtonElement(element().userAgentShadowRoot()->getElementById(ShadowElementNames::spinButton()));
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
129591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochbool TextFieldInputType::shouldShowFocusRingOnMouseFocus() const
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
131591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return true;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool TextFieldInputType::isTextField() const
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool TextFieldInputType::valueMissing(const String& value) const
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
14109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return element().isRequired() && value.isEmpty();
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool TextFieldInputType::canSetSuggestedValue()
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextFieldInputType::setValue(const String& sanitizedValue, bool valueChanged, TextFieldEventBehavior eventBehavior)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Grab this input element to keep reference even if JS event handler
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // changes input type.
153d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLInputElement> input(element());
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We don't ask InputType::setValue to dispatch events because
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // TextFieldInputType dispatches events different way from InputType.
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InputType::setValue(sanitizedValue, valueChanged, DispatchNoEvent);
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (valueChanged)
160d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        input->updateView();
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned max = visibleValue().length();
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (input->focused())
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        input->setSelectionRange(max, max);
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        input->cacheSelectionInResponseToSetValue(max);
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!valueChanged)
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (eventBehavior) {
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case DispatchChangeEvent:
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If the user is still editing this field, dispatch an input event rather than a change event.
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The change event will be dispatched when editing finishes.
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (input->focused())
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            input->dispatchFormControlInputEvent();
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            input->dispatchFormControlChangeEvent();
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case DispatchInputAndChangeEvent: {
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        input->dispatchFormControlInputEvent();
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        input->dispatchFormControlChangeEvent();
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case DispatchNoEvent:
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!input->focused())
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        input->setTextAsOfLastFormControlChangeEvent(sanitizedValue);
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextFieldInputType::handleKeydownEvent(KeyboardEvent* event)
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
197bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (!element().focused())
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
19951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (Chrome* chrome = this->chrome()) {
20051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        chrome->client().handleKeyboardEventOnTextField(element(), *event);
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
20251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event->setDefaultHandled();
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextFieldInputType::handleKeydownEventForSpinButton(KeyboardEvent* event)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
208bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (element().isDisabledOrReadOnly())
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const String& key = event->keyIdentifier();
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (key == "Up")
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        spinButtonStepUp();
213aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    else if (key == "Down" && !event->altKey())
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        spinButtonStepDown();
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
217a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    element().dispatchFormControlChangeEvent();
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event->setDefaultHandled();
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextFieldInputType::forwardEvent(Event* event)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
223e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (SpinButtonElement* spinButton = spinButtonElement()) {
224e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        spinButton->forwardEvent(event);
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event->defaultHandled())
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
229bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (element().renderer() && (event->isMouseEvent() || event->isDragEvent() || event->hasInterface(EventNames::WheelEvent) || event->type() == EventTypeNames::blur || event->type() == EventTypeNames::focus)) {
230bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        RenderTextControlSingleLine* renderTextControl = toRenderTextControlSingleLine(element().renderer());
2311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        if (event->type() == EventTypeNames::blur) {
23276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            if (RenderBox* innerEditorRenderer = element().innerEditorElement()->renderBox()) {
2331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)                // FIXME: This class has no need to know about RenderLayer!
23476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)                if (RenderLayer* innerLayer = innerEditorRenderer->layer()) {
235d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                    if (RenderLayerScrollableArea* innerScrollableArea = innerLayer->scrollableArea()) {
236d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                        IntSize scrollOffset(!renderTextControl->style()->isLeftToRightDirection() ? innerScrollableArea->scrollWidth().toInt() : 0, 0);
237d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                        innerScrollableArea->scrollToOffset(scrollOffset, ScrollOffsetClamped);
238d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                    }
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            renderTextControl->capsLockStateMayHaveChanged();
2431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        } else if (event->type() == EventTypeNames::focus) {
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            renderTextControl->capsLockStateMayHaveChanged();
24506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        }
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
247bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        element().forwardEvent(event);
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void TextFieldInputType::handleFocusEvent(Element* oldFocusedNode, FocusType focusType)
252f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles){
25309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    InputType::handleFocusEvent(oldFocusedNode, focusType);
254bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    element().beginEditing();
255f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)}
256f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextFieldInputType::handleBlurEvent()
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InputType::handleBlurEvent();
260bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    element().endEditing();
261a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (SpinButtonElement *spinButton = spinButtonElement())
262a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        spinButton->releaseCapture();
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool TextFieldInputType::shouldSubmitImplicitly(Event* event)
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return (event->type() == EventTypeNames::textInput && event->hasInterface(EventNames::TextEvent) && toTextEvent(event)->data() == "\n") || InputType::shouldSubmitImplicitly(event);
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
270591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochRenderObject* TextFieldInputType::createRenderer(RenderStyle*) const
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
272bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return new RenderTextControlSingleLine(&element());
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool TextFieldInputType::shouldHaveSpinButton() const
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
277bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return RenderTheme::theme().shouldHaveSpinButton(&element());
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextFieldInputType::createShadowSubtree()
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
282bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT(element().shadow());
283bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ShadowRoot* shadowRoot = element().userAgentShadowRoot();
284d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ASSERT(!shadowRoot->hasChildren());
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
286bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    Document& document = element().document();
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool shouldHaveSpinButton = this->shouldHaveSpinButton();
28809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool shouldHaveDataListIndicator = element().hasValidDataListOptions();
28909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool createsContainer = shouldHaveSpinButton || shouldHaveDataListIndicator || needsContainer();
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    RefPtrWillBeRawPtr<TextControlInnerEditorElement> innerEditor = TextControlInnerEditorElement::create(document);
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!createsContainer) {
293f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        shadowRoot->appendChild(innerEditor.release());
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
297323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeRawPtr<TextControlInnerContainer> container = TextControlInnerContainer::create(document);
29809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    container->setShadowPseudoId(AtomicString("-webkit-textfield-decoration-container", AtomicString::ConstructFromLiteral));
29906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    shadowRoot->appendChild(container);
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
301323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeRawPtr<EditingViewPortElement> editingViewPort = EditingViewPortElement::create(document);
302f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    editingViewPort->appendChild(innerEditor.release());
30306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    container->appendChild(editingViewPort.release());
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (shouldHaveDataListIndicator)
30609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        container->appendChild(DataListIndicatorElement::create(document));
30709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // FIXME: Because of a special handling for a spin button in
30809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // RenderTextControlSingleLine, we need to put it to the last position. It's
30909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // inconsistent with multiple-fields date/time types.
310e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (shouldHaveSpinButton)
31106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        container->appendChild(SpinButtonElement::create(document, *this));
31209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
31309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // See listAttributeTargetChanged too.
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
31606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)Element* TextFieldInputType::containerElement() const
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
318bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return element().userAgentShadowRoot()->getElementById(ShadowElementNames::textFieldContainer());
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextFieldInputType::destroyShadowSubtree()
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InputType::destroyShadowSubtree();
324e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (SpinButtonElement* spinButton = spinButtonElement())
325e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        spinButton->removeSpinButtonOwner();
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void TextFieldInputType::listAttributeTargetChanged()
32909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
33009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Element* picker = element().userAgentShadowRoot()->getElementById(ShadowElementNames::pickerIndicator());
33109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool didHavePickerIndicator = picker;
33209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool willHavePickerIndicator = element().hasValidDataListOptions();
33309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (didHavePickerIndicator == willHavePickerIndicator)
33409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
33509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (willHavePickerIndicator) {
33609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        Document& document = element().document();
33709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (Element* container = containerElement()) {
33809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            container->insertBefore(DataListIndicatorElement::create(document), spinButtonElement());
33909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        } else {
34009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // FIXME: The following code is similar to createShadowSubtree(),
34109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // but they are different. We should simplify the code by making
34209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            // containerElement mandatory.
343323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            RefPtrWillBeRawPtr<Element> rpContainer = TextControlInnerContainer::create(document);
34409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            rpContainer->setShadowPseudoId(AtomicString("-webkit-textfield-decoration-container", AtomicString::ConstructFromLiteral));
34576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)            RefPtrWillBeRawPtr<Element> innerEditor = element().innerEditorElement();
34609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            innerEditor->parentNode()->replaceChild(rpContainer.get(), innerEditor.get());
347323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)            RefPtrWillBeRawPtr<Element> editingViewPort = EditingViewPortElement::create(document);
34809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            editingViewPort->appendChild(innerEditor.release());
34909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            rpContainer->appendChild(editingViewPort.release());
35009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            rpContainer->appendChild(DataListIndicatorElement::create(document));
351d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (element().document().focusedElement() == element())
352d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                element().updateFocusAppearance(true /* restore selection */);
35309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
35409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    } else {
35509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        picker->remove(ASSERT_NO_EXCEPTION);
35609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
35709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
35809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void TextFieldInputType::attributeChanged()
360926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
36151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // FIXME: Updating on any attribute update should be unnecessary. We should
36251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // figure out what attributes affect.
36351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    updateView();
364926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
365926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextFieldInputType::disabledAttributeChanged()
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
368e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (SpinButtonElement* spinButton = spinButtonElement())
369e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        spinButton->releaseCapture();
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextFieldInputType::readonlyAttributeChanged()
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
374e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    if (SpinButtonElement* spinButton = spinButtonElement())
375e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)        spinButton->releaseCapture();
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
378926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool TextFieldInputType::supportsReadOnly() const
379926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
380926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return true;
381926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
382926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isASCIILineBreak(UChar c)
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return c == '\r' || c == '\n';
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)static String limitLength(const String& string, unsigned maxLength)
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    unsigned newLength = std::min(maxLength, string.length());
3918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (newLength == string.length())
3928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return string;
3933c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    if (newLength > 0 && U16_IS_LEAD(string[newLength - 1]))
3943c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        --newLength;
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return string.left(newLength);
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String TextFieldInputType::sanitizeValue(const String& proposedValue) const
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return limitLength(proposedValue.removeCharacters(isASCIILineBreak), HTMLInputElement::maximumLength);
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextFieldInputType::handleBeforeTextInsertedEvent(BeforeTextInsertedEvent* event)
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make sure that the text to be inserted will not violate the maxLength.
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
40776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    // We use HTMLInputElement::innerEditorValue() instead of
4083c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    // HTMLInputElement::value() because they can be mismatched by
4093c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    // sanitizeValue() in HTMLInputElement::subtreeHasChanged() in some cases.
41076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    unsigned oldLength = element().innerEditorValue().length();
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // selectionLength represents the selection length of this text field to be
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // removed by this insertion.
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the text field has no focus, we don't need to take account of the
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // selection length. The selection is the source of text drag-and-drop in
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // that case, and nothing in the text field will be removed.
417bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    unsigned selectionLength = element().focused() ? plainText(element().document().frame()->selection().selection().toNormalizedRange().get()).length() : 0;
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(oldLength >= selectionLength);
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Selected characters will be removed by the next text event.
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned baseLength = oldLength - selectionLength;
4227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    unsigned maxLength = static_cast<unsigned>(this->maxLength()); // maxLength can never be negative.
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned appendableLength = maxLength > baseLength ? maxLength - baseLength : 0;
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Truncate the inserted text to avoid violating the maxLength and other constraints.
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String eventText = event->text();
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned textLength = eventText.length();
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (textLength > 0 && isASCIILineBreak(eventText[textLength - 1]))
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        textLength--;
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    eventText.truncate(textLength);
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    eventText.replace("\r\n", " ");
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    eventText.replace('\r', ' ');
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    eventText.replace('\n', ' ');
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    event->setText(limitLength(eventText, appendableLength));
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool TextFieldInputType::shouldRespectListAttribute()
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
440d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return true;
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextFieldInputType::updatePlaceholderText()
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!supportsPlaceholder())
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
447bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    HTMLElement* placeholder = element().placeholderElement();
448bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    String placeholderText = element().strippedPlaceholder();
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (placeholderText.isEmpty()) {
4509bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        if (placeholder)
4519bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            placeholder->remove(ASSERT_NO_EXCEPTION);
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4549bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!placeholder) {
455f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        RefPtrWillBeRawPtr<HTMLElement> newElement = HTMLDivElement::create(element().document());
4569bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        placeholder = newElement.get();
45709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        placeholder->setShadowPseudoId(AtomicString("-webkit-input-placeholder", AtomicString::ConstructFromLiteral));
4589bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        placeholder->setAttribute(idAttr, ShadowElementNames::placeholder());
45906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        Element* container = containerElement();
46076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        Node* previous = container ? container : element().innerEditorElement();
461bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        previous->parentNode()->insertBefore(placeholder, previous->nextSibling());
462bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        ASSERT_WITH_SECURITY_IMPLICATION(placeholder->parentNode() == previous->parentNode());
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
464a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    placeholder->setTextContent(placeholderText);
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool TextFieldInputType::appendFormData(FormDataList& list, bool multipart) const
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    InputType::appendFormData(list, multipart);
470bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    const AtomicString& dirnameAttrValue = element().fastGetAttribute(dirnameAttr);
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!dirnameAttrValue.isNull())
472bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        list.appendData(dirnameAttrValue, element().directionForFormData());
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
476926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)String TextFieldInputType::convertFromVisibleValue(const String& visibleValue) const
477926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
478926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return visibleValue;
479926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
480926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
481926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void TextFieldInputType::subtreeHasChanged()
482926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
483bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT(element().renderer());
484926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
485bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    bool wasChanged = element().wasChangedSinceLastFormControlChangeEvent();
486bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    element().setChangedSinceLastFormControlChangeEvent(true);
487926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
488926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // We don't need to call sanitizeUserInputValue() function here because
489926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // HTMLInputElement::handleBeforeTextInsertedEvent() has already called
490926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // sanitizeUserInputValue().
491926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // sanitizeValue() is needed because IME input doesn't dispatch BeforeTextInsertedEvent.
49276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    element().setValueFromRenderer(sanitizeValue(convertFromVisibleValue(element().innerEditorValue())));
493bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    element().updatePlaceholderVisibility(false);
494926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Recalc for :invalid change.
49509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    element().setNeedsStyleRecalc(SubtreeStyleChange);
496926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
497926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    didSetValueByUserEdit(wasChanged ? ValueChangeStateChanged : ValueChangeStateNone);
498926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
499926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
500926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void TextFieldInputType::didSetValueByUserEdit(ValueChangeState state)
501926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
502bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (!element().focused())
503926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
50451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (Chrome* chrome = this->chrome())
50551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        chrome->client().didChangeValueInTextField(element());
506926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
507926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextFieldInputType::spinButtonStepDown()
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stepUpFromRenderer(-1);
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextFieldInputType::spinButtonStepUp()
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    stepUpFromRenderer(1);
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void TextFieldInputType::updateView()
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
520bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (!element().suggestedValue().isNull()) {
52176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        element().setInnerEditorValue(element().suggestedValue());
522bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        element().updatePlaceholderVisibility(false);
523a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    } else if (element().needsToUpdateViewValue()) {
524a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        // Update the view only if needsToUpdateViewValue is true. It protects
525a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        // an unacceptable view value from being overwritten with the DOM value.
526a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        //
527a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        // e.g. <input type=number> has a view value "abc", and input.max is
528a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        // updated. In this case, updateView() is called but we should not
529a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        // update the view value.
53076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        element().setInnerEditorValue(visibleValue());
531bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        element().updatePlaceholderVisibility(false);
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void TextFieldInputType::focusAndSelectSpinButtonOwner()
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
537d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLInputElement> input(element());
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    input->focus();
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    input->select();
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool TextFieldInputType::shouldSpinButtonRespondToMouseEvents()
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
544bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return !element().isDisabledOrReadOnly();
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool TextFieldInputType::shouldSpinButtonRespondToWheelEvents()
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
549bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return shouldSpinButtonRespondToMouseEvents() && element().focused();
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid TextFieldInputType::spinButtonDidReleaseMouseCapture(SpinButtonElement::EventDispatch eventDispatch)
553a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch{
55410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (eventDispatch == SpinButtonElement::EventDispatchAllowed)
55510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        element().dispatchFormControlChangeEvent();
556a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
557a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
558c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
559