Changeset 129855 in webkit


Ignore:
Timestamp:
Sep 28, 2012 12:03:29 AM (12 years ago)
Author:
yosin@chromium.org
Message:

[Forms] Adding DateTimeMonthFieldElement and DateTimeYearFieldElement
https://bugs.webkit.org/show_bug.cgi?id=97864

Reviewed by Kent Tamura.

This patch is a part of preparation of implementing multiple fields
date/time input UI.

This patch introduces DateTimeMonthFieldElement and DateTimeYearFieldElement
classes for implementing multiple fields "month" input type.

Multiple fields "month" input type uses two fields for month and year
in locale dependent order. Month field display month as two digit.
Year field display year as four digits in usual case and can display
up to 6 digits to support maximum year 275760, defined in HTML5
specification.

This patch also changes default value for step down and up on empty
field to better UI in year field. Year field displays current year
when step down and up on empty field rather than minimum year 1, or
maximum year 275760.

Note: This patch affects ports which enable both ENABLE_INPUT_TYPE_TIME
and ENABLE_INPUT_MULTIPLE_FIELDS_UI.

No new tests. This patch doesn't change behavior.

  • html/shadow/DateTimeFieldElements.cpp:

(WebCore::DateTimeMonthFieldElement::DateTimeMonthFieldElement): Added.
(WebCore::DateTimeMonthFieldElement::create): Added.
(WebCore::DateTimeMonthFieldElement::populateDateTimeFieldsState): Added.
(WebCore::DateTimeMonthFieldElement::setValueAsDate): Added.
(WebCore::DateTimeMonthFieldElement::setValueAsDateTimeFieldsState): Added.
(WebCore::DateTimeYearFieldElement::DateTimeYearFieldElement): Added.
(WebCore::DateTimeYearFieldElement::create): Added.
(WebCore::DateTimeYearFieldElement::defaultValueForStepDown): Added.
(WebCore::DateTimeYearFieldElement::defaultValueForStepUp): Added.
(WebCore::DateTimeYearFieldElement::populateDateTimeFieldsState): Added.
(WebCore::DateTimeYearFieldElement::setValueAsDate): Added.
(WebCore::DateTimeYearFieldElement::setValueAsDateTimeFieldsState): Added.

  • html/shadow/DateTimeFieldElements.h:

(DateTimeMonthFieldElement): Added.
(DateTimeYearFieldElement): Added.

  • html/shadow/DateTimeNumericFieldElement.cpp:

(WebCore::DateTimeNumericFieldElement::Range::isInRange): Added for ease of checking value is in range.
(WebCore::DateTimeNumericFieldElement::defaultValueForStepDown): Added for default behavior.
(WebCore::DateTimeNumericFieldElement::defaultValueForStepUp): ditto.
(WebCore::DateTimeNumericFieldElement::stepDown): Changed to use defaultValueForStepDown instead of maximum field value.
(WebCore::DateTimeNumericFieldElement::stepUp): Changed to use defaultValueForStepUp minium field value.
(WebCore::DateTimeNumericFieldElement::value): Changed to use "%04d" when maximum field value is greater than 999 for year field.

  • html/shadow/DateTimeNumericFieldElement.h:

(DateTimeNumericFieldElement): Changed to add declarations of defaultValueForStepDown() and defaultValueForStepUp().

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r129854 r129855  
     12012-09-28  Yoshifumi Inoue  <yosin@chromium.org>
     2
     3        [Forms] Adding DateTimeMonthFieldElement and DateTimeYearFieldElement
     4        https://bugs.webkit.org/show_bug.cgi?id=97864
     5
     6        Reviewed by Kent Tamura.
     7
     8        This patch is a part of preparation of implementing multiple fields
     9        date/time input UI.
     10
     11        This patch introduces DateTimeMonthFieldElement and DateTimeYearFieldElement
     12        classes for implementing multiple fields "month" input type.
     13
     14        Multiple fields "month" input type uses two fields for month and year
     15        in locale dependent order. Month field display month as two digit.
     16        Year field display year as four digits in usual case and can display
     17        up to 6 digits to support maximum year 275760, defined in HTML5
     18        specification.
     19
     20        This patch also changes default value for step down and up on empty
     21        field to better UI in year field. Year field displays current year
     22        when step down and up on empty field rather than minimum year 1, or
     23        maximum year 275760.
     24
     25        Note: This patch affects ports which enable both ENABLE_INPUT_TYPE_TIME
     26        and ENABLE_INPUT_MULTIPLE_FIELDS_UI.
     27
     28        No new tests. This patch doesn't change behavior.
     29
     30        * html/shadow/DateTimeFieldElements.cpp:
     31        (WebCore::DateTimeMonthFieldElement::DateTimeMonthFieldElement): Added.
     32        (WebCore::DateTimeMonthFieldElement::create): Added.
     33        (WebCore::DateTimeMonthFieldElement::populateDateTimeFieldsState): Added.
     34        (WebCore::DateTimeMonthFieldElement::setValueAsDate): Added.
     35        (WebCore::DateTimeMonthFieldElement::setValueAsDateTimeFieldsState): Added.
     36        (WebCore::DateTimeYearFieldElement::DateTimeYearFieldElement): Added.
     37        (WebCore::DateTimeYearFieldElement::create): Added.
     38        (WebCore::DateTimeYearFieldElement::defaultValueForStepDown): Added.
     39        (WebCore::DateTimeYearFieldElement::defaultValueForStepUp): Added.
     40        (WebCore::DateTimeYearFieldElement::populateDateTimeFieldsState): Added.
     41        (WebCore::DateTimeYearFieldElement::setValueAsDate): Added.
     42        (WebCore::DateTimeYearFieldElement::setValueAsDateTimeFieldsState): Added.
     43        * html/shadow/DateTimeFieldElements.h:
     44        (DateTimeMonthFieldElement): Added.
     45        (DateTimeYearFieldElement): Added.
     46        * html/shadow/DateTimeNumericFieldElement.cpp:
     47        (WebCore::DateTimeNumericFieldElement::Range::isInRange): Added for ease of checking value is in range.
     48        (WebCore::DateTimeNumericFieldElement::defaultValueForStepDown): Added for default behavior.
     49        (WebCore::DateTimeNumericFieldElement::defaultValueForStepUp): ditto.
     50        (WebCore::DateTimeNumericFieldElement::stepDown): Changed to use defaultValueForStepDown instead of maximum field value.
     51        (WebCore::DateTimeNumericFieldElement::stepUp):  Changed to use defaultValueForStepUp minium field value.
     52        (WebCore::DateTimeNumericFieldElement::value): Changed to use "%04d" when maximum field value is greater than 999 for year field.
     53        * html/shadow/DateTimeNumericFieldElement.h:
     54        (DateTimeNumericFieldElement): Changed to add declarations of defaultValueForStepDown() and defaultValueForStepUp().
     55
    1562012-09-27  Yoshifumi Inoue  <yosin@chromium.org>
    257
  • trunk/Source/WebCore/html/shadow/DateTimeFieldElements.cpp

    r129854 r129855  
    3131#include "DateTimeFieldsState.h"
    3232#include "LocalizedStrings.h"
     33#include <wtf/CurrentTime.h>
     34#include <wtf/DateMath.h>
    3335
    3436namespace WebCore {
     
    257259// ----------------------------
    258260
     261DateTimeMonthFieldElement::DateTimeMonthFieldElement(Document* document, FieldOwner& fieldOwner, const String& placeholder)
     262    : DateTimeNumericFieldElement(document, fieldOwner, 1, 12, placeholder)
     263{
     264}
     265
     266PassRefPtr<DateTimeMonthFieldElement> DateTimeMonthFieldElement::create(Document* document, FieldOwner& fieldOwner, const String& placeholder)
     267{
     268    DEFINE_STATIC_LOCAL(AtomicString, monthPsuedoId, ("-webkit-datetime-edit-month-field"));
     269    RefPtr<DateTimeMonthFieldElement> field = adoptRef(new DateTimeMonthFieldElement(document, fieldOwner, placeholder));
     270    field->initialize(monthPsuedoId, AXMonthFieldText());
     271    return field.release();
     272}
     273
     274void DateTimeMonthFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState)
     275{
     276    dateTimeFieldsState.setMonth(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue);
     277}
     278
     279void DateTimeMonthFieldElement::setValueAsDate(const DateComponents& date)
     280{
     281    setValueAsInteger(date.month() + 1);
     282}
     283
     284void DateTimeMonthFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState, const DateComponents& dateForReadOnlyField)
     285{
     286    if (!dateTimeFieldsState.hasMonth()) {
     287        setEmptyValue(dateForReadOnlyField);
     288        return;
     289    }
     290
     291    const unsigned value = dateTimeFieldsState.month();
     292    if (range().isInRange(static_cast<int>(value))) {
     293        setValueAsInteger(value);
     294        return;
     295    }
     296
     297    setEmptyValue(dateForReadOnlyField);
     298}
     299
     300// ----------------------------
     301
    259302DateTimeSecondFieldElement::DateTimeSecondFieldElement(Document* document, FieldOwner& fieldOwner)
    260303    : DateTimeNumericFieldElement(document, fieldOwner, 0, 59, "--")
     
    296339}
    297340
     341// ----------------------------
     342
     343// HTML5 uses ISO-8601 format with year >= 1. Gregorian calendar started in
     344// 1582. However, we need to support 0001-01-01 in Gregorian calendar rule.
     345static const int minimumYear = 1;
     346// Date in ECMAScript can't represent dates later than 275760-09-13T00:00Z.
     347// So, we have the same upper limit in HTML5 dates.
     348static const int maximumYear = 275760;
     349
     350DateTimeYearFieldElement::DateTimeYearFieldElement(Document* document, FieldOwner& fieldOwner, const String& placeholder)
     351    : DateTimeNumericFieldElement(document, fieldOwner, minimumYear, maximumYear, placeholder)
     352{
     353}
     354
     355PassRefPtr<DateTimeYearFieldElement> DateTimeYearFieldElement::create(Document* document, FieldOwner& fieldOwner, const String& placeholder)
     356{
     357    DEFINE_STATIC_LOCAL(AtomicString, yearPsuedoId, ("-webkit-datetime-edit-year-field"));
     358    RefPtr<DateTimeYearFieldElement> field = adoptRef(new DateTimeYearFieldElement(document, fieldOwner, placeholder));
     359    field->initialize(yearPsuedoId, AXYearFieldText());
     360    return field.release();
     361}
     362
     363int DateTimeYearFieldElement::defaultValueForStepDown() const
     364{
     365    double current = currentTimeMS();
     366    double utcOffset = calculateUTCOffset();
     367    double dstOffset = calculateDSTOffset(current, utcOffset);
     368    int offset = static_cast<int>((utcOffset + dstOffset) / msPerMinute);
     369    current += offset * msPerMinute;
     370
     371    DateComponents date;
     372    date.setMillisecondsSinceEpochForMonth(current);
     373    return date.fullYear();
     374}
     375
     376int DateTimeYearFieldElement::defaultValueForStepUp() const
     377{
     378    return defaultValueForStepDown();
     379}
     380
     381void DateTimeYearFieldElement::populateDateTimeFieldsState(DateTimeFieldsState& dateTimeFieldsState)
     382{
     383    dateTimeFieldsState.setYear(hasValue() ? valueAsInteger() : DateTimeFieldsState::emptyValue);
     384}
     385
     386void DateTimeYearFieldElement::setValueAsDate(const DateComponents& date)
     387{
     388    setValueAsInteger(date.fullYear());
     389}
     390
     391void DateTimeYearFieldElement::setValueAsDateTimeFieldsState(const DateTimeFieldsState& dateTimeFieldsState, const DateComponents& dateForReadOnlyField)
     392{
     393    if (!dateTimeFieldsState.hasYear()) {
     394        setEmptyValue(dateForReadOnlyField);
     395        return;
     396    }
     397
     398    const unsigned value = dateTimeFieldsState.year();
     399    if (range().isInRange(static_cast<int>(value))) {
     400        setValueAsInteger(value);
     401        return;
     402    }
     403
     404    setEmptyValue(dateForReadOnlyField);
     405}
     406
    298407} // namespace WebCore
    299408
  • trunk/Source/WebCore/html/shadow/DateTimeFieldElements.h

    r129612 r129855  
    104104};
    105105
     106class DateTimeMonthFieldElement : public DateTimeNumericFieldElement {
     107    WTF_MAKE_NONCOPYABLE(DateTimeMonthFieldElement);
     108
     109public:
     110    static PassRefPtr<DateTimeMonthFieldElement> create(Document*, FieldOwner&, const String& placeholder);
     111
     112private:
     113    DateTimeMonthFieldElement(Document*, FieldOwner&, const String& placeholder);
     114
     115    // DateTimeFieldElement functions.
     116    virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
     117    virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL;
     118    virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&, const DateComponents& dateForReadOnlyField) OVERRIDE FINAL;
     119};
     120
    106121class DateTimeSecondFieldElement : public DateTimeNumericFieldElement {
    107122    WTF_MAKE_NONCOPYABLE(DateTimeSecondFieldElement);
     
    119134};
    120135
     136class DateTimeYearFieldElement : public DateTimeNumericFieldElement {
     137    WTF_MAKE_NONCOPYABLE(DateTimeYearFieldElement);
     138
     139public:
     140    static PassRefPtr<DateTimeYearFieldElement> create(Document*, FieldOwner&, const String& placeholder);
     141
     142private:
     143    DateTimeYearFieldElement(Document*, FieldOwner&, const String& placeholder);
     144
     145    // DateTimeFieldElement functions.
     146    virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
     147    virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL;
     148    virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&, const DateComponents& dateForReadOnlyField) OVERRIDE FINAL;
     149
     150    // DateTimeNumericFieldElement functions.
     151    virtual int defaultValueForStepDown() const OVERRIDE FINAL;
     152    virtual int defaultValueForStepUp() const OVERRIDE FINAL;
     153};
     154
    121155} // namespace WebCore
    122156
  • trunk/Source/WebCore/html/shadow/DateTimeNumericFieldElement.cpp

    r129854 r129855  
    4848}
    4949
     50bool DateTimeNumericFieldElement::Range::isInRange(int value) const
     51{
     52    return value >= minimum && value <= maximum;
     53}
     54
     55// ----------------------------
     56
    5057DateTimeNumericFieldElement::DateTimeNumericFieldElement(Document* document, FieldOwner& fieldOwner, int minimum, int maximum, const String& placeholder)
    5158    : DateTimeFieldElement(document, fieldOwner)
     
    5663    , m_hasValue(false)
    5764{
     65}
     66
     67int DateTimeNumericFieldElement::defaultValueForStepDown() const
     68{
     69    return m_range.maximum;
     70}
     71
     72int DateTimeNumericFieldElement::defaultValueForStepUp() const
     73{
     74    return m_range.minimum;
    5875}
    5976
     
    139156        setValueAsInteger(m_value == m_range.minimum ? m_range.maximum : clampValue(m_value - 1), DispatchEvent);
    140157    else
    141         setValueAsInteger(m_range.maximum, DispatchEvent);
     158        setValueAsInteger(defaultValueForStepDown(), DispatchEvent);
    142159}
    143160
     
    147164        setValueAsInteger(m_value == m_range.maximum ? m_range.minimum : clampValue(m_value + 1), DispatchEvent);
    148165    else
    149         setValueAsInteger(m_range.minimum, DispatchEvent);
     166        setValueAsInteger(defaultValueForStepUp(), DispatchEvent);
    150167}
    151168
     
    157174    Localizer& localizer = this->localizer();
    158175    if (m_range.maximum > 999)
    159         return localizer.convertToLocalizedNumber(String::number(m_value));
     176        return localizer.convertToLocalizedNumber(String::format("%04d", m_value));
    160177
    161178    if (m_range.maximum > 99)
  • trunk/Source/WebCore/html/shadow/DateTimeNumericFieldElement.h

    r129854 r129855  
    4646        Range(int minimum, int maximum);
    4747        int clampValue(int) const;
     48        bool isInRange(int) const;
    4849
    4950        int maximum;
     
    5455
    5556    int clampValue(int value) const { return m_range.clampValue(value); }
     57    virtual int defaultValueForStepDown() const;
     58    virtual int defaultValueForStepUp() const;
    5659    const Range& range() const { return m_range; }
    5760
Note: See TracChangeset for help on using the changeset viewer.