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