tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

CanvasPermissionPromptHelper.sys.mjs (3386B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
      4 
      5 import { PrivateBrowsingUtils } from "resource://gre/modules/PrivateBrowsingUtils.sys.mjs";
      6 
      7 export let CanvasPermissionPromptHelper = {
      8  _permissionsPrompt: "canvas-permissions-prompt",
      9  _permissionsPromptHideDoorHanger: "canvas-permissions-prompt-hide-doorhanger",
     10  _notificationIcon: "canvas-notification-icon",
     11 
     12  // aSubject is an nsIBrowser (e10s) or an nsIDOMWindow (non-e10s).
     13  // aData is an Origin string.
     14  observe(aSubject, aTopic, aData) {
     15    if (
     16      aTopic != this._permissionsPrompt &&
     17      aTopic != this._permissionsPromptHideDoorHanger
     18    ) {
     19      return;
     20    }
     21 
     22    let browser;
     23    if (aSubject instanceof Ci.nsIDOMWindow) {
     24      browser = aSubject.docShell.chromeEventHandler;
     25    } else {
     26      browser = aSubject;
     27    }
     28 
     29    let window = browser?.ownerGlobal;
     30    if (!window) {
     31      // Without knowing where this came from, we can't show the prompt.
     32      return;
     33    }
     34 
     35    let { gNavigatorBundle, gBrowserBundle } = window;
     36    let message = gNavigatorBundle.getFormattedString(
     37      "canvas.siteprompt2",
     38      ["<>"],
     39      1
     40    );
     41 
     42    let principal =
     43      Services.scriptSecurityManager.createContentPrincipalFromOrigin(aData);
     44 
     45    function setCanvasPermission(aPerm, aPersistent) {
     46      Services.perms.addFromPrincipal(
     47        principal,
     48        "canvas",
     49        aPerm,
     50        aPersistent
     51          ? Ci.nsIPermissionManager.EXPIRE_NEVER
     52          : Ci.nsIPermissionManager.EXPIRE_SESSION
     53      );
     54    }
     55 
     56    let mainAction = {
     57      label: gNavigatorBundle.getString("canvas.allow2"),
     58      accessKey: gNavigatorBundle.getString("canvas.allow2.accesskey"),
     59      callback(state) {
     60        setCanvasPermission(
     61          Ci.nsIPermissionManager.ALLOW_ACTION,
     62          state && state.checkboxChecked
     63        );
     64      },
     65    };
     66 
     67    let secondaryActions = [
     68      {
     69        label: gNavigatorBundle.getString("canvas.block"),
     70        accessKey: gNavigatorBundle.getString("canvas.block.accesskey"),
     71        callback(state) {
     72          setCanvasPermission(
     73            Ci.nsIPermissionManager.DENY_ACTION,
     74            state && state.checkboxChecked
     75          );
     76        },
     77      },
     78    ];
     79 
     80    let checkbox = {
     81      // In PB mode, we don't want the "always remember" checkbox
     82      show: !PrivateBrowsingUtils.isWindowPrivate(window),
     83    };
     84    if (checkbox.show) {
     85      checkbox.checked = true;
     86      checkbox.label = gBrowserBundle.GetStringFromName("canvas.remember2");
     87    }
     88 
     89    let options = {
     90      checkbox,
     91      name: principal.host,
     92      learnMoreURL:
     93        Services.urlFormatter.formatURLPref("app.support.baseURL") +
     94        "fingerprint-permission",
     95      dismissed: aTopic == this._permissionsPromptHideDoorHanger,
     96      eventCallback(e) {
     97        if (e == "showing") {
     98          this.browser.ownerDocument.getElementById(
     99            "canvas-permissions-prompt-warning"
    100          ).textContent = gBrowserBundle.GetStringFromName(
    101            "canvas.siteprompt2.warning"
    102          );
    103        }
    104      },
    105    };
    106    window.PopupNotifications.show(
    107      browser,
    108      this._permissionsPrompt,
    109      message,
    110      this._notificationIcon,
    111      mainAction,
    112      secondaryActions,
    113      options
    114    );
    115  },
    116 };