wasm: fix qtloader.js preRun usage

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 <morten.sorvig@qt.io>
(cherry picked from commit bf39bd8e06e9d66bfb9f01e83c743420e812b630)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Morten Sørvig 2023-11-28 18:12:12 +01:00 committed by Qt Cherry-pick Bot
parent 41c9754b4c
commit e76a04d26c

View File

@ -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?.();