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 };