Changeset 234260 in webkit


Ignore:
Timestamp:
Jul 26, 2018 9:01:04 AM (6 years ago)
Author:
commit-queue@webkit.org
Message:

JSC: Intl API should ignore encoding when parsing BCP 47 language tag from ISO 15897 locale string (passed via LANG)
https://bugs.webkit.org/show_bug.cgi?id=167991

Patch by Andy VanWagoner <andy@vanwagoner.family> on 2018-07-26
Reviewed by Michael Catanzaro.

Source/JavaScriptCore:

Improved the conversion of ICU locales to BCP47 tags, using their preferred method.
Checked locale.isEmpty() before returning it from defaultLocale, so there should be
no more cases where you might have an invalid locale come back from resolveLocale.

  • runtime/IntlObject.cpp:

(JSC::convertICULocaleToBCP47LanguageTag):
(JSC::defaultLocale):
(JSC::lookupMatcher):

  • runtime/IntlObject.h:
  • runtime/JSGlobalObject.cpp:

(JSC::JSGlobalObject::intlCollatorAvailableLocales):
(JSC::JSGlobalObject::intlDateTimeFormatAvailableLocales):
(JSC::JSGlobalObject::intlNumberFormatAvailableLocales):
(JSC::JSGlobalObject::intlPluralRulesAvailableLocales):

LayoutTests:

Replaced expecting throwing a runtime error to avoid a crash, with testing for good default locale fallback behavior.

  • js/intl-default-locale-expected.txt: Added.
  • js/intl-default-locale.html: Added.
  • js/intl-invalid-locale-crash-expected.txt: Removed.
  • js/intl-invalid-locale-crash.html: Removed.
  • platform/win/TestExpectations:
Location:
trunk
Files:
2 added
2 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r234257 r234260  
     12018-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
    1162018-07-26  Miguel Gomez  <magomez@igalia.com>
    217
  • trunk/LayoutTests/platform/win/TestExpectations

    r234149 r234260  
    24822482js/intl-collator.html [ Skip ]
    24832483js/intl-datetimeformat.html [ Skip ]
     2484js/intl-default-locale.html [ Skip ]
    24842485js/intl-numberformat.html [ Skip ]
    24852486js/intl-numberformat-format-to-parts.html [ Skip ]
     
    33483349js/dom/string-prototype-properties.html [ Failure ]
    33493350js/dom/webidl-type-mapping.html [ Failure ]
    3350 js/intl-invalid-locale-crash.html [ Failure ]
    33513351js/regress-141098.html [ Failure ]
    33523352pageoverlay/overlay-installation.html [ Failure ]
  • trunk/Source/JavaScriptCore/ChangeLog

    r234252 r234260  
     12018-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
    1232018-07-26  Fujii Hironori  <Hironori.Fujii@sony.com>
    224
  • trunk/Source/JavaScriptCore/runtime/IntlObject.cpp

    r234160 r234260  
    131131}
    132132
    133 void convertICULocaleToBCP47LanguageTag(String& locale)
    134 {
    135     locale.replace('_', '-');
     133String 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();
    136146}
    137147
     
    591601    VM& vm = state.vm();
    592602    if (auto defaultLanguage = state.jsCallee()->globalObject(vm)->globalObjectMethodTable()->defaultLanguage) {
    593         String locale = defaultLanguage();
     603        String locale = canonicalizeLanguageTag(defaultLanguage());
    594604        if (!locale.isEmpty())
    595             return canonicalizeLanguageTag(locale);
     605            return locale;
    596606    }
    597607
    598608    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    }
    601614
    602615    // If all else fails, ask ICU. It will probably say something bogus like en_us even if the user
    603616    // 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;
    607622}
    608623
     
    647662
    648663    MatcherResult result;
    649     if (!availableLocale.isNull()) {
     664    if (!availableLocale.isEmpty()) {
    650665        result.locale = availableLocale;
    651666        if (locale != noExtensionsLocale) {
  • trunk/Source/JavaScriptCore/runtime/IntlObject.h

    r234127 r234260  
    6060
    6161String defaultLocale(ExecState&);
    62 void convertICULocaleToBCP47LanguageTag(String& locale);
     62String convertICULocaleToBCP47LanguageTag(const char* localeID);
    6363bool intlBooleanOption(ExecState&, JSValue options, PropertyName, bool& usesFallback);
    6464String 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  
    15831583        int32_t count = ucol_countAvailable();
    15841584        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);
    15881588        }
    15891589        addMissingScriptLocales(m_intlCollatorAvailableLocales);
     
    15971597        int32_t count = udat_countAvailable();
    15981598        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);
    16021602        }
    16031603        addMissingScriptLocales(m_intlDateTimeFormatAvailableLocales);
     
    16111611        int32_t count = unum_countAvailable();
    16121612        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);
    16161616        }
    16171617        addMissingScriptLocales(m_intlNumberFormatAvailableLocales);
     
    16251625        int32_t count = uloc_countAvailable();
    16261626        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);
    16301630        }
    16311631        addMissingScriptLocales(m_intlPluralRulesAvailableLocales);
Note: See TracChangeset for help on using the changeset viewer.