Bug 1039069 - Show a hint of the change of the preferred language list. r=mconley
MozReview-Commit-ID: LHyXmdnyf3N
--- 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">