summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEven Oscar Andersen <[email protected]>2025-06-06 09:52:23 +0200
committerEven Oscar Andersen <[email protected]>2025-06-13 12:02:20 +0200
commit30c254591d30300221fe4d98dbe885474a2889d9 (patch)
treea957bdc0094620becc162b80ee720b1b97a98e94
parent60841478d3a5de10f279c77f3c722d666c51656a (diff)
wasm: a11y - Implement support for disabled attribute
Fixes: QTBUG-137449 Change-Id: I6aa07c7108b5ad14c12e6f24e71b8dda12fec483 Reviewed-by: Morten Johan Sørvig <[email protected]>
-rw-r--r--src/plugins/platforms/wasm/qwasmaccessibility.cpp15
-rw-r--r--src/plugins/platforms/wasm/qwasmaccessibility.h1
-rw-r--r--src/widgets/kernel/qwidget.cpp17
3 files changed, 32 insertions, 1 deletions
diff --git a/src/plugins/platforms/wasm/qwasmaccessibility.cpp b/src/plugins/platforms/wasm/qwasmaccessibility.cpp
index 842d70145a1..fdbd301753e 100644
--- a/src/plugins/platforms/wasm/qwasmaccessibility.cpp
+++ b/src/plugins/platforms/wasm/qwasmaccessibility.cpp
@@ -454,7 +454,7 @@ void QWasmAccessibility::setHtmlElementVisibility(QAccessibleInterface *iface, b
container.call<void>("appendChild", element);
- visible = visible && !iface->state().invisible && !iface->state().disabled;
+ visible = visible && !iface->state().invisible;
setProperty(element, "ariaHidden", !visible); // ariaHidden mean completely hidden; maybe some sort of soft-hidden should be used.
}
@@ -513,6 +513,12 @@ void QWasmAccessibility::setHtmlElementFocus(QAccessibleInterface *iface)
element.call<void>("focus");
}
+void QWasmAccessibility::setHtmlElementDisabled(QAccessibleInterface *iface)
+{
+ auto element = ensureHtmlElement(iface);
+ setAttribute(element, "aria-disabled", iface->state().disabled);
+}
+
void QWasmAccessibility::handleStaticTextUpdate(QAccessibleEvent *event)
{
switch (event->type()) {
@@ -677,6 +683,7 @@ void QWasmAccessibility::populateAccessibilityTree(QAccessibleInterface *iface)
setHtmlElementVisibility(iface, true);
setHtmlElementGeometry(iface);
setHtmlElementTextName(iface);
+ setHtmlElementDisabled(iface);
handleIdentifierUpdate(iface);
handleDescriptionChanged(iface);
}
@@ -853,6 +860,12 @@ void QWasmAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event)
// Handle some common event types. See
// https://doc.qt.io/qt-5/qaccessible.html#Event-enum
switch (event->type()) {
+ case QAccessible::StateChanged: {
+ QAccessibleStateChangeEvent *stateChangeEvent = (QAccessibleStateChangeEvent *)event;
+ if (stateChangeEvent->changedStates().disabled)
+ setHtmlElementDisabled(iface);
+ } break;
+
case QAccessible::DescriptionChanged:
handleDescriptionChanged(iface);
return;
diff --git a/src/plugins/platforms/wasm/qwasmaccessibility.h b/src/plugins/platforms/wasm/qwasmaccessibility.h
index c5dc9d9cb73..64e7f603833 100644
--- a/src/plugins/platforms/wasm/qwasmaccessibility.h
+++ b/src/plugins/platforms/wasm/qwasmaccessibility.h
@@ -58,6 +58,7 @@ private:
void setHtmlElementTextName(QAccessibleInterface *iface);
void setHtmlElementTextNameLE(QAccessibleInterface *iface);
void setHtmlElementFocus(QAccessibleInterface *iface);
+ void setHtmlElementDisabled(QAccessibleInterface *iface);
void handleStaticTextUpdate(QAccessibleEvent *event);
void handleButtonUpdate(QAccessibleEvent *event);
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index e2a505f6e2a..1155172a0a8 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -3377,8 +3377,25 @@ QAction *QWidget::addAction(const QIcon &icon, const QString &text, const QKeySe
void QWidget::setEnabled(bool enable)
{
Q_D(QWidget);
+
+#if QT_CONFIG(accessibility)
+ const bool wasEnabled = !testAttribute(Qt::WA_ForceDisabled);
+#endif
+
setAttribute(Qt::WA_ForceDisabled, !enable);
d->setEnabled_helper(enable);
+
+#if QT_CONFIG(accessibility)
+ // A widget is enabled if it's parent and itself is enabled.
+ // We do not send state changed events recursively. It is up
+ // to the receiver of the events to check children if required.
+ if (QAccessible::isActive() && wasEnabled != enable) {
+ QAccessible::State states;
+ states.disabled = 1;
+ QAccessibleStateChangeEvent scEvent(this, states);
+ QAccessible::updateAccessibility(&scEvent);
+ }
+#endif
}
void QWidgetPrivate::setEnabled_helper(bool enable)