From 7da96b1ab28e2e0e9e61bb4b3d7645a2d31e36cb Mon Sep 17 00:00:00 2001
From: ohfp <1813007-ohfp@users.noreply.gitlab.com>
Date: Tue, 12 Apr 2022 11:57:53 +0200
Subject: [PATCH 1/2] port pref-pane patch changes to gecko-dev
---
browser/components/preferences/jar.mn | 1 +
.../preferences/librewolf.inc.xhtml | 254 +++++++++++++++++
browser/components/preferences/librewolf.js | 260 ++++++++++++++++++
browser/components/preferences/preferences.js | 2 +
.../components/preferences/preferences.xhtml | 13 +
.../en-US/browser/preferences/preferences.ftl | 90 ++++++
browser/themes/shared/jar.inc.mn | 2 +
.../shared/preferences/category-librewolf.svg | 96 +++++++
.../themes/shared/preferences/librewolf.css | 23 ++
.../themes/shared/preferences/preferences.css | 4 +
10 files changed, 745 insertions(+)
create mode 100644 browser/components/preferences/librewolf.inc.xhtml
create mode 100644 browser/components/preferences/librewolf.js
create mode 100644 browser/themes/shared/preferences/category-librewolf.svg
create mode 100644 browser/themes/shared/preferences/librewolf.css
diff --git a/browser/components/preferences/jar.mn b/browser/components/preferences/jar.mn
index 752b0b2ae3d2..0aa6f606b851 100644
--- a/browser/components/preferences/jar.mn
+++ b/browser/components/preferences/jar.mn
@@ -11,6 +11,7 @@ browser.jar:
content/browser/preferences/home.js
content/browser/preferences/search.js
content/browser/preferences/privacy.js
+ content/browser/preferences/librewolf.js
content/browser/preferences/containers.js
content/browser/preferences/sync.js
content/browser/preferences/experimental.js
diff --git a/browser/components/preferences/librewolf.inc.xhtml b/browser/components/preferences/librewolf.inc.xhtml
new file mode 100644
index 000000000000..7a582fb9bb0c
--- /dev/null
+++ b/browser/components/preferences/librewolf.inc.xhtml
@@ -0,0 +1,254 @@
+# 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/.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/browser/components/preferences/librewolf.js b/browser/components/preferences/librewolf.js
new file mode 100644
index 000000000000..23395f027a50
--- /dev/null
+++ b/browser/components/preferences/librewolf.js
@@ -0,0 +1,260 @@
+/* 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/. */
+
+/* import-globals-from extensionControlled.js */
+/* import-globals-from preferences.js */
+
+var { AppConstants } = ChromeUtils.import( "resource://gre/modules/AppConstants.jsm");
+XPCOMUtils.defineLazyGetter(this, "L10n", () => {
+ return new Localization([
+ "branding/brand.ftl",
+ "browser/locales/en-US/browser/preferences/preferences.ftl",
+ ]);
+});
+
+Preferences.addAll([
+ // IPv6
+ { id: "network.dns.disableIPv6", type: "bool" },
+ // ocsp hard-fail
+ { id: "security.OCSP.require", type: "bool" },
+ // ocsp hard-fail
+ { id: "identity.fxaccounts.enabled", type: "bool" },
+ // WebGL
+ { id: "webgl.disabled", type: "bool" },
+ // RFP
+ { id: "privacy.resistFingerprinting", type: "bool" },
+ // Automatically Update Extensions
+ { id: "extensions.update.enabled", type: "bool" },
+ { id: "extensions.update.autoUpdateDefault", type: "bool" },
+ // Clipboard autocopy/paste
+ { id: "clipboard.autocopy", type: "bool" },
+ { id: "middlemouse.paste", type: "bool" },
+ // XOrigin referrers
+ { id: "network.http.referer.XOriginPolicy", type: "int"},
+ // Harden
+ { id: "privacy.resistFingerprinting.letterboxing", type: "bool" },
+ // Google Safe Browsing
+ //{ id: "browser.safebrowsing.malware.enabled", type: "bool" }, // Already loaded
+ //{ id: "browser.safebrowsing.phishing.enabled", type: "bool" },
+ { id: "browser.safebrowsing.blockedURIs.enabled", type: "bool" },
+ { id: "browser.safebrowsing.provider.google4.gethashURL", type: "string" },
+ { id: "browser.safebrowsing.provider.google4.updateURL", type: "string" },
+ { id: "browser.safebrowsing.provider.google.gethashURL", type: "string" },
+ { id: "browser.safebrowsing.provider.google.updateURL", type: "string" },
+ /**** Prefs that require changing a lockPref ****/
+ // Google safe browsing check downloads
+ //{ id: "browser.safebrowsing.downloads.enabled", type: "bool" }, //Also already added
+ { id: "toolkit.legacyUserProfileCustomizations.stylesheets", type: "bool" },
+ // Canvas UI when blocked
+ { id: "privacy.resistFingerprinting.autoDeclineNoUserInputCanvasPrompts", type: "bool" },
+]);
+
+var gLibrewolfPane = {
+ _pane: null,
+
+ // called when the document is first parsed
+ init() {
+ this._pane = document.getElementById("paneLibrewolf");
+
+ // Set all event listeners on checkboxes
+ setBoolSyncListeners(
+ "librewolf-extension-update-checkbox",
+ ["extensions.update.autoUpdateDefault", "extensions.update.enabled"],
+ [true, true ],
+ );
+ setBoolSyncListeners(
+ "librewolf-ipv6-checkbox",
+ ["network.dns.disableIPv6"],
+ [false, ],
+ );
+ setBoolSyncListeners(
+ "librewolf-ocsp-checkbox",
+ ["security.OCSP.require"],
+ [true, ],
+ );
+ setBoolSyncListeners(
+ "librewolf-sync-checkbox",
+ ["identity.fxaccounts.enabled"],
+ [true, ],
+ );
+ setBoolSyncListeners(
+ "librewolf-autocopy-checkbox",
+ ["clipboard.autocopy", "middlemouse.paste"],
+ [true, true ],
+ );
+ setBoolSyncListeners(
+ "librewolf-styling-checkbox",
+ ["toolkit.legacyUserProfileCustomizations.stylesheets"],
+ [true, ],
+ );
+
+ setBoolSyncListeners(
+ "librewolf-webgl-checkbox",
+ ["webgl.disabled"],
+ [false ],
+ );
+ setBoolSyncListeners(
+ "librewolf-rfp-checkbox",
+ ["privacy.resistFingerprinting"],
+ [true ],
+ );
+ setBoolSyncListeners(
+ "librewolf-auto-decline-canvas-checkbox",
+ ["privacy.resistFingerprinting.autoDeclineNoUserInputCanvasPrompts"],
+ [true ],
+ );
+
+ setBoolSyncListeners(
+ "librewolf-letterboxing-checkbox",
+ ["privacy.resistFingerprinting.letterboxing"],
+ [true ],
+ );
+
+ setSyncListeners(
+ "librewolf-goog-safe-checkbox",
+ [
+ "browser.safebrowsing.malware.enabled",
+ "browser.safebrowsing.phishing.enabled",
+ "browser.safebrowsing.blockedURIs.enabled",
+ "browser.safebrowsing.provider.google4.gethashURL",
+ "browser.safebrowsing.provider.google4.updateURL",
+ "browser.safebrowsing.provider.google.gethashURL",
+ "browser.safebrowsing.provider.google.updateURL",
+ ],
+ [
+ true,
+ true,
+ true,
+ "https://safebrowsing.googleapis.com/v4/fullHashes:find?$ct=application/x-protobuf&key=%GOOGLE_SAFEBROWSING_API_KEY%&$httpMethod=POST",
+ "https://safebrowsing.googleapis.com/v4/threatListUpdates:fetch?$ct=application/x-protobuf&key=%GOOGLE_SAFEBROWSING_API_KEY%&$httpMethod=POST",
+ "https://safebrowsing.google.com/safebrowsing/gethash?client=SAFEBROWSING_ID&appver=%MAJOR_VERSION%&pver=2.2",
+ "https://safebrowsing.google.com/safebrowsing/downloads?client=SAFEBROWSING_ID&appver=%MAJOR_VERSION%&pver=2.2&key=%GOOGLE_SAFEBROWSING_API_KEY%",
+ ],
+ [
+ false,
+ false,
+ false,
+ "",
+ "",
+ "",
+ "",
+ ]
+ );
+
+ Preferences.get("network.http.referer.XOriginPolicy").on("change", syncXOriginPolicy(Preferences.get("network.http.referer.XOriginPolicy")));
+
+ // Set event listener on open profile directory button
+ setEventListener("librewolf-open-profile", "command", openProfileDirectory);
+ // Set event listener on open about:config button
+ setEventListener("librewolf-config-link", "click", openAboutConfig);
+
+ // Notify observers that the UI is now ready
+ Services.obs.notifyObservers(window, "librewolf-pane-loaded");
+ },
+};
+
+function syncXOriginPolicy(prefValue) {
+ if (prefValue == "0" || prefValue == "1") {
+ Services.prefs.setIntPref("network.http.referer.XOriginPolicy", 2);
+ } else {
+ Services.prefs.setIntPref("network.http.referer.XOriginPolicy", 0);
+ }
+}
+
+function openProfileDirectory() {
+ // Get the profile directory.
+ let currProfD = Services.dirsvc.get("ProfD", Ci.nsIFile);
+ let profileDir = currProfD.path;
+
+ // Show the profile directory.
+ let nsLocalFile = Components.Constructor(
+ "@mozilla.org/file/local;1",
+ "nsIFile",
+ "initWithPath"
+ );
+ new nsLocalFile(profileDir).reveal();
+}
+
+function openAboutConfig() {
+ window.open("about:config", "_blank");
+}
+
+function setBoolSyncListeners(checkboxid, opts, vals) {
+ setSyncFromPrefListener(checkboxid, () => readGenericBoolPrefs(opts, vals));
+ setSyncToPrefListener(checkboxid, () => writeGenericBoolPrefs(opts, vals, document.getElementById(checkboxid).checked));
+ for (let i = 1; i < opts.length; i++) {
+ Preferences.get(opts[i]).on("change", () => makeMasterCheckboxesReactive(checkboxid, () => readGenericBoolPrefs(opts, vals)));
+ }
+}
+function setSyncListeners(checkboxid, opts, onVals, offVals) {
+ setSyncFromPrefListener(checkboxid, () => readGenericPrefs(opts, onVals, offVals));
+ setSyncToPrefListener(checkboxid, () => writeGenericPrefs(opts, onVals, offVals, document.getElementById(checkboxid).checked));
+ for (let i = 1; i < opts.length; i++) {
+ Preferences.get(opts[i]).on("change", () => makeMasterCheckboxesReactive(checkboxid, () => readGenericPrefs(opts, onVals, offVals)));
+ }
+}
+
+function makeMasterCheckboxesReactive(checkboxid, func) {
+ let shouldBeChecked = func();
+ document.getElementById(checkboxid).checked = shouldBeChecked;
+}
+
+// Wrapper function in case something more is required (as I suspected in the first iteration of this)
+function getPref(pref) {
+ let retval = Preferences.get(pref);
+/* if (retval === undefined) {
+ return defaultValue;
+ } */
+ return retval._value;
+}
+// Returns true if all the preferences in prefs are equal to onVals, false otherwise TODO may need a third array for their default values because mozilla is dumb, after testing though pretty sure this was misinformation being spread by comments in default FF code that has long since been fixed
+function readGenericBoolPrefs(prefs, onVals) {
+ for (let i = 0; i < prefs.length; i++) {
+ if (getPref(prefs[i]) != onVals[i]) {
+ return false;
+ }
+ }
+ return true;
+}
+function writeGenericBoolPrefs(opts, vals, changeToOn) {
+ valsCopy = [...vals];
+ if (!changeToOn) {
+ for (let i = 0; i < vals.length; i++) {
+ valsCopy[i] = !vals[i];
+ }
+ }
+ // Start at 1 because returning sets the last one
+ for (let i = 1; i < vals.length; i++) {
+ Services.prefs.setBoolPref(opts[i], valsCopy[i]);
+ }
+ return valsCopy[0];
+}
+
+// Returns true if all the preferences in prefs are equal to onVals, false otherwise... currently the same as for Bool as offVals is ignored
+function readGenericPrefs(prefs, onVals, offVals) {
+ for (let i = 0; i < prefs.length; i ++) {
+ let temp = getPref(prefs[i]);
+ if (getPref(prefs[i]) != onVals[i]) {
+ return false;
+ }
+ }
+ return true;
+}
+function writeGenericPrefs(opts, onVals, offVals, changeToOn) {
+ let writeArr = (changeToOn) ? onVals : offVals;
+ for (let i = 1; i < opts.length; i++) {
+ let type = typeof(writeArr[i]);
+ if (type == "number") {
+ Services.prefs.setIntPref(opts[i], writeArr[i]);
+ } else if (type == "boolean") {
+ Services.prefs.setBoolPref(opts[i], writeArr[i]);
+ } else if (type == "string") {
+ Services.prefs.setCharPref(opts[i], writeArr[i]);
+ } else {
+ console.log("BADNESS 10000");
+ }
+ }
+ return writeArr[0];
+}
+
diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js
index f6dc2b3781f8..7d401fc63219 100644
--- a/browser/components/preferences/preferences.js
+++ b/browser/components/preferences/preferences.js
@@ -8,6 +8,7 @@
/* import-globals-from search.js */
/* import-globals-from containers.js */
/* import-globals-from privacy.js */
+/* import-globals-from librewolf.js */
/* import-globals-from sync.js */
/* import-globals-from experimental.js */
/* import-globals-from moreFromMozilla.js */
@@ -191,6 +192,7 @@ function init_all() {
register_module("paneHome", gHomePane);
register_module("paneSearch", gSearchPane);
register_module("panePrivacy", gPrivacyPane);
+ register_module("paneLibrewolf", gLibrewolfPane);
register_module("paneContainers", gContainersPane);
if (Services.prefs.getBoolPref("browser.preferences.experimental")) {
// Set hidden based on previous load's hidden value.
diff --git a/browser/components/preferences/preferences.xhtml b/browser/components/preferences/preferences.xhtml
index 81059f3d2e01..d815682d68bc 100644
--- a/browser/components/preferences/preferences.xhtml
+++ b/browser/components/preferences/preferences.xhtml
@@ -13,6 +13,7 @@
+
@@ -129,6 +130,17 @@
+
+
+
+
+
+
+
+-->
+
+
+
diff --git a/browser/themes/shared/preferences/librewolf.css b/browser/themes/shared/preferences/librewolf.css
new file mode 100644
index 000000000000..12f926ab7018
--- /dev/null
+++ b/browser/themes/shared/preferences/librewolf.css
@@ -0,0 +1,23 @@
+.librewolf-collapse > input {
+ display: none;
+}
+.librewolf-collapse > input ~ .librewolf-collapsed {
+ display: none;
+ /* max-height: 0; */
+ transition: max-height 0.25s ease-in-out;
+}
+.librewolf-collapse > input:checked ~ .librewolf-collapsed {
+ display: block;
+ /* max-height: 20rem; */
+}
+.librewolf-warning {
+ display: inline;
+ font-size: 0.8em;
+}
+.librewolf-button-icon {
+ width: 16px;
+ height: 16px;
+ margin-right: 8px;
+ -moz-context-properties: fill, fill-opacity;
+ fill: currentColor;
+}
diff --git a/browser/themes/shared/preferences/preferences.css b/browser/themes/shared/preferences/preferences.css
index 8b110d3eed52..801b1835a7a4 100644
--- a/browser/themes/shared/preferences/preferences.css
+++ b/browser/themes/shared/preferences/preferences.css
@@ -222,6 +222,10 @@ checkbox {
list-style-image: url("chrome://browser/skin/preferences/category-privacy-security.svg");
}
+#category-librewolf > .category-icon {
+ list-style-image: url("chrome://browser/skin/preferences/category-librewolf.svg");
+}
+
#category-sync > .category-icon {
list-style-image: url("chrome://browser/skin/preferences/category-sync.svg");
}
--
2.35.1
From 05a4e5c148f53263b65577724ab857b16b516673 Mon Sep 17 00:00:00 2001
From: ohfp <1813007-ohfp@users.noreply.gitlab.com>
Date: Thu, 14 Apr 2022 10:28:41 +0200
Subject: [PATCH 2/2] fix xorigin pref init and handling
---
.../preferences/librewolf.inc.xhtml | 4 +-
browser/components/preferences/librewolf.js | 48 ++++++++++++-------
.../en-US/browser/preferences/preferences.ftl | 2 +-
3 files changed, 33 insertions(+), 21 deletions(-)
diff --git a/browser/components/preferences/librewolf.inc.xhtml b/browser/components/preferences/librewolf.inc.xhtml
index 7a582fb9bb0c..c2dfea6d0858 100644
--- a/browser/components/preferences/librewolf.inc.xhtml
+++ b/browser/components/preferences/librewolf.inc.xhtml
@@ -105,7 +105,7 @@
-
+
@@ -113,7 +113,7 @@
-
+
diff --git a/browser/components/preferences/librewolf.js b/browser/components/preferences/librewolf.js
index 23395f027a50..95c5dbb48291 100644
--- a/browser/components/preferences/librewolf.js
+++ b/browser/components/preferences/librewolf.js
@@ -9,17 +9,17 @@ var { AppConstants } = ChromeUtils.import( "resource://gre/modules/AppConstants.
XPCOMUtils.defineLazyGetter(this, "L10n", () => {
return new Localization([
"branding/brand.ftl",
- "browser/locales/en-US/browser/preferences/preferences.ftl",
+ "browser/preferences/preferences.ftl",
]);
});
Preferences.addAll([
- // IPv6
- { id: "network.dns.disableIPv6", type: "bool" },
- // ocsp hard-fail
- { id: "security.OCSP.require", type: "bool" },
- // ocsp hard-fail
- { id: "identity.fxaccounts.enabled", type: "bool" },
+ // IPv6
+ { id: "network.dns.disableIPv6", type: "bool" },
+ // ocsp hard-fail
+ { id: "security.OCSP.require", type: "bool" },
+ // ocsp hard-fail
+ { id: "identity.fxaccounts.enabled", type: "bool" },
// WebGL
{ id: "webgl.disabled", type: "bool" },
// RFP
@@ -31,7 +31,7 @@ Preferences.addAll([
{ id: "clipboard.autocopy", type: "bool" },
{ id: "middlemouse.paste", type: "bool" },
// XOrigin referrers
- { id: "network.http.referer.XOriginPolicy", type: "int"},
+ { id: "network.http.referer.XOriginPolicy", type: "int" },
// Harden
{ id: "privacy.resistFingerprinting.letterboxing", type: "bool" },
// Google Safe Browsing
@@ -47,7 +47,10 @@ Preferences.addAll([
//{ id: "browser.safebrowsing.downloads.enabled", type: "bool" }, //Also already added
{ id: "toolkit.legacyUserProfileCustomizations.stylesheets", type: "bool" },
// Canvas UI when blocked
- { id: "privacy.resistFingerprinting.autoDeclineNoUserInputCanvasPrompts", type: "bool" },
+ {
+ id: "privacy.resistFingerprinting.autoDeclineNoUserInputCanvasPrompts",
+ type: "bool",
+ },
]);
var gLibrewolfPane = {
@@ -142,7 +145,12 @@ var gLibrewolfPane = {
]
);
- Preferences.get("network.http.referer.XOriginPolicy").on("change", syncXOriginPolicy(Preferences.get("network.http.referer.XOriginPolicy")));
+ setXOriginPolicySyncListeners(
+ "librewolf-xorigin-ref-checkbox",
+ "network.http.referer.XOriginPolicy",
+ [1, 2],
+ [0]
+ );
// Set event listener on open profile directory button
setEventListener("librewolf-open-profile", "command", openProfileDirectory);
@@ -154,12 +162,16 @@ var gLibrewolfPane = {
},
};
-function syncXOriginPolicy(prefValue) {
- if (prefValue == "0" || prefValue == "1") {
- Services.prefs.setIntPref("network.http.referer.XOriginPolicy", 2);
- } else {
- Services.prefs.setIntPref("network.http.referer.XOriginPolicy", 0);
- }
+function setXOriginPolicySyncListeners(checkboxid, pref, onVals, offVals) {
+ setSyncFromPrefListener(checkboxid, () => onVals.includes(getPref(pref)));
+ setSyncToPrefListener(checkboxid, () =>
+ writeGenericPrefs([pref], [2], [0], document.getElementById(checkboxid).checked)
+ );
+ Preferences.get(pref).on("change", () =>
+ makeMasterCheckboxesReactive(checkboxid, () =>
+ onVals.includes(getPref(pref))
+ )
+ );
}
function openProfileDirectory() {
@@ -196,13 +208,13 @@ function setSyncListeners(checkboxid, opts, onVals, offVals) {
}
function makeMasterCheckboxesReactive(checkboxid, func) {
- let shouldBeChecked = func();
+ const shouldBeChecked = func();
document.getElementById(checkboxid).checked = shouldBeChecked;
}
// Wrapper function in case something more is required (as I suspected in the first iteration of this)
function getPref(pref) {
- let retval = Preferences.get(pref);
+ const retval = Preferences.get(pref);
/* if (retval === undefined) {
return defaultValue;
} */
diff --git a/browser/locales/en-US/browser/preferences/preferences.ftl b/browser/locales/en-US/browser/preferences/preferences.ftl
index 40fdfefd7e52..bfde1423dc1a 100644
--- a/browser/locales/en-US/browser/preferences/preferences.ftl
+++ b/browser/locales/en-US/browser/preferences/preferences.ftl
@@ -1401,7 +1401,7 @@ librewolf-ipv6-checkbox =
.label = Enable IPv6
librewolf-privacy-heading = Privacy
-librewolf-xorigin-ref-checbox =
+librewolf-xorigin-ref-checkbox =
.label = Limit cross-origin referrers
librewolf-broken-heading = Fingerprinting
--
2.35.1