Bug 1522567 - Add cryptomining and fingerprinting protection options to custom content blocking preferences. r=ewright,flod
authorJohann Hofmann <jhofmann@mozilla.com>
Wed, 06 Feb 2019 22:11:57 +0000
changeset 457489 a424fa81316d1240ccc9980505f1f05228b6b99d
parent 457488 d89d983c9a44129e0d884257323ede913aadeeef
child 457490 88a984a7faca9997e38b0161b86d2243b9275fe5
push id77603
push userjhofmann@mozilla.com
push dateWed, 06 Feb 2019 23:07:39 +0000
treeherderautoland@a424fa81316d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersewright, flod
bugs1522567
milestone67.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1522567 - Add cryptomining and fingerprinting protection options to custom content blocking preferences. r=ewright,flod Differential Revision: https://phabricator.services.mozilla.com/D18662
browser/app/profile/firefox.js
browser/components/nsBrowserGlue.js
browser/components/preferences/in-content/privacy.js
browser/components/preferences/in-content/privacy.xul
browser/components/preferences/in-content/tests/browser_contentblocking.js
browser/locales/en-US/browser/preferences/preferences.ftl
browser/themes/shared/controlcenter/cryptominers-disabled.svg
browser/themes/shared/controlcenter/cryptominers.svg
browser/themes/shared/controlcenter/fingerprinters-disabled.svg
browser/themes/shared/controlcenter/fingerprinters.svg
browser/themes/shared/incontentprefs/privacy.css
browser/themes/shared/jar.inc.mn
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1549,16 +1549,19 @@ pref("dom.storage_access.max_concurrent_
 
 // Define a set of default features for the Content Blocking UI.
 pref("browser.contentblocking.trackingprotection.control-center.ui.enabled", true);
 pref("browser.contentblocking.rejecttrackers.control-center.ui.enabled", true);
 
 pref("browser.contentblocking.control-center.ui.showBlockedLabels", true);
 pref("browser.contentblocking.control-center.ui.showAllowedLabels", false);
 
+pref("browser.contentblocking.cryptomining.preferences.ui.enabled", false);
+pref("browser.contentblocking.fingerprinting.preferences.ui.enabled", false);
+
 // Enable the Report Breakage UI on Nightly and Beta but not on Release yet.
 #ifdef EARLY_BETA_OR_EARLIER
 pref("browser.contentblocking.reportBreakage.enabled", true);
 #else
 pref("browser.contentblocking.reportBreakage.enabled", false);
 #endif
 // Show report breakage for tracking cookies in all channels.
 pref("browser.contentblocking.rejecttrackers.reportBreakage.enabled", true);
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -982,18 +982,17 @@ BrowserGlue.prototype = {
     os.removeObserver(this, "profile-before-change");
     os.removeObserver(this, "keyword-search");
     os.removeObserver(this, "browser-search-engine-modified");
     os.removeObserver(this, "flash-plugin-hang");
     os.removeObserver(this, "xpi-signature-changed");
     os.removeObserver(this, "sync-ui-state:update");
     os.removeObserver(this, "shield-init-complete");
 
-    Services.prefs.removeObserver("privacy.trackingprotection.enabled", this._matchCBCategory);
-    Services.prefs.removeObserver("privacy.trackingprotection.pbmode.enabled", this._matchCBCategory);
+    Services.prefs.removeObserver("privacy.trackingprotection", this._matchCBCategory);
     Services.prefs.removeObserver("urlclassifier.trackingTable", this._matchCBCategory);
     Services.prefs.removeObserver("network.cookie.cookieBehavior", this._matchCBCategory);
     Services.prefs.removeObserver(ContentBlockingCategoriesPrefs.PREF_CB_CATEGORY, this._updateCBCategory);
   },
 
   // runs on startup, before the first command line handler is invoked
   // (i.e. before the first window is opened)
   _beforeUIStartup: function BG__beforeUIStartup() {
@@ -1358,18 +1357,18 @@ BrowserGlue.prototype = {
 
     this._firstWindowTelemetry(aWindow);
     this._firstWindowLoaded();
 
     // Set the default favicon size for UI views that use the page-icon protocol.
     PlacesUtils.favicons.setDefaultIconURIPreferredSize(16 * aWindow.devicePixelRatio);
 
     this._matchCBCategory();
-    Services.prefs.addObserver("privacy.trackingprotection.enabled", this._matchCBCategory);
-    Services.prefs.addObserver("privacy.trackingprotection.pbmode.enabled", this._matchCBCategory);
+    // This observes the entire privacy.trackingprotection.* pref tree.
+    Services.prefs.addObserver("privacy.trackingprotection", this._matchCBCategory);
     Services.prefs.addObserver("urlclassifier.trackingTable", this._matchCBCategory);
     Services.prefs.addObserver("network.cookie.cookieBehavior", this._matchCBCategory);
     Services.prefs.addObserver(ContentBlockingCategoriesPrefs.PREF_CB_CATEGORY, this._updateCBCategory);
     Services.prefs.addObserver("media.autoplay.default", this._updateAutoplayPref);
   },
 
   _updateAutoplayPref() {
     let blocked = Services.prefs.getIntPref("media.autoplay.default", 1);
@@ -2991,22 +2990,26 @@ var ContentBlockingCategoriesPrefs = {
   // The prefs inside CATEGORY_PREFS set expected value for each CB category.
   // A null value means that pref is default.
   CATEGORY_PREFS: {
     strict: [
       ["urlclassifier.trackingTable", null],
       ["network.cookie.cookieBehavior", Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER],
       ["privacy.trackingprotection.pbmode.enabled", true],
       ["privacy.trackingprotection.enabled", true],
+      ["privacy.trackingprotection.fingerprinting.enabled", null],
+      ["privacy.trackingprotection.cryptomining.enabled", null],
     ],
     standard: [
       ["urlclassifier.trackingTable", null],
       ["network.cookie.cookieBehavior", null],
       ["privacy.trackingprotection.pbmode.enabled", null],
       ["privacy.trackingprotection.enabled", null],
+      ["privacy.trackingprotection.fingerprinting.enabled", null],
+      ["privacy.trackingprotection.cryptomining.enabled", null],
     ],
   },
   switchingCategory: false,
 
   /**
    * Checks if CB prefs match perfectly with one of our pre-defined categories.
    */
   prefsMatch(category) {
--- a/browser/components/preferences/in-content/privacy.js
+++ b/browser/components/preferences/in-content/privacy.js
@@ -36,19 +36,21 @@ XPCOMUtils.defineLazyGetter(this, "Alert
     alertsService.manualDoNotDisturb;
     return alertsService;
   } catch (ex) {
     return undefined;
   }
 });
 
 Preferences.addAll([
-  // Tracking Protection
+  // Content blocking / Tracking Protection
   { id: "privacy.trackingprotection.enabled", type: "bool" },
   { id: "privacy.trackingprotection.pbmode.enabled", type: "bool" },
+  { id: "privacy.trackingprotection.fingerprinting.enabled", type: "bool" },
+  { id: "privacy.trackingprotection.cryptomining.enabled", type: "bool" },
 
   // Button prefs
   { id: "pref.privacy.disable_button.cookie_exceptions", type: "bool" },
   { id: "pref.privacy.disable_button.view_cookies", type: "bool" },
   { id: "pref.privacy.disable_button.change_blocklist", type: "bool" },
   { id: "pref.privacy.disable_button.tracking_protection_exceptions", type: "bool" },
 
   // Location Bar
@@ -443,16 +445,24 @@ var gPrivacyPane = {
     setEventListener("strictArrow", "command", this.toggleExpansion);
     setEventListener("customArrow", "command", this.toggleExpansion);
 
     Preferences.get("network.cookie.cookieBehavior").on("change",
       gPrivacyPane.readBlockCookies.bind(gPrivacyPane));
     Preferences.get("browser.contentblocking.category").on("change",
       gPrivacyPane.highlightCBCategory);
 
+    let cryptoMinersOption = document.getElementById("contentBlockingCryptominersOption");
+    let fingerprintersOption = document.getElementById("contentBlockingFingerprintersOption");
+
+    cryptoMinersOption.hidden =
+      !Services.prefs.getBoolPref("browser.contentblocking.cryptomining.preferences.ui.enabled");
+    fingerprintersOption.hidden =
+      !Services.prefs.getBoolPref("browser.contentblocking.fingerprinting.preferences.ui.enabled");
+
     this.highlightCBCategory();
     this.readBlockCookies();
 
     let link = document.getElementById("contentBlockingLearnMore");
     let contentBlockingUrl = Services.urlFormatter.formatURLPref("app.support.baseURL") + "content-blocking";
     link.setAttribute("href", contentBlockingUrl);
 
     let contentBlockingTour = Services.urlFormatter.formatURLPref("privacy.trackingprotection.introURL")
--- a/browser/components/preferences/in-content/privacy.xul
+++ b/browser/components/preferences/in-content/privacy.xul
@@ -101,17 +101,17 @@
                 </vbox>
                 <vbox class="content-blocking-warning">
                   <vbox class="indent">
                     <hbox>
                       <image class="content-blocking-warning-image"/>
                       <label class="content-blocking-warning-title" data-l10n-id="content-blocking-warning-title"/>
                     </hbox>
                     <description class="indent">
-                      <html:span class="tail-with-learn-more" data-l10n-id="content-blocking-warning-desc"></html:span>
+                      <html:span class="tail-with-learn-more" data-l10n-id="content-blocking-warning-description"></html:span>
                       <label class="text-link content-blocking-warning-learn-how" data-l10n-id="content-blocking-learn-how"/>
                     </description>
                   </vbox>
                 </vbox>
               </vbox>
             </vbox>
           </vbox>
         <vbox id="contentBlockingOptionCustom" class="tracking-protection-ui content-blocking-category">
@@ -170,24 +170,38 @@
                           <menuitem data-l10n-id="sitedata-option-block-unvisited" value="unvisited"/>
                           <menuitem data-l10n-id="sitedata-option-block-all-third-party" value="all-third-parties"/>
                           <menuitem data-l10n-id="sitedata-option-block-all" value="always"/>
                         </menupopup>
                       </menulist>
                     </hbox>
                   </vbox>
                 </hbox>
+                <hbox class="custom-option" id="contentBlockingCryptominersOption">
+                  <checkbox id="contentBlockingCryptominersCheckbox"
+                            class="content-blocking-checkbox" flex="1"
+                            preference="privacy.trackingprotection.cryptomining.enabled"
+                            data-l10n-id="content-blocking-cryptominers-label"
+                            aria-describedby="contentBlockingCustomDesc"/>
+                </hbox>
+                <hbox class="custom-option" id="contentBlockingFingerprintersOption">
+                  <checkbox id="contentBlockingFingerprintersCheckbox"
+                            class="content-blocking-checkbox" flex="1"
+                            preference="privacy.trackingprotection.fingerprinting.enabled"
+                            data-l10n-id="content-blocking-fingerprinters-label"
+                            aria-describedby="contentBlockingCustomDesc"/>
+                </hbox>
               <vbox class="content-blocking-warning">
                 <vbox class="indent">
                   <hbox>
                     <image class="content-blocking-warning-image"/>
                     <label class="content-blocking-warning-title" data-l10n-id="content-blocking-warning-title"/>
                   </hbox>
                   <description class="indent">
-                    <html:span class="tail-with-learn-more" data-l10n-id="content-blocking-warning-desc"></html:span>
+                    <html:span class="tail-with-learn-more" data-l10n-id="content-blocking-warning-description"></html:span>
                     <label class="text-link content-blocking-warning-learn-how" data-l10n-id="content-blocking-learn-how"/>
                   </description>
                 </vbox>
               </vbox>
             </vbox>
           </vbox>
         </vbox>
       </radiogroup>
--- a/browser/components/preferences/in-content/tests/browser_contentblocking.js
+++ b/browser/components/preferences/in-content/tests/browser_contentblocking.js
@@ -3,16 +3,18 @@
 ChromeUtils.defineModuleGetter(this, "Preferences",
                                "resource://gre/modules/Preferences.jsm");
 
 const TP_PREF = "privacy.trackingprotection.enabled";
 const TP_PBM_PREF = "privacy.trackingprotection.pbmode.enabled";
 const TP_LIST_PREF = "urlclassifier.trackingTable";
 const NCB_PREF = "network.cookie.cookieBehavior";
 const CAT_PREF = "browser.contentblocking.category";
+const FP_PREF = "privacy.trackingprotection.fingerprinting.enabled";
+const CM_PREF = "privacy.trackingprotection.cryptomining.enabled";
 
 requestLongerTimeout(2);
 
 // Tests that the content blocking main category checkboxes have the correct default state.
 add_task(async function testContentBlockingMainCategory() {
   let prefs = [
     [TP_PREF, false],
     [TP_PBM_PREF, true],
@@ -108,16 +110,18 @@ add_task(async function testContentBlock
 
 // Tests that the content blocking "Standard" category radio sets the prefs to their default values.
 add_task(async function testContentBlockingStandardCategory() {
   let prefs = {
     [TP_LIST_PREF]: null,
     [TP_PREF]: null,
     [TP_PBM_PREF]: null,
     [NCB_PREF]: null,
+    [FP_PREF]: null,
+    [CM_PREF]: null,
   };
 
   for (let pref in prefs) {
     switch (Services.prefs.getPrefType(pref)) {
     case Services.prefs.PREF_BOOL:
       prefs[pref] = Services.prefs.getBoolPref(pref);
       break;
     case Services.prefs.PREF_INT:
@@ -130,16 +134,18 @@ add_task(async function testContentBlock
       ok(false, `Unknown pref type for ${pref}`);
     }
   }
 
   Services.prefs.setStringPref(TP_LIST_PREF, "test-track-simple,base-track-digest256,content-track-digest256");
   Services.prefs.setBoolPref(TP_PREF, true);
   Services.prefs.setBoolPref(TP_PBM_PREF, false);
   Services.prefs.setIntPref(NCB_PREF, Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER);
+  Services.prefs.setBoolPref(FP_PREF, true);
+  Services.prefs.setBoolPref(CM_PREF, true);
 
   for (let pref in prefs) {
     switch (Services.prefs.getPrefType(pref)) {
     case Services.prefs.PREF_BOOL:
       // Account for prefs that may have retained their default value
       if (Services.prefs.getBoolPref(pref) != prefs[pref]) {
         ok(Services.prefs.prefHasUserValue(pref), `modified the pref ${pref}`);
       }
@@ -192,23 +198,25 @@ add_task(async function testContentBlock
   // TP prefs are reset async to check for extensions controlling them.
   await TestUtils.waitForCondition(() => Services.prefs.prefHasUserValue(TP_PREF));
 
   is(Services.prefs.getStringPref(CAT_PREF), "strict", `${CAT_PREF} has been set to strict`);
   is(Services.prefs.getBoolPref(TP_PREF), true, `${TP_PREF} has been set to true`);
   is(Services.prefs.getBoolPref(TP_PBM_PREF), true, `${TP_PBM_PREF} has been set to true`);
   is(Services.prefs.getIntPref(NCB_PREF), Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER, `${NCB_PREF} has been set to ${Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER}`);
   ok(!Services.prefs.prefHasUserValue(TP_LIST_PREF), `reset the pref ${TP_LIST_PREF}`);
+  ok(!Services.prefs.prefHasUserValue(FP_PREF), `reset the pref ${FP_PREF}`);
+  ok(!Services.prefs.prefHasUserValue(CM_PREF), `reset the pref ${CM_PREF}`);
 
   gBrowser.removeCurrentTab();
 });
 
 // Tests that the content blocking "Custom" category behaves as expected.
 add_task(async function testContentBlockingCustomCategory() {
-  let prefs = [TP_LIST_PREF, TP_PREF, TP_PBM_PREF, NCB_PREF];
+  let prefs = [TP_LIST_PREF, TP_PREF, TP_PBM_PREF, NCB_PREF, FP_PREF, CM_PREF];
 
   await openPreferencesViaOpenPreferencesAPI("privacy", {leaveOpen: true});
   let doc = gBrowser.contentDocument;
   let strictRadioOption = doc.getElementById("strictRadio");
   let standardRadioOption = doc.getElementById("standardRadio");
   let customRadioOption = doc.getElementById("customRadio");
   let defaults = new Preferences({defaultBranch: true});
 
@@ -229,16 +237,26 @@ add_task(async function testContentBlock
   // Changing the TP_PREF should necessarily set CAT_PREF to "custom"
   Services.prefs.setBoolPref(TP_PREF, false);
   await TestUtils.waitForCondition(() => !Services.prefs.prefHasUserValue(TP_PREF));
   is(Services.prefs.getStringPref(CAT_PREF), "custom", `${CAT_PREF} has been set to custom`);
 
   strictRadioOption.click();
   await TestUtils.waitForCondition(() => Services.prefs.getStringPref(CAT_PREF) == "strict");
 
+  // Changing the FP_PREF and CM_PREF should necessarily set CAT_PREF to "custom"
+  for (let pref of [FP_PREF, CM_PREF]) {
+    Services.prefs.setBoolPref(pref, true);
+    await TestUtils.waitForCondition(() => Services.prefs.prefHasUserValue(pref));
+    is(Services.prefs.getStringPref(CAT_PREF), "custom", `${CAT_PREF} has been set to custom`);
+
+    strictRadioOption.click();
+    await TestUtils.waitForCondition(() => Services.prefs.getStringPref(CAT_PREF) == "strict");
+  }
+
   // Changing the NCB_PREF should necessarily set CAT_PREF to "custom"
   let defaultNCB = defaults.get(NCB_PREF);
   let nonDefaultNCB;
   switch (defaultNCB) {
   case Ci.nsICookieService.BEHAVIOR_ACCEPT:
     nonDefaultNCB = Ci.nsICookieService.BEHAVIOR_REJECT;
     break;
   case Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER:
@@ -286,8 +304,54 @@ add_task(async function testContentBlock
   ];
 
   await openPreferencesViaOpenPreferencesAPI("privacy", {leaveOpen: true});
   let doc = gBrowser.contentDocument;
   checkControlState(doc, disabledControls, false);
 
   gBrowser.removeCurrentTab();
 });
+
+// Checks that cryptomining and fingerprinting visibility can be controlled via pref.
+add_task(async function testCustomOptionsVisibility() {
+  Services.prefs.setBoolPref("browser.contentblocking.cryptomining.preferences.ui.enabled", false);
+  Services.prefs.setBoolPref("browser.contentblocking.fingerprinting.preferences.ui.enabled", false);
+
+  await openPreferencesViaOpenPreferencesAPI("privacy", {leaveOpen: true});
+
+  let doc = gBrowser.contentDocument;
+  let cryptominersOption = doc.getElementById("contentBlockingCryptominersOption");
+  let fingerprintersOption = doc.getElementById("contentBlockingFingerprintersOption");
+
+  ok(cryptominersOption.hidden, "Cryptomining is hidden");
+  ok(fingerprintersOption.hidden, "Fingerprinting is hidden");
+
+  gBrowser.removeCurrentTab();
+
+  Services.prefs.setBoolPref("browser.contentblocking.cryptomining.preferences.ui.enabled", true);
+
+  await openPreferencesViaOpenPreferencesAPI("privacy", {leaveOpen: true});
+
+  doc = gBrowser.contentDocument;
+  cryptominersOption = doc.getElementById("contentBlockingCryptominersOption");
+  fingerprintersOption = doc.getElementById("contentBlockingFingerprintersOption");
+
+  ok(!cryptominersOption.hidden, "Cryptomining is shown");
+  ok(fingerprintersOption.hidden, "Fingerprinting is hidden");
+
+  gBrowser.removeCurrentTab();
+
+  Services.prefs.setBoolPref("browser.contentblocking.fingerprinting.preferences.ui.enabled", true);
+
+  await openPreferencesViaOpenPreferencesAPI("privacy", {leaveOpen: true});
+
+  doc = gBrowser.contentDocument;
+  cryptominersOption = doc.getElementById("contentBlockingCryptominersOption");
+  fingerprintersOption = doc.getElementById("contentBlockingFingerprintersOption");
+
+  ok(!cryptominersOption.hidden, "Cryptomining is shown");
+  ok(!fingerprintersOption.hidden, "Fingerprinting is shown");
+
+  gBrowser.removeCurrentTab();
+
+  Services.prefs.clearUserPref("browser.contentblocking.cryptomining.preferences.ui.enabled");
+  Services.prefs.clearUserPref("browser.contentblocking.fingerprinting.preferences.ui.enabled");
+});
--- a/browser/locales/en-US/browser/preferences/preferences.ftl
+++ b/browser/locales/en-US/browser/preferences/preferences.ftl
@@ -842,17 +842,17 @@ content-blocking-strict-desc = Blocks al
 content-blocking-custom-desc = Choose what to block.
 
 content-blocking-private-trackers = Known trackers only in Private Windows
 content-blocking-third-party-cookies = Third-party tracking cookies
 content-blocking-all-windows-trackers = Known trackers in all windows
 content-blocking-all-third-party-cookies = All third-party cookies
 
 content-blocking-warning-title = Heads up!
-content-blocking-warning-desc = Blocking cookies and trackers can cause some websites to break. It’s easy to disable blocking for sites you trust.
+content-blocking-warning-description = Blocking content can cause some websites to break. It’s easy to disable blocking for sites you trust.
 content-blocking-learn-how = Learn how
 
 content-blocking-trackers-label =
   .label = Trackers
   .accesskey = T
 content-blocking-tracking-protection-option-all-windows =
   .label = In all windows
   .accesskey = A
@@ -860,16 +860,27 @@ content-blocking-option-private =
   .label = Only in Private Windows
   .accesskey = p
 content-blocking-tracking-protection-change-block-list = Change block list
 
 content-blocking-cookies-label =
   .label = Cookies
   .accesskey = C
 
+# Cryptomining refers to using scripts on websites that can use a computer’s resources to mine cryptocurrency without a user’s knowledge.
+content-blocking-cryptominers-label =
+  .label = Cryptominers
+  .accesskey = y
+
+# Browser fingerprinting is a method of tracking users by the configuration and settings information (their "digital fingerprint")
+# that is visible to websites they browse, rather than traditional tracking methods such as IP addresses and unique cookies.
+content-blocking-fingerprinters-label =
+  .label = Fingerprinters
+  .accesskey = F
+
 ## Privacy Section - Tracking
 
 tracking-manage-exceptions =
     .label = Manage Exceptions…
     .accesskey = x
 
 ## Privacy Section - Permissions
 
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/controlcenter/cryptominers-disabled.svg
@@ -0,0 +1,7 @@
+<!-- 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/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="context-fill" fill-opacity="context-fill-opacity">
+  <path d="M14.71 1.29a1 1 0 0 0-1.42 0l-.7.71H9v-.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5V2H5a2 2 0 0 0-1.6.8L2.2 4.4A1 1 0 0 0 3 6h4v1.59l-5.71 5.7a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l12-12a1 1 0 0 0 0-1.42z"/>
+  <path d="M7 14.5a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5V10l-2 2z"/>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/controlcenter/cryptominers.svg
@@ -0,0 +1,6 @@
+<!-- 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/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="context-fill" fill-opacity="context-fill-opacity">
+  <path d="M13 2H9v-.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5V2H5a2 2 0 0 0-1.6.8L2.2 4.4A1 1 0 0 0 3 6h4v8.5a.5.5 0 0 0 .5.5h1a.5.5 0 0 0 .5-.5V6h4z"/>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/controlcenter/fingerprinters-disabled.svg
@@ -0,0 +1,8 @@
+<!-- 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/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="context-fill" fill-opacity="context-fill-opacity">
+  <path d="M14.71 1.29a1 1 0 0 0-1.42 0l-.56.57A7 7 0 0 0 1 7a1 1 0 0 0 2 0 5 5 0 0 1 5-5 5 5 0 0 1 3.31 1.28l-.7.7A4 4 0 0 0 8 3a4 4 0 0 0-4 4 2 2 0 0 1-2 2 1 1 0 0 0 0 2 3.86 3.86 0 0 0 2.33-.75l-3 3a.91.91 0 0 0-.08.13.82.82 0 0 0-.11.17 1.17 1.17 0 0 0-.06.2A.86.86 0 0 0 1 14a.61.61 0 0 0 0 .23.62.62 0 0 0 0 .13v.08a.76.76 0 0 0 .12.19s0 .06.06.09a1 1 0 0 0 1.42 0l12-12a1 1 0 0 0 .11-1.43zM6 7a2 2 0 0 1 2-2 1.94 1.94 0 0 1 1.18.41l-.72.72A.91.91 0 0 0 8 6a1 1 0 0 0-1 1 4.76 4.76 0 0 1-.06.65L5.12 9.47A4.1 4.1 0 0 0 6 7z"/>
+  <path d="M9.68 9.32a8.06 8.06 0 0 1-1.42 2.48 11 11 0 0 0-1.15 1.75 1 1 0 0 0 .44 1.34A.93.93 0 0 0 8 15a1 1 0 0 0 .89-.55 9.74 9.74 0 0 1 1-1.44A8.84 8.84 0 0 0 12 7z"/>
+  <path d="M12.91 6.09A5.5 5.5 0 0 1 13 7a8.24 8.24 0 0 1-1.14 4.28A5.75 5.75 0 0 0 11 14a1 1 0 0 0 2 0 3.91 3.91 0 0 1 .63-1.79A10.18 10.18 0 0 0 15 7a6.81 6.81 0 0 0-.48-2.52z"/>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/controlcenter/fingerprinters.svg
@@ -0,0 +1,8 @@
+<!-- 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/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="context-fill" fill-opacity="context-fill-opacity">
+  <path d="M8 0a7 7 0 0 0-7 7 1 1 0 0 0 2 0 5 5 0 0 1 10 0 8.24 8.24 0 0 1-1.14 4.28A5.75 5.75 0 0 0 11 14a1 1 0 0 0 2 0 3.91 3.91 0 0 1 .63-1.79A10.18 10.18 0 0 0 15 7a7 7 0 0 0-7-7z"/>
+  <path d="M8 3a4 4 0 0 0-4 4 2 2 0 0 1-2 2 1 1 0 0 0 0 2 4 4 0 0 0 4-4 2 2 0 0 1 4 0 6.88 6.88 0 0 1-1.74 4.8 11 11 0 0 0-1.15 1.75 1 1 0 0 0 .44 1.34A.93.93 0 0 0 8 15a1 1 0 0 0 .89-.55 9.74 9.74 0 0 1 1-1.44A8.84 8.84 0 0 0 12 7a4 4 0 0 0-4-4z"/>
+  <path d="M8 6a1 1 0 0 0-1 1c0 4.21-5.26 6-5.32 6.05a1 1 0 0 0-.63 1.27A1 1 0 0 0 2 15a1.25 1.25 0 0 0 .32 0C2.59 14.86 9 12.66 9 7a1 1 0 0 0-1-1z"/>
+</svg>
--- a/browser/themes/shared/incontentprefs/privacy.css
+++ b/browser/themes/shared/incontentprefs/privacy.css
@@ -29,16 +29,31 @@
 #contentBlockingBlockCookiesCheckbox > .checkbox-label-box {
   list-style-image: url("chrome://browser/skin/controlcenter/3rdpartycookies.svg");
 }
 
 #contentBlockingBlockCookiesCheckbox[checked] > .checkbox-label-box {
   list-style-image: url("chrome://browser/skin/controlcenter/3rdpartycookies-disabled.svg");
 }
 
+#contentBlockingCryptominersCheckbox > .checkbox-label-box {
+  list-style-image: url("chrome://browser/skin/controlcenter/cryptominers.svg");
+}
+
+#contentBlockingCryptominersCheckbox[checked] > .checkbox-label-box {
+  list-style-image: url("chrome://browser/skin/controlcenter/cryptominers-disabled.svg");
+}
+
+#contentBlockingFingerprintersCheckbox > .checkbox-label-box {
+  list-style-image: url("chrome://browser/skin/controlcenter/fingerprinters.svg");
+}
+
+#contentBlockingFingerprintersCheckbox[checked] > .checkbox-label-box {
+  list-style-image: url("chrome://browser/skin/controlcenter/fingerprinters-disabled.svg");
+}
 
 .content-blocking-icon,
 .permission-icon {
   -moz-context-properties: fill;
   fill: currentColor;
 }
 
 .content-blocking-icon[disabled] {
--- a/browser/themes/shared/jar.inc.mn
+++ b/browser/themes/shared/jar.inc.mn
@@ -22,18 +22,22 @@
   skin/classic/browser/addons/addon-install-error.svg          (../shared/addons/addon-install-error.svg)
   skin/classic/browser/addons/addon-install-installed.svg      (../shared/addons/addon-install-installed.svg)
   skin/classic/browser/addons/addon-install-warning.svg        (../shared/addons/addon-install-warning.svg)
   skin/classic/browser/addons/addon-private-browsing.svg       (../shared/addons/addon-private-browsing.svg)
   skin/classic/browser/controlcenter/3rdpartycookies.svg       (../shared/controlcenter/3rdpartycookies.svg)
   skin/classic/browser/controlcenter/3rdpartycookies-disabled.svg (../shared/controlcenter/3rdpartycookies-disabled.svg)
   skin/classic/browser/controlcenter/conn-not-secure.svg       (../shared/controlcenter/conn-not-secure.svg)
   skin/classic/browser/controlcenter/connection.svg            (../shared/controlcenter/connection.svg)
+  skin/classic/browser/controlcenter/cryptominers.svg          (../shared/controlcenter/cryptominers.svg)
+  skin/classic/browser/controlcenter/cryptominers-disabled.svg (../shared/controlcenter/cryptominers-disabled.svg)
   skin/classic/browser/controlcenter/mcb-disabled.svg          (../shared/controlcenter/mcb-disabled.svg)
   skin/classic/browser/controlcenter/extension.svg             (../shared/controlcenter/extension.svg)
+  skin/classic/browser/controlcenter/fingerprinters.svg        (../shared/controlcenter/fingerprinters.svg)
+  skin/classic/browser/controlcenter/fingerprinters-disabled.svg (../shared/controlcenter/fingerprinters-disabled.svg)
   skin/classic/browser/controlcenter/info.svg                  (../shared/controlcenter/info.svg)
   skin/classic/browser/controlcenter/permissions.svg           (../shared/controlcenter/permissions.svg)
   skin/classic/browser/controlcenter/trackers.svg              (../shared/controlcenter/trackers.svg)
   skin/classic/browser/controlcenter/trackers-disabled.svg     (../shared/controlcenter/trackers-disabled.svg)
   skin/classic/browser/controlcenter/tracking-protection.svg   (../shared/controlcenter/tracking-protection.svg)
   skin/classic/browser/controlcenter/warning.svg               (../shared/controlcenter/warning.svg)
   skin/classic/browser/customizableui/empty-overflow-panel.png     (../shared/customizableui/empty-overflow-panel.png)
   skin/classic/browser/customizableui/empty-overflow-panel@2x.png  (../shared/customizableui/empty-overflow-panel@2x.png)