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