From 0ec75f4b9932a65f9ec7ec79eb6f2e04691cea3f Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Wed, 13 Apr 2022 13:58:44 +1000 Subject: [PATCH] wasm: use emscripten::val for specialHTMLTargets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We need to add specialHTMLTargets to EXPORTED_RUNTIME_METHODS in order to use it, as Emscripten does not export it. Also, EM_ASM is not allowed for SIDE_MODULES, so it's better to use emscripten::val methods. Change-Id: I9b352ac98e2a961157f5bb36456bec3e35891270 Reviewed-by: Morten Johan Sørvig --- cmake/QtWasmHelpers.cmake | 2 +- src/plugins/platforms/wasm/qwasmscreen.cpp | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cmake/QtWasmHelpers.cmake b/cmake/QtWasmHelpers.cmake index 47af621861b..b8e58398608 100644 --- a/cmake/QtWasmHelpers.cmake +++ b/cmake/QtWasmHelpers.cmake @@ -3,7 +3,7 @@ function (qt_internal_setup_wasm_target_properties wasmTarget) target_link_options("${wasmTarget}" INTERFACE "SHELL:-s ERROR_ON_UNDEFINED_SYMBOLS=1" - "SHELL:-s EXPORTED_RUNTIME_METHODS=[UTF16ToString,stringToUTF16]" + "SHELL:-s EXPORTED_RUNTIME_METHODS=[UTF16ToString,stringToUTF16,specialHTMLTargets]" "SHELL:-s USE_WEBGL2=1" "--bind" "SHELL:-s FETCH=1") diff --git a/src/plugins/platforms/wasm/qwasmscreen.cpp b/src/plugins/platforms/wasm/qwasmscreen.cpp index c32adbe13fd..ef1fb39f5b8 100644 --- a/src/plugins/platforms/wasm/qwasmscreen.cpp +++ b/src/plugins/platforms/wasm/qwasmscreen.cpp @@ -104,9 +104,10 @@ QWasmScreen::QWasmScreen(const emscripten::val &containerOrCanvas) // apps/ages only, since Emscripten uses the main document to look up the element. // As a workaround for this, Emscripten supports registering custom mappings in the // "specialHTMLTargets" object. Add a mapping for the canvas for this screen. - EM_ASM({ - specialHTMLTargets["!qtcanvas_" + $0] = Emval.toValue($1); - }, uint32_t(this), m_canvas.as_handle()); + emscripten::val specialHtmlTargets = emscripten::val::module_property("specialHTMLTargets"); + + std::string id = std::string("!qtcanvas_") + std::to_string(uint32_t(this)); + specialHtmlTargets.set(id, m_canvas.as_handle()); // Install event handlers on the container/canvas. This must be // done after the canvas has been created above. @@ -118,9 +119,10 @@ QWasmScreen::QWasmScreen(const emscripten::val &containerOrCanvas) QWasmScreen::~QWasmScreen() { - EM_ASM({ - specialHTMLTargets["!qtcanvas_" + $0] = undefined; - }, uint32_t(this)); + emscripten::val specialHtmlTargets = emscripten::val::module_property("specialHTMLTargets"); + + std::string id = std::string("!qtcanvas_") + std::to_string(uint32_t(this)); + specialHtmlTargets.set(id, emscripten::val::undefined()); m_canvas.set(m_canvasResizeObserverCallbackContextPropertyName, emscripten::val(intptr_t(0))); destroy();