Bug 1039069 - Show a hint of the change of the preferred language list. r=mconley draft
authorChung-Sheng Fu <cfu@mozilla.com>
Tue, 24 Oct 2017 16:28:53 +0800
changeset 706240 e8b5a7e79312f73809c22f21c06eedacf167f7d1
parent 706239 6c55e1fca3448653895c9f78d7b412dd4ca785c4
child 706241 7fe673023498db52b97f111bf58528d9144f9106
push id91750
push userbmo:cfu@mozilla.com
push dateFri, 01 Dec 2017 15:12:32 +0000
reviewersmconley
bugs1039069
milestone59.0a1
Bug 1039069 - Show a hint of the change of the preferred language list. r=mconley MozReview-Commit-ID: LHyXmdnyf3N
browser/components/preferences/languages.js
browser/components/preferences/languages.xul
browser/locales/en-US/chrome/browser/preferences/languages.dtd
--- a/browser/components/preferences/languages.js
+++ b/browser/components/preferences/languages.js
@@ -1,13 +1,15 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
+Components.utils.import("resource://gre/modules/Services.jsm");
+
 var gLanguagesDialog = {
 
   _availableLanguagesList: [],
   _acceptLanguages: { },
 
   _selectedItemID: null,
 
   init() {
@@ -144,26 +146,32 @@ var gLanguagesDialog = {
       this._acceptLanguages[languages[i]] = true;
     }
 
     if (this._activeLanguages.childNodes.length > 0) {
       this._activeLanguages.ensureIndexIsVisible(selectedIndex);
       this._activeLanguages.selectedIndex = selectedIndex;
     }
 
+    // Update states of accept-language list and buttons according to
+    // privacy.resistFingerprinting and privacy.spoof_english.
+    this.readSpoofEnglish();
+
     return undefined;
   },
 
   writeAcceptLanguages() {
     return undefined;
   },
 
   onAvailableLanguageSelect() {
+    var availableLanguages = this._availableLanguages;
     var addButton = document.getElementById("addButton");
-    addButton.disabled = false;
+    addButton.disabled = availableLanguages.disabled ||
+                         availableLanguages.selectedIndex < 0;
 
     this._availableLanguages.removeAttribute("accesskey");
   },
 
   addLanguage() {
     var selectedID = this._availableLanguages.selectedItem.id;
     var preference = document.getElementById("intl.accept_languages");
     var arrayOfPrefs = preference.value.toLowerCase().split(/\s*,\s*/);
@@ -286,11 +294,45 @@ var gLanguagesDialog = {
       downButton.disabled = this._activeLanguages.selectedIndex == this._activeLanguages.childNodes.length - 1;
       removeButton.disabled = false;
       break;
     default:
       upButton.disabled = true;
       downButton.disabled = true;
       removeButton.disabled = false;
     }
+  },
+
+  readSpoofEnglish() {
+    var checkbox = document.getElementById("spoofEnglish");
+    var resistFingerprinting = Services.prefs.getBoolPref("privacy.resistFingerprinting");
+    if (!resistFingerprinting) {
+      checkbox.hidden = true;
+      return false;
+    }
+
+    var spoofEnglish = document.getElementById("privacy.spoof_english").value;
+    var activeLanguages = this._activeLanguages;
+    var availableLanguages = this._availableLanguages;
+    checkbox.hidden = false;
+    switch (spoofEnglish) {
+    case 1: // don't spoof intl.accept_lanauges
+      activeLanguages.disabled = false;
+      activeLanguages.selectItem(activeLanguages.firstChild);
+      availableLanguages.disabled = false;
+      this.onAvailableLanguageSelect();
+      return false;
+    case 2: // spoof intl.accept_lanauges
+      activeLanguages.clearSelection();
+      activeLanguages.disabled = true;
+      availableLanguages.disabled = true;
+      this.onAvailableLanguageSelect();
+      return true;
+    default: // will prompt for spoofing intl.accept_lanauges if resisting fingerprinting
+      return false;
+    }
+  },
+
+  writeSpoofEnglish() {
+    return document.getElementById("spoofEnglish").checked ? 2 : 1;
   }
 };
 
--- a/browser/components/preferences/languages.xul
+++ b/browser/components/preferences/languages.xul
@@ -35,28 +35,36 @@
                   name="pref.browser.language.disable_button.up"
                   type="bool"/>
       <preference id="pref.browser.language.disable_button.down"
                   name="pref.browser.language.disable_button.down"
                   type="bool"/>
       <preference id="pref.browser.language.disable_button.remove"
                   name="pref.browser.language.disable_button.remove"
                   type="bool"/>
+      <preference id="privacy.spoof_english"
+                  name="privacy.spoof_english"
+                  type="int"/>
     </preferences>
 
     <script type="application/javascript" src="chrome://browser/content/preferences/languages.js"/>
 
     <stringbundleset id="languageSet">
       <stringbundle id="bundleRegions"      src="chrome://global/locale/regionNames.properties"/>
       <stringbundle id="bundleLanguages"    src="chrome://global/locale/languageNames.properties"/>
       <stringbundle id="bundlePreferences"  src="chrome://browser/locale/preferences/preferences.properties"/>
       <stringbundle id="bundleAccepted"     src="resource://gre/res/language.properties"/>
     </stringbundleset>
 
     <description>&languages.customize2.description;</description>
+    <checkbox id="spoofEnglish"
+              label="&languages.customize.spoofEnglish;"
+              preference="privacy.spoof_english"
+              onsyncfrompreference="return gLanguagesDialog.readSpoofEnglish();"
+              onsynctopreference="return gLanguagesDialog.writeSpoofEnglish();"/>
     <grid flex="1">
       <columns>
         <column flex="1"/>
         <column/>
       </columns>
       <rows>
         <row flex="1">
           <listbox id="activeLanguages" flex="1" rows="6"
--- a/browser/locales/en-US/chrome/browser/preferences/languages.dtd
+++ b/browser/locales/en-US/chrome/browser/preferences/languages.dtd
@@ -10,9 +10,9 @@
 <!ENTITY languages.customize.moveUp.accesskey           "U">
 <!ENTITY languages.customize.moveDown.label             "Move Down">
 <!ENTITY languages.customize.moveDown.accesskey         "D">
 <!ENTITY languages.customize.deleteButton.label         "Remove">
 <!ENTITY languages.customize.deleteButton.accesskey     "R">
 <!ENTITY languages.customize.selectLanguage.label       "Select a language to add…">
 <!ENTITY languages.customize.addButton.label            "Add">
 <!ENTITY languages.customize.addButton.accesskey        "A">
-
+<!ENTITY languages.customize.spoofEnglish               "Request English versions of web pages for enhanced privacy">