Bug 542999 - Setting general.useragent.locale in user profile should override any intl.locale.matchOS setting. r=bsmedberg

This commit is contained in:
Mike Hommey 2010-02-22 12:42:38 +13:00
Родитель 62e69790b7
Коммит 477afdaf64
3 изменённых файлов: 55 добавлений и 16 удалений

Просмотреть файл

@ -1285,10 +1285,11 @@ nsresult
nsChromeRegistry::SelectLocaleFromPref(nsIPrefBranch* prefs) nsChromeRegistry::SelectLocaleFromPref(nsIPrefBranch* prefs)
{ {
nsresult rv; 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); 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! // compute lang and region code only when needed!
nsCAutoString uiLocale; nsCAutoString uiLocale;
rv = getUILangCountry(uiLocale); rv = getUILangCountry(uiLocale);

Просмотреть файл

@ -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/

Просмотреть файл

@ -36,8 +36,41 @@
* ***** END LICENSE BLOCK ***** * ***** 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 = [ var MANIFESTS = [
do_get_file("data/test_bug519468.manifest") manifest
]; ];
registerManifests(MANIFESTS); registerManifests(MANIFESTS);
@ -46,35 +79,42 @@ var chromeReg = Cc["@mozilla.org/chrome/chrome-registry;1"]
.getService(Ci.nsIXULChromeRegistry) .getService(Ci.nsIXULChromeRegistry)
.QueryInterface(Ci.nsIToolkitChromeRegistry); .QueryInterface(Ci.nsIToolkitChromeRegistry);
var localeService = Cc["@mozilla.org/intl/nslocaleservice;1"]
.getService(Ci.nsILocaleService);
var prefService = Cc["@mozilla.org/preferences-service;1"] var prefService = Cc["@mozilla.org/preferences-service;1"]
.getService(Ci.nsIPrefService) .getService(Ci.nsIPrefService)
.QueryInterface(Ci.nsIPrefBranch); .QueryInterface(Ci.nsIPrefBranch);
function test_locale(aTest) { function test_locale(aTest) {
prefService.setBoolPref("intl.locale.matchOS", aTest.matchOS); 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); do_check_eq(selectedLocale, aTest.locale);
} }
function run_test() function run_test()
{ {
var systemLocale = localeService.getLocaleComponentForUserAgent();
var tests = [ var tests = [
{matchOS: false, selected: null, locale: "en-US"},
{matchOS: true, selected: null, locale: systemLocale}, {matchOS: true, selected: null, locale: systemLocale},
{matchOS: true, selected: "fr-FR", locale: systemLocale}, {matchOS: true, selected: locales[0], locale: locales[0]},
{matchOS: false, selected: "fr-FR", locale: "fr-FR"}, {matchOS: true, selected: locales[1], locale: locales[1]},
{matchOS: true, selected: null, locale: systemLocale} {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) { for (var i = 0; i < tests.length; ++ i) {
var test = tests[i]; var test = tests[i];
if (!test.package)
test.package = "testmatchos";
test_locale(test); test_locale(test);
} }
manifest.remove(false);
} }