|
1 diff --git a/chrome/src/nsChromeRegistry.cpp b/chrome/src/nsChromeRegistry.cpp |
|
2 --- a/chrome/src/nsChromeRegistry.cpp |
|
3 +++ b/chrome/src/nsChromeRegistry.cpp |
|
4 @@ -1267,20 +1267,21 @@ nsChromeRegistry::WrappersEnabled(nsIURI |
|
5 return PL_DHASH_ENTRY_IS_LIVE(entry) && |
|
6 entry->flags & PackageEntry::XPCNATIVEWRAPPERS; |
|
7 } |
|
8 |
|
9 nsresult |
|
10 nsChromeRegistry::SelectLocaleFromPref(nsIPrefBranch* prefs) |
|
11 { |
|
12 nsresult rv; |
|
13 - PRBool matchOSLocale = PR_FALSE; |
|
14 + PRBool matchOSLocale = PR_FALSE, userLocaleOverride = PR_FALSE; |
|
15 + prefs->PrefHasUserValue(SELECTED_LOCALE_PREF, &userLocaleOverride); |
|
16 rv = prefs->GetBoolPref(MATCH_OS_LOCALE_PREF, &matchOSLocale); |
|
17 |
|
18 - if (NS_SUCCEEDED(rv) && matchOSLocale) { |
|
19 + if (NS_SUCCEEDED(rv) && matchOSLocale && !userLocaleOverride) { |
|
20 // compute lang and region code only when needed! |
|
21 nsCAutoString uiLocale; |
|
22 rv = getUILangCountry(uiLocale); |
|
23 if (NS_SUCCEEDED(rv)) |
|
24 mSelectedLocale = uiLocale; |
|
25 } |
|
26 else { |
|
27 nsXPIDLCString provider; |
|
28 diff --git a/chrome/test/unit/test_bug519468.js b/chrome/test/unit/test_bug519468.js |
|
29 --- a/chrome/test/unit/test_bug519468.js |
|
30 +++ b/chrome/test/unit/test_bug519468.js |
|
31 @@ -31,50 +31,90 @@ |
|
32 * decision by deleting the provisions above and replace them with the notice |
|
33 * and other provisions required by the GPL or the LGPL. If you do not delete |
|
34 * the provisions above, a recipient may use your version of this file under |
|
35 * the terms of any one of the MPL, the GPL or the LGPL. |
|
36 * |
|
37 * ***** END LICENSE BLOCK ***** |
|
38 */ |
|
39 |
|
40 +function write_locale(stream, locale, package) { |
|
41 + var s = "locale " + package + " " + locale + " jar:" + locale + ".jar!"; |
|
42 + s += "/locale/" + locale + "/" + package +"/\n"; |
|
43 + stream.write(s, s.length); |
|
44 +} |
|
45 + |
|
46 +var localeService = Cc["@mozilla.org/intl/nslocaleservice;1"] |
|
47 + .getService(Ci.nsILocaleService); |
|
48 + |
|
49 +var systemLocale = localeService.getLocaleComponentForUserAgent(); |
|
50 + |
|
51 +var locales; |
|
52 + |
|
53 +if (systemLocale == "en-US") |
|
54 + locales = [ "en-US", "fr-FR", "de-DE" ]; |
|
55 +else if (systemLocale == "fr-FR") |
|
56 + locales = [ "en-US", systemLocale, "de-DE" ]; |
|
57 +else |
|
58 + locales = [ "en-US", systemLocale, "fr-FR" ]; |
|
59 + |
|
60 +var workingDir = Cc["@mozilla.org/file/directory_service;1"]. |
|
61 + getService(Ci.nsIProperties).get("TmpD", Ci.nsIFile); |
|
62 +var manifest = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile); |
|
63 +manifest.initWithFile(workingDir); |
|
64 +manifest.append("test_bug519468.manifest"); |
|
65 +manifest.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0600); |
|
66 +var stream = Cc["@mozilla.org/network/file-output-stream;1"]. |
|
67 + createInstance(Ci.nsIFileOutputStream); |
|
68 +stream.init(manifest, 0x04 | 0x08 | 0x20, 0600, 0); // write, create, truncate |
|
69 +locales.slice(0,2).forEach(function(l) write_locale(stream, l, "testmatchos")); |
|
70 +write_locale(stream, locales[2], "testnomatchos"); |
|
71 +stream.close(); |
|
72 + |
|
73 var MANIFESTS = [ |
|
74 - do_get_file("data/test_bug519468.manifest") |
|
75 + manifest |
|
76 ]; |
|
77 |
|
78 registerManifests(MANIFESTS); |
|
79 |
|
80 var chromeReg = Cc["@mozilla.org/chrome/chrome-registry;1"] |
|
81 .getService(Ci.nsIXULChromeRegistry) |
|
82 .QueryInterface(Ci.nsIToolkitChromeRegistry); |
|
83 |
|
84 -var localeService = Cc["@mozilla.org/intl/nslocaleservice;1"] |
|
85 - .getService(Ci.nsILocaleService); |
|
86 - |
|
87 var prefService = Cc["@mozilla.org/preferences-service;1"] |
|
88 .getService(Ci.nsIPrefService) |
|
89 .QueryInterface(Ci.nsIPrefBranch); |
|
90 |
|
91 function test_locale(aTest) { |
|
92 prefService.setBoolPref("intl.locale.matchOS", aTest.matchOS); |
|
93 - prefService.setCharPref("general.useragent.locale", aTest.selected || "en-US"); |
|
94 + if (aTest.selected) |
|
95 + prefService.setCharPref("general.useragent.locale", aTest.selected); |
|
96 + else |
|
97 + try { |
|
98 + prefService.clearUserPref("general.useragent.locale"); |
|
99 + } catch(e) {} |
|
100 |
|
101 - var selectedLocale = chromeReg.getSelectedLocale("testmatchos"); |
|
102 + var selectedLocale = chromeReg.getSelectedLocale(aTest.package); |
|
103 do_check_eq(selectedLocale, aTest.locale); |
|
104 } |
|
105 |
|
106 function run_test() |
|
107 { |
|
108 - var systemLocale = localeService.getLocaleComponentForUserAgent(); |
|
109 - |
|
110 var tests = [ |
|
111 - {matchOS: false, selected: null, locale: "en-US"}, |
|
112 {matchOS: true, selected: null, locale: systemLocale}, |
|
113 - {matchOS: true, selected: "fr-FR", locale: systemLocale}, |
|
114 - {matchOS: false, selected: "fr-FR", locale: "fr-FR"}, |
|
115 - {matchOS: true, selected: null, locale: systemLocale} |
|
116 + {matchOS: true, selected: locales[0], locale: locales[0]}, |
|
117 + {matchOS: true, selected: locales[1], locale: locales[1]}, |
|
118 + {matchOS: true, selected: locales[2], locale: locales[0]}, |
|
119 + {matchOS: true, selected: null, locale: locales[2], package: "testnomatchos"}, |
|
120 + {matchOS: false, selected: null, locale: locales[0]}, |
|
121 + {matchOS: false, selected: locales[0], locale: locales[0]}, |
|
122 + {matchOS: false, selected: locales[1], locale: locales[1]}, |
|
123 + {matchOS: false, selected: locales[2], locale: locales[0]}, |
|
124 ]; |
|
125 |
|
126 for (var i = 0; i < tests.length; ++ i) { |
|
127 var test = tests[i]; |
|
128 + if (!test.package) |
|
129 + test.package = "testmatchos"; |
|
130 test_locale(test); |
|
131 } |
|
132 + manifest.remove(false); |
|
133 } |