diff options
Diffstat (limited to 'application/basilisk/base/content/browser-trackingprotection.js')
-rw-r--r-- | application/basilisk/base/content/browser-trackingprotection.js | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/application/basilisk/base/content/browser-trackingprotection.js b/application/basilisk/base/content/browser-trackingprotection.js new file mode 100644 index 000000000..20917a083 --- /dev/null +++ b/application/basilisk/base/content/browser-trackingprotection.js @@ -0,0 +1,177 @@ +/* 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/. */ + +var TrackingProtection = { + // If the user ignores the doorhanger, we stop showing it after some time. + PREF_ENABLED_GLOBALLY: "privacy.trackingprotection.enabled", + PREF_ENABLED_IN_PRIVATE_WINDOWS: "privacy.trackingprotection.pbmode.enabled", + enabledGlobally: false, + enabledInPrivateWindows: false, + container: null, + content: null, + icon: null, + activeTooltipText: null, + disabledTooltipText: null, + + init() { + let $ = selector => document.querySelector(selector); + this.container = $("#tracking-protection-container"); + this.content = $("#tracking-protection-content"); + this.icon = $("#tracking-protection-icon"); + + this.updateEnabled(); + Services.prefs.addObserver(this.PREF_ENABLED_GLOBALLY, this, false); + Services.prefs.addObserver(this.PREF_ENABLED_IN_PRIVATE_WINDOWS, this, false); + + this.activeTooltipText = + gNavigatorBundle.getString("trackingProtection.icon.activeTooltip"); + this.disabledTooltipText = + gNavigatorBundle.getString("trackingProtection.icon.disabledTooltip"); + + this.enabledHistogramAdd(this.enabledGlobally); + this.disabledPBMHistogramAdd(!this.enabledInPrivateWindows); + }, + + uninit() { + Services.prefs.removeObserver(this.PREF_ENABLED_GLOBALLY, this); + Services.prefs.removeObserver(this.PREF_ENABLED_IN_PRIVATE_WINDOWS, this); + }, + + observe() { + this.updateEnabled(); + }, + + get enabled() { + return this.enabledGlobally || + (this.enabledInPrivateWindows && + PrivateBrowsingUtils.isWindowPrivate(window)); + }, + + updateEnabled() { + this.enabledGlobally = + Services.prefs.getBoolPref(this.PREF_ENABLED_GLOBALLY); + this.enabledInPrivateWindows = + Services.prefs.getBoolPref(this.PREF_ENABLED_IN_PRIVATE_WINDOWS); + this.container.hidden = !this.enabled; + }, + + enabledHistogramAdd(value) { + if (PrivateBrowsingUtils.isWindowPrivate(window)) { + return; + } + Services.telemetry.getHistogramById("TRACKING_PROTECTION_ENABLED").add(value); + }, + + disabledPBMHistogramAdd(value) { + if (PrivateBrowsingUtils.isWindowPrivate(window)) { + return; + } + Services.telemetry.getHistogramById("TRACKING_PROTECTION_PBM_DISABLED").add(value); + }, + + eventsHistogramAdd(value) { + if (PrivateBrowsingUtils.isWindowPrivate(window)) { + return; + } + Services.telemetry.getHistogramById("TRACKING_PROTECTION_EVENTS").add(value); + }, + + shieldHistogramAdd(value) { + if (PrivateBrowsingUtils.isWindowPrivate(window)) { + return; + } + Services.telemetry.getHistogramById("TRACKING_PROTECTION_SHIELD").add(value); + }, + + onSecurityChange(state, isSimulated) { + if (!this.enabled) { + return; + } + + // Only animate the shield if the event was not fired directly from + // the tabbrowser (due to a browser change). + if (isSimulated) { + this.icon.removeAttribute("animate"); + } else { + this.icon.setAttribute("animate", "true"); + } + + let isBlocking = state & Ci.nsIWebProgressListener.STATE_BLOCKED_TRACKING_CONTENT; + let isAllowing = state & Ci.nsIWebProgressListener.STATE_LOADED_TRACKING_CONTENT; + + if (isBlocking) { + this.icon.setAttribute("tooltiptext", this.activeTooltipText); + this.icon.setAttribute("state", "blocked-tracking-content"); + this.content.setAttribute("state", "blocked-tracking-content"); + + this.shieldHistogramAdd(2); + } else if (isAllowing) { + this.icon.setAttribute("tooltiptext", this.disabledTooltipText); + this.icon.setAttribute("state", "loaded-tracking-content"); + this.content.setAttribute("state", "loaded-tracking-content"); + + this.shieldHistogramAdd(1); + } else { + this.icon.removeAttribute("tooltiptext"); + this.icon.removeAttribute("state"); + this.content.removeAttribute("state"); + + // We didn't show the shield + this.shieldHistogramAdd(0); + } + + // Telemetry for state change. + this.eventsHistogramAdd(0); + }, + + disableForCurrentPage() { + // Convert document URI into the format used by + // nsChannelClassifier::ShouldEnableTrackingProtection. + // Any scheme turned into https is correct. + let normalizedUrl = Services.io.newURI( + "https://" + gBrowser.selectedBrowser.currentURI.hostPort, + null, null); + + // Add the current host in the 'trackingprotection' consumer of + // the permission manager using a normalized URI. This effectively + // places this host on the tracking protection allowlist. + if (PrivateBrowsingUtils.isBrowserPrivate(gBrowser.selectedBrowser)) { + PrivateBrowsingUtils.addToTrackingAllowlist(normalizedUrl); + } else { + Services.perms.add(normalizedUrl, + "trackingprotection", Services.perms.ALLOW_ACTION); + } + + // Telemetry for disable protection. + this.eventsHistogramAdd(1); + + // Hide the control center. + document.getElementById("identity-popup").hidePopup(); + + BrowserReload(); + }, + + enableForCurrentPage() { + // Remove the current host from the 'trackingprotection' consumer + // of the permission manager. This effectively removes this host + // from the tracking protection allowlist. + let normalizedUrl = Services.io.newURI( + "https://" + gBrowser.selectedBrowser.currentURI.hostPort, + null, null); + + if (PrivateBrowsingUtils.isBrowserPrivate(gBrowser.selectedBrowser)) { + PrivateBrowsingUtils.removeFromTrackingAllowlist(normalizedUrl); + } else { + Services.perms.remove(normalizedUrl, "trackingprotection"); + } + + // Telemetry for enable protection. + this.eventsHistogramAdd(2); + + // Hide the control center. + document.getElementById("identity-popup").hidePopup(); + + BrowserReload(); + }, +}; |