From ac710784aff2ada5b3dd2aa0d3179aa41763faf5 Mon Sep 17 00:00:00 2001 From: Even Oscar Andersen Date: Sat, 17 May 2025 08:06:38 +0200 Subject: [PATCH] wasm: Handle exceptions in promise MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes: QTBUG-136962 Change-Id: I2d33b0132a83945b476f0f47fa4697ddaa2374b3 Reviewed-by: Morten Johan Sørvig --- src/corelib/platform/wasm/qstdweb.cpp | 11 ++++++++--- tests/manual/wasm/qstdweb/promise_main.cpp | 23 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/corelib/platform/wasm/qstdweb.cpp b/src/corelib/platform/wasm/qstdweb.cpp index 18ab0ec1a9c..727668c45ae 100644 --- a/src/corelib/platform/wasm/qstdweb.cpp +++ b/src/corelib/platform/wasm/qstdweb.cpp @@ -487,10 +487,15 @@ void Promise::adoptPromise(emscripten::val promise, PromiseCallbacks callbacks) // Set handlers on the promise if (thenIndex) - promise.call("then", suspendResume->jsEventHandlerAt(*thenIndex)); + promise = + promise.call("then", suspendResume->jsEventHandlerAt(*thenIndex)); + if (catchIndex) - promise.call("catch", suspendResume->jsEventHandlerAt(*catchIndex)); - promise.call("finally", suspendResume->jsEventHandlerAt(*finallyIndex)); + promise = promise.call("catch", + suspendResume->jsEventHandlerAt(*catchIndex)); + + promise = promise.call("finally", + suspendResume->jsEventHandlerAt(*finallyIndex)); } void Promise::all(std::vector promises, PromiseCallbacks callbacks) diff --git a/tests/manual/wasm/qstdweb/promise_main.cpp b/tests/manual/wasm/qstdweb/promise_main.cpp index 5f1e5102c93..395e815cf95 100644 --- a/tests/manual/wasm/qstdweb/promise_main.cpp +++ b/tests/manual/wasm/qstdweb/promise_main.cpp @@ -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()); + QWASMSUCCESS(); + } + }, std::string("throwInThen")); + + EM_ASM({ + testSupport.resolve["throwInThen"](); + }); +} + void WasmPromiseTest::bareFinally() { init();