testing/specialpowers/content/MockPermissionPrompt.jsm

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:930acace1767
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 this.EXPORTED_SYMBOLS = ["MockPermissionPrompt"];
6
7 const Cc = Components.classes;
8 const Ci = Components.interfaces;
9 const Cm = Components.manager;
10 const Cu = Components.utils;
11
12 const CONTRACT_ID = "@mozilla.org/content-permission/prompt;1";
13
14 Cu.import("resource://gre/modules/FileUtils.jsm");
15 Cu.import("resource://gre/modules/Services.jsm");
16 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
17
18 var registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
19 var oldClassID, oldFactory;
20 var newClassID = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator).generateUUID();
21 var newFactory = {
22 createInstance: function(aOuter, aIID) {
23 if (aOuter)
24 throw Components.results.NS_ERROR_NO_AGGREGATION;
25 return new MockPermissionPromptInstance().QueryInterface(aIID);
26 },
27 lockFactory: function(aLock) {
28 throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
29 },
30 QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory])
31 };
32
33 this.MockPermissionPrompt = {
34 init: function() {
35 this.reset();
36 if (!registrar.isCIDRegistered(newClassID)) {
37 try {
38 oldClassID = registrar.contractIDToCID(CONTRACT_ID);
39 oldFactory = Cm.getClassObject(Cc[CONTRACT_ID], Ci.nsIFactory);
40 } catch (ex) {
41 oldClassID = "";
42 oldFactory = null;
43 dump("TEST-INFO | can't get permission prompt registered component, " +
44 "assuming there is none");
45 }
46 if (oldFactory) {
47 registrar.unregisterFactory(oldClassID, oldFactory);
48 }
49 registrar.registerFactory(newClassID, "", CONTRACT_ID, newFactory);
50 }
51 },
52
53 reset: function() {
54 },
55
56 cleanup: function() {
57 this.reset();
58 if (oldFactory) {
59 registrar.unregisterFactory(newClassID, newFactory);
60 registrar.registerFactory(oldClassID, "", CONTRACT_ID, oldFactory);
61 }
62 },
63 };
64
65 function MockPermissionPromptInstance() { };
66 MockPermissionPromptInstance.prototype = {
67 QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPermissionPrompt]),
68
69 promptResult: Ci.nsIPermissionManager.UNKNOWN_ACTION,
70
71 prompt: function(request) {
72
73 let perms = request.types.QueryInterface(Ci.nsIArray);
74 for (let idx = 0; idx < perms.length; idx++) {
75 let perm = perms.queryElementAt(idx, Ci.nsIContentPermissionType);
76 if (Services.perms.testExactPermissionFromPrincipal(
77 request.principal, perm.type) != Ci.nsIPermissionManager.ALLOW_ACTION) {
78 request.cancel();
79 return;
80 }
81 }
82
83 request.allow();
84 }
85 };
86
87 // Expose everything to content. We call reset() here so that all of the relevant
88 // lazy expandos get added.
89 MockPermissionPrompt.reset();
90 function exposeAll(obj) {
91 var props = {};
92 for (var prop in obj)
93 props[prop] = 'rw';
94 obj.__exposedProps__ = props;
95 }
96 exposeAll(MockPermissionPrompt);
97 exposeAll(MockPermissionPromptInstance.prototype);

mercurial