mozilla-ua-locale-pref.patch
branchmozilla-1.9.2
changeset 57 fee8a3636d4a
child 58 e0951c708771
equal deleted inserted replaced
56:6c1feeed3314 57:fee8a3636d4a
       
     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  }