diff options
author | Pavel Dubsky <pavel.dubsky@qt.io> | 2024-03-05 14:33:39 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-04-16 12:03:58 +0000 |
commit | 140adbe8b134814bc1c8be6eebd45343df175e88 (patch) | |
tree | f72e6bcda5a49632c42f671f71fbc5dbb0011553 | |
parent | 386868ba51bb3924763bbca6279ba4e8e4c335fc (diff) |
Return masked characters for passwords during narration
Current implementation returns plain text (unmasked) when narration
(accessibility feature) is enabled. This fix changes the behavior to
return QQuickTextInput::displayText() for all QQuickTextInput elements
since it contains a text that is actually visible to the user which in
case of a password contains masked characters.
Fixes: QTBUG-120097
Pick-to: 6.6 6.5
Change-Id: I99dcf9ec8d8bb3dfcf0b34ae11f6cd500ed5a904
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
(cherry picked from commit 57c6168d0074294ab44b820c963bb563764d7bb7)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/quick/accessible/qaccessiblequickitem.cpp | 2 | ||||
-rw-r--r-- | tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp | 30 |
2 files changed, 32 insertions, 0 deletions
diff --git a/src/quick/accessible/qaccessiblequickitem.cpp b/src/quick/accessible/qaccessiblequickitem.cpp index 6f8df29538..514b1a9214 100644 --- a/src/quick/accessible/qaccessiblequickitem.cpp +++ b/src/quick/accessible/qaccessiblequickitem.cpp @@ -622,6 +622,8 @@ QString QAccessibleQuickItem::text(QAccessible::Text textType) const // the following block handles item-specific behavior if (role() == QAccessible::EditableText) { if (textType == QAccessible::Value) { + if (auto textInput = qobject_cast<QQuickTextInput *>(item())) + return textInput->displayText(); if (QTextDocument *doc = textDocument()) { return doc->toPlainText(); } diff --git a/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp b/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp index 97b1b5bd44..e164d89217 100644 --- a/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp +++ b/tests/auto/quick/qquickaccessible/tst_qquickaccessible.cpp @@ -19,6 +19,7 @@ #include <QtQuick/private/qquickaccessibleattached_p.h> #include <QtQuick/private/qquicklistview_p.h> #include <QtQuick/private/qquicktext_p.h> +#include <QtQuick/private/qquicktextinput_p.h> #include <QtQuickTestUtils/private/qmlutils_p.h> #include <QtQuickTestUtils/private/visualtestutils_p.h> @@ -61,6 +62,7 @@ private slots: void hitTest(); void checkableTest(); void ignoredTest(); + void passwordTest(); }; tst_QQuickAccessible::tst_QQuickAccessible() @@ -669,6 +671,34 @@ void tst_QQuickAccessible::ignoredTest() QTestAccessibility::clearEvents(); } +void tst_QQuickAccessible::passwordTest() +{ + QQmlEngine engine; + QQmlComponent component(&engine); + component.setData("import QtQuick\nTextInput {\n" + "Accessible.role: Accessible.EditableText\n" + "Accessible.name: \"Password\"\n" + "Accessible.passwordEdit: true\n" + "echoMode: TextInput.Password\n" + "text: \"Green\"\n" + "}", QUrl()); + auto object = std::unique_ptr<QObject>(component.create()); + QVERIFY(object != nullptr); + + QQuickTextInput *textInput = qobject_cast<QQuickTextInput *>(object.get()); + QVERIFY(textInput != nullptr); + + const auto passwordCharacter = textInput->passwordCharacter(); + const auto passwordLength = textInput->text().length(); + const auto password = passwordCharacter.repeated(passwordLength); + + QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(object.get()); + QVERIFY(iface); + QCOMPARE(iface->text(QAccessible::Value), password); + + QTestAccessibility::clearEvents(); +} + QTEST_MAIN(tst_QQuickAccessible) #include "tst_qquickaccessible.moc" |