/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ const osPrefs = Cc["@mozilla.org/intl/ospreferences;1"].getService( Ci.mozIOSPreferences ); const localeService = Services.locale; /** * Make sure the locale service can be instantiated. */ add_test(function test_defaultLocale() { const defaultLocale = localeService.defaultLocale; Assert.notStrictEqual(defaultLocale.length, 0, "Default locale is not empty"); run_next_test(); }); add_test(function test_lastFallbackLocale() { const lastFallbackLocale = localeService.lastFallbackLocale; Assert.strictEqual( lastFallbackLocale, "en-US", "Last fallback locale is en-US" ); run_next_test(); }); add_test(function test_appLocalesAsLangTags() { const appLocale = localeService.appLocaleAsLangTag; Assert.notEqual(appLocale, "", "appLocale is non-empty"); const appLocales = localeService.appLocalesAsLangTags; Assert.ok(Array.isArray(appLocales), "appLocales returns an array"); Assert.equal( appLocale, appLocales[0], "appLocale matches first entry in appLocales" ); const enUSLocales = appLocales.filter(loc => loc === "en-US"); Assert.equal(enUSLocales.length, 1, "en-US is present exactly one time"); run_next_test(); }); const PREF_REQUESTED_LOCALES = "intl.locale.requested"; const REQ_LOC_CHANGE_EVENT = "intl:requested-locales-changed"; add_test(function test_requestedLocales() { const requestedLocales = localeService.requestedLocales; Assert.ok( Array.isArray(requestedLocales), "requestedLocales returns an array" ); run_next_test(); }); /** * In this test we verify that after we set an observer on the LocaleService * event for requested locales change, it will be fired when the * pref for matchOS is set to true. * * Then, we test that when the matchOS is set to true, we will retrieve * OS locale from requestedLocales. */ add_test(function test_requestedLocales_matchOS() { do_test_pending(); Services.prefs.setCharPref(PREF_REQUESTED_LOCALES, "ar-IR"); const observer = { observe(aSubject, aTopic) { switch (aTopic) { case REQ_LOC_CHANGE_EVENT: { const reqLocs = localeService.requestedLocales; Assert.strictEqual(reqLocs[0], osPrefs.systemLocale); Services.obs.removeObserver(observer, REQ_LOC_CHANGE_EVENT); do_test_finished(); } } }, }; Services.obs.addObserver(observer, REQ_LOC_CHANGE_EVENT); Services.prefs.setCharPref(PREF_REQUESTED_LOCALES, ""); run_next_test(); }); /** * In this test we verify that after we set an observer on the LocaleService * event for requested locales change, it will be fired when the * pref for browser UI locale changes. */ add_test(function test_requestedLocales_onChange() { do_test_pending(); Services.prefs.setCharPref(PREF_REQUESTED_LOCALES, "ar-IR"); const observer = { observe(aSubject, aTopic) { switch (aTopic) { case REQ_LOC_CHANGE_EVENT: { const reqLocs = localeService.requestedLocales; Assert.strictEqual(reqLocs[0], "sr-RU"); Services.obs.removeObserver(observer, REQ_LOC_CHANGE_EVENT); do_test_finished(); } } }, }; Services.obs.addObserver(observer, REQ_LOC_CHANGE_EVENT); Services.prefs.setCharPref(PREF_REQUESTED_LOCALES, "sr-RU"); run_next_test(); }); add_test(function test_requestedLocale() { Services.prefs.setCharPref(PREF_REQUESTED_LOCALES, "tlh"); let requestedLocale = localeService.requestedLocale; Assert.strictEqual( requestedLocale, "tlh", "requestedLocale returns the right value" ); Services.prefs.clearUserPref(PREF_REQUESTED_LOCALES); run_next_test(); }); add_test(function test_requestedLocales() { localeService.requestedLocales = ["de-AT", "de-DE", "de-CH"]; let locales = localeService.requestedLocales; Assert.strictEqual(locales[0], "de-AT"); Assert.strictEqual(locales[1], "de-DE"); Assert.strictEqual(locales[2], "de-CH"); run_next_test(); }); add_test(function test_isAppLocaleRTL() { Assert.strictEqual(typeof localeService.isAppLocaleRTL, "boolean"); run_next_test(); }); add_test(function test_isAppLocaleRTL_pseudo() { let avLocales = localeService.availableLocales; let reqLocales = localeService.requestedLocales; localeService.availableLocales = ["en-US"]; localeService.requestedLocales = ["en-US"]; Services.prefs.setCharPref("intl.l10n.pseudo", ""); Assert.strictEqual(localeService.isAppLocaleRTL, false); Services.prefs.setCharPref("intl.l10n.pseudo", "bidi"); Assert.strictEqual(localeService.isAppLocaleRTL, true); Services.prefs.setCharPref("intl.l10n.pseudo", "accented"); Assert.strictEqual(localeService.isAppLocaleRTL, false); // Clean up localeService.availableLocales = avLocales; localeService.requestedLocales = reqLocales; Services.prefs.clearUserPref("intl.l10n.pseudo"); run_next_test(); }); add_test(function test_packagedLocales() { const locales = localeService.packagedLocales; Assert.notStrictEqual(locales.length, 0, "Packaged locales are empty"); run_next_test(); }); add_test(function test_availableLocales() { const avLocales = localeService.availableLocales; localeService.availableLocales = ["und", "ar-IR"]; let locales = localeService.availableLocales; Assert.equal(locales.length, 2); Assert.strictEqual(locales[0], "und"); Assert.strictEqual(locales[1], "ar-IR"); localeService.availableLocales = avLocales; run_next_test(); }); /** * This test verifies that all values coming from the pref are sanitized. */ add_test(function test_requestedLocales_sanitize() { Services.prefs.setStringPref( PREF_REQUESTED_LOCALES, "de,2,#$@#,pl,ąó,!a2,DE-at,,;" ); let locales = localeService.requestedLocales; Assert.equal(locales[0], "de"); Assert.equal(locales[1], "pl"); Assert.equal(locales[2], "de-AT"); Assert.equal(locales.length, 3); Services.prefs.clearUserPref(PREF_REQUESTED_LOCALES); run_next_test(); }); add_test(function test_handle_ja_JP_mac() { const bkpAvLocales = localeService.availableLocales; localeService.availableLocales = ["ja-JP-mac", "en-US"]; localeService.requestedLocales = ["ja-JP-mac"]; let reqLocales = localeService.requestedLocales; Assert.equal(reqLocales[0], "ja-JP-macos"); let avLocales = localeService.availableLocales; Assert.equal(avLocales[0], "ja-JP-macos"); let appLocales = localeService.appLocalesAsBCP47; Assert.equal(appLocales[0], "ja-JP-macos"); let appLocalesAsLT = localeService.appLocalesAsLangTags; Assert.equal(appLocalesAsLT[0], "ja-JP-mac"); Assert.equal(localeService.appLocaleAsLangTag, "ja-JP-mac"); localeService.availableLocales = bkpAvLocales; run_next_test(); }); add_test(function test_locale_service_glue() { // On Android, intl.accept_languages is set with a user pref value, // so we clear that in order to test the default value handling. let origAcceptLanguages = null; if (Services.prefs.prefHasUserValue("intl.accept_languages")) { origAcceptLanguages = Services.prefs.getCharPref("intl.accept_languages"); Services.prefs.clearUserPref("intl.accept_languages"); } const origAvLocales = localeService.availableLocales; localeService.availableLocales = ["en-US"]; localeService.requestedLocales = ["en-US"]; Assert.equal(localeService.acceptLanguages, "en-US, en"); Assert.equal(localeService.ellipsis, "…"); Assert.equal(localeService.alwaysAppendAccesskeys, false); Assert.equal(localeService.insertSeparatorBeforeAccesskeys, true); localeService.availableLocales = ["ca-valencia", "en-US"]; localeService.requestedLocales = ["ca-valencia"]; Assert.equal(localeService.acceptLanguages, "ca-valencia, ca, en-US, en"); localeService.availableLocales = ["hi-IN", "en-US"]; localeService.requestedLocales = ["hi-IN"]; Assert.equal(localeService.acceptLanguages, "hi-IN, hi, en-US, en"); localeService.availableLocales = ["ja-JP-mac", "en-US"]; localeService.requestedLocales = ["ja-JP-mac"]; Assert.equal(localeService.acceptLanguages, "ja, en-US, en"); Assert.equal(localeService.ellipsis, "..."); Assert.equal(localeService.alwaysAppendAccesskeys, true); Assert.equal(localeService.insertSeparatorBeforeAccesskeys, false); localeService.availableLocales = ["zh-CN", "en-US"]; localeService.requestedLocales = ["zh-CN"]; Assert.equal( localeService.acceptLanguages, "zh-CN, zh, zh-TW, zh-HK, en-US, en" ); Assert.equal(localeService.ellipsis, "…"); Assert.equal(localeService.alwaysAppendAccesskeys, false); Assert.equal(localeService.insertSeparatorBeforeAccesskeys, false); localeService.availableLocales = ["zh-TW", "en-US"]; localeService.requestedLocales = ["zh-TW"]; Assert.equal(localeService.acceptLanguages, "zh-TW, zh, en-US, en"); Assert.equal(localeService.ellipsis, "…"); Assert.equal(localeService.alwaysAppendAccesskeys, true); Assert.equal(localeService.insertSeparatorBeforeAccesskeys, true); if (origAcceptLanguages) { Services.prefs.setCharPref("intl.accept_languages", origAcceptLanguages); } localeService.availableLocales = origAvLocales; run_next_test(); }); add_test(function test_font_language_group() { const origAvLocales = localeService.availableLocales; for (const [locales, expGroup] of [ [["ar", "ckb", "fa", "ks", "skr"], "ar"], [["az", "mai", "sat", "vi"], "x-unicode"], [["be", "bg", "kk", "mk", "ru", "sah", "sr", "tg", "uk"], "x-cyrillic"], [["bn"], "x-beng"], [["bo"], "x-tibt"], [["brx", "hi", "mr", "ne"], "x-devanagari"], [["el"], "el"], [["gu-IN"], "x-gujr"], [["he"], "he"], [["hy", "hye", "xcl"], "x-armn"], [["ja"], "ja"], [["kn"], "x-knda"], [["ko"], "ko"], [["lo", "th"], "th"], [["ml"], "x-mlym"], [["si"], "x-sinh"], [["son"], "x-western"], [["te"], "x-telu"], [["th"], "th"], [["zh-CN"], "zh-CN"], [["zh-TW"], "zh-TW"], ]) { for (const locale of locales) { localeService.availableLocales = [locale, "en-US"]; localeService.requestedLocales = [locale]; Assert.equal(localeService.fontLanguageGroup, expGroup, locale); } } localeService.availableLocales = origAvLocales; run_next_test(); }); add_test(function test_url_fixup_suffix() { const origAvLocales = localeService.availableLocales; for (const [locales, expSuffix] of [ [["be"], ".by"], [["cs"], ".cz"], [["da"], ".dk"], [["nb-NO", "nn-NO"], ".no"], [["sk"], ".sk"], [["en-US", "fi"], ".com"], ]) { for (const locale of locales) { localeService.availableLocales = [locale, "en-US"]; localeService.requestedLocales = [locale]; Assert.equal(localeService.urlFixupSuffix, expSuffix, locale); } } localeService.availableLocales = origAvLocales; run_next_test(); }); registerCleanupFunction(() => { Services.prefs.clearUserPref(PREF_REQUESTED_LOCALES); });