mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			111 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* 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/. */
 | 
						|
 | 
						|
const lazy = {};
 | 
						|
 | 
						|
ChromeUtils.defineESModuleGetters(lazy, {
 | 
						|
  PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * A helper module to manage the Content Blocking Allow List.
 | 
						|
 *
 | 
						|
 * This module provides a couple of utility APIs for adding or
 | 
						|
 * removing a given browser object to the Content Blocking allow
 | 
						|
 * list.
 | 
						|
 */
 | 
						|
export const ContentBlockingAllowList = {
 | 
						|
  _observingLastPBContext: false,
 | 
						|
 | 
						|
  _maybeSetupLastPBContextObserver() {
 | 
						|
    if (!this._observingLastPBContext) {
 | 
						|
      this._observer = {
 | 
						|
        QueryInterface: ChromeUtils.generateQI([
 | 
						|
          "nsIObserver",
 | 
						|
          "nsISupportsWeakReference",
 | 
						|
        ]),
 | 
						|
 | 
						|
        observe(subject, topic) {
 | 
						|
          if (topic == "last-pb-context-exited") {
 | 
						|
            Services.perms.removeByType("trackingprotection-pb");
 | 
						|
          }
 | 
						|
        },
 | 
						|
      };
 | 
						|
      Services.obs.addObserver(this._observer, "last-pb-context-exited", true);
 | 
						|
      this._observingLastPBContext = true;
 | 
						|
    }
 | 
						|
  },
 | 
						|
 | 
						|
  _basePrincipalForAntiTrackingCommon(browser) {
 | 
						|
    let principal =
 | 
						|
      browser.browsingContext.currentWindowGlobal
 | 
						|
        ?.contentBlockingAllowListPrincipal;
 | 
						|
    // We can only use content principals for this purpose.
 | 
						|
    if (!principal || !principal.isContentPrincipal) {
 | 
						|
      return null;
 | 
						|
    }
 | 
						|
    return principal;
 | 
						|
  },
 | 
						|
 | 
						|
  _permissionTypeFor(browser) {
 | 
						|
    return lazy.PrivateBrowsingUtils.isBrowserPrivate(browser)
 | 
						|
      ? "trackingprotection-pb"
 | 
						|
      : "trackingprotection";
 | 
						|
  },
 | 
						|
 | 
						|
  _expiryFor(browser) {
 | 
						|
    return lazy.PrivateBrowsingUtils.isBrowserPrivate(browser)
 | 
						|
      ? Ci.nsIPermissionManager.EXPIRE_SESSION
 | 
						|
      : Ci.nsIPermissionManager.EXPIRE_NEVER;
 | 
						|
  },
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns false if this module cannot handle the current document loaded in
 | 
						|
   * the browser object.  This can happen for example for about: or file:
 | 
						|
   * documents.
 | 
						|
   */
 | 
						|
  canHandle(browser) {
 | 
						|
    return this._basePrincipalForAntiTrackingCommon(browser) != null;
 | 
						|
  },
 | 
						|
 | 
						|
  /**
 | 
						|
   * Add the given browser object to the Content Blocking allow list.
 | 
						|
   */
 | 
						|
  add(browser) {
 | 
						|
    // Start observing PB last-context-exit notification to do the needed cleanup.
 | 
						|
    this._maybeSetupLastPBContextObserver();
 | 
						|
 | 
						|
    let prin = this._basePrincipalForAntiTrackingCommon(browser);
 | 
						|
    let type = this._permissionTypeFor(browser);
 | 
						|
    let expire = this._expiryFor(browser);
 | 
						|
    Services.perms.addFromPrincipal(
 | 
						|
      prin,
 | 
						|
      type,
 | 
						|
      Services.perms.ALLOW_ACTION,
 | 
						|
      expire
 | 
						|
    );
 | 
						|
  },
 | 
						|
 | 
						|
  /**
 | 
						|
   * Remove the given browser object from the Content Blocking allow list.
 | 
						|
   */
 | 
						|
  remove(browser) {
 | 
						|
    let prin = this._basePrincipalForAntiTrackingCommon(browser);
 | 
						|
    let type = this._permissionTypeFor(browser);
 | 
						|
    Services.perms.removeFromPrincipal(prin, type);
 | 
						|
  },
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns true if the current browser has loaded a document that is on the
 | 
						|
   * Content Blocking allow list.
 | 
						|
   */
 | 
						|
  includes(browser) {
 | 
						|
    let prin = this._basePrincipalForAntiTrackingCommon(browser);
 | 
						|
    let type = this._permissionTypeFor(browser);
 | 
						|
    return (
 | 
						|
      Services.perms.testExactPermissionFromPrincipal(prin, type) ==
 | 
						|
      Services.perms.ALLOW_ACTION
 | 
						|
    );
 | 
						|
  },
 | 
						|
};
 |