Changeset 234260 in webkit
- Timestamp:
- Jul 26, 2018 9:01:04 AM (6 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 2 deleted
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r234257 r234260 1 2018-07-26 Andy VanWagoner <andy@vanwagoner.family> 2 3 JSC: Intl API should ignore encoding when parsing BCP 47 language tag from ISO 15897 locale string (passed via LANG) 4 https://bugs.webkit.org/show_bug.cgi?id=167991 5 6 Reviewed by Michael Catanzaro. 7 8 Replaced expecting throwing a runtime error to avoid a crash, with testing for good default locale fallback behavior. 9 10 * js/intl-default-locale-expected.txt: Added. 11 * js/intl-default-locale.html: Added. 12 * js/intl-invalid-locale-crash-expected.txt: Removed. 13 * js/intl-invalid-locale-crash.html: Removed. 14 * platform/win/TestExpectations: 15 1 16 2018-07-26 Miguel Gomez <magomez@igalia.com> 2 17 -
trunk/LayoutTests/platform/win/TestExpectations
r234149 r234260 2482 2482 js/intl-collator.html [ Skip ] 2483 2483 js/intl-datetimeformat.html [ Skip ] 2484 js/intl-default-locale.html [ Skip ] 2484 2485 js/intl-numberformat.html [ Skip ] 2485 2486 js/intl-numberformat-format-to-parts.html [ Skip ] … … 3348 3349 js/dom/string-prototype-properties.html [ Failure ] 3349 3350 js/dom/webidl-type-mapping.html [ Failure ] 3350 js/intl-invalid-locale-crash.html [ Failure ]3351 3351 js/regress-141098.html [ Failure ] 3352 3352 pageoverlay/overlay-installation.html [ Failure ] -
trunk/Source/JavaScriptCore/ChangeLog
r234252 r234260 1 2018-07-26 Andy VanWagoner <andy@vanwagoner.family> 2 3 JSC: Intl API should ignore encoding when parsing BCP 47 language tag from ISO 15897 locale string (passed via LANG) 4 https://bugs.webkit.org/show_bug.cgi?id=167991 5 6 Reviewed by Michael Catanzaro. 7 8 Improved the conversion of ICU locales to BCP47 tags, using their preferred method. 9 Checked locale.isEmpty() before returning it from defaultLocale, so there should be 10 no more cases where you might have an invalid locale come back from resolveLocale. 11 12 * runtime/IntlObject.cpp: 13 (JSC::convertICULocaleToBCP47LanguageTag): 14 (JSC::defaultLocale): 15 (JSC::lookupMatcher): 16 * runtime/IntlObject.h: 17 * runtime/JSGlobalObject.cpp: 18 (JSC::JSGlobalObject::intlCollatorAvailableLocales): 19 (JSC::JSGlobalObject::intlDateTimeFormatAvailableLocales): 20 (JSC::JSGlobalObject::intlNumberFormatAvailableLocales): 21 (JSC::JSGlobalObject::intlPluralRulesAvailableLocales): 22 1 23 2018-07-26 Fujii Hironori <Hironori.Fujii@sony.com> 2 24 -
trunk/Source/JavaScriptCore/runtime/IntlObject.cpp
r234160 r234260 131 131 } 132 132 133 void convertICULocaleToBCP47LanguageTag(String& locale) 134 { 135 locale.replace('_', '-'); 133 String convertICULocaleToBCP47LanguageTag(const char* localeID) 134 { 135 UErrorCode status = U_ZERO_ERROR; 136 Vector<char, 32> buffer(32); 137 auto length = uloc_toLanguageTag(localeID, buffer.data(), buffer.size(), false, &status); 138 if (status == U_BUFFER_OVERFLOW_ERROR) { 139 buffer.grow(length); 140 status = U_ZERO_ERROR; 141 uloc_toLanguageTag(localeID, buffer.data(), buffer.size(), false, &status); 142 } 143 if (!U_FAILURE(status)) 144 return String(buffer.data(), length); 145 return String(); 136 146 } 137 147 … … 591 601 VM& vm = state.vm(); 592 602 if (auto defaultLanguage = state.jsCallee()->globalObject(vm)->globalObjectMethodTable()->defaultLanguage) { 593 String locale = defaultLanguage();603 String locale = canonicalizeLanguageTag(defaultLanguage()); 594 604 if (!locale.isEmpty()) 595 return canonicalizeLanguageTag(locale);605 return locale; 596 606 } 597 607 598 608 Vector<String> languages = userPreferredLanguages(); 599 if (!languages.isEmpty() && !languages[0].isEmpty()) 600 return canonicalizeLanguageTag(languages[0]); 609 for (const auto& language : languages) { 610 String locale = canonicalizeLanguageTag(language); 611 if (!locale.isEmpty()) 612 return locale; 613 } 601 614 602 615 // If all else fails, ask ICU. It will probably say something bogus like en_us even if the user 603 616 // has configured some other language, but being wrong is better than crashing. 604 String locale = uloc_getDefault(); 605 convertICULocaleToBCP47LanguageTag(locale); 606 return locale; 617 String locale = convertICULocaleToBCP47LanguageTag(uloc_getDefault()); 618 if (!locale.isEmpty()) 619 return locale; 620 621 return "en"_s; 607 622 } 608 623 … … 647 662 648 663 MatcherResult result; 649 if (!availableLocale.is Null()) {664 if (!availableLocale.isEmpty()) { 650 665 result.locale = availableLocale; 651 666 if (locale != noExtensionsLocale) { -
trunk/Source/JavaScriptCore/runtime/IntlObject.h
r234127 r234260 60 60 61 61 String defaultLocale(ExecState&); 62 void convertICULocaleToBCP47LanguageTag(String& locale);62 String convertICULocaleToBCP47LanguageTag(const char* localeID); 63 63 bool intlBooleanOption(ExecState&, JSValue options, PropertyName, bool& usesFallback); 64 64 String intlStringOption(ExecState&, JSValue options, PropertyName, std::initializer_list<const char*> values, const char* notFound, const char* fallback); -
trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp
r234127 r234260 1583 1583 int32_t count = ucol_countAvailable(); 1584 1584 for (int32_t i = 0; i < count; ++i) { 1585 String locale (ucol_getAvailable(i));1586 convertICULocaleToBCP47LanguageTag(locale);1587 m_intlCollatorAvailableLocales.add(locale);1585 String locale = convertICULocaleToBCP47LanguageTag(ucol_getAvailable(i)); 1586 if (!locale.isEmpty()) 1587 m_intlCollatorAvailableLocales.add(locale); 1588 1588 } 1589 1589 addMissingScriptLocales(m_intlCollatorAvailableLocales); … … 1597 1597 int32_t count = udat_countAvailable(); 1598 1598 for (int32_t i = 0; i < count; ++i) { 1599 String locale (udat_getAvailable(i));1600 convertICULocaleToBCP47LanguageTag(locale);1601 m_intlDateTimeFormatAvailableLocales.add(locale);1599 String locale = convertICULocaleToBCP47LanguageTag(udat_getAvailable(i)); 1600 if (!locale.isEmpty()) 1601 m_intlDateTimeFormatAvailableLocales.add(locale); 1602 1602 } 1603 1603 addMissingScriptLocales(m_intlDateTimeFormatAvailableLocales); … … 1611 1611 int32_t count = unum_countAvailable(); 1612 1612 for (int32_t i = 0; i < count; ++i) { 1613 String locale (unum_getAvailable(i));1614 convertICULocaleToBCP47LanguageTag(locale);1615 m_intlNumberFormatAvailableLocales.add(locale);1613 String locale = convertICULocaleToBCP47LanguageTag(unum_getAvailable(i)); 1614 if (!locale.isEmpty()) 1615 m_intlNumberFormatAvailableLocales.add(locale); 1616 1616 } 1617 1617 addMissingScriptLocales(m_intlNumberFormatAvailableLocales); … … 1625 1625 int32_t count = uloc_countAvailable(); 1626 1626 for (int32_t i = 0; i < count; ++i) { 1627 String locale (uloc_getAvailable(i));1628 convertICULocaleToBCP47LanguageTag(locale);1629 m_intlPluralRulesAvailableLocales.add(locale);1627 String locale = convertICULocaleToBCP47LanguageTag(uloc_getAvailable(i)); 1628 if (!locale.isEmpty()) 1629 m_intlPluralRulesAvailableLocales.add(locale); 1630 1630 } 1631 1631 addMissingScriptLocales(m_intlPluralRulesAvailableLocales);
Note: See TracChangeset
for help on using the changeset viewer.