summaryrefslogtreecommitdiffstats
path: root/dom/serviceworkers/test/test_notification_get.html
blob: e4e8edb8b9618b8c5df00d1455e81901fde45612 (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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<!DOCTYPE HTML>
<html>
<head>
  <title>ServiceWorkerRegistration.getNotifications() on main thread and worker thread.</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="/tests/dom/notification/test/mochitest/MockServices.js"></script>
  <script type="text/javascript" src="/tests/dom/notification/test/mochitest/NotificationTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test"></pre>
<script type="text/javascript">

  SimpleTest.requestFlakyTimeout("untriaged");

  function testFrame(src) {
    return new Promise(function(resolve, reject) {
      var iframe = document.createElement("iframe");
      iframe.src = src;
      window.callback = function(result) {
        iframe.src = "about:blank";
        document.body.removeChild(iframe);
        iframe = null;
        SpecialPowers.exactGC(function() {
          resolve(result);
        });
      };
      document.body.appendChild(iframe);
    });
  }

  function registerSW() {
    return testFrame('notification/register.html').then(function() {
      ok(true, "Registered service worker.");
    });
  }

  async function unregisterSW() {
    const reg = await navigator.serviceWorker.getRegistration("./notification/");
    await reg.unregister();
  }

  function testDismiss() {
    // Dismissed persistent notifications should be removed from the
    // notification list.
    var alertsService = SpecialPowers.Cc["@mozilla.org/alerts-service;1"]
                                     .getService(SpecialPowers.Ci.nsIAlertsService);
    return navigator.serviceWorker.getRegistration("./notification/")
      .then(function(reg) {
        return reg.showNotification(
          "This is a notification that will be closed", { tag: "dismiss" })
          .then(function() {
            return reg;
          });
      }).then(function(reg) {
        return reg.getNotifications()
          .then(function(notifications) {
            is(notifications.length, 1, "There should be one visible notification");
            is(notifications[0].tag, "dismiss", "Tag should match");

            // Simulate dismissing the notification by using the alerts service
            // directly, instead of `Notification#close`.
            var principal = SpecialPowers.wrap(document).nodePrincipal;
            var id = principal.origin + "#tag:dismiss";
            alertsService.closeAlert(id, principal);

            return reg;
          });
      }).then(function(reg) {
        return reg.getNotifications();
      }).then(function(notifications) {
        // Make sure dismissed notifications are no longer retrieved.
        is(notifications.length, 0, "There should be no more stored notifications");
      });
  }

  function testGet() {
    var options = NotificationTest.payload;
    return navigator.serviceWorker.getRegistration("./notification/")
      .then(function(reg) {
        return reg.showNotification("This is a title", options)
                 .then(function() {
                  return reg;
                 });
      }).then(function(reg) {
        return reg.getNotifications();
      }).then(function(notifications) {
        is(notifications.length, 1, "There should be one stored notification");
        var notification = notifications[0];
        ok(notification instanceof Notification, "Should be a Notification");
        is(notification.title, "This is a title", "Title should match");
        for (var key in options) {
          is(notification[key], options[key], key + " property should match");
        }
        notification.close();
      }).then(function() {
        return navigator.serviceWorker.getRegistration("./notification/").then(function(reg) {
          return reg.getNotifications();
        });
      }).then(function(notifications) {
        // Make sure closed notifications are no longer retrieved.
        is(notifications.length, 0, "There should be no more stored notifications");
      }).catch(function(e) {
        ok(false, "Something went wrong " + e.message);
      })
  }

  function testGetWorker() {
    todo(false, "navigator.serviceWorker is not available on workers yet");
    return Promise.resolve();
  }

  SimpleTest.waitForExplicitFinish();

  MockServices.register();
  SpecialPowers.pushPrefEnv({"set": [
    ["dom.serviceWorkers.exemptFromPerDomainMax", true],
    ["dom.serviceWorkers.enabled", true],
    ["dom.serviceWorkers.testing.enabled", true],
    ["dom.webnotifications.serviceworker.enabled", true],
    ["notification.prompt.testing", true],
  ]}, function() {
    registerSW()
      .then(testGet)
      .then(testGetWorker)
      .then(testDismiss)
      .then(unregisterSW)
      .then(function() {
        MockServices.unregister();
        SimpleTest.finish();
      });
  });
</script>
</body>
</html>