From 477afdaf64eb57fbb8ba972a91aad80ecba797fd Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Mon, 22 Feb 2010 12:42:38 +1300 Subject: [PATCH] Bug 542999 - Setting general.useragent.locale in user profile should override any intl.locale.matchOS setting. r=bsmedberg --- chrome/src/nsChromeRegistry.cpp | 5 +- chrome/test/unit/data/test_bug519468.manifest | 2 - chrome/test/unit/test_bug519468.js | 64 +++++++++++++++---- 3 files changed, 55 insertions(+), 16 deletions(-) delete mode 100644 chrome/test/unit/data/test_bug519468.manifest diff --git a/chrome/src/nsChromeRegistry.cpp b/chrome/src/nsChromeRegistry.cpp index e09c67168ec..04919061395 100644 --- a/chrome/src/nsChromeRegistry.cpp +++ b/chrome/src/nsChromeRegistry.cpp @@ -1285,10 +1285,11 @@ nsresult nsChromeRegistry::SelectLocaleFromPref(nsIPrefBranch* prefs) { nsresult rv; - PRBool matchOSLocale = PR_FALSE; + PRBool matchOSLocale = PR_FALSE, userLocaleOverride = PR_FALSE; + prefs->PrefHasUserValue(SELECTED_LOCALE_PREF, &userLocaleOverride); rv = prefs->GetBoolPref(MATCH_OS_LOCALE_PREF, &matchOSLocale); - if (NS_SUCCEEDED(rv) && matchOSLocale) { + if (NS_SUCCEEDED(rv) && matchOSLocale && !userLocaleOverride) { // compute lang and region code only when needed! nsCAutoString uiLocale; rv = getUILangCountry(uiLocale); diff --git a/chrome/test/unit/data/test_bug519468.manifest b/chrome/test/unit/data/test_bug519468.manifest deleted file mode 100644 index 5d39f9260ed..00000000000 --- a/chrome/test/unit/data/test_bug519468.manifest +++ /dev/null @@ -1,2 +0,0 @@ -locale testmatchos en-US jar:en-US.jar!/locale/en-US/global/ -locale testmatchos fr-FR jar:en-US.jar!/locale/en-US/global/ diff --git a/chrome/test/unit/test_bug519468.js b/chrome/test/unit/test_bug519468.js index 68ef753ef38..3e10d1f918c 100644 --- a/chrome/test/unit/test_bug519468.js +++ b/chrome/test/unit/test_bug519468.js @@ -36,8 +36,41 @@ * ***** END LICENSE BLOCK ***** */ +function write_locale(stream, locale, package) { + var s = "locale " + package + " " + locale + " jar:" + locale + ".jar!"; + s += "/locale/" + locale + "/" + package +"/\n"; + stream.write(s, s.length); +} + +var localeService = Cc["@mozilla.org/intl/nslocaleservice;1"] + .getService(Ci.nsILocaleService); + +var systemLocale = localeService.getLocaleComponentForUserAgent(); + +var locales; + +if (systemLocale == "en-US") + locales = [ "en-US", "fr-FR", "de-DE" ]; +else if (systemLocale == "fr-FR") + locales = [ "en-US", systemLocale, "de-DE" ]; +else + locales = [ "en-US", systemLocale, "fr-FR" ]; + +var workingDir = Cc["@mozilla.org/file/directory_service;1"]. + getService(Ci.nsIProperties).get("TmpD", Ci.nsIFile); +var manifest = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile); +manifest.initWithFile(workingDir); +manifest.append("test_bug519468.manifest"); +manifest.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0600); +var stream = Cc["@mozilla.org/network/file-output-stream;1"]. + createInstance(Ci.nsIFileOutputStream); +stream.init(manifest, 0x04 | 0x08 | 0x20, 0600, 0); // write, create, truncate +locales.slice(0,2).forEach(function(l) write_locale(stream, l, "testmatchos")); +write_locale(stream, locales[2], "testnomatchos"); +stream.close(); + var MANIFESTS = [ - do_get_file("data/test_bug519468.manifest") + manifest ]; registerManifests(MANIFESTS); @@ -46,35 +79,42 @@ var chromeReg = Cc["@mozilla.org/chrome/chrome-registry;1"] .getService(Ci.nsIXULChromeRegistry) .QueryInterface(Ci.nsIToolkitChromeRegistry); -var localeService = Cc["@mozilla.org/intl/nslocaleservice;1"] - .getService(Ci.nsILocaleService); - var prefService = Cc["@mozilla.org/preferences-service;1"] .getService(Ci.nsIPrefService) .QueryInterface(Ci.nsIPrefBranch); function test_locale(aTest) { prefService.setBoolPref("intl.locale.matchOS", aTest.matchOS); - prefService.setCharPref("general.useragent.locale", aTest.selected || "en-US"); + if (aTest.selected) + prefService.setCharPref("general.useragent.locale", aTest.selected); + else + try { + prefService.clearUserPref("general.useragent.locale"); + } catch(e) {} - var selectedLocale = chromeReg.getSelectedLocale("testmatchos"); + var selectedLocale = chromeReg.getSelectedLocale(aTest.package); do_check_eq(selectedLocale, aTest.locale); } function run_test() { - var systemLocale = localeService.getLocaleComponentForUserAgent(); - var tests = [ - {matchOS: false, selected: null, locale: "en-US"}, {matchOS: true, selected: null, locale: systemLocale}, - {matchOS: true, selected: "fr-FR", locale: systemLocale}, - {matchOS: false, selected: "fr-FR", locale: "fr-FR"}, - {matchOS: true, selected: null, locale: systemLocale} + {matchOS: true, selected: locales[0], locale: locales[0]}, + {matchOS: true, selected: locales[1], locale: locales[1]}, + {matchOS: true, selected: locales[2], locale: locales[0]}, + {matchOS: true, selected: null, locale: locales[2], package: "testnomatchos"}, + {matchOS: false, selected: null, locale: locales[0]}, + {matchOS: false, selected: locales[0], locale: locales[0]}, + {matchOS: false, selected: locales[1], locale: locales[1]}, + {matchOS: false, selected: locales[2], locale: locales[0]}, ]; for (var i = 0; i < tests.length; ++ i) { var test = tests[i]; + if (!test.package) + test.package = "testmatchos"; test_locale(test); } + manifest.remove(false); }