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