summaryrefslogtreecommitdiffstats
path: root/extensions/permissions/test/PermissionTestUtils.jsm
blob: 1968d1697a41135329add39a47db1402bddee1fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

/*
 * Utility module for tests to access the PermissionManager
 * with uri or origin string parameters.
 */

"use strict";

const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");

let pm = Services.perms;

let secMan = Services.scriptSecurityManager;

const EXPORTED_SYMBOLS = ["PermissionTestUtils"];

/**
 * Convert origin string or uri to principal.
 * If passed an nsIPrincipal it will be returned without conversion.
 * @param {Ci.nsIPrincipal|Ci.nsIURI|string} subject - Subject to convert to principal
 * @returns {Ci.nsIPrincipal} Principal created from subject
 */
function convertToPrincipal(subject) {
  if (subject instanceof Ci.nsIPrincipal) {
    return subject;
  }
  if (typeof subject === "string") {
    return secMan.createContentPrincipalFromOrigin(subject);
  }
  if (subject === null || subject instanceof Ci.nsIURI) {
    return secMan.createContentPrincipal(subject, {});
  }
  throw new Error(
    "subject parameter must be an nsIURI an origin string or a principal."
  );
}

let PermissionTestUtils = {
  /**
   * Add permission information for a given subject.
   * Subject can be a principal, uri or origin string.
   * @see nsIPermissionManager for documentation
   *
   * @param {Ci.nsIPrincipal|Ci.nsIURI|string} subject
   * @param {*} args
   */
  add(subject, ...args) {
    return pm.addFromPrincipal(convertToPrincipal(subject), ...args);
  },
  /**
   * Get all custom permissions for a given subject.
   * Subject can be a principal, uri or origin string.
   * @see nsIPermissionManager for documentation
   *
   * @param {Ci.nsIPrincipal|Ci.nsIURI|string} subject
   * @param {*} args
   */
  getAll(subject, ...args) {
    return pm.getAllForPrincipal(convertToPrincipal(subject), ...args);
  },
  /**
   * Remove permission information for a given subject and permission type
   * Subject can be a principal, uri or origin string.
   * @see nsIPermissionManager for documentation
   *
   * @param {Ci.nsIPrincipal|Ci.nsIURI|string} subject
   * @param {*} args
   */
  remove(subject, ...args) {
    return pm.removeFromPrincipal(convertToPrincipal(subject), ...args);
  },
  /**
   * Test whether a website has permission to perform the given action.
   * Subject can be a principal, uri or origin string.
   * @see nsIPermissionManager for documentation
   *
   * @param {Ci.nsIPrincipal|Ci.nsIURI|string} subject
   * @param {*} args
   */
  testPermission(subject, ...args) {
    return pm.testPermissionFromPrincipal(convertToPrincipal(subject), ...args);
  },
  /**
   * Test whether a website has permission to perform the given action.
   * Subject can be a principal, uri or origin string.
   * @see nsIPermissionManager for documentation
   *
   * @param {Ci.nsIPrincipal|Ci.nsIURI|string} subject
   * @param {*} args
   */
  testExactPermission(subject, ...args) {
    return pm.testExactPermissionFromPrincipal(
      convertToPrincipal(subject),
      ...args
    );
  },
  /**
   * Get the permission object associated with the given subject and action.
   * Subject can be a principal, uri or origin string.
   * @see nsIPermissionManager for documentation
   *
   * @param {Ci.nsIPrincipal|Ci.nsIURI|string} subject
   * @param {*} args
   */
  getPermissionObject(subject, type, exactHost = false) {
    return pm.getPermissionObject(convertToPrincipal(subject), type, exactHost);
  },
};