MockPermissionPrompt.sys.mjs (2178B)
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 http://mozilla.org/MPL/2.0/. */ 4 5 const Cm = Components.manager; 6 7 const CONTRACT_ID = "@mozilla.org/content-permission/prompt;1"; 8 9 var registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar); 10 var oldClassID, oldFactory; 11 var newClassID = Services.uuid.generateUUID(); 12 var newFactory = { 13 createInstance(aIID) { 14 return new MockPermissionPromptInstance().QueryInterface(aIID); 15 }, 16 QueryInterface: ChromeUtils.generateQI(["nsIFactory"]), 17 }; 18 19 export var MockPermissionPrompt = { 20 init() { 21 this.reset(); 22 if (!registrar.isCIDRegistered(newClassID)) { 23 try { 24 oldClassID = registrar.contractIDToCID(CONTRACT_ID); 25 oldFactory = Cm.getClassObject(Cc[CONTRACT_ID], Ci.nsIFactory); 26 } catch (ex) { 27 oldClassID = ""; 28 oldFactory = null; 29 dump( 30 "TEST-INFO | can't get permission prompt registered component, " + 31 "assuming there is none" 32 ); 33 } 34 if (oldFactory) { 35 registrar.unregisterFactory(oldClassID, oldFactory); 36 } 37 registrar.registerFactory(newClassID, "", CONTRACT_ID, newFactory); 38 } 39 }, 40 41 reset() {}, 42 43 cleanup() { 44 this.reset(); 45 if (oldFactory) { 46 registrar.unregisterFactory(newClassID, newFactory); 47 registrar.registerFactory(oldClassID, "", CONTRACT_ID, oldFactory); 48 } 49 }, 50 }; 51 52 function MockPermissionPromptInstance() {} 53 MockPermissionPromptInstance.prototype = { 54 QueryInterface: ChromeUtils.generateQI(["nsIContentPermissionPrompt"]), 55 56 promptResult: Ci.nsIPermissionManager.UNKNOWN_ACTION, 57 58 prompt(request) { 59 let perms = request.types.QueryInterface(Ci.nsIArray); 60 for (let idx = 0; idx < perms.length; idx++) { 61 let perm = perms.queryElementAt(idx, Ci.nsIContentPermissionType); 62 if ( 63 Services.perms.testExactPermissionFromPrincipal( 64 request.principal, 65 perm.type 66 ) != Ci.nsIPermissionManager.ALLOW_ACTION 67 ) { 68 request.cancel(); 69 return; 70 } 71 } 72 73 request.allow(); 74 }, 75 };