Changeset 126126 in webkit
- Timestamp:
- Aug 20, 2012 8:04:46 PM (12 years ago)
- Location:
- trunk/Source
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r126123 r126126 1 2012-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 1 25 2012-08-20 Kentaro Hara <haraken@chromium.org> 2 26 -
trunk/Source/WebCore/platform/text/LocaleWin.cpp
r125837 r126126 279 279 // -------------------------------- Parsing 280 280 281 bool 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 281 289 // Returns -1 if parsing fails. 282 static intparseNumber(const String& input, unsigned& index)290 int LocaleWin::parseNumber(const String& input, unsigned& index) 283 291 { 284 292 unsigned digitsStart = index; 285 293 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])) 286 302 index++; 287 303 if (digitsStart == index) 288 304 return -1; 289 305 bool ok = false; 290 int number = input.substring(digitsStart, index - digitsStart).toInt(&ok);306 int number = convertFromLocalizedNumber(input.substring(digitsStart, index - digitsStart)).toInt(&ok); 291 307 return ok ? number : -1; 292 308 } … … 404 420 // -------------------------------- Formatting 405 421 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 { 422 inline void LocaleWin::appendNumber(int value, StringBuilder& buffer) 423 { 424 buffer.append(convertToLocalizedNumber(String::number(value))); 425 } 426 427 void 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 441 void LocaleWin::appendFourDigitsNumber(int value, StringBuilder& buffer) 442 { 443 String numberString = String::number(value); 420 444 if (value < 0) { 421 buffer.append( String::number(value));445 buffer.append(convertToLocalizedNumber(numberString)); 422 446 return; 423 447 } 448 StringBuilder numberBuffer; 449 numberBuffer.reserveCapacity(3 + numberString.length()); 424 450 if (value < 10) 425 buffer.append("000");451 numberBuffer.append("000"); 426 452 else if (value < 100) 427 buffer.append("00");453 numberBuffer.append("00"); 428 454 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())); 431 458 } 432 459 -
trunk/Source/WebCore/platform/text/LocaleWin.h
r124735 r126126 75 75 void ensureMonthLabels(); 76 76 void ensureShortDateTokens(); 77 bool isLocalizedDigit(UChar); 78 int parseNumber(const String&, unsigned& index); 77 79 int parseNumberOrMonth(const String&, unsigned& index); 78 80 double parseDate(const Vector<DateFormatToken>&, int baseYear, const String&); 81 void appendNumber(int, StringBuilder&); 82 void appendTwoDigitsNumber(int, StringBuilder&); 83 void appendFourDigitsNumber(int, StringBuilder&); 79 84 String formatDate(const Vector<DateFormatToken>&, int baseYear, int year, int month, int day); 80 85 #if ENABLE(CALENDAR_PICKER) -
trunk/Source/WebKit/chromium/ChangeLog
r126121 r126126 1 2012-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 1 12 2012-08-20 Kent Tamura <tkent@chromium.org> 2 13 -
trunk/Source/WebKit/chromium/tests/LocaleWinTest.cpp
r124735 r126126 212 212 EXPECT_STREQ("Jan-1-0001", locale->formatDate("MMM-d-yyyy", 2012, 1, January, 1).utf8().data()); 213 213 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()); 215 218 216 219 // For the following test, we'd like to confirm they don't crash and their … … 256 259 EXPECT_TRUE(isnan(locale->parseDate("MMMM/d/y", 2012, "November 32 2"))); 257 260 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"))); 258 265 } 259 266
Note: See TracChangeset
for help on using the changeset viewer.