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