diff options
| author | Jan Arve Sæther <jan-arve.saether@qt.io> | 2025-03-28 16:51:30 +0100 |
|---|---|---|
| committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2025-04-11 10:18:49 +0000 |
| commit | b206c4e687f2c942cd429258b93be6aae245bb34 (patch) | |
| tree | fb9f93b9a53069fc6dc1a6af15f9581dbb787ebb | |
| parent | 2e1c6757e7ac4b335ed8b7aa68e7a0feed00d81f (diff) | |
Don't overwrite Accessible.description when it was explicitly set
QQuickTextAreaPrivate::accessibilityActiveChanged() unconditionally set
the Accessible.description to it's placeholder text whenever the
accessibility became active (also when it became inactive, but it's
beside the point). However, this meant that any explicitly set
description would be overwritten each time accessibility became active.
This was also the case whenever placeholderText got changed.
Follow the same pattern as the Accessible.name property: Add an API for
setting an implicit description: setDescriptionImplicitly(). This is
similar to setNameImplicitly().
If there is already an explicit description set,
setDescriptionImplicitly() will do nothing. Otherwise, it will set the
description.
Thanks for Even Oscar Andersen <even.oscar.andersen@qt.io> for reporting
the bug
Task-number: QTBUG-135164
Change-Id: I8d63c70225c5a46e5e3df7f3359c87fca399f530
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
(cherry picked from commit e84635f9239673592f44df99d3e0f9b65a1d97f0)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit 13869111e47b3bb92243f41725676e41051ce530)
| -rw-r--r-- | src/quick/items/qquickaccessibleattached.cpp | 8 | ||||
| -rw-r--r-- | src/quick/items/qquickaccessibleattached_p.h | 1 | ||||
| -rw-r--r-- | src/quicktemplates/qquicktextarea.cpp | 4 | ||||
| -rw-r--r-- | tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp | 92 |
4 files changed, 103 insertions, 2 deletions
diff --git a/src/quick/items/qquickaccessibleattached.cpp b/src/quick/items/qquickaccessibleattached.cpp index 2ba7d38d4a..a363cdc7f2 100644 --- a/src/quick/items/qquickaccessibleattached.cpp +++ b/src/quick/items/qquickaccessibleattached.cpp @@ -429,6 +429,14 @@ void QQuickAccessibleAttached::setNameImplicitly(const QString &name) m_nameExplicitlySet = false; } +void QQuickAccessibleAttached::setDescriptionImplicitly(const QString &desc) +{ + if (m_descriptionExplicitlySet) + return; + setDescription(desc); + m_descriptionExplicitlySet = false; +} + QQuickAccessibleAttached *QQuickAccessibleAttached::qmlAttachedProperties(QObject *obj) { return new QQuickAccessibleAttached(obj); diff --git a/src/quick/items/qquickaccessibleattached_p.h b/src/quick/items/qquickaccessibleattached_p.h index 9f3883b8b7..528a9d2288 100644 --- a/src/quick/items/qquickaccessibleattached_p.h +++ b/src/quick/items/qquickaccessibleattached_p.h @@ -120,6 +120,7 @@ public: QAccessible::updateAccessibility(&ev); } } + void setDescriptionImplicitly(const QString &desc); QString id() const { return m_id; } void setId(const QString &id) diff --git a/src/quicktemplates/qquicktextarea.cpp b/src/quicktemplates/qquicktextarea.cpp index 7656c3e0ed..63c438ef69 100644 --- a/src/quicktemplates/qquicktextarea.cpp +++ b/src/quicktemplates/qquicktextarea.cpp @@ -419,7 +419,7 @@ void QQuickTextAreaPrivate::accessibilityActiveChanged(bool active) { QQuickTextEditPrivate::accessibilityActiveChanged(active); if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(q_func())) - accessibleAttached->setDescription(placeholder); + accessibleAttached->setDescriptionImplicitly(placeholder); } #endif @@ -615,7 +615,7 @@ void QQuickTextArea::setPlaceholderText(const QString &text) d->placeholder = text; #if QT_CONFIG(accessibility) if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(this)) - accessibleAttached->setDescription(text); + accessibleAttached->setDescriptionImplicitly(text); #endif emit placeholderTextChanged(); } diff --git a/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp b/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp index fe700a959f..e5d57fe6f9 100644 --- a/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp +++ b/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp @@ -57,6 +57,9 @@ private slots: void commonTests(); void quickAttachedProperties(); + + void quickAttachedProperties_description_data(); + void quickAttachedProperties_description(); void attachedWins(); void basicPropertiesTest(); void hitTest(); @@ -327,6 +330,95 @@ void tst_QQuickAccessible::quickAttachedProperties() QTestAccessibility::clearEvents(); } +void tst_QQuickAccessible::quickAttachedProperties_description_data() +{ + QTest::addColumn<QString>("qmlCode"); + QTest::addColumn<QString>("initialExplicitDescription"); + QTest::addColumn<QString>("implicitDescription"); + QTest::addColumn<QString>("implicitDescription2"); + QTest::addColumn<QString>("explicitDescription2"); + QTest::addColumn<QString>("implicitDescription3"); + + QTest::addColumn<QAccessible::Role>("expectedRole"); + QTest::addColumn<QString>("expectedDescription"); + + QTest::newRow("TextArea with initial explicit description") << R"( + import QtQuick + import QtQuick.Controls + TextArea { + Accessible.role: Accessible.EditableText + %1 + })" + << "Explicit description" + << "Initial implicit" // implicitDescription + << "Updated implicit" // implicitDescription2 + << "Explicit" // explicitDescription2 + << "Updated implicit again" // implicitDescription3 + + // EXPECTED + << QAccessible::EditableText + << "Explicit description"; + + + QTest::newRow("TextArea, no initial explicit description") << R"( + import QtQuick + import QtQuick.Controls + TextArea { + Accessible.role: Accessible.EditableText + %1 + })" + << QString() + << "Initial implicit" // implicitDescription + << "Updated implicit" // implicitDescription2 + << "Explicit" // explicitDescription2 + << "Updated implicit again" // implicitDescription3 + + // EXPECTED + << QAccessible::EditableText + << "Explicit description"; +} + +void tst_QQuickAccessible::quickAttachedProperties_description() +{ + QFETCH(QString, qmlCode); + QFETCH(QString, initialExplicitDescription); + QFETCH(QString, implicitDescription); + QFETCH(QString, implicitDescription2); + QFETCH(QString, explicitDescription2); + QFETCH(QString, implicitDescription3); + QFETCH(QAccessible::Role, expectedRole); + QFETCH(QString, expectedDescription); + + QQmlEngine engine; + QQmlComponent component(&engine); + QString extraCode; + if (!initialExplicitDescription.isNull()) + extraCode.append(QString::fromLatin1(R"(Accessible.description: "%1")").arg(initialExplicitDescription)); + extraCode.append(QString::fromLatin1("\nplaceholderText: \"%2\"").arg(implicitDescription)); + + component.setData(qmlCode.arg(extraCode).toUtf8(), QUrl()); + auto object = std::unique_ptr<QObject>(component.create()); + QVERIFY(object); + + const auto attachedObject = qobject_cast<QQuickAccessibleAttached*>( + QQuickAccessibleAttached::attachedProperties(object.get())); + QVERIFY(attachedObject); + QCOMPARE(attachedObject->role(), expectedRole); + + const QString &explicitDesc = initialExplicitDescription; + QCOMPARE(attachedObject->description(), explicitDesc.isNull() ? implicitDescription : explicitDesc); + + object->setProperty("placeholderText", implicitDescription2); + QCOMPARE(attachedObject->description(), explicitDesc.isNull() ? implicitDescription2 : explicitDesc); + + attachedObject->setDescription(explicitDescription2); + QCOMPARE(attachedObject->description(), explicitDescription2); + + object->setProperty("placeholderText", implicitDescription2); + QCOMPARE(attachedObject->description(), explicitDescription2); + QTestAccessibility::clearEvents(); +} + // Verify that a role can be explicitly set, and that the values from the // attached object are used even if the item has a default role - QTBUG-110114 void tst_QQuickAccessible::attachedWins() |
