test_requestedlocales.js (3388B)
1 /* Any copyright is dedicated to the Public Domain. 2 * http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 var { setTimeout } = ChromeUtils.importESModule( 7 "resource://gre/modules/Timer.sys.mjs" 8 ); 9 10 const REQ_LOC_CHANGE_EVENT = "intl:requested-locales-changed"; 11 12 function promiseLocaleChanged(requestedLocale) { 13 return new Promise(resolve => { 14 let localeObserver = { 15 observe(aSubject, aTopic) { 16 switch (aTopic) { 17 case REQ_LOC_CHANGE_EVENT: { 18 let reqLocs = Services.locale.requestedLocales; 19 equal(reqLocs[0], requestedLocale); 20 Services.obs.removeObserver(localeObserver, REQ_LOC_CHANGE_EVENT); 21 resolve(); 22 } 23 } 24 }, 25 }; 26 Services.obs.addObserver(localeObserver, REQ_LOC_CHANGE_EVENT); 27 }); 28 } 29 30 function promiseLocaleNotChanged() { 31 return new Promise(resolve => { 32 let localeObserver = { 33 observe(aSubject, aTopic) { 34 switch (aTopic) { 35 case REQ_LOC_CHANGE_EVENT: 36 ok(false, "Locale should not change."); 37 Services.obs.removeObserver(localeObserver, REQ_LOC_CHANGE_EVENT); 38 resolve(); 39 } 40 }, 41 }; 42 Services.obs.addObserver(localeObserver, REQ_LOC_CHANGE_EVENT); 43 /* eslint-disable mozilla/no-arbitrary-setTimeout */ 44 setTimeout(function () { 45 Services.obs.removeObserver(localeObserver, REQ_LOC_CHANGE_EVENT); 46 resolve(); 47 }, 100); 48 }); 49 } 50 51 add_task(async function test_requested_locale_array() { 52 let originalLocales = Services.locale.requestedLocales; 53 let localePromise = promiseLocaleChanged("de"); 54 await setupPolicyEngineWithJson({ 55 policies: { 56 RequestedLocales: ["de"], 57 }, 58 }); 59 await localePromise; 60 Services.locale.requestedLocales = originalLocales; 61 }); 62 63 add_task(async function test_requested_locale_string() { 64 let originalLocales = Services.locale.requestedLocales; 65 let localePromise = promiseLocaleChanged("fr"); 66 await setupPolicyEngineWithJson({ 67 policies: { 68 RequestedLocales: "fr", 69 }, 70 }); 71 await localePromise; 72 Services.locale.requestedLocales = originalLocales; 73 }); 74 75 add_task(async function test_system_locale_string() { 76 let originalLocales = Services.locale.requestedLocales; 77 78 let localePromise = promiseLocaleChanged("und"); 79 Services.locale.requestedLocales = ["und"]; 80 await localePromise; 81 82 let systemLocale = Cc["@mozilla.org/intl/ospreferences;1"].getService( 83 Ci.mozIOSPreferences 84 ).systemLocale; 85 localePromise = promiseLocaleChanged(systemLocale); 86 87 await setupPolicyEngineWithJson({ 88 policies: { 89 RequestedLocales: "", 90 }, 91 }); 92 await localePromise; 93 Services.locale.requestedLocales = originalLocales; 94 }); 95 96 add_task(async function test_user_requested_locale_change() { 97 let originalLocales = Services.locale.requestedLocales; 98 let localePromise = promiseLocaleChanged("fr"); 99 await setupPolicyEngineWithJson({ 100 policies: { 101 RequestedLocales: "fr", 102 }, 103 }); 104 await localePromise; 105 106 // Simulate user change of locale 107 localePromise = promiseLocaleChanged("de"); 108 Services.locale.requestedLocales = ["de"]; 109 await localePromise; 110 111 localePromise = promiseLocaleNotChanged("fr"); 112 await setupPolicyEngineWithJson({ 113 policies: { 114 RequestedLocales: "fr", 115 }, 116 }); 117 await localePromise; 118 119 Services.locale.requestedLocales = originalLocales; 120 });