From 32fbce89fd1bd1b92b3a32fec532315ccd379bd7 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Wed, 29 May 2024 21:23:22 -0400 Subject: [PATCH 01/43] Separating file packager fetch. --- src/polyfill/fetch.js | 80 +++++++++++++++++++++++++ src/shell.js | 5 ++ test/common.py | 2 +- test/test_browser.py | 132 ++++++++++++++++++++++++++++++++++++++++- tools/file_packager.py | 127 +++++++++++++++++++++------------------ 5 files changed, 286 insertions(+), 60 deletions(-) create mode 100644 src/polyfill/fetch.js diff --git a/src/polyfill/fetch.js b/src/polyfill/fetch.js new file mode 100644 index 0000000000000..979335699a84e --- /dev/null +++ b/src/polyfill/fetch.js @@ -0,0 +1,80 @@ +// Fetch polyfill from https://github.com/developit/unfetch +// License: +//============================================================================== +// Copyright (c) 2017 Jason Miller +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +//============================================================================== + +#if !POLYFILL +#error "this file should never be included unless POLYFILL is set" +#endif + +if (typeof globalThis.fetch == 'undefined') { + globalThis.fetch = function (url, options) { + options = options || {}; + return new Promise((resolve, reject) => { + const request = new XMLHttpRequest(); + const keys = []; + const headers = {}; + + request.responseType = 'arraybuffer'; + + const response = () => ({ + ok: ((request.status / 100) | 0) == 2, // 200-299 + statusText: request.statusText, + status: request.status, + url: request.responseURL, + text: () => Promise.resolve(request.responseText), + json: () => Promise.resolve(request.responseText).then(JSON.parse), + blob: () => Promise.resolve(new Blob([request.response])), + arrayBuffer: () => Promise.resolve(request.response), + clone: response, + headers: { + keys: () => keys, + entries: () => keys.map((n) => [n, request.getResponseHeader(n)]), + get: (n) => request.getResponseHeader(n), + has: (n) => request.getResponseHeader(n) != null, + }, + }); + + request.open(options.method || "get", url, true); + + request.onload = () => { + request + .getAllResponseHeaders() + .toLowerCase() + .replace(/^(.+?):/gm, (m, key) => { + headers[key] || keys.push((headers[key] = key)); + }); + resolve(response()); + }; + + request.onerror = reject; + + request.withCredentials = options.credentials == "include"; + + for (const i in options.headers) { + request.setRequestHeader(i, options.headers[i]); + } + + request.send(options.body || null); + }); + } +} diff --git a/src/shell.js b/src/shell.js index add93992b4960..e0e99753c067c 100644 --- a/src/shell.js +++ b/src/shell.js @@ -61,6 +61,11 @@ var Module = typeof {{{ EXPORT_NAME }}} != 'undefined' ? {{{ EXPORT_NAME }}} : { // See https://caniuse.com/mdn-javascript_builtins_bigint64array #include "polyfill/bigint64array.js" #endif + +#if MIN_CHROME_VERSION < 40 || MIN_FIREFOX_VERSION < 39 || MIN_SAFARI_VERSION < 103000 +// See https://caniuse.com/fetch +#include "polyfill/fetch.js" +#endif #endif // POLYFILL #if MODULARIZE diff --git a/test/common.py b/test/common.py index c19be77f01e00..a342524e42d30 100644 --- a/test/common.py +++ b/test/common.py @@ -2270,7 +2270,7 @@ def compile_btest(self, filename, args, reporting=Reporting.FULL): if reporting == Reporting.FULL: # If C reporting (i.e. the REPORT_RESULT macro) is required we # also include report_result.c and force-include report_result.h - self.run_process([EMCC, '-c', '-I' + TEST_ROOT, + self.run_process([EMCC, '-c', '-fPIC', '-I' + TEST_ROOT, '-DEMTEST_PORT_NUMBER=%d' % self.port, test_file('report_result.c')] + self.get_emcc_args(compile_only=True)) args += ['report_result.o', '-include', test_file('report_result.h')] diff --git a/test/test_browser.py b/test/test_browser.py index 957883dbe17cb..2164e15e821c9 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -699,7 +699,8 @@ def setup(assetLocalization):


+ {{{ SCRIPT }}} + + ''') + + def test(args, expect_fail): + self.compile_btest('main.cpp', args + ['--preload-file', path, '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html']) + js = read_file('a.out.js') + if expect_fail: + create_file('a.out.js', 'fetch = undefined;\n' + js) + return self.run_browser('a.out.html', '/report_result?TypeError: fetch is not a function') + else: + return self.run_browser('a.out.html', '/report_result?1') + + test([], expect_fail=True) + test(['-sLEGACY_VM_SUPPORT'], expect_fail=False) + test(['-sLEGACY_VM_SUPPORT', '-sNO_POLYFILL'], expect_fail=True) + + def test_fetch_polyfill_shared_lib(self): + create_file('library.c', r''' + #include + int library_func() { + return 42; + } + ''') + create_file('main.c', r''' + #include + #include + #include + #include + int main() { + int found = EM_ASM_INT( + return preloadedWasm['/library.so'] !== undefined; + ); + void *lib_handle = dlopen("/library.so", RTLD_NOW); + typedef int (*voidfunc)(); + voidfunc x = (voidfunc)dlsym(lib_handle, "library_func"); + printf("Got val: %d\n", x()); + assert(x() == 42); + return 0; + } + ''') + create_file('on_window_error_shell.html', r''' + +
+

+ + {{{ SCRIPT }}} + + ''') + + self.run_process([EMCC, 'library.c', '-sSIDE_MODULE', '-O2', '-o', 'library.so']) + + def test(args, expect_fail): + self.compile_btest('main.c', ['library.so', '-sMAIN_MODULE', '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html']) + js = read_file('a.out.js') + if expect_fail: + create_file('a.out.js', 'fetch = undefined;\n' + js) + return self.run_browser('a.out.html', '/report_result?abort:TypeError') + else: + return self.run_browser('a.out.html', '/report_result?1') + + test([], expect_fail=True) + test(['-sLEGACY_VM_SUPPORT'], expect_fail=False) + test(['-sLEGACY_VM_SUPPORT', '-sNO_POLYFILL'], expect_fail=True) + class emrun(RunnerCore): def test_emrun_info(self): diff --git a/tools/file_packager.py b/tools/file_packager.py index d435a33209cab..e247f5666b58e 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -359,7 +359,7 @@ def generate_object_file(data_files): def main(): if len(sys.argv) == 1: - err('''Usage: file_packager TARGET [--preload A [B..]] [--embed C [D..]] [--exclude E [F..]]] [--js-output=OUTPUT.js] [--no-force] [--use-preload-cache] [--indexedDB-name=EM_PRELOAD_CACHE] [--separate-metadata] [--lz4] [--use-preload-plugins] + err('''Usage: file_packager TARGET [--preload A [B..]] [--embed C [D..]] [--exclude E [F..]]] [--js-output=OUTPUT.js] [--no-force] [--use-preload-cache] [--indexedDB-name=EM_PRELOAD_CACHE] [--separate-metadata] [--lz4] [--use-preload-plugins] [--no-node] See the source for more details.''') return 1 @@ -775,7 +775,7 @@ def generate_js(data_target, data_files, metadata): } var REMOTE_PACKAGE_NAME = Module['locateFile'] ? Module['locateFile'](REMOTE_PACKAGE_BASE, '') : REMOTE_PACKAGE_BASE;\n''' % (js_manipulation.escape_for_js_string(data_target), js_manipulation.escape_for_js_string(remote_package_name)) metadata['remote_package_size'] = remote_package_size - ret += '''var REMOTE_PACKAGE_SIZE = metadata['remote_package_size'];\n''' + ret += ''' var REMOTE_PACKAGE_SIZE = metadata['remote_package_size'];\n''' if options.use_preload_cache: # Set the id to a hash of the preloaded data, so that caches survive over multiple builds @@ -965,59 +965,74 @@ def generate_js(data_target, data_files, metadata): }); return; }'''.strip() + ret += ''' function fetchRemotePackage(packageName, packageSize, callback, errback) { %(node_support_code)s - var xhr = new XMLHttpRequest(); - xhr.open('GET', packageName, true); - xhr.responseType = 'arraybuffer'; - xhr.onprogress = function(event) { - var url = packageName; - var size = packageSize; - if (event.total) size = event.total; - if (event.loaded) { - if (!xhr.addedTotal) { - xhr.addedTotal = true; - if (!Module.dataFileDownloads) Module.dataFileDownloads = {}; - Module.dataFileDownloads[url] = { - loaded: event.loaded, - total: size - }; - } else { - Module.dataFileDownloads[url].loaded = event.loaded; - } - var total = 0; - var loaded = 0; - var num = 0; - for (var download in Module.dataFileDownloads) { - var data = Module.dataFileDownloads[download]; - total += data.total; - loaded += data.loaded; - num++; - } - total = Math.ceil(total * Module.expectedDataFileDownloads/num); - if (Module['setStatus']) Module['setStatus'](`Downloading data... (${loaded}/${total})`); - } else if (!Module.dataFileDownloads) { - if (Module['setStatus']) Module['setStatus']('Downloading data...'); + Module.dataFileDownloads = Module.dataFileDownloads || {}; + const url = packageName; + fetch(url) + .catch(cause => Promise.reject(new Error('Network Error : ' + url, {cause}))) // If fetch fails, rewrite the error to include the failing URL & the cause. + .then(response => { + + let loaded = 0; + + if (!response.ok) { + return Promise.reject(new Error(response.statusText + ' : ' + response.url)); } - }; - xhr.onerror = function(event) { - throw new Error("NetworkError for: " + packageName); - } - xhr.onload = function(event) { - if (xhr.status == 200 || xhr.status == 304 || xhr.status == 206 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 - var packageData = xhr.response; - callback(packageData); - } else { - throw new Error(xhr.statusText + " : " + xhr.responseURL); + + // If we're using the polyfill, readers won't be available... + if(!response.body && response.arrayBuffer) { + response.arrayBuffer().then(buffer => callback(buffer)); + return; } - }; - xhr.send(null); - }; + const reader = response.body.getReader(); + const headers = response.headers; + + const total = headers.get('Content-Length') ?? packageSize; + const chunks = []; + + const iterate = () => reader.read().then(handleChunk).catch(cause => { + return Promise.reject(new Error(response.statusText + ' : ' + response.url, {cause})); + }); + + const handleChunk = ({done, value}) => { + if (!done) { + chunks.push(value); + loaded += value.length; + Module.dataFileDownloads[url] = Module.dataFileDownloads[url] ?? {}; + Module.dataFileDownloads[url].loaded = loaded; + Module.dataFileDownloads[url].total = total; + + if (total) { + if (Module['setStatus']) Module['setStatus'](`Downloading data... (${loaded}/${total})`); + } + else { + if (Module['setStatus']) Module['setStatus']('Downloading data...'); + } + return iterate(); + } + else { + const size = chunks.map(c => c.length).reduce((a, b) => a + b, 0); + let index = 0; + const packageData = new Uint8Array(size); + for(const chunk of chunks) { + packageData.set(chunk, index); + index += chunk.length; + } + + callback(packageData.buffer); + } + }; + return iterate(); + }); + };\n''' % {'node_support_code': node_support_code} + + ret += ''' function handleError(error) { console.error('package error:', error); - };\n''' % {'node_support_code': node_support_code} + };\n''' code += ''' function processPackageData(arrayBuffer) { @@ -1113,15 +1128,14 @@ def generate_js(data_target, data_files, metadata): function runMetaWithFS() { Module['addRunDependency']('%(metadata_file)s'); var REMOTE_METADATA_NAME = Module['locateFile'] ? Module['locateFile']('%(metadata_file)s', '') : '%(metadata_file)s'; - var xhr = new XMLHttpRequest(); - xhr.onreadystatechange = function() { - if (xhr.readyState === 4 && xhr.status === 200) { - loadPackage(JSON.parse(xhr.responseText)); - } - } - xhr.open('GET', REMOTE_METADATA_NAME, true); - xhr.overrideMimeType('application/json'); - xhr.send(null); + fetch(REMOTE_METADATA_NAME) + .then(response => { + if(response.ok) { + return response.json(); + } + return Promise.reject(new Error(response.statusText + ' : ' + response.url)); + }) + .then(loadPackage); } if (Module['calledRun']) { @@ -1130,7 +1144,6 @@ def generate_js(data_target, data_files, metadata): if (!Module['preRun']) Module['preRun'] = []; Module["preRun"].push(runMetaWithFS); }\n''' % {'metadata_file': os.path.basename(options.jsoutput + '.metadata')} - else: _metadata_template = ''' } From b88154d7703eb1b3b9439577c379bc2a1e50fcee Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Wed, 29 May 2024 21:25:33 -0400 Subject: [PATCH 02/43] Tweak --- test/test_browser.py | 63 -------------------------------------------- 1 file changed, 63 deletions(-) diff --git a/test/test_browser.py b/test/test_browser.py index 2164e15e821c9..49b8291a6b78b 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5614,69 +5614,6 @@ def test(args, expect_fail): test(['-sLEGACY_VM_SUPPORT'], expect_fail=False) test(['-sLEGACY_VM_SUPPORT', '-sNO_POLYFILL'], expect_fail=True) - def test_fetch_polyfill_shared_lib(self): - create_file('library.c', r''' - #include - int library_func() { - return 42; - } - ''') - create_file('main.c', r''' - #include - #include - #include - #include - int main() { - int found = EM_ASM_INT( - return preloadedWasm['/library.so'] !== undefined; - ); - void *lib_handle = dlopen("/library.so", RTLD_NOW); - typedef int (*voidfunc)(); - voidfunc x = (voidfunc)dlsym(lib_handle, "library_func"); - printf("Got val: %d\n", x()); - assert(x() == 42); - return 0; - } - ''') - create_file('on_window_error_shell.html', r''' - -
-

- - {{{ SCRIPT }}} - - ''') - - self.run_process([EMCC, 'library.c', '-sSIDE_MODULE', '-O2', '-o', 'library.so']) - - def test(args, expect_fail): - self.compile_btest('main.c', ['library.so', '-sMAIN_MODULE', '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html']) - js = read_file('a.out.js') - if expect_fail: - create_file('a.out.js', 'fetch = undefined;\n' + js) - return self.run_browser('a.out.html', '/report_result?abort:TypeError') - else: - return self.run_browser('a.out.html', '/report_result?1') - - test([], expect_fail=True) - test(['-sLEGACY_VM_SUPPORT'], expect_fail=False) - test(['-sLEGACY_VM_SUPPORT', '-sNO_POLYFILL'], expect_fail=True) - class emrun(RunnerCore): def test_emrun_info(self): From b8e2ed950288720aa87349fc0f228fd7d17a891a Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Wed, 29 May 2024 22:30:46 -0400 Subject: [PATCH 03/43] Accounting for differences between FF & Chrome error text in test. --- AUTHORS | 1 + test/test_browser.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 52da4b03647c4..5aed48f68b996 100644 --- a/AUTHORS +++ b/AUTHORS @@ -600,3 +600,4 @@ a license to everyone to use it as detailed in LICENSE.) * YAMAMOTO Takashi * Artur Gatin (copyright owned by Teladoc Health, Inc.) * Christian Lloyd (copyright owned by Teladoc Health, Inc.) +* Sean Morris diff --git a/test/test_browser.py b/test/test_browser.py index 49b8291a6b78b..d6e1adb85daad 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5578,7 +5578,7 @@ def test_fetch_polyfill_preload(self): window.disableErrorReporting = true; window.onerror = null; var xhr = new XMLHttpRequest(); - xhr.open('GET', 'http://localhost:8888/report_result?' + error, true); + xhr.open('GET', 'http://localhost:8888/report_result?' + (error.includes('fetch is not a function') ? 1 : 0), true); xhr.send(); setTimeout(function() { window.close() }, 1000); }); @@ -5606,7 +5606,7 @@ def test(args, expect_fail): js = read_file('a.out.js') if expect_fail: create_file('a.out.js', 'fetch = undefined;\n' + js) - return self.run_browser('a.out.html', '/report_result?TypeError: fetch is not a function') + return self.run_browser('a.out.html', '/report_result?1') else: return self.run_browser('a.out.html', '/report_result?1') From 58fcb8f738cb776390b90e55eca2044de332febd Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Wed, 29 May 2024 22:50:36 -0400 Subject: [PATCH 04/43] Fixing exception detection in test_missing_data_throws_error --- test/test_browser.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/test/test_browser.py b/test/test_browser.py index d6e1adb85daad..e10237814ad38 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -699,16 +699,20 @@ def setup(assetLocalization):


- {{{ SCRIPT }}} - - ''') def test(args, expect_fail): - self.compile_btest('main.cpp', args + ['--preload-file', path, '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html']) + self.compile_btest('main.cpp', args + ['--preload-file', path, '-o', 'a.out.html']) if expect_fail: js = read_file('a.out.js') create_file('a.out.js', 'fetch = undefined;\n' + js) From b23fffad9ec89856a0d4995343c15237e84267d5 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Tue, 17 Sep 2024 00:11:54 -0400 Subject: [PATCH 10/43] Restoring custom shell. --- test/test_browser.py | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/test/test_browser.py b/test/test_browser.py index 1dec700d07f7f..85200dd138445 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5399,9 +5399,42 @@ def test_fetch_polyfill_preload(self): return 0; } ''' % path) + create_file('on_window_error_shell.html', r''' + +
+

+ + {{{ SCRIPT }}} + + ''') def test(args, expect_fail): - self.compile_btest('main.cpp', args + ['--preload-file', path, '-o', 'a.out.html']) + self.compile_btest('main.cpp', args + ['--preload-file', path, '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html']) if expect_fail: js = read_file('a.out.js') create_file('a.out.js', 'fetch = undefined;\n' + js) From c3fadbc6e6901ada6031762c9d3a937688f32a63 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Tue, 17 Sep 2024 00:43:04 -0400 Subject: [PATCH 11/43] Removing shell correctly. --- test/test_browser.py | 47 +++++++++----------------------------------- 1 file changed, 9 insertions(+), 38 deletions(-) diff --git a/test/test_browser.py b/test/test_browser.py index 85200dd138445..9d79d7a2778ff 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5396,52 +5396,23 @@ def test_fetch_polyfill_preload(self): buf[20] = 0; fclose(f); printf("|%%s|\n", buf); - return 0; + return 42; } ''' % path) - create_file('on_window_error_shell.html', r''' - -
-

- - {{{ SCRIPT }}} - - ''') def test(args, expect_fail): - self.compile_btest('main.cpp', args + ['--preload-file', path, '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html']) + self.compile_btest('main.cpp', args + ['--preload-file', path, '-o', 'a.out.html']) if expect_fail: js = read_file('a.out.js') create_file('a.out.js', 'fetch = undefined;\n' + js) - return self.run_browser('a.out.html', '/report_result?0') + return self.run_browser('a.out.html', '/report_result?exception:fetch is not a function') else: - return self.run_browser('a.out.html', '/report_result?1') - + return self.run_browser('a.out.html', '/report_result?42') + + test([], expect_fail=False) + test(['-sLEGACY_VM_SUPPORT'], expect_fail=False) + test(['-sLEGACY_VM_SUPPORT', '-sNO_POLYFILL'], expect_fail=True) + @no_wasm64('https://github.com/llvm/llvm-project/issues/98778') def test_fetch_polyfill_shared_lib(self): create_file('library.c', r''' From 4b05f8089e8598fb8b4be89305b3d189160f4161 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Tue, 17 Sep 2024 00:46:26 -0400 Subject: [PATCH 12/43] origFetch. --- test/test_browser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_browser.py b/test/test_browser.py index 9d79d7a2778ff..b717cb99e5479 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5404,7 +5404,7 @@ def test(args, expect_fail): self.compile_btest('main.cpp', args + ['--preload-file', path, '-o', 'a.out.html']) if expect_fail: js = read_file('a.out.js') - create_file('a.out.js', 'fetch = undefined;\n' + js) + create_file('a.out.js', 'let origFetch = fetch; fetch = undefined;\n' + js) return self.run_browser('a.out.html', '/report_result?exception:fetch is not a function') else: return self.run_browser('a.out.html', '/report_result?42') From 8a027b7160f144f7b0b155b9d6cc373cafd828fb Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Tue, 17 Sep 2024 02:01:15 -0400 Subject: [PATCH 13/43] Tweaks --- test/test_browser.py | 2 +- tools/file_packager.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_browser.py b/test/test_browser.py index b717cb99e5479..d81e6637d04c8 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5401,7 +5401,7 @@ def test_fetch_polyfill_preload(self): ''' % path) def test(args, expect_fail): - self.compile_btest('main.cpp', args + ['--preload-file', path, '-o', 'a.out.html']) + self.compile_btest('main.cpp', ['--preload-file', path, '-o', '-sEXIT_RUNTIME', 'a.out.html'] + args) if expect_fail: js = read_file('a.out.js') create_file('a.out.js', 'let origFetch = fetch; fetch = undefined;\n' + js) diff --git a/tools/file_packager.py b/tools/file_packager.py index ad575ed31bc99..e602c9077b4e7 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -774,7 +774,7 @@ def generate_js(data_target, data_files, metadata): } var REMOTE_PACKAGE_NAME = Module['locateFile'] ? Module['locateFile'](REMOTE_PACKAGE_BASE, '') : REMOTE_PACKAGE_BASE;\n''' % (js_manipulation.escape_for_js_string(data_target), js_manipulation.escape_for_js_string(remote_package_name)) metadata['remote_package_size'] = remote_package_size - ret += ''' var REMOTE_PACKAGE_SIZE = metadata['remote_package_size'];\n''' + ret += '''var REMOTE_PACKAGE_SIZE = metadata['remote_package_size'];\n''' if options.use_preload_cache: # Set the id to a hash of the preloaded data, so that caches survive over multiple builds From 9b415a6af7abf5967dc4fe7be6ff22aaec45f5c1 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Tue, 17 Sep 2024 02:03:11 -0400 Subject: [PATCH 14/43] Tweaks --- test/test_browser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_browser.py b/test/test_browser.py index d81e6637d04c8..e3a1fa415ac8e 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5408,7 +5408,7 @@ def test(args, expect_fail): return self.run_browser('a.out.html', '/report_result?exception:fetch is not a function') else: return self.run_browser('a.out.html', '/report_result?42') - + test([], expect_fail=False) test(['-sLEGACY_VM_SUPPORT'], expect_fail=False) test(['-sLEGACY_VM_SUPPORT', '-sNO_POLYFILL'], expect_fail=True) From db4a31dd11116e98ed62b982ff380ae3e2009706 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Tue, 17 Sep 2024 02:08:33 -0400 Subject: [PATCH 15/43] Spacing. --- test/test_browser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_browser.py b/test/test_browser.py index e3a1fa415ac8e..727c14a69f3f9 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5412,7 +5412,7 @@ def test(args, expect_fail): test([], expect_fail=False) test(['-sLEGACY_VM_SUPPORT'], expect_fail=False) test(['-sLEGACY_VM_SUPPORT', '-sNO_POLYFILL'], expect_fail=True) - + @no_wasm64('https://github.com/llvm/llvm-project/issues/98778') def test_fetch_polyfill_shared_lib(self): create_file('library.c', r''' From 3bf0964d05eafe43839b06975fab40199ffa314a Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Tue, 17 Sep 2024 07:02:01 -0400 Subject: [PATCH 16/43] Tweaks. --- test/test_browser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_browser.py b/test/test_browser.py index 727c14a69f3f9..b3902eaeaa111 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5401,7 +5401,7 @@ def test_fetch_polyfill_preload(self): ''' % path) def test(args, expect_fail): - self.compile_btest('main.cpp', ['--preload-file', path, '-o', '-sEXIT_RUNTIME', 'a.out.html'] + args) + self.compile_btest('main.cpp', ['-sEXIT_RUNTIME', '--preload-file', path, '-o', 'a.out.html'] + args) if expect_fail: js = read_file('a.out.js') create_file('a.out.js', 'let origFetch = fetch; fetch = undefined;\n' + js) From 03b301ad34aa8bac64c1c2fbb58cb3840a95a924 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Tue, 17 Sep 2024 07:41:31 -0400 Subject: [PATCH 17/43] Correctly checking exit code. --- test/test_browser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_browser.py b/test/test_browser.py index b3902eaeaa111..3e66539be5fcb 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5407,7 +5407,7 @@ def test(args, expect_fail): create_file('a.out.js', 'let origFetch = fetch; fetch = undefined;\n' + js) return self.run_browser('a.out.html', '/report_result?exception:fetch is not a function') else: - return self.run_browser('a.out.html', '/report_result?42') + return self.run_browser('a.out.html', '/report_result?exit:42') test([], expect_fail=False) test(['-sLEGACY_VM_SUPPORT'], expect_fail=False) From 8ff77d0d00bf69fdd926b1a77e375c34f77aeb71 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Tue, 17 Sep 2024 08:44:50 -0400 Subject: [PATCH 18/43] Minimal custom shell. --- test/test_browser.py | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/test/test_browser.py b/test/test_browser.py index 3e66539be5fcb..a063e92f33b33 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5395,21 +5395,39 @@ def test_fetch_polyfill_preload(self): fread(buf, 1, 20, f); buf[20] = 0; fclose(f); - printf("|%%s|\n", buf); - return 42; + printf("%%s\n", buf); + return 0; } ''' % path) + create_file('on_window_error_shell.html', r''' + +
+

+ + {{{ SCRIPT }}} + ''') def test(args, expect_fail): - self.compile_btest('main.cpp', ['-sEXIT_RUNTIME', '--preload-file', path, '-o', 'a.out.html'] + args) + self.compile_btest('main.cpp', ['-sEXIT_RUNTIME', '--preload-file', path, '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html'] + args) if expect_fail: js = read_file('a.out.js') create_file('a.out.js', 'let origFetch = fetch; fetch = undefined;\n' + js) return self.run_browser('a.out.html', '/report_result?exception:fetch is not a function') else: - return self.run_browser('a.out.html', '/report_result?exit:42') + return self.run_browser('a.out.html', '/report_result?exit:0') - test([], expect_fail=False) + test([], expect_fail=True) test(['-sLEGACY_VM_SUPPORT'], expect_fail=False) test(['-sLEGACY_VM_SUPPORT', '-sNO_POLYFILL'], expect_fail=True) From 5b37c95cd3fa64b26745343f409342b45ca6df40 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Tue, 17 Sep 2024 09:34:33 -0400 Subject: [PATCH 19/43] closing HTML tag. --- test/test_browser.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/test_browser.py b/test/test_browser.py index a063e92f33b33..21d85723d83f0 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5416,7 +5416,8 @@ def test_fetch_polyfill_preload(self): }); {{{ SCRIPT }}} - ''') + + ''') def test(args, expect_fail): self.compile_btest('main.cpp', ['-sEXIT_RUNTIME', '--preload-file', path, '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html'] + args) From 34b1afd52e9ba1383c708b0484c89bf29c14e895 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Tue, 17 Sep 2024 10:08:15 -0400 Subject: [PATCH 20/43] Extra test. --- test/test_browser.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_browser.py b/test/test_browser.py index 21d85723d83f0..1c7b15ef4d6a8 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5428,6 +5428,7 @@ def test(args, expect_fail): else: return self.run_browser('a.out.html', '/report_result?exit:0') + test([], expect_fail=False) test([], expect_fail=True) test(['-sLEGACY_VM_SUPPORT'], expect_fail=False) test(['-sLEGACY_VM_SUPPORT', '-sNO_POLYFILL'], expect_fail=True) From bedece998ea3fd61a859408667a5ae2f16309759 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Tue, 17 Sep 2024 10:42:19 -0400 Subject: [PATCH 21/43] Spacing. --- test/test_browser.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/test_browser.py b/test/test_browser.py index 1c7b15ef4d6a8..f7b24462c1821 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5417,7 +5417,8 @@ def test_fetch_polyfill_preload(self): {{{ SCRIPT }}} - ''') + + ''') def test(args, expect_fail): self.compile_btest('main.cpp', ['-sEXIT_RUNTIME', '--preload-file', path, '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html'] + args) From efaf744da8bea654c1484c92cd0ac7c21cfbd27d Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Wed, 18 Sep 2024 19:23:26 -0400 Subject: [PATCH 22/43] Style. --- test/test_browser.py | 14 +++++++------- tools/file_packager.py | 22 ++++++++++------------ 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/test/test_browser.py b/test/test_browser.py index f7b24462c1821..b90bbe1777991 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5383,22 +5383,22 @@ def test_webpack(self, es6): self.run_browser('webpack/dist/index.html', '/report_result?exit:0') def test_fetch_polyfill_preload(self): - path = 'hello-world.txt' - create_file(path, 'hello, world!') - create_file('main.cpp', r''' + create_file('hello.txt', 'hello, world!') + create_file('main.c', r''' #include #include #include int main() { - FILE *f = fopen("%s", "r"); + FILE *f = fopen("hello.txt", "r"); char buf[100]; fread(buf, 1, 20, f); buf[20] = 0; fclose(f); - printf("%%s\n", buf); + printf("%s\n", buf); return 0; } - ''' % path) + ''') + create_file('on_window_error_shell.html', r'''
@@ -5421,7 +5421,7 @@ def test_fetch_polyfill_preload(self): ''') def test(args, expect_fail): - self.compile_btest('main.cpp', ['-sEXIT_RUNTIME', '--preload-file', path, '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html'] + args) + self.compile_btest('main.c', ['-sEXIT_RUNTIME', '--preload-file', 'hello.txt', '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html'] + args) if expect_fail: js = read_file('a.out.js') create_file('a.out.js', 'let origFetch = fetch; fetch = undefined;\n' + js) diff --git a/tools/file_packager.py b/tools/file_packager.py index e602c9077b4e7..7ffe441a7fbb3 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -956,11 +956,10 @@ def generate_js(data_target, data_files, metadata): ret += ''' function fetchRemotePackage(packageName, packageSize, callback, errback) { %(node_support_code)s - Module.dataFileDownloads = Module.dataFileDownloads || {}; - const url = packageName; - fetch(url) - .catch(cause => Promise.reject(new Error(`Network Error: ${url}`, {cause}))) // If fetch fails, rewrite the error to include the failing URL & the cause. - .then(response => { + Module.dataFileDownloads ??= {}; + fetch(packageName) + .catch((cause) => Promise.reject(new Error(`Network Error: ${packageName}`, {cause}))) // If fetch fails, rewrite the error to include the failing URL & the cause. + .then((response) => { let loaded = 0; @@ -970,7 +969,7 @@ def generate_js(data_target, data_files, metadata): // If we're using the polyfill, readers won't be available... if (!response.body && response.arrayBuffer) { - response.arrayBuffer().then(buffer => callback(buffer)); + response.arrayBuffer().then(callback); return; } @@ -988,9 +987,9 @@ def generate_js(data_target, data_files, metadata): if (!done) { chunks.push(value); loaded += value.length; - Module.dataFileDownloads[url] = Module.dataFileDownloads[url] ?? {}; - Module.dataFileDownloads[url].loaded = loaded; - Module.dataFileDownloads[url].total = size; + Module.dataFileDownloads[packageName] = Module.dataFileDownloads[packageName] ?? {}; + Module.dataFileDownloads[packageName].loaded = loaded; + Module.dataFileDownloads[packageName].total = size; let totalLoaded = 0; let totalSize = 0; @@ -1022,12 +1021,11 @@ def generate_js(data_target, data_files, metadata): }; return iterate(); }); - };\n''' % {'node_support_code': node_support_code} + }; - ret += ''' function handleError(error) { console.error('package error:', error); - };\n''' + };\n''' % {'node_support_code': node_support_code} code += ''' function processPackageData(arrayBuffer) { From e360fa80756a58e8865cf697c1210e600cd913b1 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Wed, 18 Sep 2024 20:40:05 -0400 Subject: [PATCH 23/43] Brackets. --- tools/file_packager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/file_packager.py b/tools/file_packager.py index 7ffe441a7fbb3..21bc1085a8359 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -979,7 +979,7 @@ def generate_js(data_target, data_files, metadata): const size = headers.get('Content-Length') ?? packageSize; const chunks = []; - const iterate = () => reader.read().then(handleChunk).catch(cause => { + const iterate = () => reader.read().then(handleChunk).catch((cause) => { return Promise.reject(new Error(`Unexpected error while handling : ${response.url} ${cause}`, {cause})); }); @@ -1008,7 +1008,7 @@ def generate_js(data_target, data_files, metadata): return iterate(); } else { - const size = chunks.map(c => c.length).reduce((a, b) => a + b, 0); + const size = chunks.map((c) => c.length).reduce((a, b) => a + b, 0); let index = 0; const packageData = new Uint8Array(size); for(const chunk of chunks) { @@ -1119,7 +1119,7 @@ def generate_js(data_target, data_files, metadata): Module['addRunDependency']('%(metadata_file)s'); var REMOTE_METADATA_NAME = Module['locateFile'] ? Module['locateFile']('%(metadata_file)s', '') : '%(metadata_file)s'; fetch(REMOTE_METADATA_NAME) - .then(response => { + .then((response) => { if (response.ok) { return response.json(); } From 295b75033d8704d42357aed6fe918ce2977f9b94 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Wed, 18 Sep 2024 21:23:07 -0400 Subject: [PATCH 24/43] Style. --- tools/file_packager.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/tools/file_packager.py b/tools/file_packager.py index 21bc1085a8359..237368b5d4cf3 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -1001,17 +1001,14 @@ def generate_js(data_target, data_files, metadata): if (totalSize) { if (Module['setStatus']) Module['setStatus'](`Downloading data... (${totalLoaded}/${totalSize})`); - } - else { + } else { if (Module['setStatus']) Module['setStatus']('Downloading data...'); } return iterate(); - } - else { - const size = chunks.map((c) => c.length).reduce((a, b) => a + b, 0); + } else { let index = 0; - const packageData = new Uint8Array(size); - for(const chunk of chunks) { + const packageData = new Uint8Array(chunks.map((c) => c.length).reduce((a, b) => a + b, 0)); + for (const chunk of chunks) { packageData.set(chunk, index); index += chunk.length; } From 27a84da3fc202fb1819f4a88e7db6a352654aab8 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Wed, 18 Sep 2024 21:24:12 -0400 Subject: [PATCH 25/43] Style. --- tools/file_packager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/file_packager.py b/tools/file_packager.py index 237368b5d4cf3..a0ad2518ef4a2 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -1006,11 +1006,11 @@ def generate_js(data_target, data_files, metadata): } return iterate(); } else { - let index = 0; const packageData = new Uint8Array(chunks.map((c) => c.length).reduce((a, b) => a + b, 0)); + let offset = 0; for (const chunk of chunks) { - packageData.set(chunk, index); - index += chunk.length; + packageData.set(chunk, offset); + offset += chunk.length; } callback(packageData.buffer); From 206bb2b156bd8df9181d905466915d5204ef0939 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Thu, 19 Sep 2024 12:25:30 -0400 Subject: [PATCH 26/43] Spacing --- test/test_browser.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/test_browser.py b/test/test_browser.py index b90bbe1777991..a74d6a0a5d8b3 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5396,8 +5396,7 @@ def test_fetch_polyfill_preload(self): fclose(f); printf("%s\n", buf); return 0; - } - ''') + }''') create_file('on_window_error_shell.html', r''' @@ -5417,8 +5416,7 @@ def test_fetch_polyfill_preload(self): {{{ SCRIPT }}} - - ''') + ''') def test(args, expect_fail): self.compile_btest('main.c', ['-sEXIT_RUNTIME', '--preload-file', 'hello.txt', '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html'] + args) From f622a0dbbb2e675392115f267766b875d6c9102b Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Thu, 19 Sep 2024 13:57:02 -0400 Subject: [PATCH 27/43] Modernizing JS. --- tools/file_packager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/file_packager.py b/tools/file_packager.py index a0ad2518ef4a2..5b894fa1ec002 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -976,7 +976,7 @@ def generate_js(data_target, data_files, metadata): const reader = response.body.getReader(); const headers = response.headers; - const size = headers.get('Content-Length') ?? packageSize; + const size = Number(headers.get('Content-Length') ?? packageSize); const chunks = []; const iterate = () => reader.read().then(handleChunk).catch((cause) => { @@ -1000,9 +1000,9 @@ def generate_js(data_target, data_files, metadata): } if (totalSize) { - if (Module['setStatus']) Module['setStatus'](`Downloading data... (${totalLoaded}/${totalSize})`); + Module.setStatus?.(`Downloading data... (${totalLoaded}/${totalSize})`); } else { - if (Module['setStatus']) Module['setStatus']('Downloading data...'); + Module.setStatus?.('Downloading data...'); } return iterate(); } else { From 489bc060a5320ec876c3a1c9877d26d88272647d Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Thu, 19 Sep 2024 14:35:52 -0400 Subject: [PATCH 28/43] Style. --- tools/file_packager.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/file_packager.py b/tools/file_packager.py index 5b894fa1ec002..9edfcf51113e9 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -1000,9 +1000,9 @@ def generate_js(data_target, data_files, metadata): } if (totalSize) { - Module.setStatus?.(`Downloading data... (${totalLoaded}/${totalSize})`); + Module['setStatus']?.(`Downloading data... (${totalLoaded}/${totalSize})`); } else { - Module.setStatus?.('Downloading data...'); + Module['setStatus']?.('Downloading data...'); } return iterate(); } else { @@ -1016,6 +1016,7 @@ def generate_js(data_target, data_files, metadata): callback(packageData.buffer); } }; + return iterate(); }); }; From 071b8141a6dfd1f875ba5c65345069ef3631b45b Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Thu, 19 Sep 2024 16:05:03 -0400 Subject: [PATCH 29/43] Spacing --- test/test_browser.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/test_browser.py b/test/test_browser.py index a74d6a0a5d8b3..b90bbe1777991 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5396,7 +5396,8 @@ def test_fetch_polyfill_preload(self): fclose(f); printf("%s\n", buf); return 0; - }''') + } + ''') create_file('on_window_error_shell.html', r''' @@ -5416,7 +5417,8 @@ def test_fetch_polyfill_preload(self): {{{ SCRIPT }}} - ''') + + ''') def test(args, expect_fail): self.compile_btest('main.c', ['-sEXIT_RUNTIME', '--preload-file', 'hello.txt', '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html'] + args) From ddb958eb4980ebda9042bb31fee53b492ee136a7 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Thu, 19 Sep 2024 16:30:15 -0400 Subject: [PATCH 30/43] Style --- tools/file_packager.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tools/file_packager.py b/tools/file_packager.py index 9edfcf51113e9..24301c91dde76 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -999,11 +999,7 @@ def generate_js(data_target, data_files, metadata): totalSize += dowload.total; } - if (totalSize) { - Module['setStatus']?.(`Downloading data... (${totalLoaded}/${totalSize})`); - } else { - Module['setStatus']?.('Downloading data...'); - } + Module['setStatus']?.(`Downloading data... (${totalLoaded}/${totalSize})`); return iterate(); } else { const packageData = new Uint8Array(chunks.map((c) => c.length).reduce((a, b) => a + b, 0)); @@ -1017,6 +1013,7 @@ def generate_js(data_target, data_files, metadata): } }; + Module['setStatus']?.('Downloading data...'); return iterate(); }); }; From c553d289775ebe6df79da1043399ed3f695251b7 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Thu, 19 Sep 2024 16:31:54 -0400 Subject: [PATCH 31/43] Style --- tools/file_packager.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/file_packager.py b/tools/file_packager.py index 24301c91dde76..35fb6fdb47d10 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -956,7 +956,7 @@ def generate_js(data_target, data_files, metadata): ret += ''' function fetchRemotePackage(packageName, packageSize, callback, errback) { %(node_support_code)s - Module.dataFileDownloads ??= {}; + Module['dataFileDownloads'] ??= {}; fetch(packageName) .catch((cause) => Promise.reject(new Error(`Network Error: ${packageName}`, {cause}))) // If fetch fails, rewrite the error to include the failing URL & the cause. .then((response) => { @@ -987,14 +987,14 @@ def generate_js(data_target, data_files, metadata): if (!done) { chunks.push(value); loaded += value.length; - Module.dataFileDownloads[packageName] = Module.dataFileDownloads[packageName] ?? {}; - Module.dataFileDownloads[packageName].loaded = loaded; - Module.dataFileDownloads[packageName].total = size; + Module['dataFileDownloads'][packageName] = Module['dataFileDownloads'][packageName] ?? {}; + Module['dataFileDownloads'][packageName].loaded = loaded; + Module['dataFileDownloads'][packageName].total = size; let totalLoaded = 0; let totalSize = 0; - for (const dowload of Object.values(Module.dataFileDownloads)) { + for (const dowload of Object.values(Module['dataFileDownloads'])) { totalLoaded += dowload.loaded; totalSize += dowload.total; } From 661258b4556ed82e76d9ace72030f61d9c02e18f Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Thu, 19 Sep 2024 19:08:58 -0400 Subject: [PATCH 32/43] Style & typo. --- tools/file_packager.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tools/file_packager.py b/tools/file_packager.py index 35fb6fdb47d10..e2d5c6911849e 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -987,16 +987,17 @@ def generate_js(data_target, data_files, metadata): if (!done) { chunks.push(value); loaded += value.length; - Module['dataFileDownloads'][packageName] = Module['dataFileDownloads'][packageName] ?? {}; + + Module['dataFileDownloads'][packageName] ??= {}; Module['dataFileDownloads'][packageName].loaded = loaded; Module['dataFileDownloads'][packageName].total = size; let totalLoaded = 0; let totalSize = 0; - for (const dowload of Object.values(Module['dataFileDownloads'])) { - totalLoaded += dowload.loaded; - totalSize += dowload.total; + for (const download of Object.values(Module['dataFileDownloads'])) { + totalLoaded += download.loaded; + totalSize += download.total; } Module['setStatus']?.(`Downloading data... (${totalLoaded}/${totalSize})`); From 68d3d02c17c27e3927343ca55b49b995934c0181 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Thu, 19 Sep 2024 19:14:46 -0400 Subject: [PATCH 33/43] Removing debug. --- test/test_browser.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/test_browser.py b/test/test_browser.py index b90bbe1777991..671e6cfd558fb 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5406,7 +5406,6 @@ def test_fetch_polyfill_preload(self): {{{ SCRIPT }}} - - ''') + ''') def test(args, expect_fail): self.compile_btest('main.c', ['-sEXIT_RUNTIME', '--preload-file', 'hello.txt', '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html'] + args) From e68044e0a41d5969580e5ac67ca05c9d73219732 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Thu, 19 Sep 2024 21:00:15 -0400 Subject: [PATCH 41/43] You can't concat() TypedArrays... --- tools/file_packager.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/file_packager.py b/tools/file_packager.py index 7c0b8d0f4afd9..c17b0b576521a 100755 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -976,7 +976,6 @@ def generate_js(data_target, data_files, metadata): const chunks = []; const headers = response.headers; const total = Number(headers.get('Content-Length') ?? packageSize); - let loaded = 0; const handleChunk = ({done, value}) => { @@ -996,7 +995,12 @@ def generate_js(data_target, data_files, metadata): Module['setStatus']?.(`Downloading data... (${totalLoaded}/${totalSize})`); return iterate(); } else { - const packageData = new Uint8Array([].concat(...chunks)); + const packageData = new Uint8Array(chunks.map((c) => c.length).reduce((a, b) => a + b, 0)); + let offset = 0; + for (const chunk of chunks) { + packageData.set(chunk, offset); + offset += chunk.length; + } callback(packageData.buffer); } }; From 4fac7e043431f07de57a4577150cdadda48da229 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Thu, 19 Sep 2024 22:08:45 -0400 Subject: [PATCH 42/43] Spacing. --- test/test_browser.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/test_browser.py b/test/test_browser.py index 8455a36dde404..fde20d1a6f05b 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5390,7 +5390,8 @@ def test_fetch_polyfill_preload(self): fclose(f); printf("%s\n", buf); return 0; - }''') + } + ''') create_file('on_window_error_shell.html', r''' @@ -5409,7 +5410,8 @@ def test_fetch_polyfill_preload(self): {{{ SCRIPT }}} - ''') + + ''') def test(args, expect_fail): self.compile_btest('main.c', ['-sEXIT_RUNTIME', '--preload-file', 'hello.txt', '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html'] + args) From aadfaecb2f33be6857906815652474ded933d4f4 Mon Sep 17 00:00:00 2001 From: Sean Morris <640101+seanmorris@users.noreply.github.com> Date: Thu, 19 Sep 2024 22:54:54 -0400 Subject: [PATCH 43/43] Spacing. --- test/test_browser.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/test_browser.py b/test/test_browser.py index fde20d1a6f05b..8455a36dde404 100644 --- a/test/test_browser.py +++ b/test/test_browser.py @@ -5390,8 +5390,7 @@ def test_fetch_polyfill_preload(self): fclose(f); printf("%s\n", buf); return 0; - } - ''') + }''') create_file('on_window_error_shell.html', r''' @@ -5410,8 +5409,7 @@ def test_fetch_polyfill_preload(self): {{{ SCRIPT }}} - - ''') + ''') def test(args, expect_fail): self.compile_btest('main.c', ['-sEXIT_RUNTIME', '--preload-file', 'hello.txt', '--shell-file', 'on_window_error_shell.html', '-o', 'a.out.html'] + args)