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