summaryrefslogtreecommitdiffstats
path: root/dom/serviceworkers/test/async_waituntil_worker.js
blob: f830fc6f8385f2fe650d7bd83d12dad52609ed2b (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
var keepAlivePromise;
var resolvePromise;
var result = "Failed";

onactivate = function (event) {
  event.waitUntil(clients.claim());
};

onmessage = function (event) {
  if (event.data === "Start") {
    event.waitUntil(Promise.reject());

    keepAlivePromise = new Promise(function (resolve, reject) {
      resolvePromise = resolve;
    });

    result = "Success";
    event.waitUntil(keepAlivePromise);
    event.source.postMessage("Started");
  } else if (event.data === "Result") {
    event.source.postMessage(result);
    if (resolvePromise !== undefined) {
      resolvePromise();
    }
  }
};

addEventListener("fetch", e => {
  let respondWithPromise = new Promise(function (res, rej) {
    setTimeout(() => {
      res(new Response("ok"));
    }, 0);
  });
  e.respondWith(respondWithPromise);
  // Test that waitUntil can be called in the promise handler of the existing
  // lifetime extension promise.
  respondWithPromise.then(() => {
    e.waitUntil(
      clients.matchAll().then(cls => {
        dump(`matchAll returned ${cls.length} client(s) with URLs:\n`);
        cls.forEach(cl => {
          dump(`${cl.url}\n`);
        });

        if (cls.length != 1) {
          dump("ERROR: no controlled clients.\n");
        }
        client = cls[0];
        client.postMessage("Done");
      })
    );
  });
});