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