summaryrefslogtreecommitdiffstats
path: root/dom/workers/test/serviceworkers/test_notification_get.html
blob: dbb312e7b55509739180de1d162153c6a12890cf (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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
<!DOCTYPE HTML>
<html>
<head>
  <title>ServiceWorkerRegistration.getNotifications() on main thread and worker thread.</title>
  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="/tests/dom/tests/mochitest/notification/MockServices.js"></script>
  <script type="text/javascript" src="/tests/dom/tests/mochitest/notification/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.");
    });
  }

  function unregisterSW() {
    return testFrame('notification/unregister.html').then(function() {
      ok(true, "Unregistered service worker.");
    });
  }

  // To check that the scope is respected when retrieving notifications.
  function registerAlternateSWAndAddNotification() {
    return testFrame('notification_alt/register.html').then(function() {
      ok(true, "Registered alternate service worker.");
      return navigator.serviceWorker.getRegistration("./notification_alt/").then(function(reg) {
        return reg.showNotification("This is a notification_alt");
      });
    });
  }

  function unregisterAlternateSWAndAddNotification() {
    return testFrame('notification_alt/unregister.html').then(function() {
      ok(true, "unregistered alternate service worker.");
    });
  }

  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() {
    // Non persistent notifications will not show up in getNotification().
    var n = new Notification("Scope does not match");
    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 registerAlternateSWAndAddNotification().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) {
          if (key === "data") {
            ok(NotificationTest.customDataMatches(notification.data),
               "data property should match");
            continue;
          }
          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);
      }).then(unregisterAlternateSWAndAddNotification);
  }

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

  function waitForSWTests(reg, msg) {
    return new Promise(function(resolve, reject) {
      var content = document.getElementById("content");

      iframe = document.createElement("iframe");

      content.appendChild(iframe);
      iframe.setAttribute('src', "notification/listener.html");

      window.onmessage = function(e) {
        if (e.data.type == 'status') {
          ok(e.data.status, "Service worker test: " + e.data.msg);
        } else if (e.data.type == 'finish') {
          content.removeChild(iframe);
          resolve();
        }
      }

      iframe.onload = function(e) {
        iframe.onload = null;
        reg.active.postMessage(msg);
      }
    });
  }

  function testGetServiceWorker() {
    return navigator.serviceWorker.getRegistration("./notification/")
      .then(function(reg) {
        return waitForSWTests(reg, 'create');
      });
  }

  // Create a Notification here, make sure ServiceWorker sees it.
  function testAcrossThreads() {
    return navigator.serviceWorker.getRegistration("./notification/")
      .then(function(reg) {
        return reg.showNotification("This is a title")
                 .then(function() {
                  return reg;
                 });
      }).then(function(reg) {
        return waitForSWTests(reg, 'do-not-create');
      });
  }

  SimpleTest.waitForExplicitFinish();

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