From e76a04d26c95c5c2486cdbfe81681f5dfc3ea5c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20S=C3=B8rvig?= Date: Tue, 28 Nov 2023 18:12:12 +0100 Subject: [PATCH] wasm: fix qtloader.js preRun usage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Emscripten documents that preRun should be an array of functions, but also accepts setting it to a single function. qtloader.js was accidentally using this feature, which works as long as qtloader is the single user, but breaks if other code expects an array. A typical error in this case is: "Module.preRun.push is not a function" Fix this by creating and maintaining preRun as an array. Pick-to: 6.6 Change-Id: Ie1382695f3f25839cb971ab4adc81984fc8c53ca Reviewed-by: Morten Johan Sørvig (cherry picked from commit bf39bd8e06e9d66bfb9f01e83c743420e812b630) Reviewed-by: Qt Cherry-pick Bot --- src/plugins/platforms/wasm/qtloader.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/plugins/platforms/wasm/qtloader.js b/src/plugins/platforms/wasm/qtloader.js index 1b76d4ecc12..c0bb3652cfa 100644 --- a/src/plugins/platforms/wasm/qtloader.js +++ b/src/plugins/platforms/wasm/qtloader.js @@ -116,15 +116,13 @@ async function qtLoad(config) } } - const originalPreRun = config.preRun; - config.preRun = instance => - { - originalPreRun?.(); - + const qtPreRun = (instance) => { + // Copy qt.environment to instance.ENV throwIfEnvUsedButNotExported(instance, config); for (const [name, value] of Object.entries(config.qt.environment ?? {})) instance.ENV[name] = value; + // Copy self.preloadData to MEMFS const makeDirs = (FS, filePath) => { const parts = filePath.split("/"); let path = "/"; @@ -142,13 +140,16 @@ async function qtLoad(config) } } } - throwIfFsUsedButNotExported(instance, config); for ({destination, data} of self.preloadData) { makeDirs(instance.FS, destination); instance.FS.writeFile(destination, new Uint8Array(data)); } - }; + } + + if (!config.preRun) + config.preRun = []; + config.preRun.push(qtPreRun); config.onRuntimeInitialized = () => config.qt.onLoaded?.();