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/NumberInputType.h" 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h" 365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h" 375d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/InputTypeNames.h" 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h" 3906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/KeyboardEvent.h" 4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h" 4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/HTMLParserIdioms.h" 4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTextControl.h" 431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/PlatformLocale.h" 44591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/MathExtras.h" 45591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/PassOwnPtr.h" 4651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include <limits> 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 48c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)using blink::WebLocalizedString; 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const int numberDefaultStep = 1; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const int numberDefaultStepBase = 0; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const int numberStepScaleFactor = 1; 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)struct RealNumberRenderSize { 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned sizeBeforeDecimalPoint; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned sizeAfteDecimalPoint; 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RealNumberRenderSize(unsigned before, unsigned after) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : sizeBeforeDecimalPoint(before) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , sizeAfteDecimalPoint(after) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RealNumberRenderSize max(const RealNumberRenderSize& other) const 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return RealNumberRenderSize( 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) std::max(sizeBeforeDecimalPoint, other.sizeBeforeDecimalPoint), 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) std::max(sizeAfteDecimalPoint, other.sizeAfteDecimalPoint)); 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static RealNumberRenderSize calculateRenderSize(const Decimal& value) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(value.isFinite()); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const unsigned sizeOfDigits = String::number(value.value().coefficient()).length(); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const unsigned sizeOfSign = value.isNegative() ? 1 : 0; 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const int exponent = value.exponent(); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (exponent >= 0) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return RealNumberRenderSize(sizeOfSign + sizeOfDigits, 0); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const int sizeBeforeDecimalPoint = exponent + sizeOfDigits; 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (sizeBeforeDecimalPoint > 0) { 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In case of "123.456" 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return RealNumberRenderSize(sizeOfSign + sizeBeforeDecimalPoint, sizeOfDigits - sizeBeforeDecimalPoint); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // In case of "0.00012345" 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const unsigned sizeOfZero = 1; 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const unsigned numberOfZeroAfterDecimalPoint = -sizeBeforeDecimalPoint; 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return RealNumberRenderSize(sizeOfSign + sizeOfZero , numberOfZeroAfterDecimalPoint + sizeOfDigits); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 96323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)PassRefPtrWillBeRawPtr<InputType> NumberInputType::create(HTMLInputElement& element) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 98323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) return adoptRefWillBeNoop(new NumberInputType(element)); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 101e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)void NumberInputType::countUsage() 102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 103f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) countUsageIfVisible(UseCounter::InputTypeNumber); 104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& NumberInputType::formControlType() const 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 10851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return InputTypeNames::number; 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void NumberInputType::setValue(const String& sanitizedValue, bool valueChanged, TextFieldEventBehavior eventBehavior) 112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 11376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) if (!valueChanged && sanitizedValue.isEmpty() && !element().innerEditorValue().isEmpty()) 114d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) element().updateView(); 115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) TextFieldInputType::setValue(sanitizedValue, valueChanged, eventBehavior); 116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double NumberInputType::valueAsDouble() const 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 120bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return parseToDoubleForNumberType(element().value()); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void NumberInputType::setValueAsDouble(double newValue, TextFieldEventBehavior eventBehavior, ExceptionState& exceptionState) const 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 125bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) element().setValue(serializeForNumberType(newValue), eventBehavior); 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 12851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void NumberInputType::setValueAsDecimal(const Decimal& newValue, TextFieldEventBehavior eventBehavior, ExceptionState& exceptionState) const 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 130bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) element().setValue(serializeForNumberType(newValue), eventBehavior); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool NumberInputType::typeMismatchFor(const String& value) const 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return !value.isEmpty() && !std::isfinite(parseToDoubleForNumberType(value)); 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool NumberInputType::typeMismatch() const 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 140bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) ASSERT(!typeMismatchFor(element().value())); 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)StepRange NumberInputType::createStepRange(AnyStepHandling anyStepHandling) const 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DEFINE_STATIC_LOCAL(const StepRange::StepDescription, stepDescription, (numberDefaultStep, numberDefaultStepBase, numberStepScaleFactor)); 1475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) const Decimal doubleMax = Decimal::fromDouble(std::numeric_limits<double>::max()); 148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return InputType::createStepRange(anyStepHandling, numberDefaultStepBase, -doubleMax, doubleMax, stepDescription); 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool NumberInputType::sizeShouldIncludeDecoration(int defaultSize, int& preferredSize) const 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) preferredSize = defaultSize; 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 155bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) const String stepString = element().fastGetAttribute(stepAttr); 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (equalIgnoringCase(stepString, "any")) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 159bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) const Decimal minimum = parseToDecimalForNumberType(element().fastGetAttribute(minAttr)); 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!minimum.isFinite()) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 163bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) const Decimal maximum = parseToDecimalForNumberType(element().fastGetAttribute(maxAttr)); 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!maximum.isFinite()) 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Decimal step = parseToDecimalForNumberType(stepString, 1); 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(step.isFinite()); 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RealNumberRenderSize size = calculateRenderSize(minimum).max(calculateRenderSize(maximum).max(calculateRenderSize(step))); 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) preferredSize = size.sizeBeforeDecimalPoint + size.sizeAfteDecimalPoint + (size.sizeAfteDecimalPoint ? 1 : 0); 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool NumberInputType::isSteppable() const 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NumberInputType::handleKeydownEvent(KeyboardEvent* event) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) handleKeydownEventForSpinButton(event); 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!event->defaultHandled()) 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) TextFieldInputType::handleKeydownEvent(event); 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Decimal NumberInputType::parseToNumber(const String& src, const Decimal& defaultValue) const 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return parseToDecimalForNumberType(src, defaultValue); 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String NumberInputType::serialize(const Decimal& value) const 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!value.isFinite()) 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return String(); 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return serializeForNumberType(value); 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool isE(UChar ch) 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ch == 'e' || ch == 'E'; 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String NumberInputType::localizeValue(const String& proposedValue) const 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (proposedValue.isEmpty()) 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return proposedValue; 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We don't localize scientific notations. 21106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (proposedValue.find(isE) != kNotFound) 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return proposedValue; 213bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return element().locale().convertToLocalizedNumber(proposedValue); 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String NumberInputType::visibleValue() const 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 218bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return localizeValue(element().value()); 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String NumberInputType::convertFromVisibleValue(const String& visibleValue) const 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (visibleValue.isEmpty()) 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return visibleValue; 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We don't localize scientific notations. 22606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) if (visibleValue.find(isE) != kNotFound) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return visibleValue; 228bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return element().locale().convertFromLocalizedNumber(visibleValue); 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String NumberInputType::sanitizeValue(const String& proposedValue) const 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (proposedValue.isEmpty()) 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return proposedValue; 235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return std::isfinite(parseToDoubleForNumberType(proposedValue)) ? proposedValue : emptyString(); 236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool NumberInputType::hasBadInput() const 239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 24076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) String standardValue = convertFromVisibleValue(element().innerEditorValue()); 241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return !standardValue.isEmpty() && !std::isfinite(parseToDoubleForNumberType(standardValue)); 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)String NumberInputType::badInputText() const 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 24606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) return locale().queryString(WebLocalizedString::ValidationBadInputForNumber); 24706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)} 24806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 24906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)String NumberInputType::rangeOverflowText(const Decimal& maximum) const 25006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles){ 25106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) return locale().queryString(WebLocalizedString::ValidationRangeOverflow, localizeValue(serialize(maximum))); 25206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)} 25306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) 25406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)String NumberInputType::rangeUnderflowText(const Decimal& minimum) const 25506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles){ 25606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) return locale().queryString(WebLocalizedString::ValidationRangeUnderflow, localizeValue(serialize(minimum))); 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool NumberInputType::shouldRespectSpeechAttribute() 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool NumberInputType::supportsPlaceholder() const 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NumberInputType::minOrMaxAttributeChanged() 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InputType::minOrMaxAttributeChanged(); 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 273bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (element().renderer()) 2745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) element().renderer()->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void NumberInputType::stepAttributeChanged() 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InputType::stepAttributeChanged(); 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 281bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (element().renderer()) 2825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) element().renderer()->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool NumberInputType::supportsSelectionAPI() const 28609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 28709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) return false; 28809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 28909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 290c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 291