Accessibility OS X: Improve password handling

Set the right sub role (NSAccessibilitySecureTextFieldSubrole) and
return the bullet point character for the text contents. This alignes
the behavior with native widgets.

Change-Id: I7305e08dca61097dd8c050aed64c792c06de0a4d
Reviewed-by: Morten Johan Sørvig <morten.sorvig@theqtcompany.com>
This commit is contained in:
Frederik Gladhorn 2016-01-25 12:35:18 +01:00
parent 1568074a60
commit 4a251da5bb

View File

@ -195,6 +195,8 @@ NSString *macSubrole(QAccessibleInterface *interface)
QAccessible::State s = interface->state();
if (s.searchEdit)
return NSAccessibilitySearchFieldSubrole;
if (s.passwordEdit)
return NSAccessibilitySecureTextFieldSubrole;
return nil;
}
@ -349,18 +351,23 @@ id getValueAttribute(QAccessibleInterface *interface)
const QAccessible::Role qtrole = interface->role();
if (qtrole == QAccessible::EditableText) {
if (QAccessibleTextInterface *textInterface = interface->textInterface()) {
// VoiceOver will read out the entire text string at once when returning
// text as a value. For large text edits the size of the returned string
// needs to be limited and text range attributes need to be used instead.
// NSTextEdit returns the first sentence as the value, Do the same here:
int begin = 0;
int end = textInterface->characterCount();
// ### call to textAfterOffset hangs. Booo!
//if (textInterface->characterCount() > 0)
// textInterface->textAfterOffset(0, QAccessible2::SentenceBoundary, &begin, &end);
QString text = textInterface->text(begin, end);
//qDebug() << "text" << begin << end << text;
QString text;
if (interface->state().passwordEdit) {
// return round password replacement chars
text = QString(end, QChar(kBulletUnicode));
} else {
// VoiceOver will read out the entire text string at once when returning
// text as a value. For large text edits the size of the returned string
// needs to be limited and text range attributes need to be used instead.
// NSTextEdit returns the first sentence as the value, Do the same here:
// ### call to textAfterOffset hangs. Booo!
//if (textInterface->characterCount() > 0)
// textInterface->textAfterOffset(0, QAccessible2::SentenceBoundary, &begin, &end);
text = textInterface->text(begin, end);
}
return QCFString::toNSString(text);
}
}