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/data/test_bug519468.manifest b/chrome/test/unit/data/test_bug519468.manifest |
|
29 deleted file mode 100644 |
|
30 --- a/chrome/test/unit/data/test_bug519468.manifest |
|
31 +++ /dev/null |
|
32 @@ -1,2 +0,0 @@ |
|
33 -locale testmatchos en-US jar:en-US.jar!/locale/en-US/global/ |
|
34 -locale testmatchos fr-FR jar:en-US.jar!/locale/en-US/global/ |
|
35 diff --git a/chrome/test/unit/test_bug519468.js b/chrome/test/unit/test_bug519468.js |
|
36 --- a/chrome/test/unit/test_bug519468.js |
|
37 +++ b/chrome/test/unit/test_bug519468.js |
|
38 @@ -31,50 +31,90 @@ |
|
39 * decision by deleting the provisions above and replace them with the notice |
|
40 * and other provisions required by the GPL or the LGPL. If you do not delete |
|
41 * the provisions above, a recipient may use your version of this file under |
|
42 * the terms of any one of the MPL, the GPL or the LGPL. |
|
43 * |
|
44 * ***** END LICENSE BLOCK ***** |
|
45 */ |
|
46 |
|
47 +function write_locale(stream, locale, package) { |
|
48 + var s = "locale " + package + " " + locale + " jar:" + locale + ".jar!"; |
|
49 + s += "/locale/" + locale + "/" + package +"/\n"; |
|
50 + stream.write(s, s.length); |
|
51 +} |
|
52 + |
|
53 +var localeService = Cc["@mozilla.org/intl/nslocaleservice;1"] |
|
54 + .getService(Ci.nsILocaleService); |
|
55 + |
|
56 +var systemLocale = localeService.getLocaleComponentForUserAgent(); |
|
57 + |
|
58 +var locales; |
|
59 + |
|
60 +if (systemLocale == "en-US") |
|
61 + locales = [ "en-US", "fr-FR", "de-DE" ]; |
|
62 +else if (systemLocale == "fr-FR") |
|
63 + locales = [ "en-US", systemLocale, "de-DE" ]; |
|
64 +else |
|
65 + locales = [ "en-US", systemLocale, "fr-FR" ]; |
|
66 + |
|
67 +var workingDir = Cc["@mozilla.org/file/directory_service;1"]. |
|
68 + getService(Ci.nsIProperties).get("TmpD", Ci.nsIFile); |
|
69 +var manifest = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile); |
|
70 +manifest.initWithFile(workingDir); |
|
71 +manifest.append("test_bug519468.manifest"); |
|
72 +manifest.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0600); |
|
73 +var stream = Cc["@mozilla.org/network/file-output-stream;1"]. |
|
74 + createInstance(Ci.nsIFileOutputStream); |
|
75 +stream.init(manifest, 0x04 | 0x08 | 0x20, 0600, 0); // write, create, truncate |
|
76 +locales.slice(0,2).forEach(function(l) write_locale(stream, l, "testmatchos")); |
|
77 +write_locale(stream, locales[2], "testnomatchos"); |
|
78 +stream.close(); |
|
79 + |
|
80 var MANIFESTS = [ |
|
81 - do_get_file("data/test_bug519468.manifest") |
|
82 + manifest |
|
83 ]; |
|
84 |
|
85 registerManifests(MANIFESTS); |
|
86 |
|
87 var chromeReg = Cc["@mozilla.org/chrome/chrome-registry;1"] |
|
88 .getService(Ci.nsIXULChromeRegistry) |
|
89 .QueryInterface(Ci.nsIToolkitChromeRegistry); |
|
90 |
|
91 -var localeService = Cc["@mozilla.org/intl/nslocaleservice;1"] |
|
92 - .getService(Ci.nsILocaleService); |
|
93 - |
|
94 var prefService = Cc["@mozilla.org/preferences-service;1"] |
|
95 .getService(Ci.nsIPrefService) |
|
96 .QueryInterface(Ci.nsIPrefBranch); |
|
97 |
|
98 function test_locale(aTest) { |
|
99 prefService.setBoolPref("intl.locale.matchOS", aTest.matchOS); |
|
100 - prefService.setCharPref("general.useragent.locale", aTest.selected || "en-US"); |
|
101 + if (aTest.selected) |
|
102 + prefService.setCharPref("general.useragent.locale", aTest.selected); |
|
103 + else |
|
104 + try { |
|
105 + prefService.clearUserPref("general.useragent.locale"); |
|
106 + } catch(e) {} |
|
107 |
|
108 - var selectedLocale = chromeReg.getSelectedLocale("testmatchos"); |
|
109 + var selectedLocale = chromeReg.getSelectedLocale(aTest.package); |
|
110 do_check_eq(selectedLocale, aTest.locale); |
|
111 } |
|
112 |
|
113 function run_test() |
|
114 { |
|
115 - var systemLocale = localeService.getLocaleComponentForUserAgent(); |
|
116 - |
|
117 var tests = [ |
|
118 - {matchOS: false, selected: null, locale: "en-US"}, |
|
119 {matchOS: true, selected: null, locale: systemLocale}, |
|
120 - {matchOS: true, selected: "fr-FR", locale: systemLocale}, |
|
121 - {matchOS: false, selected: "fr-FR", locale: "fr-FR"}, |
|
122 - {matchOS: true, selected: null, locale: systemLocale} |
|
123 + {matchOS: true, selected: locales[0], locale: locales[0]}, |
|
124 + {matchOS: true, selected: locales[1], locale: locales[1]}, |
|
125 + {matchOS: true, selected: locales[2], locale: locales[0]}, |
|
126 + {matchOS: true, selected: null, locale: locales[2], package: "testnomatchos"}, |
|
127 + {matchOS: false, selected: null, locale: locales[0]}, |
|
128 + {matchOS: false, selected: locales[0], locale: locales[0]}, |
|
129 + {matchOS: false, selected: locales[1], locale: locales[1]}, |
|
130 + {matchOS: false, selected: locales[2], locale: locales[0]}, |
|
131 ]; |
|
132 |
|
133 for (var i = 0; i < tests.length; ++ i) { |
|
134 var test = tests[i]; |
|
135 + if (!test.package) |
|
136 + test.package = "testmatchos"; |
|
137 test_locale(test); |
|
138 } |
|
139 + manifest.remove(false); |
|
140 } |
|