| Index: Source/WebCore/html/shadow/DateTimeNumericFieldElement.cpp
|
| ===================================================================
|
| --- Source/WebCore/html/shadow/DateTimeNumericFieldElement.cpp (revision 139034)
|
| +++ Source/WebCore/html/shadow/DateTimeNumericFieldElement.cpp (working copy)
|
| @@ -107,7 +107,10 @@
|
|
|
| void DateTimeNumericFieldElement::didBlur()
|
| {
|
| - m_lastDigitCharTime = 0;
|
| + int value = typeAheadValue();
|
| + m_typeAheadBuffer.clear();
|
| + if (value >= 0)
|
| + setValueAsInteger(value, DispatchEvent);
|
| DateTimeFieldElement::didBlur();
|
| }
|
|
|
| @@ -130,23 +133,28 @@
|
| return;
|
|
|
| UChar charCode = static_cast<UChar>(keyboardEvent->charCode());
|
| - if (charCode < ' ')
|
| - return;
|
| -
|
| - DOMTimeStamp delta = keyboardEvent->timeStamp() - m_lastDigitCharTime;
|
| - m_lastDigitCharTime = 0;
|
| -
|
| String number = localeForOwner().convertFromLocalizedNumber(String(&charCode, 1));
|
| const int digit = number[0] - '0';
|
| if (digit < 0 || digit > 9)
|
| return;
|
|
|
| + DOMTimeStamp delta = keyboardEvent->timeStamp() - m_lastDigitCharTime;
|
| + m_lastDigitCharTime = keyboardEvent->timeStamp();
|
| +
|
| + if (delta > typeAheadTimeout)
|
| + m_typeAheadBuffer.clear();
|
| + m_typeAheadBuffer.append(number);
|
| +
|
| + int newValue = typeAheadValue();
|
| + if (m_range.isInRange(newValue))
|
| + setValueAsInteger(newValue, DispatchEvent);
|
| + else
|
| + updateVisibleValue(DispatchEvent);
|
| +
|
| + if (m_typeAheadBuffer.length() >= DateTimeNumericFieldElement::formatValue(m_range.maximum).length() || newValue * 10 > m_range.maximum)
|
| + focusOnNextField();
|
| +
|
| keyboardEvent->setDefaultHandled();
|
| - setValueAsInteger(m_hasValue && delta < typeAheadTimeout ? m_value * 10 + digit : digit, DispatchEvent);
|
| - if (m_value * 10 > m_range.maximum)
|
| - focusOnNextField();
|
| - else
|
| - m_lastDigitCharTime = keyboardEvent->timeStamp();
|
| }
|
|
|
| bool DateTimeNumericFieldElement::hasValue() const
|
| @@ -166,13 +174,12 @@
|
|
|
| void DateTimeNumericFieldElement::setEmptyValue(EventBehavior eventBehavior)
|
| {
|
| - m_lastDigitCharTime = 0;
|
| -
|
| if (isReadOnly())
|
| return;
|
|
|
| m_hasValue = false;
|
| m_value = 0;
|
| + m_typeAheadBuffer.clear();
|
| updateVisibleValue(eventBehavior);
|
| }
|
|
|
| @@ -181,7 +188,6 @@
|
| m_value = clampValueForHardLimits(value);
|
| m_hasValue = true;
|
| updateVisibleValue(eventBehavior);
|
| - m_lastDigitCharTime = 0;
|
| }
|
|
|
| void DateTimeNumericFieldElement::stepDown()
|
| @@ -189,6 +195,7 @@
|
| int newValue = roundDown(m_hasValue ? m_value - 1 : defaultValueForStepDown());
|
| if (!m_range.isInRange(newValue))
|
| newValue = roundDown(m_range.maximum);
|
| + m_typeAheadBuffer.clear();
|
| setValueAsInteger(newValue, DispatchEvent);
|
| }
|
|
|
| @@ -197,6 +204,7 @@
|
| int newValue = roundUp(m_hasValue ? m_value + 1 : defaultValueForStepUp());
|
| if (!m_range.isInRange(newValue))
|
| newValue = roundUp(m_range.minimum);
|
| + m_typeAheadBuffer.clear();
|
| setValueAsInteger(newValue, DispatchEvent);
|
| }
|
|
|
| @@ -210,8 +218,17 @@
|
| return m_hasValue ? m_value : -1;
|
| }
|
|
|
| +int DateTimeNumericFieldElement::typeAheadValue() const
|
| +{
|
| + if (m_typeAheadBuffer.length())
|
| + return m_typeAheadBuffer.toString().toInt();
|
| + return -1;
|
| +}
|
| +
|
| String DateTimeNumericFieldElement::visibleValue() const
|
| {
|
| + if (m_typeAheadBuffer.length())
|
| + return formatValue(typeAheadValue());
|
| return m_hasValue ? value() : m_placeholder;
|
| }
|
|
|
|
|