1<!DOCTYPE html> 2<meta charset="utf-8"> 3<title>WebAssembly.instantiateStreaming</title> 4<script src="/resources/testharness.js"></script> 5<script src="/resources/testharnessreport.js"></script> 6<script src="/common/get-host-info.sub.js"></script> 7<script> 8 promise_test(async function() { 9 const response = await fetch('resources/incrementer.wasm'); 10 const { instance, module } = await WebAssembly.instantiateStreaming(response); 11 assert_true(instance instanceof WebAssembly.Instance); 12 assert_true(module instanceof WebAssembly.Module); 13 }, "instantiateStreaming using resolved response"); 14 15 promise_test(async function() { 16 const response = await fetch('resources/incrementer.wasm'); 17 const { instance } = await WebAssembly.instantiateStreaming(response); 18 assert_true(instance instanceof WebAssembly.Instance); 19 }, "instantiateStreaming using resolved response and check instantiate"); 20 21 promise_test(async function() { 22 const result = fetch('resources/incrementer.wasm'); 23 const { instance } = await WebAssembly.instantiateStreaming(result); 24 assert_true(instance instanceof WebAssembly.Instance); 25 }, "instantiateStreaming using promise response from fetch and check instantiate"); 26 27 promise_test(async function(t) { 28 const result = fetch('resources/incrementer.wrong_mime_type.wasm'); 29 await promise_rejects_js(t, TypeError, WebAssembly.instantiateStreaming(result)); 30 }, "instantiateStreaming raise error if wrong mime type"); 31 32 promise_test(async function(t) { 33 const result = fetch('resources/incrementer.no_mime_type.wasm?pipe=header(Content-Type,)'); 34 await promise_rejects_js(t, TypeError, WebAssembly.instantiateStreaming(result)); 35 }, "instantiateStreaming raise error if no mime type"); 36 37 promise_test(async function(t) { 38 const result = fetch('webapi/status.py?status=404'); 39 await promise_rejects_js(t, TypeError, WebAssembly.instantiateStreaming(result)); 40 }, "instantiateStreaming raise error if 404 status"); 41 42 const getWasmUrl = fileName => { 43 const host_info = get_host_info(); 44 const url = host_info.HTTP_ORIGIN_WITH_DIFFERENT_PORT + '/wasm/webapi/'; 45 return url + fileName + "?pipe=header(Access-Control-Allow-Origin,*)"; 46 }; 47 48 promise_test(async function() { 49 const result = fetch(getWasmUrl('resources/incrementer.wasm'), {"mode": "cors"} ); 50 const { instance } = await WebAssembly.instantiateStreaming(result); 51 assert_true(instance instanceof WebAssembly.Instance); 52 }, "instantiateStreaming check CORS"); 53 54 promise_test(async function(t) { 55 const result = fetch(getWasmUrl('resources/incrementer.wasm'), {"mode": "no-cors"} ); 56 await promise_rejects_js(t, TypeError, WebAssembly.instantiateStreaming(result)); 57 }, "instantiateStreaming raise error if no-cors"); 58 59 promise_test(async function() { 60 const v = await fetch('resources/incrementer.wasm'); 61 const buffer = await v.arrayBuffer(); 62 const response = new Response(buffer, { headers: { "Content-Type" : "application/wasm" }}); 63 const { instance } = await WebAssembly.instantiateStreaming(response); 64 assert_true(instance instanceof WebAssembly.Instance); 65 }, "instantiateStreaming receive promise with response created from ArrayBuffer"); 66 67 promise_test(async function() { 68 const v = await fetch('resources/incrementer.wasm'); 69 const buffer = await v.arrayBuffer(); 70 const stream = new ReadableStream({ 71 start(controller) { 72 (async () => { 73 await Promise.resolve().then(() => controller.enqueue(new Uint8Array(buffer.slice(0, 20)))); 74 await Promise.resolve().then(() => controller.enqueue(new Uint8Array(buffer.slice(20, buffer.byteLength)))); 75 await Promise.resolve().then(() => controller.close()); 76 })(); 77 } 78 }); 79 const response = new Response(stream, { headers: { "Content-Type" : "application/wasm" }}); 80 const { instance } = await WebAssembly.instantiateStreaming(response); 81 assert_true(instance instanceof WebAssembly.Instance); 82 }, "instantiateStreaming using ReadableStream with Uint8Array chunks"); 83 84 promise_test(async function(t) { 85 const v = await fetch('resources/incrementer.wasm'); 86 const buffer = await v.arrayBuffer(); 87 const stream = new ReadableStream({ 88 start(controller) { 89 // Enqueuing an ArrayBuffer rather a Uint8Array per 90 // https://streams.spec.whatwg.org/#read-loop 91 controller.enqueue(buffer); 92 controller.close(); 93 } 94 }); 95 const response = new Response(stream, { headers: { "Content-Type" : "application/wasm" }}); 96 await promise_rejects_js(t, TypeError, WebAssembly.instantiateStreaming(response)); 97 }, "instantiateStreaming using ReadableStream with ArrayBuffer chunk"); 98 99 promise_test(async function() { 100 const response = await fetch('resources/incrementer.wasm'); 101 const blob = await response.blob(); 102 const { instance, module } = await WebAssembly.instantiateStreaming(new Response(blob, { headers: { "Content-Type" : "application/wasm" }})); 103 assert_true(instance instanceof WebAssembly.Instance); 104 assert_true(module instanceof WebAssembly.Module); 105 }, "instantiateStreaming using blob"); 106 107 promise_test(async function(t) { 108 const response = await fetch('resources/incrementer.wasm'); 109 const blob = await response.blob(); 110 const formData = new FormData; 111 formData.append('blob', blob); 112 formData.append('blob2', "Hello"); 113 await promise_rejects_js(t, WebAssembly.CompileError, WebAssembly.instantiateStreaming(new Response(formData, { headers: { "Content-Type" : "application/wasm" }}))); 114 }, "instantiateStreaming using FormData"); 115</script> 116