Changeset 126126 in webkit


Ignore:
Timestamp:
Aug 20, 2012 8:04:46 PM (12 years ago)
Author:
tkent@chromium.org
Message:

[Chromium-win] Use native digits in parsing/formatting dates in the textfield part of input[type=date]
https://bugs.webkit.org/show_bug.cgi?id=94281

Reviewed by Hajime Morita.

Source/WebCore:

Tests: Add some cases to Source/WebKit/chromium/tests/LocaleWinTest.cpp

  • platform/text/LocaleWin.cpp:

(WebCore::LocaleWin::isLocalizedDigit): A helper for parseNumber(). This
return true if the specified character is one of native digits.
(WebCore::LocaleWin::parseNumber):
Try to parse ASCII digits, then try to parse native digtis. This
becomes a member of LocaleWin because it uses
convertFromLocalizedNumber().
(WebCore::LocaleWin::appendNumber): Apply convertToLocalizedNumber().
(WebCore::LocaleWin::appendTwoDigitsNumber): ditto.
(WebCore::LocaleWin::appendFourDigitsNumber): ditto.

  • platform/text/LocaleWin.h:

(LocaleWin):

  • Make some static functions member functions of LocaleWin.
  • Add isLocalizedDigit().

Source/WebKit/chromium:

  • tests/LocaleWinTest.cpp:

(TEST_F): Added formatting and parsing tests for Persian locale to check
native digit behavior.

Location:
trunk/Source
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r126123 r126126  
     12012-08-20  Kent Tamura  <tkent@chromium.org>
     2
     3        [Chromium-win] Use native digits in parsing/formatting dates in the textfield part of input[type=date]
     4        https://bugs.webkit.org/show_bug.cgi?id=94281
     5
     6        Reviewed by Hajime Morita.
     7
     8        Tests: Add some cases to Source/WebKit/chromium/tests/LocaleWinTest.cpp
     9
     10        * platform/text/LocaleWin.cpp:
     11        (WebCore::LocaleWin::isLocalizedDigit): A helper for parseNumber(). This
     12        return true if the specified character is one of native digits.
     13        (WebCore::LocaleWin::parseNumber):
     14        Try to parse ASCII digits, then try to parse native digtis. This
     15        becomes a member of LocaleWin because it uses
     16        convertFromLocalizedNumber().
     17        (WebCore::LocaleWin::appendNumber): Apply convertToLocalizedNumber().
     18        (WebCore::LocaleWin::appendTwoDigitsNumber): ditto.
     19        (WebCore::LocaleWin::appendFourDigitsNumber): ditto.
     20        * platform/text/LocaleWin.h:
     21        (LocaleWin):
     22        - Make some static functions member functions of LocaleWin.
     23        - Add isLocalizedDigit().
     24
    1252012-08-20  Kentaro Hara  <haraken@chromium.org>
    226
  • trunk/Source/WebCore/platform/text/LocaleWin.cpp

    r125837 r126126  
    279279// -------------------------------- Parsing
    280280
     281bool LocaleWin::isLocalizedDigit(UChar ch)
     282{
     283    String normalizedDigit = convertFromLocalizedNumber(String(&ch, 1));
     284    if (normalizedDigit.length() != 1)
     285        return false;
     286    return isASCIIDigit(normalizedDigit[0]);
     287}
     288
    281289// Returns -1 if parsing fails.
    282 static int parseNumber(const String& input, unsigned& index)
     290int LocaleWin::parseNumber(const String& input, unsigned& index)
    283291{
    284292    unsigned digitsStart = index;
    285293    while (index < input.length() && isASCIIDigit(input[index]))
     294        index++;
     295    if (digitsStart != index) {
     296        bool ok = false;
     297        int number = input.substring(digitsStart, index - digitsStart).toInt(&ok);
     298        return ok ? number : -1;
     299    }
     300
     301    while (index < input.length() && isLocalizedDigit(input[index]))
    286302        index++;
    287303    if (digitsStart == index)
    288304        return -1;
    289305    bool ok = false;
    290     int number = input.substring(digitsStart, index - digitsStart).toInt(&ok);
     306    int number = convertFromLocalizedNumber(input.substring(digitsStart, index - digitsStart)).toInt(&ok);
    291307    return ok ? number : -1;
    292308}
     
    404420// -------------------------------- Formatting
    405421
    406 static inline void appendNumber(int value, StringBuilder& buffer)
    407 {
    408     buffer.append(String::number(value));
    409 }
    410 
    411 static void appendTwoDigitsNumber(int value, StringBuilder& buffer)
    412 {
    413     if (value >= 0 && value < 10)
    414         buffer.append("0");
    415     buffer.append(String::number(value));
    416 }
    417 
    418 static void appendFourDigitsNumber(int value, StringBuilder& buffer)
    419 {
     422inline void LocaleWin::appendNumber(int value, StringBuilder& buffer)
     423{
     424    buffer.append(convertToLocalizedNumber(String::number(value)));
     425}
     426
     427void LocaleWin::appendTwoDigitsNumber(int value, StringBuilder& buffer)
     428{
     429    String numberString = String::number(value);
     430    if (value < 0 || value >= 10) {
     431        buffer.append(convertToLocalizedNumber(numberString));
     432        return;
     433    }
     434    StringBuilder numberBuffer;
     435    numberBuffer.reserveCapacity(1 + numberString.length());
     436    numberBuffer.append("0");
     437    numberBuffer.append(numberString);
     438    buffer.append(convertToLocalizedNumber(numberBuffer.toString()));
     439}
     440
     441void LocaleWin::appendFourDigitsNumber(int value, StringBuilder& buffer)
     442{
     443    String numberString = String::number(value);
    420444    if (value < 0) {
    421         buffer.append(String::number(value));
     445        buffer.append(convertToLocalizedNumber(numberString));
    422446        return;
    423447    }
     448    StringBuilder numberBuffer;
     449    numberBuffer.reserveCapacity(3 + numberString.length());
    424450    if (value < 10)
    425         buffer.append("000");
     451        numberBuffer.append("000");
    426452    else if (value < 100)
    427         buffer.append("00");
     453        numberBuffer.append("00");
    428454    else if (value < 1000)
    429         buffer.append("0");
    430     buffer.append(String::number(value));
     455        numberBuffer.append("0");
     456    numberBuffer.append(numberString);
     457    buffer.append(convertToLocalizedNumber(numberBuffer.toString()));
    431458}
    432459
  • trunk/Source/WebCore/platform/text/LocaleWin.h

    r124735 r126126  
    7575    void ensureMonthLabels();
    7676    void ensureShortDateTokens();
     77    bool isLocalizedDigit(UChar);
     78    int parseNumber(const String&, unsigned& index);
    7779    int parseNumberOrMonth(const String&, unsigned& index);
    7880    double parseDate(const Vector<DateFormatToken>&, int baseYear, const String&);
     81    void appendNumber(int, StringBuilder&);
     82    void appendTwoDigitsNumber(int, StringBuilder&);
     83    void appendFourDigitsNumber(int, StringBuilder&);
    7984    String formatDate(const Vector<DateFormatToken>&, int baseYear, int year, int month, int day);
    8085#if ENABLE(CALENDAR_PICKER)
  • trunk/Source/WebKit/chromium/ChangeLog

    r126121 r126126  
     12012-08-20  Kent Tamura  <tkent@chromium.org>
     2
     3        [Chromium-win] Use native digits in parsing/formatting dates in the textfield part of input[type=date]
     4        https://bugs.webkit.org/show_bug.cgi?id=94281
     5
     6        Reviewed by Hajime Morita.
     7
     8        * tests/LocaleWinTest.cpp:
     9        (TEST_F): Added formatting and parsing tests for Persian locale to check
     10        native digit behavior.
     11
    1122012-08-20  Kent Tamura  <tkent@chromium.org>
    213
  • trunk/Source/WebKit/chromium/tests/LocaleWinTest.cpp

    r124735 r126126  
    212212    EXPECT_STREQ("Jan-1-0001", locale->formatDate("MMM-d-yyyy", 2012, 1, January, 1).utf8().data());
    213213    EXPECT_STREQ("Sep-13-275760", locale->formatDate("MMM-d-yyyy", 2012, 275760, September, 13).utf8().data());
    214    
     214
     215    OwnPtr<LocaleWin> persian = LocaleWin::create(Persian);
     216    // U+06F0 U+06F1 / U+06F0 U+06F8 / U+06F0 U+06F0 U+06F0 U+06F2
     217    EXPECT_STREQ("\xDB\xB0\xDB\xB1/\xDB\xB0\xDB\xB8/\xDB\xB0\xDB\xB0\xDB\xB0\xDB\xB1", persian->formatDate("dd/MM/yyyy", 2012, 1, August, 1).utf8().data());
    215218
    216219    // For the following test, we'd like to confirm they don't crash and their
     
    256259    EXPECT_TRUE(isnan(locale->parseDate("MMMM/d/y", 2012, "November 32 2")));
    257260    EXPECT_TRUE(isnan(locale->parseDate("MMMM/d/y", 2012, "-1/-1/-1")));
     261
     262    OwnPtr<LocaleWin> persian = LocaleWin::create(Persian);
     263    // U+06F1 U+06F6 / U+06F0 U+06F8 / 2012
     264    EXPECT_EQ(msForDate(2012, August, 16), persian->parseDate("dd/MM/yyyy", 2012, String::fromUTF8("\xDB\xB1\xDB\xB6/\xDB\xB0\xDB\xB8/2012")));
    258265}
    259266
Note: See TracChangeset for help on using the changeset viewer.