diff --git a/src/gui/accessible/linux/atspiadaptor.cpp b/src/gui/accessible/linux/atspiadaptor.cpp index 13cd494d8c8..a83dec4e644 100644 --- a/src/gui/accessible/linux/atspiadaptor.cpp +++ b/src/gui/accessible/linux/atspiadaptor.cpp @@ -1647,7 +1647,7 @@ bool AtSpiAdaptor::accessibleInterface(QAccessibleInterface *interface, const QS sendReply(connection, message, QVariant::fromValue(spiStateSetFromSpiStates(spiState))); } else if (function == "GetAttributes"_L1) { - sendReply(connection, message, QVariant::fromValue(QSpiAttributeSet())); + sendReply(connection, message, QVariant::fromValue(getAttributes(interface))); } else if (function == "GetRelationSet"_L1) { sendReply(connection, message, QVariant::fromValue(relationSet(interface, connection))); } else if (function == "GetApplication"_L1) { @@ -2305,6 +2305,38 @@ namespace } } +QSpiAttributeSet AtSpiAdaptor::getAttributes(QAccessibleInterface *interface) const +{ + QSpiAttributeSet set; + QAccessibleAttributesInterface *attributesIface = interface->attributesInterface(); + if (!attributesIface) + return set; + + const QList attrKeys = attributesIface->attributeKeys(); + for (QAccessible::Attribute key : attrKeys) { + const QVariant value = attributesIface->attributeValue(key); + // see "Core Accessibility API Mappings" spec: https://www.w3.org/TR/core-aam-1.2/ + switch (key) { + case QAccessible::Attribute::Custom: + { + // forward custom attributes to AT-SPI as-is + Q_ASSERT((value.canConvert>())); + const QHash attrMap = value.value>(); + for (auto [name, val] : attrMap.asKeyValueRange()) + set.insert(name, val); + break; + } + case QAccessible::Attribute::Level: + Q_ASSERT(value.canConvert()); + set.insert(QStringLiteral("level"), QString::number(value.toInt())); + break; + default: + break; + } + } + return set; +} + // FIXME all attribute methods below should share code QVariantList AtSpiAdaptor::getAttributes(QAccessibleInterface *interface, int offset, bool includeDefaults) const { diff --git a/src/gui/accessible/linux/atspiadaptor_p.h b/src/gui/accessible/linux/atspiadaptor_p.h index aab15d4501b..68a455e7cb7 100644 --- a/src/gui/accessible/linux/atspiadaptor_p.h +++ b/src/gui/accessible/linux/atspiadaptor_p.h @@ -89,6 +89,7 @@ private: // accessible helper functions AtspiRole getRole(QAccessibleInterface *interface) const; + QSpiAttributeSet getAttributes(QAccessibleInterface *) const; QSpiRelationArray relationSet(QAccessibleInterface *interface, const QDBusConnection &connection) const; QStringList accessibleInterfaces(QAccessibleInterface *interface) const; diff --git a/src/gui/accessible/qaccessible.cpp b/src/gui/accessible/qaccessible.cpp index b037279e8b8..eec779efb10 100644 --- a/src/gui/accessible/qaccessible.cpp +++ b/src/gui/accessible/qaccessible.cpp @@ -3192,7 +3192,7 @@ bool QAccessibleSelectionInterface::isSelected(QAccessibleInterface *childItem) Attributes are key-value pairs. Values are stored in \l QVariant. - The \a QAccessible::Attributes enumeration describes the available keys and + The \l QAccessible::Attribute enumeration describes the available keys and documents which type to use for the value of each key. While the text-specific attributes handled by \l QAccessibleTextInterface::attributes @@ -3225,8 +3225,11 @@ QAccessibleAttributesInterface::~QAccessibleAttributesInterface() Returns the value of the attribute \a key of this object. - If the specificed attribute is not set for this object, an invalid - \l QVariant is returned. + If the attribute is set for this object, a value of the type documented for the + given key in the documentation of the \l QAccessible::Attribute enumeration is + returned in the \l QVariant. + + Otherwise, an invalid \l QVariant is returned. */ /*! \internal */