wasm: Handle exceptions in promise

Fixes: QTBUG-136962
Change-Id: I2d33b0132a83945b476f0f47fa4697ddaa2374b3
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
This commit is contained in:
Even Oscar Andersen 2025-05-17 08:06:38 +02:00
parent c3c51dd5d1
commit ac710784af
2 changed files with 31 additions and 3 deletions

View File

@ -487,10 +487,15 @@ void Promise::adoptPromise(emscripten::val promise, PromiseCallbacks callbacks)
// Set handlers on the promise
if (thenIndex)
promise.call<emscripten::val>("then", suspendResume->jsEventHandlerAt(*thenIndex));
promise =
promise.call<emscripten::val>("then", suspendResume->jsEventHandlerAt(*thenIndex));
if (catchIndex)
promise.call<emscripten::val>("catch", suspendResume->jsEventHandlerAt(*catchIndex));
promise.call<emscripten::val>("finally", suspendResume->jsEventHandlerAt(*finallyIndex));
promise = promise.call<emscripten::val>("catch",
suspendResume->jsEventHandlerAt(*catchIndex));
promise = promise.call<emscripten::val>("finally",
suspendResume->jsEventHandlerAt(*finallyIndex));
}
void Promise::all(std::vector<emscripten::val> promises, PromiseCallbacks callbacks)

View File

@ -54,6 +54,7 @@ private slots:
void multipleResolve();
void simpleReject();
void multipleReject();
void throwInThen();
void bareFinally();
void finallyWithThen();
void finallyWithThrow();
@ -188,6 +189,28 @@ void WasmPromiseTest::multipleReject()
}, promiseCount);
}
void WasmPromiseTest::throwInThen()
{
init();
qstdweb::Promise::make(m_testSupport, "makeTestPromise", {
.thenFunc = [](val result) {
Q_UNUSED(result);
EM_ASM({
throw "Expected error";
});
},
.catchFunc = [](val error) {
QWASMCOMPARE("Expected error", error.as<std::string>());
QWASMSUCCESS();
}
}, std::string("throwInThen"));
EM_ASM({
testSupport.resolve["throwInThen"]();
});
}
void WasmPromiseTest::bareFinally()
{
init();