1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/testing/specialpowers/content/MockPermissionPrompt.jsm Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,97 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +this.EXPORTED_SYMBOLS = ["MockPermissionPrompt"]; 1.9 + 1.10 +const Cc = Components.classes; 1.11 +const Ci = Components.interfaces; 1.12 +const Cm = Components.manager; 1.13 +const Cu = Components.utils; 1.14 + 1.15 +const CONTRACT_ID = "@mozilla.org/content-permission/prompt;1"; 1.16 + 1.17 +Cu.import("resource://gre/modules/FileUtils.jsm"); 1.18 +Cu.import("resource://gre/modules/Services.jsm"); 1.19 +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); 1.20 + 1.21 +var registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar); 1.22 +var oldClassID, oldFactory; 1.23 +var newClassID = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator).generateUUID(); 1.24 +var newFactory = { 1.25 + createInstance: function(aOuter, aIID) { 1.26 + if (aOuter) 1.27 + throw Components.results.NS_ERROR_NO_AGGREGATION; 1.28 + return new MockPermissionPromptInstance().QueryInterface(aIID); 1.29 + }, 1.30 + lockFactory: function(aLock) { 1.31 + throw Components.results.NS_ERROR_NOT_IMPLEMENTED; 1.32 + }, 1.33 + QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory]) 1.34 +}; 1.35 + 1.36 +this.MockPermissionPrompt = { 1.37 + init: function() { 1.38 + this.reset(); 1.39 + if (!registrar.isCIDRegistered(newClassID)) { 1.40 + try { 1.41 + oldClassID = registrar.contractIDToCID(CONTRACT_ID); 1.42 + oldFactory = Cm.getClassObject(Cc[CONTRACT_ID], Ci.nsIFactory); 1.43 + } catch (ex) { 1.44 + oldClassID = ""; 1.45 + oldFactory = null; 1.46 + dump("TEST-INFO | can't get permission prompt registered component, " + 1.47 + "assuming there is none"); 1.48 + } 1.49 + if (oldFactory) { 1.50 + registrar.unregisterFactory(oldClassID, oldFactory); 1.51 + } 1.52 + registrar.registerFactory(newClassID, "", CONTRACT_ID, newFactory); 1.53 + } 1.54 + }, 1.55 + 1.56 + reset: function() { 1.57 + }, 1.58 + 1.59 + cleanup: function() { 1.60 + this.reset(); 1.61 + if (oldFactory) { 1.62 + registrar.unregisterFactory(newClassID, newFactory); 1.63 + registrar.registerFactory(oldClassID, "", CONTRACT_ID, oldFactory); 1.64 + } 1.65 + }, 1.66 +}; 1.67 + 1.68 +function MockPermissionPromptInstance() { }; 1.69 +MockPermissionPromptInstance.prototype = { 1.70 + QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPermissionPrompt]), 1.71 + 1.72 + promptResult: Ci.nsIPermissionManager.UNKNOWN_ACTION, 1.73 + 1.74 + prompt: function(request) { 1.75 + 1.76 + let perms = request.types.QueryInterface(Ci.nsIArray); 1.77 + for (let idx = 0; idx < perms.length; idx++) { 1.78 + let perm = perms.queryElementAt(idx, Ci.nsIContentPermissionType); 1.79 + if (Services.perms.testExactPermissionFromPrincipal( 1.80 + request.principal, perm.type) != Ci.nsIPermissionManager.ALLOW_ACTION) { 1.81 + request.cancel(); 1.82 + return; 1.83 + } 1.84 + } 1.85 + 1.86 + request.allow(); 1.87 + } 1.88 +}; 1.89 + 1.90 +// Expose everything to content. We call reset() here so that all of the relevant 1.91 +// lazy expandos get added. 1.92 +MockPermissionPrompt.reset(); 1.93 +function exposeAll(obj) { 1.94 + var props = {}; 1.95 + for (var prop in obj) 1.96 + props[prop] = 'rw'; 1.97 + obj.__exposedProps__ = props; 1.98 +} 1.99 +exposeAll(MockPermissionPrompt); 1.100 +exposeAll(MockPermissionPromptInstance.prototype);