| <!DOCTYPE html> |
| <meta name="timeout" content="long"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <body> |
| <script> |
| function get_requests(worker, expected) { |
| return new Promise(resolve => { |
| navigator.serviceWorker.addEventListener('message', function onMsg(evt) { |
| if (evt.data.size >= expected) { |
| navigator.serviceWorker.removeEventListener('message', onMsg); |
| resolve(evt.data); |
| } else { |
| worker.postMessage(""); |
| } |
| }); |
| worker.postMessage(""); |
| }); |
| } |
| |
| const resources = [ |
| x=>`<link rel="stylesheet" href="404/style?${x}">`, |
| x=>`<link rel="prefetch" as="style" href="404/prefetch?${x}">`, |
| x=>`<script src="404/script?${x}"><\/script>`, |
| x=>`<iframe src="404/iframe?${x}"></iframe>`, |
| x=>`<meta http-equiv="refresh" content="0;url=404/meta?${x}">`, |
| x=>`<a href="404/a?${x}">click</a><script>document.querySelector('a').click()<\/script>`, |
| x=>`<base href="404/base?${x}"><a href>me</a><script>document.querySelector('a').click()<\/script>`, |
| x=>`<video controls poster="404/poster?${x}"></video>`, |
| x=>`<input type="image" src="404/input?${x}">`, |
| x=>`<form method="GET" action="404/form?${x}"></form><script>document.querySelector('form').submit()<\/script>`, |
| x=>`<body background="404/body?${x}"></body>`, |
| ]; |
| |
| async_test(t => { |
| const script = 'service-worker.js'; |
| const paths = []; |
| navigator.serviceWorker.register(script); |
| t.step(async () => { |
| const registration = await navigator.serviceWorker.ready; |
| for (const html of resources) { |
| const iframe1 = |
| document.body.appendChild(document.createElement('iframe')); |
| iframe1.src = 'resources.html?html=' + html`%0A<`; |
| const iframe2 = |
| document.body.appendChild(document.createElement('iframe')); |
| iframe2.src = 'resources.html?html=' + html``; |
| const path = html`EOP`; |
| paths.push(path.substring(path.search('404\\/')+4, path.search('EOP'))); |
| } |
| |
| const requests = await get_requests(registration.active, resources.length); |
| paths.forEach(path => { |
| assert_true(requests.has(path), |
| `${path} should appear in requests sent`); |
| }); |
| await registration.unregister(); |
| t.done(); |
| }); |
| }, 'Only blocks dangling markup requests'); |
| </script> |