test_localeService.js (10547B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 const osPrefs = Cc["@mozilla.org/intl/ospreferences;1"].getService( 6 Ci.mozIOSPreferences 7 ); 8 9 const localeService = Services.locale; 10 11 /** 12 * Make sure the locale service can be instantiated. 13 */ 14 15 add_test(function test_defaultLocale() { 16 const defaultLocale = localeService.defaultLocale; 17 Assert.notStrictEqual(defaultLocale.length, 0, "Default locale is not empty"); 18 run_next_test(); 19 }); 20 21 add_test(function test_lastFallbackLocale() { 22 const lastFallbackLocale = localeService.lastFallbackLocale; 23 Assert.strictEqual( 24 lastFallbackLocale, 25 "en-US", 26 "Last fallback locale is en-US" 27 ); 28 run_next_test(); 29 }); 30 31 add_test(function test_appLocalesAsLangTags() { 32 const appLocale = localeService.appLocaleAsLangTag; 33 Assert.notEqual(appLocale, "", "appLocale is non-empty"); 34 35 const appLocales = localeService.appLocalesAsLangTags; 36 Assert.ok(Array.isArray(appLocales), "appLocales returns an array"); 37 38 Assert.equal( 39 appLocale, 40 appLocales[0], 41 "appLocale matches first entry in appLocales" 42 ); 43 44 const enUSLocales = appLocales.filter(loc => loc === "en-US"); 45 Assert.equal(enUSLocales.length, 1, "en-US is present exactly one time"); 46 47 run_next_test(); 48 }); 49 50 const PREF_REQUESTED_LOCALES = "intl.locale.requested"; 51 const REQ_LOC_CHANGE_EVENT = "intl:requested-locales-changed"; 52 53 add_test(function test_requestedLocales() { 54 const requestedLocales = localeService.requestedLocales; 55 Assert.ok( 56 Array.isArray(requestedLocales), 57 "requestedLocales returns an array" 58 ); 59 60 run_next_test(); 61 }); 62 63 /** 64 * In this test we verify that after we set an observer on the LocaleService 65 * event for requested locales change, it will be fired when the 66 * pref for matchOS is set to true. 67 * 68 * Then, we test that when the matchOS is set to true, we will retrieve 69 * OS locale from requestedLocales. 70 */ 71 add_test(function test_requestedLocales_matchOS() { 72 do_test_pending(); 73 74 Services.prefs.setCharPref(PREF_REQUESTED_LOCALES, "ar-IR"); 75 76 const observer = { 77 observe(aSubject, aTopic) { 78 switch (aTopic) { 79 case REQ_LOC_CHANGE_EVENT: { 80 const reqLocs = localeService.requestedLocales; 81 Assert.strictEqual(reqLocs[0], osPrefs.systemLocale); 82 Services.obs.removeObserver(observer, REQ_LOC_CHANGE_EVENT); 83 do_test_finished(); 84 } 85 } 86 }, 87 }; 88 89 Services.obs.addObserver(observer, REQ_LOC_CHANGE_EVENT); 90 Services.prefs.setCharPref(PREF_REQUESTED_LOCALES, ""); 91 92 run_next_test(); 93 }); 94 95 /** 96 * In this test we verify that after we set an observer on the LocaleService 97 * event for requested locales change, it will be fired when the 98 * pref for browser UI locale changes. 99 */ 100 add_test(function test_requestedLocales_onChange() { 101 do_test_pending(); 102 103 Services.prefs.setCharPref(PREF_REQUESTED_LOCALES, "ar-IR"); 104 105 const observer = { 106 observe(aSubject, aTopic) { 107 switch (aTopic) { 108 case REQ_LOC_CHANGE_EVENT: { 109 const reqLocs = localeService.requestedLocales; 110 Assert.strictEqual(reqLocs[0], "sr-RU"); 111 Services.obs.removeObserver(observer, REQ_LOC_CHANGE_EVENT); 112 do_test_finished(); 113 } 114 } 115 }, 116 }; 117 118 Services.obs.addObserver(observer, REQ_LOC_CHANGE_EVENT); 119 Services.prefs.setCharPref(PREF_REQUESTED_LOCALES, "sr-RU"); 120 121 run_next_test(); 122 }); 123 124 add_test(function test_requestedLocale() { 125 Services.prefs.setCharPref(PREF_REQUESTED_LOCALES, "tlh"); 126 127 let requestedLocale = localeService.requestedLocale; 128 Assert.strictEqual( 129 requestedLocale, 130 "tlh", 131 "requestedLocale returns the right value" 132 ); 133 134 Services.prefs.clearUserPref(PREF_REQUESTED_LOCALES); 135 136 run_next_test(); 137 }); 138 139 add_test(function test_requestedLocales() { 140 localeService.requestedLocales = ["de-AT", "de-DE", "de-CH"]; 141 142 let locales = localeService.requestedLocales; 143 Assert.strictEqual(locales[0], "de-AT"); 144 Assert.strictEqual(locales[1], "de-DE"); 145 Assert.strictEqual(locales[2], "de-CH"); 146 147 run_next_test(); 148 }); 149 150 add_test(function test_isAppLocaleRTL() { 151 Assert.strictEqual(typeof localeService.isAppLocaleRTL, "boolean"); 152 153 run_next_test(); 154 }); 155 156 add_test(function test_isAppLocaleRTL_pseudo() { 157 let avLocales = localeService.availableLocales; 158 let reqLocales = localeService.requestedLocales; 159 160 localeService.availableLocales = ["en-US"]; 161 localeService.requestedLocales = ["en-US"]; 162 Services.prefs.setCharPref("intl.l10n.pseudo", ""); 163 164 Assert.strictEqual(localeService.isAppLocaleRTL, false); 165 166 Services.prefs.setCharPref("intl.l10n.pseudo", "bidi"); 167 Assert.strictEqual(localeService.isAppLocaleRTL, true); 168 169 Services.prefs.setCharPref("intl.l10n.pseudo", "accented"); 170 Assert.strictEqual(localeService.isAppLocaleRTL, false); 171 172 // Clean up 173 localeService.availableLocales = avLocales; 174 localeService.requestedLocales = reqLocales; 175 Services.prefs.clearUserPref("intl.l10n.pseudo"); 176 177 run_next_test(); 178 }); 179 180 add_test(function test_packagedLocales() { 181 const locales = localeService.packagedLocales; 182 Assert.notStrictEqual(locales.length, 0, "Packaged locales are empty"); 183 run_next_test(); 184 }); 185 186 add_test(function test_availableLocales() { 187 const avLocales = localeService.availableLocales; 188 localeService.availableLocales = ["und", "ar-IR"]; 189 190 let locales = localeService.availableLocales; 191 Assert.equal(locales.length, 2); 192 Assert.strictEqual(locales[0], "und"); 193 Assert.strictEqual(locales[1], "ar-IR"); 194 195 localeService.availableLocales = avLocales; 196 197 run_next_test(); 198 }); 199 200 /** 201 * This test verifies that all values coming from the pref are sanitized. 202 */ 203 add_test(function test_requestedLocales_sanitize() { 204 Services.prefs.setStringPref( 205 PREF_REQUESTED_LOCALES, 206 "de,2,#$@#,pl,ąó,!a2,DE-at,,;" 207 ); 208 209 let locales = localeService.requestedLocales; 210 Assert.equal(locales[0], "de"); 211 Assert.equal(locales[1], "pl"); 212 Assert.equal(locales[2], "de-AT"); 213 Assert.equal(locales.length, 3); 214 215 Services.prefs.clearUserPref(PREF_REQUESTED_LOCALES); 216 217 run_next_test(); 218 }); 219 220 add_test(function test_handle_ja_JP_mac() { 221 const bkpAvLocales = localeService.availableLocales; 222 223 localeService.availableLocales = ["ja-JP-mac", "en-US"]; 224 225 localeService.requestedLocales = ["ja-JP-mac"]; 226 227 let reqLocales = localeService.requestedLocales; 228 Assert.equal(reqLocales[0], "ja-JP-macos"); 229 230 let avLocales = localeService.availableLocales; 231 Assert.equal(avLocales[0], "ja-JP-macos"); 232 233 let appLocales = localeService.appLocalesAsBCP47; 234 Assert.equal(appLocales[0], "ja-JP-macos"); 235 236 let appLocalesAsLT = localeService.appLocalesAsLangTags; 237 Assert.equal(appLocalesAsLT[0], "ja-JP-mac"); 238 239 Assert.equal(localeService.appLocaleAsLangTag, "ja-JP-mac"); 240 241 localeService.availableLocales = bkpAvLocales; 242 243 run_next_test(); 244 }); 245 246 add_test(function test_locale_service_glue() { 247 // On Android, intl.accept_languages is set with a user pref value, 248 // so we clear that in order to test the default value handling. 249 let origAcceptLanguages = null; 250 if (Services.prefs.prefHasUserValue("intl.accept_languages")) { 251 origAcceptLanguages = Services.prefs.getCharPref("intl.accept_languages"); 252 Services.prefs.clearUserPref("intl.accept_languages"); 253 } 254 const origAvLocales = localeService.availableLocales; 255 256 localeService.availableLocales = ["en-US"]; 257 localeService.requestedLocales = ["en-US"]; 258 Assert.equal(localeService.acceptLanguages, "en-US, en"); 259 Assert.equal(localeService.ellipsis, "…"); 260 Assert.equal(localeService.alwaysAppendAccesskeys, false); 261 Assert.equal(localeService.insertSeparatorBeforeAccesskeys, true); 262 263 localeService.availableLocales = ["ca-valencia", "en-US"]; 264 localeService.requestedLocales = ["ca-valencia"]; 265 Assert.equal(localeService.acceptLanguages, "ca-valencia, ca, en-US, en"); 266 267 localeService.availableLocales = ["hi-IN", "en-US"]; 268 localeService.requestedLocales = ["hi-IN"]; 269 Assert.equal(localeService.acceptLanguages, "hi-IN, hi, en-US, en"); 270 271 localeService.availableLocales = ["ja-JP-mac", "en-US"]; 272 localeService.requestedLocales = ["ja-JP-mac"]; 273 Assert.equal(localeService.acceptLanguages, "ja, en-US, en"); 274 Assert.equal(localeService.ellipsis, "..."); 275 Assert.equal(localeService.alwaysAppendAccesskeys, true); 276 Assert.equal(localeService.insertSeparatorBeforeAccesskeys, false); 277 278 localeService.availableLocales = ["zh-CN", "en-US"]; 279 localeService.requestedLocales = ["zh-CN"]; 280 Assert.equal( 281 localeService.acceptLanguages, 282 "zh-CN, zh, zh-TW, zh-HK, en-US, en" 283 ); 284 Assert.equal(localeService.ellipsis, "…"); 285 Assert.equal(localeService.alwaysAppendAccesskeys, false); 286 Assert.equal(localeService.insertSeparatorBeforeAccesskeys, false); 287 288 localeService.availableLocales = ["zh-TW", "en-US"]; 289 localeService.requestedLocales = ["zh-TW"]; 290 Assert.equal(localeService.acceptLanguages, "zh-TW, zh, en-US, en"); 291 Assert.equal(localeService.ellipsis, "…"); 292 Assert.equal(localeService.alwaysAppendAccesskeys, true); 293 Assert.equal(localeService.insertSeparatorBeforeAccesskeys, true); 294 295 if (origAcceptLanguages) { 296 Services.prefs.setCharPref("intl.accept_languages", origAcceptLanguages); 297 } 298 localeService.availableLocales = origAvLocales; 299 300 run_next_test(); 301 }); 302 303 add_test(function test_font_langauge_group() { 304 const origAvLocales = localeService.availableLocales; 305 306 for (const [locales, expGroup] of [ 307 [["ar", "ckb", "fa", "ks", "skr"], "ar"], 308 [["az", "mai", "sat", "vi"], "x-unicode"], 309 [["be", "bg", "kk", "mk", "ru", "sah", "sr", "tg", "uk"], "x-cyrillic"], 310 [["bn"], "x-beng"], 311 [["bo"], "x-tibt"], 312 [["brx", "hi", "mr", "ne"], "x-devanagari"], 313 [["el"], "el"], 314 [["gu-IN"], "x-gujr"], 315 [["he"], "he"], 316 [["hy", "hye", "xcl"], "x-armn"], 317 [["ja"], "ja"], 318 [["kn"], "x-knda"], 319 [["ko"], "ko"], 320 [["lo", "th"], "th"], 321 [["ml"], "x-mlym"], 322 [["si"], "x-sinh"], 323 [["son"], "x-western"], 324 [["te"], "x-telu"], 325 [["th"], "th"], 326 [["zh-CN"], "zh-CN"], 327 [["zh-TW"], "zh-TW"], 328 ]) { 329 for (const locale of locales) { 330 localeService.availableLocales = [locale, "en-US"]; 331 localeService.requestedLocales = [locale]; 332 Assert.equal(localeService.fontLanguageGroup, expGroup, locale); 333 } 334 } 335 336 localeService.availableLocales = origAvLocales; 337 338 run_next_test(); 339 }); 340 341 registerCleanupFunction(() => { 342 Services.prefs.clearUserPref(PREF_REQUESTED_LOCALES); 343 });