summaryrefslogtreecommitdiffstats
path: root/toolkit/components/alerts/test/test_principal.html
blob: 74a20dbd70db2b96323ce0a27c01a0e0cbeb3dd6 (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
111
112
113
114
115
116
117
118
119
120
121
122
<!DOCTYPE HTML>
<html>
<head>
  <title>Test for Bug 1202933</title>
  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>

<body>
<p id="display"></p>

<pre id="test">
<script class="testbody" type="text/javascript">

const Cc = SpecialPowers.Cc;
const Ci = SpecialPowers.Ci;
const Services = SpecialPowers.Services;

const notifier = Cc["@mozilla.org/alerts-service;1"]
                   .getService(Ci.nsIAlertsService);

const chromeScript = SpecialPowers.loadChromeScript(_ => {
  Components.utils.import("resource://gre/modules/Services.jsm");

  addMessageListener("anyXULAlertsVisible", function() {
    var windows = Services.wm.getEnumerator("alert:alert");
    return windows.hasMoreElements();
  });

  addMessageListener("getAlertSource", function() {
    var alertWindows = Services.wm.getEnumerator("alert:alert");
    if (!alertWindows) {
      return null;
    }
    var alertWindow = alertWindows.getNext();
    return alertWindow.document.getElementById("alertSourceLabel").getAttribute("value");
  });
});

function notify(alertName, principal) {
  return new Promise((resolve, reject) => {
    var source;
    function observe(subject, topic, data) {
      if (topic == "alertclickcallback") {
        reject(new Error("Alerts should not be clicked during test"));
      } else if (topic == "alertshow") {
        source = chromeScript.sendSyncMessage("getAlertSource")[0][0];
        notifier.closeAlert(alertName);
      } else {
        is(topic, "alertfinished", "Should hide alert");
        resolve(source);
      }
    }
    notifier.showAlertNotification(null, "Notification test",
                                   "Surprise! I'm here to test notifications!",
                                   false, alertName, observe, alertName,
                                   null, null, null, principal);
    if (SpecialPowers.Services.appinfo.OS == "Darwin") {
      notifier.closeAlert(alertName);
    }
  });
}

function* testNoPrincipal() {
  var source = yield notify("noPrincipal", null);
  ok(!source, "Should omit source without principal");
}

function* testSystemPrincipal() {
  var principal = Services.scriptSecurityManager.getSystemPrincipal();
  var source = yield notify("systemPrincipal", principal);
  ok(!source, "Should omit source for system principal");
}

function* testNullPrincipal() {
  var principal = Services.scriptSecurityManager.createNullPrincipal({});
  var source = yield notify("nullPrincipal", principal);
  ok(!source, "Should omit source for null principal");
}

function* testNodePrincipal() {
  var principal = SpecialPowers.wrap(document).nodePrincipal;
  var source = yield notify("nodePrincipal", principal);

  var stringBundle = Services.strings.createBundle(
    "chrome://alerts/locale/alert.properties"
  );
  var localizedSource = stringBundle.formatStringFromName(
    "source.label", [principal.URI.hostPort], 1);
  is(source, localizedSource, "Should include source for node principal");
}

function runTest() {
  if (!("@mozilla.org/alerts-service;1" in Cc)) {
    todo(false, "Alerts service does not exist in this application");
    return;
  }

  if ("@mozilla.org/system-alerts-service;1" in Cc) {
    todo(false, "Native alerts service exists in this application");
    return;
  }

  ok(true, "Alerts service exists in this application");

  // sendSyncMessage returns an array of arrays. See the comments in
  // test_alerts_noobserve.html and test_SpecialPowersLoadChromeScript.html.
  var [[alertsVisible]] = chromeScript.sendSyncMessage("anyXULAlertsVisible");
  ok(!alertsVisible, "Alerts should not be present at the start of the test.");

  add_task(testNoPrincipal);
  add_task(testSystemPrincipal);
  add_task(testNullPrincipal);
  add_task(testNodePrincipal);
}

runTest();
</script>
</pre>
</body>
</html>