// META: timeout=long // META: global=window,worker const BODY_FUNCTION_AND_DATA = { arrayBuffer: null, blob: null, formData: new FormData(), json: new Blob(["{}"]), text: null, }; for (const [bodyFunction, body] of Object.entries(BODY_FUNCTION_AND_DATA)) { promise_test(async () => { const controller = new AbortController(); const signal = controller.signal; const request = new Request("../resources/data.json", { method: "post", signal, body, }); controller.abort(); await request[bodyFunction](); assert_true( true, `An aborted request should still be able to run ${bodyFunction}()` ); }, `Calling ${bodyFunction}() on an aborted request`); promise_test(async () => { const controller = new AbortController(); const signal = controller.signal; const request = new Request("../resources/data.json", { method: "post", signal, body, }); const p = request[bodyFunction](); controller.abort(); await p; assert_true( true, `An aborted request should still be able to run ${bodyFunction}()` ); }, `Aborting a request after calling ${bodyFunction}()`); if (!body) { promise_test(async () => { const controller = new AbortController(); const signal = controller.signal; const request = new Request("../resources/data.json", { method: "post", signal, body, }); // consuming happens synchronously, so don't wait fetch(request).catch(() => {}); controller.abort(); await request[bodyFunction](); assert_true( true, `An aborted consumed request should still be able to run ${bodyFunction}() when empty` ); }, `Calling ${bodyFunction}() on an aborted consumed empty request`); } promise_test(async t => { const controller = new AbortController(); const signal = controller.signal; const request = new Request("../resources/data.json", { method: "post", signal, body: body || new Blob(["foo"]), }); // consuming happens synchronously, so don't wait fetch(request).catch(() => {}); controller.abort(); await promise_rejects_js(t, TypeError, request[bodyFunction]()); }, `Calling ${bodyFunction}() on an aborted consumed nonempty request`); }