blob: cf06b531bb0eff1f57c4424f93defada2d4732d4 [file] [log] [blame] [edit]
<!doctype html><html lang="en-us"><head><meta charset="utf-8"></head>
<body>
<canvas style='display:block; margin:auto;'></canvas>
<script>
function binary(url) { // Downloads a binary file and outputs it in the specified callback
return new Promise((ok, err) => {
var x = new XMLHttpRequest();
x.open('GET', url, true);
x.responseType = 'arraybuffer';
x.onload = () => { ok(x.response); }
x.send(null);
});
}
function script(url) { // Downloads a script file and adds it to DOM
return new Promise((ok, err) => {
var s = document.createElement('script');
s.src = url;
s.onload = () => {
#if MODULARIZE
var c = {{{ EXPORT_NAME }}};
delete {{{ EXPORT_NAME }}};
ok(c);
#else
ok();
#endif
};
document.body.appendChild(s);
});
}
#if !MODULARIZE
var Module = {};
#endif
function revokeURL(url) {
URL.revokeObjectURL(url)
}
// Depending on the build flags that one uses, different files need to be downloaded
// to load the compiled page. What follows is a matrix of all different combinations that
// affect how code is downloaded. When developing your own shell file, you can copy the whole
// matrix, or just focus on a single/specific set of download schemes to use.
#if MODULARIZE && !WASM && !SEPARATE_ASM && MEM_INIT_METHOD == 0
// Modularize + asm.js embedded in main runtime .js file, no separate .mem init file
script('{{{ TARGET_BASENAME }}}.js').then((r) => {
r();
});
#endif
#if MODULARIZE && !WASM && !SEPARATE_ASM && MEM_INIT_METHOD == 1
// Modularize + asm.js embedded in main runtime .js file, separate .mem init file
Promise.all([script('{{{ TARGET_BASENAME }}}.js'), binary('{{{ TARGET_BASENAME }}}.mem')]).then((r) => {
var js = r[0]; // Detour the JS code to a separate variable to avoid instantiating with 'r' as this to avoid strict ECMAScript/Firefox GC problems that cause a leak, see https://bugzilla.mozilla.org/show_bug.cgi?id=1540101
js({ mem: r[1] });
});
#endif
#if MODULARIZE && !WASM && SEPARATE_ASM && MEM_INIT_METHOD == 0
// Modularize + asm.js in its own file, no separate .mem init file
Promise.all([script('{{{ TARGET_BASENAME }}}.js'), script('{{{ TARGET_BASENAME }}}.asm.js')]).then((r) => {
var js = r[0]; // Detour the JS code to a separate variable to avoid instantiating with 'r' as this to avoid strict ECMAScript/Firefox GC problems that cause a leak, see https://bugzilla.mozilla.org/show_bug.cgi?id=1540101
js({ asm: r[1] });
});
#endif
#if MODULARIZE && !WASM && SEPARATE_ASM && MEM_INIT_METHOD == 1
// Modularize + asm.js in its own file, separate .mem init file
Promise.all([script('{{{ TARGET_BASENAME }}}.js'), script('{{{ TARGET_BASENAME }}}.asm.js'), binary('{{{ TARGET_BASENAME }}}.mem')]).then((r) => {
var js = r[0]; // Detour the JS code to a separate variable to avoid instantiating with 'r' as this to avoid strict ECMAScript/Firefox GC problems that cause a leak, see https://bugzilla.mozilla.org/show_bug.cgi?id=1540101
js({ asm: r[1], mem: r[2] });
});
#endif
#if !MODULARIZE && !WASM && !SEPARATE_ASM && MEM_INIT_METHOD == 0
// No modularize, asm.js embedded in main runtime .js file, no separate .mem init file
script('{{{ TARGET_BASENAME }}}.js');
#endif
#if !MODULARIZE && !WASM && !SEPARATE_ASM && MEM_INIT_METHOD == 1
// No modularize, asm.js embedded in main runtime .js file, separate .mem init file
Promise.all([binary('{{{ TARGET_BASENAME }}}.js'), binary('{{{ TARGET_BASENAME }}}.mem')]).then((r) => {
Module.mem = r[1];
var url = URL.createObjectURL(new Blob([r[0]], { type: 'application/javascript' }));
script(url).then(() => { revokeURL(url) });
});
#endif
#if !MODULARIZE && !WASM && SEPARATE_ASM && MEM_INIT_METHOD == 0
// No modularize, asm.js in its own file, no separate .mem init file
Promise.all([binary('{{{ TARGET_BASENAME }}}.js'), script('{{{ TARGET_BASENAME }}}.asm.js')]).then((r) => {
var url = URL.createObjectURL(new Blob([r[0]], { type: 'application/javascript' }));
script(url).then(() => { revokeURL(url) });
});
#endif
#if !MODULARIZE && !WASM && SEPARATE_ASM && MEM_INIT_METHOD == 1
// No modularize, asm.js in its own file, separate .mem init file
Promise.all([binary('{{{ TARGET_BASENAME }}}.js'), script('{{{ TARGET_BASENAME }}}.asm.js'), binary('{{{ TARGET_BASENAME }}}.mem')]).then((r) => {
Module.mem = r[2];
var url = URL.createObjectURL(new Blob([r[0]], { type: 'application/javascript' }));
script(url).then(() => { revokeURL(url) });
});
#endif
#if MODULARIZE && WASM && !MINIMAL_RUNTIME_STREAMING_WASM_INSTANTIATION
// Modularized wasm, no separate .mem init file
Promise.all([script('{{{ TARGET_BASENAME }}}.js'), {{{ DOWNLOAD_WASM }}}]).then((r) => {
var js = r[0]; // Detour the JS code to a separate variable to avoid instantiating with 'r' as this to avoid strict ECMAScript/Firefox GC problems that cause a leak, see https://bugzilla.mozilla.org/show_bug.cgi?id=1540101
js({ wasm: r[1] });
});
#endif
#if MODULARIZE && WASM && MINIMAL_RUNTIME_STREAMING_WASM_INSTANTIATION
// Modularized wasm, no separate .mem init file
Promise.all([script('{{{ TARGET_BASENAME }}}.js'), {{{ DOWNLOAD_WASM }}}]).then((r) => {
var js = r[0]; // Detour the JS code to a separate variable to avoid instantiating with 'r' as this to avoid strict ECMAScript/Firefox GC problems that cause a leak, see https://bugzilla.mozilla.org/show_bug.cgi?id=1540101
js({ wasm: r[1] });
});
// Modularize, no separate .mem init file, with streaming Wasm instantiation.
// https://caniuse.com/#feat=wasm and https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiateStreaming
// Firefox 52 added Wasm support, but only Firefox 58 added instantiateStreaming.
// Chrome 57 added Wasm support, but only Chrome 61 added instantiateStreaming.
// Node.js and Safari do not support instantiateStreaming.
#if MIN_FIREFOX_VERSION < 58 || MIN_CHROME_VERSION < 61 || ENVIRONMENT_MAY_BE_NODE || MIN_SAFARI_VERSION != TARGET_NOT_SUPPORTED
// Modularize, no separate .mem init file
Promise.all([binary('{{{ TARGET_BASENAME }}}.js'), WebAssembly.instantiateStreaming && binary('{{{ TARGET_BASENAME }}}.wasm')]).then((r) => {
var url = URL.createObjectURL(new Blob([r[0]], { type: 'application/javascript' }));
script(url).then((js) => {
js({ wasm: r[1] });
revokeURL(url);
});
});
#else
// Modularize: WebAssembly.instantiateStreaming() is unconditionally supported - loading the .js file is very simple:
script('{{{ TARGET_BASENAME }}}.js').then((js) => {
js();
});
#endif
#endif
#if !MODULARIZE && WASM && !MINIMAL_RUNTIME_STREAMING_WASM_INSTANTIATION
// No modularize, no separate .mem init file
Promise.all([binary('{{{ TARGET_BASENAME }}}.js'), {{{ DOWNLOAD_WASM }}}]).then((r) => {
Module.wasm = r[1];
var url = URL.createObjectURL(new Blob([r[0]], { type: 'application/javascript' }));
script(url).then(() => { revokeURL(url) });
});
#endif
#if !MODULARIZE && WASM && MINIMAL_RUNTIME_STREAMING_WASM_INSTANTIATION
// No modularize, no separate .mem init file, with streaming Wasm instantiation.
// https://caniuse.com/#feat=wasm and https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/instantiateStreaming
// Firefox 52 added Wasm support, but only Firefox 58 added instantiateStreaming.
// Chrome 57 added Wasm support, but only Chrome 61 added instantiateStreaming.
// Node.js and Safari do not support instantiateStreaming.
#if MIN_FIREFOX_VERSION < 58 || MIN_CHROME_VERSION < 61 || ENVIRONMENT_MAY_BE_NODE || MIN_SAFARI_VERSION != TARGET_NOT_SUPPORTED
// No modularize, no separate .mem init file
Promise.all([binary('{{{ TARGET_BASENAME }}}.js'), WebAssembly.instantiateStreaming && binary('{{{ TARGET_BASENAME }}}.wasm')]).then((r) => {
Module.wasm = r[1];
var url = URL.createObjectURL(new Blob([r[0]], { type: 'application/javascript' }));
script(url).then(() => { revokeURL(url) });
});
#else
// WebAssembly.instantiateStreaming() is unconditionally supported - loading the .js file is very simple:
script('{{{ TARGET_BASENAME }}}.js');
#endif
#endif
</script>
</body>
</html>