|
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); |