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