aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Arve Sæther <jan-arve.saether@qt.io>2025-03-28 16:51:30 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2025-04-11 10:18:49 +0000
commitb206c4e687f2c942cd429258b93be6aae245bb34 (patch)
treefb9f93b9a53069fc6dc1a6af15f9581dbb787ebb
parent2e1c6757e7ac4b335ed8b7aa68e7a0feed00d81f (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.cpp8
-rw-r--r--src/quick/items/qquickaccessibleattached_p.h1
-rw-r--r--src/quicktemplates/qquicktextarea.cpp4
-rw-r--r--tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp92
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()