|
11 | 11 | `location.replace(\`${dangling_url}\`)`,
|
12 | 12 | ];
|
13 | 13 |
|
14 |
| - function get_requests(worker, expected) { |
15 |
| - return new Promise(resolve => { |
| 14 | + function get_requests(test, worker, expected) { |
| 15 | + return new Promise((resolve, reject) => { |
| 16 | + let didTimeout = false; |
| 17 | + test.step_timeout(() => { |
| 18 | + didTimeout = true; |
| 19 | + reject("get_requests timed out"); |
| 20 | + }, 1000); |
16 | 21 | navigator.serviceWorker.addEventListener('message', function onMsg(evt) {
|
17 | 22 | if (evt.data.size >= expected) {
|
18 | 23 | navigator.serviceWorker.removeEventListener('message', onMsg);
|
19 | 24 | resolve(evt.data);
|
20 |
| - } else { |
| 25 | + } else if (!didTimeout) { |
21 | 26 | worker.postMessage("");
|
22 | 27 | }
|
23 | 28 | });
|
|
40 | 45 | });
|
41 | 46 |
|
42 | 47 | const dangling_resource = "404?type=text/javascript&\n<"
|
| 48 | + const dangling_resource_expected = "404?type=text/javascript&%3C" |
43 | 49 | const api_calls = [
|
44 | 50 | [`const xhr = new XMLHttpRequest();
|
45 | 51 | xhr.open("GET", \`${"xhr" + dangling_resource}\`);
|
|
54 | 60 |
|
55 | 61 | ];
|
56 | 62 |
|
57 |
| - navigator.serviceWorker.register('service-worker.js'); |
58 |
| - const iframe = document.createElement('iframe'); |
59 |
| - iframe.src = "resources/empty.html"; |
60 |
| - document.body.appendChild(iframe); |
| 63 | + let iframe, registration; |
| 64 | + promise_test(async t => { |
| 65 | + iframe = document.createElement('iframe'); |
| 66 | + iframe.src = "resources/empty.html"; |
| 67 | + document.body.appendChild(iframe); |
| 68 | + await new Promise(resolve => iframe.onload = resolve); |
| 69 | + registration = await navigator.serviceWorker.register('service-worker.js'); |
| 70 | + if (!iframe.contentWindow.navigator.serviceWorker.controller) |
| 71 | + await new Promise(resolve => iframe.contentWindow.navigator.serviceWorker.oncontrollerchange = resolve); |
| 72 | + }, "Setup controlled frame"); |
| 73 | + |
| 74 | + let number_api_calls = 0; |
61 | 75 | api_calls.forEach(call => {
|
62 |
| - promise_test(t => { |
63 |
| - return new Promise(resolve => { |
64 |
| - navigator.serviceWorker.ready.then(t.step_func(registration => { |
65 |
| - iframe.contentWindow.eval(call[0]); |
66 |
| - get_requests(registration.active, 0).then(t.step_func(requests => { |
67 |
| - resolve(assert_true(requests.has(call[1] + dangling_resource))); |
68 |
| - })); |
69 |
| - })); |
70 |
| - }); |
| 76 | + promise_test(async t => { |
| 77 | + iframe.contentWindow.eval(call[0]); |
| 78 | + const requests = await get_requests(t, registration.active, number_api_calls + 1); |
| 79 | + assert_equals(Array.from(requests)[number_api_calls], call[1] + dangling_resource_expected); |
| 80 | + number_api_calls++; |
71 | 81 | }, `Does not block ${call[1]}`);
|
72 | 82 | });
|
| 83 | + promise_test(async () => { |
| 84 | + iframe.remove(); |
| 85 | + registration.unregister(); |
| 86 | + }, "Clean up iframe"); |
73 | 87 |
|
74 | 88 | async_test(t => {
|
75 | 89 | let url = new URL(location.origin + "/" + dangling_url);
|
|
0 commit comments