blob: 3e0ebd56da5ac904b1af9949c8b51314b90f202d [file] [log] [blame]
<!doctype html>
<html>
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="resources/routines.js"></script>
</head>
<body>
<script>
var activeWorker;
var uuid = token();
var url = "/WebKit/service-workers/resources/service-worker-iframe-preload-script.py?token=" + uuid;
var frame;
const channel = new MessageChannel();
function waitUntilActivating()
{
return new Promise(resolve => {
channel.port2.onmessage = (event) => {
if (event.data === "activating")
resolve();
};
});
}
function triggerActivation()
{
activeWorker.postMessage("activate");
}
promise_test(async (test) => {
if (window.testRunner) {
testRunner.setUseSeparateServiceWorkerProcess(true);
await fetch("").then(() => { }, () => { });
}
let registration = await navigator.serviceWorker.register("/WebKit/service-workers/service-worker-iframe-preload-worker.js", { scope : url });
if (!registration.installing) {
registration.unregister();
registration = await navigator.serviceWorker.register("/WebKit/service-workers/service-worker-iframe-preload-worker.js", { scope : url });
}
activeWorker = registration.installing;
activeWorker.postMessage({ port: channel.port1 }, [channel.port1]);
await waitUntilActivating();
if (registration.navigationPreload)
await registration.navigationPreload.enable();
}, "Setup activating worker");
promise_test(async (test) => {
// Set value to 'before-navigation'
await fetch(url + "&value=before-navigation", { method: 'POST' });
// Start loading iframe, with activating worker, so only preload will start.
const iframePromise = withIframe(url);
// Wait a little bit to do a fetch. This fetch should happen after the fetch event, which is pending.
// It should receive 'before-navigation'
await new Promise(resolve => setTimeout(resolve, 100));
const fetchPromise = fetch(url);
// Trigger fetch, which will trigger the preload response.
activeWorker.postMessage("fetch");
const response = await fetchPromise;
assert_equals(await response.text(), "nothing");
const frame = await iframePromise;
assert_equals(frame.contentWindow.document.body.innerText, "before-navigation");
}, "Service worker load uses preload that starts as soon as possible");
</script>
</body>
</html>