From a7136c3e7b3fb3576a5922a094cd8de14575d0e1 Mon Sep 17 00:00:00 2001 From: Even Oscar Andersen Date: Fri, 11 Apr 2025 07:28:27 +0200 Subject: [PATCH] wasm: Reduce usage of the id attribute MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It is not always required, limit it to the cases where it is explicitly given, or if it is necessary. Fixes: QTBUG-135024 Change-Id: I451379d86543e2297574d4cda09ef825736f9c5d Reviewed-by: Morten Johan Sørvig --- .../platforms/wasm/qwasmaccessibility.cpp | 40 ++++++++++++++----- .../platforms/wasm/qwasmaccessibility.h | 1 + 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/plugins/platforms/wasm/qwasmaccessibility.cpp b/src/plugins/platforms/wasm/qwasmaccessibility.cpp index 3ad0bf36ad9..4cd8d962312 100644 --- a/src/plugins/platforms/wasm/qwasmaccessibility.cpp +++ b/src/plugins/platforms/wasm/qwasmaccessibility.cpp @@ -8,6 +8,8 @@ #include #include +#include + #if QT_CONFIG(accessibility) #include @@ -231,15 +233,11 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac case QAccessible::PageTabList:{ element = document.call("createElement", std::string("div")); element.call("setAttribute", std::string("role"), std::string("tablist")); - QString idName = iface->text(QAccessible::Name).replace(" ", "_"); - idName += "_tabList"; - element.call("setAttribute", std::string("id"), idName.toStdString()); for (int i = 0; i < iface->childCount(); ++i) { if (iface->child(i)->role() == QAccessible::PageTab){ emscripten::val elementTab = emscripten::val::undefined(); elementTab = ensureHtmlElement(iface->child(i)); - elementTab.call("setAttribute", std::string("aria-owns"), idName.toStdString()); setHtmlElementGeometry(iface->child(i)); } } @@ -315,12 +313,6 @@ emscripten::val QWasmAccessibility::createHtmlElement(QAccessibleInterface *ifac element = document.call("createElement", std::string("div")); } - QString id = QAccessibleBridgeUtils::accessibleId(iface); - if (iface->role() != QAccessible::PageTabList) - element.call("setAttribute", std::string("id"), id.toStdString()); - - element.call("addEventListener", emscripten::val("focus"), - emscripten::val::module_property("qtEventReceived"), true); return element; }(); @@ -610,6 +602,7 @@ void QWasmAccessibility::populateAccessibilityTree(QAccessibleInterface *iface) setHtmlElementGeometry(iface); setHtmlElementTextName(iface); setHtmlElementDescription(iface); + handleIdentifierUpdate(iface); } for (int i = 0; i < iface->childCount(); ++i) populateAccessibilityTree(iface->child(i)); @@ -740,6 +733,30 @@ void QWasmAccessibility::handlePageTabListUpdate(QAccessibleEvent *event) } } +void QWasmAccessibility::handleIdentifierUpdate(QAccessibleInterface *iface) +{ + emscripten::val element = ensureHtmlElement(iface); + QString id = iface->text(QAccessible::Identifier).replace(" ", "_"); + if (id.isEmpty() && iface->role() == QAccessible::PageTabList) { + std::ostringstream oss; + oss << "tabList_0x" << (void *)iface; + id = QString::fromUtf8(oss.str()); + } + + if (!id.isEmpty()) { + element.call("setAttribute", std::string("id"), id.toStdString()); + + if (iface->role() == QAccessible::PageTabList) { + for (int i = 0; i < iface->childCount(); ++i) { + auto child = ensureHtmlElement(iface->child(i)); + child.call("setAttribute", std::string("aria-owns"), id.toStdString()); + } + } + } else { + element.call("removeAttribute", std::string("id")); + } +} + void QWasmAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) { if (!m_accessibilityEnabled) @@ -758,6 +775,9 @@ void QWasmAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) setHtmlElementFocus(iface); break; + case QAccessible::IdentifierChanged: + handleIdentifierUpdate(iface); + return; case QAccessible::ObjectShow: setHtmlElementVisibility(iface, true); diff --git a/src/plugins/platforms/wasm/qwasmaccessibility.h b/src/plugins/platforms/wasm/qwasmaccessibility.h index 7d773f3051e..2f8d55a8f99 100644 --- a/src/plugins/platforms/wasm/qwasmaccessibility.h +++ b/src/plugins/platforms/wasm/qwasmaccessibility.h @@ -69,6 +69,7 @@ private: void handleSliderUpdate(QAccessibleEvent *event); void handleScrollBarUpdate(QAccessibleEvent *event); void handlePageTabListUpdate(QAccessibleEvent *event); + void handleIdentifierUpdate(QAccessibleInterface *iface); void handleEventFromHtmlElement(const emscripten::val event);