mozilla-ua-locale-pref.patch
changeset 76 93fb7400b957
parent 75 4708409c896c
child 77 f2df98836e17
equal deleted inserted replaced
75:4708409c896c 76:93fb7400b957
     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  }