summaryrefslogtreecommitdiffstats
path: root/dom/serviceworkers/test/test_serviceworkerregistrationinfo.xhtml
blob: 5b39350897ee6d2d85b7e13736679c635fac4621 (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
<?xml version="1.0"?>
<!--
  Any copyright is dedicated to the Public Domain.
  http://creativecommons.org/publicdomain/zero/1.0/
-->
<window title="Test for ServiceWorkerRegistrationInfo"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        onload="test();">
  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
  <script type="application/javascript" src="chrome_helpers.js"/>
  <script type="application/javascript">
  <![CDATA[

    let IFRAME_URL = EXAMPLE_URL + "serviceworkerregistrationinfo_iframe.html";

    function test() {
      SimpleTest.waitForExplicitFinish();

      SpecialPowers.pushPrefEnv({'set': [
        ["dom.serviceWorkers.enabled", true],
        ["dom.serviceWorkers.testing.enabled", true],
      ]}, function () {
        (async function() {
          let iframe = $("iframe");
          let promise = waitForIframeLoad(iframe);
          iframe.src = IFRAME_URL;
          await promise;

          // The change handler is not guaranteed to be called within the same
          // tick of the event loop as the one in which the change happened.
          // Because of this, the exact state of the service worker registration
          // is only known until the handler returns.
          //
          // Because then-handlers are resolved asynchronously, the following
          // checks are done using callbacks, which are called synchronously
          // when then handler is called. These callbacks can return a promise,
          // which is used to resolve the promise returned by the function.

          info("Check that a service worker registration notifies its " +
               "listeners when its state changes.");
          promise = waitForRegister(EXAMPLE_URL, function (registration) {
            is(registration.scriptSpec, "");
            ok(registration.installingWorker === null);
            ok(registration.waitingWorker === null);
            ok(registration.activeWorker === null);

            return waitForServiceWorkerRegistrationChange(registration, function  () {
              // Got change event for updating (byte-check)
              ok(registration.installingWorker === null);
              ok(registration.waitingWorker === null);
              ok(registration.activeWorker === null);

              return waitForServiceWorkerRegistrationChange(registration, function  () {
                is(registration.scriptSpec, EXAMPLE_URL + "worker.js");
                ok(registration.evaluatingWorker !== null);
                ok(registration.installingWorker === null);
                ok(registration.waitingWorker === null);
                ok(registration.activeWorker === null);

                return waitForServiceWorkerRegistrationChange(registration, function  () {
                  ok(registration.installingWorker !== null);
                  is(registration.installingWorker.scriptSpec, EXAMPLE_URL + "worker.js");
                  ok(registration.waitingWorker === null);
                  ok(registration.activeWorker === null);

                  return waitForServiceWorkerRegistrationChange(registration, function () {
                    ok(registration.installingWorker === null);
                    ok(registration.waitingWorker !== null);
                    ok(registration.activeWorker === null);

                    return waitForServiceWorkerRegistrationChange(registration, function () {
                      // Activating
                      ok(registration.installingWorker === null);
                      ok(registration.waitingWorker === null);
                      ok(registration.activeWorker !== null);

                      return waitForServiceWorkerRegistrationChange(registration, function () {
                        // Activated
                        ok(registration.installingWorker === null);
                        ok(registration.waitingWorker === null);
                        ok(registration.activeWorker !== null);

                        return registration;
                      });
                    });
                  });
                });
              });
            });
          });
          iframe.contentWindow.postMessage("register", "*");
          let registration = await promise;

          promise = waitForServiceWorkerRegistrationChange(registration, function () {
            // Got change event for updating (byte-check)
            ok(registration.installingWorker === null);
            ok(registration.waitingWorker === null);
            ok(registration.activeWorker !== null);

            return waitForServiceWorkerRegistrationChange(registration, function  () {
              is(registration.scriptSpec, EXAMPLE_URL + "worker2.js");
              ok(registration.evaluatingWorker !== null);

              return waitForServiceWorkerRegistrationChange(registration, function () {
                ok(registration.installingWorker !== null);
                is(registration.installingWorker.scriptSpec, EXAMPLE_URL + "worker2.js");
                ok(registration.waitingWorker === null);
                ok(registration.activeWorker !== null);

                return waitForServiceWorkerRegistrationChange(registration, function () {
                  ok(registration.installingWorker === null);
                  ok(registration.waitingWorker !== null);
                  ok(registration.activeWorker !== null);

                  return waitForServiceWorkerRegistrationChange(registration, function () {
                    // Activating
                    ok(registration.installingWorker === null);
                    ok(registration.waitingWorker === null);
                    ok(registration.activeWorker !== null);

                    return waitForServiceWorkerRegistrationChange(registration, function () {
                      // Activated
                      ok(registration.installingWorker === null);
                      ok(registration.waitingWorker === null);
                      ok(registration.activeWorker !== null);

                      return registration;
                    });
                  });
                });
              });
            });
          });
          iframe.contentWindow.postMessage("register", "*");
          await promise;

          iframe.contentWindow.postMessage("unregister", "*");
          await waitForUnregister(EXAMPLE_URL);

          SimpleTest.finish();
        })();
      });
    }

  ]]>
  </script>

  <body xmlns="http://www.w3.org/1999/xhtml">
    <p id="display"></p>
    <div id="content" style="display:none;"></div>
    <pre id="test"></pre>
    <iframe id="iframe"></iframe>
  </body>
  <label id="test-result"/>
</window>