From 593c7b9be40f3fa876ffadd7518795a333dc5b74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20S=C3=B8rvig?= Date: Thu, 3 Apr 2025 23:19:44 +0200 Subject: [PATCH] wasm: port a11y event handling to suspendresumecontrol The accessibility code uses a shared event handler installed on several elements. Register the event handler in the constructor and then add it to the a11y elements as needed. Change-Id: I9bfc49a3358f15cc62de9c8140cab96cf0b23161 Reviewed-by: Even Oscar Andersen Reviewed-by: Lorn Potter --- .../platforms/wasm/qwasmaccessibility.cpp | 44 +++++++++++-------- .../platforms/wasm/qwasmaccessibility.h | 4 +- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/plugins/platforms/wasm/qwasmaccessibility.cpp b/src/plugins/platforms/wasm/qwasmaccessibility.cpp index df6812b263c..c4d697b3e55 100644 --- a/src/plugins/platforms/wasm/qwasmaccessibility.cpp +++ b/src/plugins/platforms/wasm/qwasmaccessibility.cpp @@ -5,6 +5,7 @@ #include "qwasmscreen.h" #include "qwasmwindow.h" #include "qwasmintegration.h" +#include #include #if QT_CONFIG(accessibility) @@ -29,10 +30,22 @@ QWasmAccessibility::QWasmAccessibility() if (qEnvironmentVariableIntValue("QT_WASM_ENABLE_ACCESSIBILITY") == 1) enableAccessibility(); + + // Register accessiiblity element event handler + QWasmSuspendResumeControl *suspendResume = QWasmSuspendResumeControl::get(); + Q_ASSERT(suspendResume); + m_eventHandlerIndex = suspendResume->registerEventHandler([this](const emscripten::val event){ + this->handleEventFromHtmlElement(event); + }); } QWasmAccessibility::~QWasmAccessibility() { + // Remove accessiiblity element event handler + QWasmSuspendResumeControl *suspendResume = QWasmSuspendResumeControl::get(); + Q_ASSERT(suspendResume); + suspendResume->removeEventHandler(m_eventHandlerIndex); + s_instance = nullptr; } @@ -170,8 +183,10 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac case QAccessible::Button: { element = document.call("createElement", std::string("button")); + element.call("addEventListener", emscripten::val("click"), - emscripten::val::module_property("qtEventReceived"), true); + QWasmSuspendResumeControl::get()->jsEventHandlerAt(m_eventHandlerIndex), true); + } break; case QAccessible::CheckBox: { element = document.call("createElement", std::string("input")); @@ -180,7 +195,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac element.call("setAttribute", std::string("checked"), std::string("true")); } element.call("addEventListener", emscripten::val("change"), - emscripten::val::module_property("qtEventReceived"), true); + QWasmSuspendResumeControl::get()->jsEventHandlerAt(m_eventHandlerIndex), true); } break; @@ -192,7 +207,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac } element.set(std::string("name"), std::string("buttonGroup")); element.call("addEventListener", emscripten::val("change"), - emscripten::val::module_property("qtEventReceived"), true); + QWasmSuspendResumeControl::get()->jsEventHandlerAt(m_eventHandlerIndex), true); } break; case QAccessible::SpinBox: { @@ -201,7 +216,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac std::string valueString = iface->valueInterface()->currentValue().toString().toStdString(); element.call("setAttribute", std::string("value"), valueString); element.call("addEventListener", emscripten::val("change"), - emscripten::val::module_property("qtEventReceived"), true); + QWasmSuspendResumeControl::get()->jsEventHandlerAt(m_eventHandlerIndex), true); } break; case QAccessible::Slider: { @@ -210,7 +225,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac std::string valueString = iface->valueInterface()->currentValue().toString().toStdString(); element.call("setAttribute", std::string("value"), valueString); element.call("addEventListener", emscripten::val("change"), - emscripten::val::module_property("qtEventReceived"), true); + QWasmSuspendResumeControl::get()->jsEventHandlerAt(m_eventHandlerIndex), true); } break; case QAccessible::PageTabList:{ @@ -236,7 +251,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac QString text = iface->text(QAccessible::Name); element.call("setAttribute", std::string("title"), text.toStdString()); element.call("addEventListener", emscripten::val("click"), - emscripten::val::module_property("qtEventReceived"), true); + QWasmSuspendResumeControl::get()->jsEventHandlerAt(m_eventHandlerIndex), true); } break; case QAccessible::ScrollBar: { @@ -245,7 +260,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac std::string valueString = iface->valueInterface()->currentValue().toString().toStdString(); element.call("setAttribute", std::string("aria-valuenow"), valueString); element.call("addEventListener", emscripten::val("change"), - emscripten::val::module_property("qtEventReceived"), true); + QWasmSuspendResumeControl::get()->jsEventHandlerAt(m_eventHandlerIndex), true); } break; case QAccessible::StaticText: { @@ -263,7 +278,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac element.call("setAttribute", std::string("role"), std::string("toolbar")); element.call("setAttribute", std::string("title"), text.toStdString()); element.call("addEventListener", emscripten::val("click"), - emscripten::val::module_property("qtEventReceived"), true); + QWasmSuspendResumeControl::get()->jsEventHandlerAt(m_eventHandlerIndex), true); }break; case QAccessible::MenuItem: case QAccessible::ButtonMenu: { @@ -273,7 +288,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac element.call("setAttribute", std::string("role"), std::string("menuitem")); element.call("setAttribute", std::string("title"), text.toStdString()); element.call("addEventListener", emscripten::val("click"), - emscripten::val::module_property("qtEventReceived"), true); + QWasmSuspendResumeControl::get()->jsEventHandlerAt(m_eventHandlerIndex), true); }break; case QAccessible::MenuBar: case QAccessible::PopupMenu: { @@ -293,7 +308,7 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac element = document.call("createElement", std::string("input")); element.call("setAttribute", std::string("type"),std::string("text")); element.call("addEventListener", emscripten::val("input"), - emscripten::val::module_property("qtEventReceived"), true); + QWasmSuspendResumeControl::get()->jsEventHandlerAt(m_eventHandlerIndex), true); } break; default: qCDebug(lcQpaAccessibility) << "TODO: createHtmlElement() handle" << iface->role(); @@ -825,13 +840,4 @@ void QWasmAccessibility::cleanup() } -void QWasmAccessibility::onHtmlEventReceived(emscripten::val event) -{ - static_cast(QWasmIntegration::get()->accessibility())->handleEventFromHtmlElement(event); -} - -EMSCRIPTEN_BINDINGS(qtButtonEvent) { - function("qtEventReceived", &QWasmAccessibility::onHtmlEventReceived); -} - #endif // QT_CONFIG(accessibility) diff --git a/src/plugins/platforms/wasm/qwasmaccessibility.h b/src/plugins/platforms/wasm/qwasmaccessibility.h index 2502c416b85..7d773f3051e 100644 --- a/src/plugins/platforms/wasm/qwasmaccessibility.h +++ b/src/plugins/platforms/wasm/qwasmaccessibility.h @@ -78,15 +78,13 @@ private: void initialize() override; void cleanup() override; -public: // public for EMSCRIPTEN_BINDINGS - static void onHtmlEventReceived(emscripten::val event); - private: static QWasmAccessibility *s_instance; QObject *m_rootObject = nullptr; bool m_accessibilityEnabled = false; std::map>> m_enableButtons; QHash m_elements; + int m_eventHandlerIndex; }; #endif // QT_CONFIG(accessibility)