1<!DOCTYPE html>
2<meta charset=utf-8>
3<script src="/resources/testharness.js"></script>
4<script src="/resources/testharnessreport.js"></script>
5<script>
6
7const SERVICE_WORKER_TEST_CHANNEL_NAME = 'service worker';
8const events = [];
9const c1 = new BroadcastChannel(SERVICE_WORKER_TEST_CHANNEL_NAME);
10const c2 = new BroadcastChannel(SERVICE_WORKER_TEST_CHANNEL_NAME);
11c1.onmessage = e => events.push(e);
12c2.onmessage = e => events.push(e);
13
14function testCompletion(t) {
15  return new Promise((resolve) => {
16    c2.addEventListener("message", t.step_func(e => {
17      if (e.data == 'from worker') {
18        c2.postMessage('from c2');
19      } else if (e.data == 'done') {
20        assert_equals(events.length, 5);
21        assert_equals(events[0].data, 'from worker');
22        assert_equals(events[0].target, c1);
23        assert_equals(events[1].data, 'from worker');
24        assert_equals(events[1].target, c2);
25        assert_equals(events[2].data, 'from c2');
26        assert_equals(events[3].data, 'done');
27        assert_equals(events[3].target, c1);
28        assert_equals(events[4].data, 'done');
29        assert_equals(events[4].target, c2);
30        resolve();
31      }
32    }));
33  });
34}
35
36promise_test(async t => {
37
38    const testResults = testCompletion(t);
39    const SCRIPT = "resources/service-worker.js";
40    const SCOPE = "/webmessaging/broadcastchannel/resources/not-used/";
41
42    const reg = await navigator.serviceWorker.register(SCRIPT, {'scope': SCOPE});
43    t.add_cleanup(() => reg.unregister());
44
45    return testResults;
46  }, 'BroadcastChannel works in service workers');
47</script>
48