// META: title=WebAssembly.instantiateStreaming // META: script=/common/get-host-info.sub.js promise_test(async function() { const response = await fetch('resources/incrementer.wasm'); const { instance, module } = await WebAssembly.instantiateStreaming(response); assert_true(instance instanceof WebAssembly.Instance); assert_true(module instanceof WebAssembly.Module); }, "instantiateStreaming using resolved response"); promise_test(async function() { const response = await fetch('resources/incrementer.wasm'); const { instance } = await WebAssembly.instantiateStreaming(response); assert_true(instance instanceof WebAssembly.Instance); }, "instantiateStreaming using resolved response and check instantiate"); promise_test(async function() { const result = fetch('resources/incrementer.wasm'); const { instance } = await WebAssembly.instantiateStreaming(result); assert_true(instance instanceof WebAssembly.Instance); }, "instantiateStreaming using promise response from fetch and check instantiate"); promise_test(async function(t) { const result = fetch('resources/incrementer.wrong_mime_type.wasm'); await promise_rejects_js(t, TypeError, WebAssembly.instantiateStreaming(result)); }, "instantiateStreaming raise error if wrong mime type"); promise_test(async function(t) { const result = fetch('resources/incrementer.no_mime_type.wasm?pipe=header(Content-Type,)'); await promise_rejects_js(t, TypeError, WebAssembly.instantiateStreaming(result)); }, "instantiateStreaming raise error if no mime type"); promise_test(async function(t) { const result = fetch('webapi/status.py?status=404'); await promise_rejects_js(t, TypeError, WebAssembly.instantiateStreaming(result)); }, "instantiateStreaming raise error if 404 status"); const getWasmUrl = fileName => { const host_info = get_host_info(); const url = host_info.HTTP_ORIGIN_WITH_DIFFERENT_PORT + '/wasm/webapi/'; return url + fileName + "?pipe=header(Access-Control-Allow-Origin,*)"; }; promise_test(async function() { const result = fetch(getWasmUrl('resources/incrementer.wasm'), {"mode": "cors"} ); const { instance } = await WebAssembly.instantiateStreaming(result); assert_true(instance instanceof WebAssembly.Instance); }, "instantiateStreaming check CORS"); promise_test(async function(t) { const result = fetch(getWasmUrl('resources/incrementer.wasm'), {"mode": "no-cors"} ); await promise_rejects_js(t, TypeError, WebAssembly.instantiateStreaming(result)); }, "instantiateStreaming raise error if no-cors"); promise_test(async function() { const v = await fetch('resources/incrementer.wasm'); const buffer = await v.arrayBuffer(); const response = new Response(buffer, { headers: { "Content-Type" : "application/wasm" }}); const { instance } = await WebAssembly.instantiateStreaming(response); assert_true(instance instanceof WebAssembly.Instance); }, "instantiateStreaming receive promise with response created from ArrayBuffer"); promise_test(async function() { const v = await fetch('resources/incrementer.wasm'); const buffer = await v.arrayBuffer(); const stream = new ReadableStream({ start(controller) { (async () => { await Promise.resolve().then(() => controller.enqueue(new Uint8Array(buffer.slice(0, 20)))); await Promise.resolve().then(() => controller.enqueue(new Uint8Array(buffer.slice(20, buffer.byteLength)))); await Promise.resolve().then(() => controller.close()); })(); } }); const response = new Response(stream, { headers: { "Content-Type" : "application/wasm" }}); const { instance } = await WebAssembly.instantiateStreaming(response); assert_true(instance instanceof WebAssembly.Instance); }, "instantiateStreaming using ReadableStream with Uint8Array chunks"); promise_test(async function(t) { const v = await fetch('resources/incrementer.wasm'); const buffer = await v.arrayBuffer(); const stream = new ReadableStream({ start(controller) { // Enqueuing an ArrayBuffer rather a Uint8Array per // https://streams.spec.whatwg.org/#read-loop controller.enqueue(buffer); controller.close(); } }); const response = new Response(stream, { headers: { "Content-Type" : "application/wasm" }}); await promise_rejects_js(t, TypeError, WebAssembly.instantiateStreaming(response)); }, "instantiateStreaming using ReadableStream with ArrayBuffer chunk"); promise_test(async function() { const response = await fetch('resources/incrementer.wasm'); const blob = await response.blob(); const { instance, module } = await WebAssembly.instantiateStreaming(new Response(blob, { headers: { "Content-Type" : "application/wasm" }})); assert_true(instance instanceof WebAssembly.Instance); assert_true(module instanceof WebAssembly.Module); }, "instantiateStreaming using blob"); promise_test(async function(t) { const response = await fetch('resources/incrementer.wasm'); const blob = await response.blob(); const formData = new FormData; formData.append('blob', blob); formData.append('blob2', "Hello"); await promise_rejects_js(t, WebAssembly.CompileError, WebAssembly.instantiateStreaming(new Response(formData, { headers: { "Content-Type" : "application/wasm" }}))); }, "instantiateStreaming using FormData");