Bug 1394102 - FetchEvent Request.signal should be aborted when the corrisponding nsIChannel is canceled - test, r=bkelly

This commit is contained in:
Andrea Marchesini 2018-06-27 14:51:57 +02:00
Родитель bd7f80e102
Коммит 7549087a70
2 изменённых файлов: 42 добавлений и 2 удалений

Просмотреть файл

@ -94,6 +94,36 @@
await promise_rejects(t, "AbortError", reader.read());
await promise_rejects(t, "AbortError", reader.closed);
}, "Stream errors once aborted.");
promise_test(async t => {
const scope = SCOPE + "?q=aborted-signal";
await setupRegistration(t, scope);
const iframe = await with_iframe(scope);
const w = iframe.contentWindow;
const testReady = new Promise(resolve => {
w.navigator.serviceWorker.addEventListener('message', event => {
resolve(event.data);
}, { once: true });
});
const controller = new w.AbortController();
const signal = controller.signal;
w.fetch('data.json?signal', { signal });
assert_true((await testReady) == "ready", "");
controller.abort();
const aborted = new Promise(resolve => {
w.navigator.serviceWorker.addEventListener('message', event => {
resolve(event.data);
}, { once: true });
});
assert_true((await aborted) == "aborted", "");
}, "FetchEvent.request.signal must be aborted.");
</script>
</body>
</html>

Просмотреть файл

@ -5,6 +5,16 @@ async function broadcast(msg) {
}
addEventListener('fetch', event => {
event.waitUntil(broadcast(event.request.url));
event.respondWith(fetch(event.request));
if (event.request.url.endsWith('?signal')) {
event.respondWith(new Promise((resolve, reject) => {
event.request.signal.onabort = () => {
broadcast("aborted");
reject();
};
event.waitUntil(broadcast("ready"));
}));
} else {
event.waitUntil(broadcast(event.request.url));
event.respondWith(fetch(event.request));
}
});