Ignore uninteresting accessibile interfaces.
Certain interface roles should be ignored and not be a part of the user-visible accessibility interface tree. Change-Id: I264fef909052c528ee505875e3a211a33114d881 Reviewed-by: Morten Johan Sørvig <morten.sorvig@nokia.com>bb10
parent
893eb97b2a
commit
ff5ae4a578
|
|
@ -66,6 +66,7 @@ namespace QCocoaAccessible {
|
|||
*/
|
||||
|
||||
NSString *macRole(QAccessible::Role);
|
||||
bool shouldBeIgnrored(QAccessibleInterface *interface);
|
||||
NSString *getTranslatedAction(const QString &qtAction);
|
||||
NSMutableArray *createTranslatedActionsList(const QStringList &qtActions);
|
||||
QString translateAction(NSString *nsAction);
|
||||
|
|
|
|||
|
|
@ -113,6 +113,55 @@ NSString *macRole(QAccessible::Role qtRole)
|
|||
return NSAccessibilityUnknownRole;
|
||||
}
|
||||
|
||||
/*
|
||||
Mac accessibility supports ignoring elements, which means that
|
||||
the elements are still present in the accessibility tree but is
|
||||
not used by the screen reader.
|
||||
*/
|
||||
bool shouldBeIgnrored(QAccessibleInterface *interface)
|
||||
{
|
||||
// Mac accessibility does not have an attribute that corresponds to the Invisible/Offscreen
|
||||
// state. Ignore interfaces with those flags set.
|
||||
const QAccessible::State state = interface->state();
|
||||
if (state.invisible ||
|
||||
state.offscreen)
|
||||
return true;
|
||||
|
||||
// Some roles are not interesting. In particular, container roles should be
|
||||
// ignored in order to flatten the accessibility tree as seen by the user.
|
||||
const QAccessible::Role role = interface->role();
|
||||
if (role == QAccessible::Border || // QFrame
|
||||
role == QAccessible::Application || // We use the system-provided application element.
|
||||
role == QAccessible::MenuItem || // The system also provides the menu items.
|
||||
role == QAccessible::ToolBar) // Access the tool buttons directly.
|
||||
return true;
|
||||
|
||||
NSString *mac_role = macRole(interface->role());
|
||||
if (mac_role == NSAccessibilityWindowRole || // We use the system-provided window elements.
|
||||
mac_role == NSAccessibilityGroupRole ||
|
||||
mac_role == NSAccessibilityUnknownRole)
|
||||
return true;
|
||||
|
||||
// Client is a generic role returned by plain QWidgets or other
|
||||
// widgets that does not have separate QAccessible interface, such
|
||||
// as the TabWidget. Return false unless macRole gives the interface
|
||||
// a special role.
|
||||
if (role == QAccessible::Client && mac_role == NSAccessibilityUnknownRole)
|
||||
return true;
|
||||
|
||||
if (QObject * const object = interface->object()) {
|
||||
const QString className = QLatin1String(object->metaObject()->className());
|
||||
|
||||
// VoiceOver focusing on tool tips can be confusing. The contents of the
|
||||
// tool tip is available through the description attribute anyway, so
|
||||
// we disable accessibility for tool tips.
|
||||
if (className == QLatin1String("QTipLabel"))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
Translates a predefined QAccessibleActionInterface action to a Mac action constant.
|
||||
Returns 0 if the Qt Action has no mac equivalent. Ownership of the NSString is
|
||||
|
|
|
|||
|
|
@ -216,7 +216,7 @@ static QAccessibleInterface *acast(void *ptr)
|
|||
// misc
|
||||
|
||||
- (BOOL)accessibilityIsIgnored {
|
||||
return NO;
|
||||
return QCocoaAccessible::shouldBeIgnrored(acast(accessibleInterface));
|
||||
}
|
||||
|
||||
- (id)accessibilityHitTest:(NSPoint)point {
|
||||
|
|
|
|||
|
|
@ -53,8 +53,10 @@
|
|||
|
||||
@implementation QNSView (QNSViewAccessibility)
|
||||
|
||||
// The QNSView is a container that the user does not interact directly with:
|
||||
// Remove it from the user-visible accessibility tree.
|
||||
- (BOOL)accessibilityIsIgnored {
|
||||
return NO;
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (id)accessibilityAttributeValue:(NSString *)attribute {
|
||||
|
|
|
|||
Loading…
Reference in New Issue