// META: global=window,worker "use strict"; const duplex = "half"; const method = "POST"; test(() => { const body = new ReadableStream(); const request = new Request("...", { method, body, duplex }); assert_equals(request.body, body); }, "Constructing a Request with a stream holds the original object."); test((t) => { const body = new ReadableStream(); body.getReader(); assert_throws_js(TypeError, () => new Request("...", { method, body, duplex })); }, "Constructing a Request with a stream on which getReader() is called"); test((t) => { const body = new ReadableStream(); body.getReader().read(); assert_throws_js(TypeError, () => new Request("...", { method, body, duplex })); }, "Constructing a Request with a stream on which read() is called"); promise_test(async (t) => { const body = new ReadableStream({ pull: c => c.enqueue(new Uint8Array()) }); const reader = body.getReader(); await reader.read(); reader.releaseLock(); assert_throws_js(TypeError, () => new Request("...", { method, body, duplex })); }, "Constructing a Request with a stream on which read() and releaseLock() are called"); test((t) => { const request = new Request("...", { method: "POST", body: "..." }); request.body.getReader(); assert_throws_js(TypeError, () => new Request(request)); // This doesn't throw. new Request(request, { body: "..." }); }, "Constructing a Request with a Request on which body.getReader() is called"); test((t) => { const request = new Request("...", { method: "POST", body: "..." }); request.body.getReader().read(); assert_throws_js(TypeError, () => new Request(request)); // This doesn't throw. new Request(request, { body: "..." }); }, "Constructing a Request with a Request on which body.getReader().read() is called"); promise_test(async (t) => { const request = new Request("...", { method: "POST", body: "..." }); const reader = request.body.getReader(); await reader.read(); reader.releaseLock(); assert_throws_js(TypeError, () => new Request(request)); // This doesn't throw. new Request(request, { body: "..." }); }, "Constructing a Request with a Request on which read() and releaseLock() are called"); test((t) => { new Request("...", { method, body: null }); }, "It is OK to omit .duplex when the body is null."); test((t) => { new Request("...", { method, body: "..." }); }, "It is OK to omit .duplex when the body is a string."); test((t) => { new Request("...", { method, body: new Uint8Array(3) }); }, "It is OK to omit .duplex when the body is a Uint8Array."); test((t) => { new Request("...", { method, body: new Blob([]) }); }, "It is OK to omit .duplex when the body is a Blob."); test((t) => { const body = new ReadableStream(); assert_throws_js(TypeError, () => new Request("...", { method, body })); }, "It is error to omit .duplex when the body is a ReadableStream."); test((t) => { new Request("...", { method, body: null, duplex: "half" }); }, "It is OK to set .duplex = 'half' when the body is null."); test((t) => { new Request("...", { method, body: "...", duplex: "half" }); }, "It is OK to set .duplex = 'half' when the body is a string."); test((t) => { new Request("...", { method, body: new Uint8Array(3), duplex: "half" }); }, "It is OK to set .duplex = 'half' when the body is a Uint8Array."); test((t) => { new Request("...", { method, body: new Blob([]), duplex: "half" }); }, "It is OK to set .duplex = 'half' when the body is a Blob."); test((t) => { const body = new ReadableStream(); new Request("...", { method, body, duplex: "half" }); }, "It is OK to set .duplex = 'half' when the body is a ReadableStream."); test((t) => { const body = null; const duplex = "full"; assert_throws_js(TypeError, () => new Request("...", { method, body, duplex })); }, "It is error to set .duplex = 'full' when the body is null."); test((t) => { const body = "..."; const duplex = "full"; assert_throws_js(TypeError, () => new Request("...", { method, body, duplex })); }, "It is error to set .duplex = 'full' when the body is a string."); test((t) => { const body = new Uint8Array(3); const duplex = "full"; assert_throws_js(TypeError, () => new Request("...", { method, body, duplex })); }, "It is error to set .duplex = 'full' when the body is a Uint8Array."); test((t) => { const body = new Blob([]); const duplex = "full"; assert_throws_js(TypeError, () => new Request("...", { method, body, duplex })); }, "It is error to set .duplex = 'full' when the body is a Blob."); test((t) => { const body = new ReadableStream(); const duplex = "full"; assert_throws_js(TypeError, () => new Request("...", { method, body, duplex })); }, "It is error to set .duplex = 'full' when the body is a ReadableStream."); test((t) => { const body = new ReadableStream(); const duplex = "half"; const req1 = new Request("...", { method, body, duplex }); const req2 = new Request(req1); }, "It is OK to omit duplex when init.body is not given and input.body is given.");