Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(452)

Unified Diff: ui/accessibility/platform/ax_platform_node_mac.mm

Issue 2016243002: Mac a11y: Add RoleDescription and Value attributes to accessibility information. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address review comments. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/accessibility/platform/ax_platform_node_mac.mm
diff --git a/ui/accessibility/platform/ax_platform_node_mac.mm b/ui/accessibility/platform/ax_platform_node_mac.mm
index 620841889eae237edc5ee3a5a3f4f237f6de4a33..5be1e660a87e2119e4164e61460f0a2d1ab53a60 100644
--- a/ui/accessibility/platform/ax_platform_node_mac.mm
+++ b/ui/accessibility/platform/ax_platform_node_mac.mm
@@ -10,6 +10,7 @@
#include "base/macros.h"
#include "base/strings/sys_string_conversions.h"
#import "ui/accessibility/ax_node_data.h"
+#include "ui/accessibility/ax_view_state.h"
#import "ui/accessibility/platform/ax_platform_node_delegate.h"
#import "ui/gfx/mac/coordinate_conversion.h"
@@ -190,6 +191,11 @@ RoleMap BuildSubroleMap() {
} // namespace
+@interface AXPlatformNodeCocoa ()
+// Helper function for string attributes that don't require extra processing.
+- (NSString*)getStringAttribute:(ui::AXStringAttribute)attribute;
+@end
+
@implementation AXPlatformNodeCocoa
// A mapping of AX roles to native roles.
@@ -223,6 +229,83 @@ RoleMap BuildSubroleMap() {
return gfx::ScreenRectToNSRect(node_->GetBoundsInScreen());
}
+- (NSString*)getStringAttribute:(ui::AXStringAttribute)attribute {
+ std::string attributeValue;
+ if (node_->GetStringAttribute(attribute, &attributeValue))
+ return base::SysUTF8ToNSString(attributeValue);
+ return nil;
+}
+
+// NSAccessibility informal protocol implementation.
+
+- (BOOL)accessibilityIsIgnored {
+ return [[self AXRole] isEqualToString:NSAccessibilityUnknownRole];
+}
+
+- (id)accessibilityHitTest:(NSPoint)point {
+ for (AXPlatformNodeCocoa* child in [self AXChildren]) {
+ if (NSPointInRect(point, child.boundsInScreen))
+ return [child accessibilityHitTest:point];
+ }
+ return NSAccessibilityUnignoredAncestor(self);
+}
+
+- (NSArray*)accessibilityActionNames {
+ return nil;
+}
+
+- (NSArray*)accessibilityAttributeNames {
+ // These attributes are required on all accessibility objects.
+ NSMutableArray* axAttributes = [NSMutableArray
tapted 2016/06/10 03:17:17 we should keep the array literals as constants. E.
Patti Lor 2016/06/16 07:05:21 Done. Thanks for the const tip, I hadn't known abo
+ arrayWithObjects:NSAccessibilityChildrenAttribute,
+ NSAccessibilityParentAttribute,
+ NSAccessibilityPositionAttribute,
+ NSAccessibilityRoleAttribute,
+ NSAccessibilitySizeAttribute,
+ NSAccessibilitySubroleAttribute,
+
+ // Title is required for most elements.
+ // Cocoa asks for the value even if it
+ // is omitted here, but won't present it
+ // to accessibility APIs without this.
+ NSAccessibilityTitleAttribute,
+
+ // Attributes which are not required, but
+ // are general to all roles.
+ NSAccessibilityRoleDescriptionAttribute, nil];
+ switch (node_->GetData().role) {
+ case ui::AX_ROLE_CHECK_BOX:
+ case ui::AX_ROLE_COMBO_BOX:
+ case ui::AX_ROLE_MENU_ITEM_CHECK_BOX:
+ case ui::AX_ROLE_MENU_ITEM_RADIO:
+ case ui::AX_ROLE_RADIO_BUTTON:
+ case ui::AX_ROLE_SEARCH_BOX:
+ case ui::AX_ROLE_SLIDER:
+ case ui::AX_ROLE_SLIDER_THUMB:
+ case ui::AX_ROLE_TOGGLE_BUTTON:
+ case ui::AX_ROLE_TEXT_FIELD:
+ [axAttributes addObjectsFromArray:@[ NSAccessibilityValueAttribute ]];
+ break;
+ // TODO(tapted): Add additional attributes based on role.
+ default:
+ break;
+ }
+ return axAttributes;
+}
+
+- (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute {
+ return NO;
+}
+
+- (id)accessibilityAttributeValue:(NSString*)attribute {
+ SEL selector = NSSelectorFromString(attribute);
+ if ([self respondsToSelector:selector])
+ return [self performSelector:selector];
+ return nil;
+}
+
+// NSAccessibility attributes.
+
- (NSArray*)AXChildren {
if (!node_)
return nil;
@@ -253,56 +336,34 @@ RoleMap BuildSubroleMap() {
return [NSValue valueWithSize:self.boundsInScreen.size];
}
-- (NSString*)AXTitle {
- std::string value;
- if (node_->GetStringAttribute(ui::AX_ATTR_NAME, &value))
- return base::SysUTF8ToNSString(value);
- return nil;
-}
-
-// NSAccessibility informal protocol implementation.
-
-- (BOOL)accessibilityIsIgnored {
- return [[self AXRole] isEqualToString:NSAccessibilityUnknownRole];
-}
-
-- (id)accessibilityHitTest:(NSPoint)point {
- for (AXPlatformNodeCocoa* child in [self AXChildren]) {
- if (NSPointInRect(point, child.boundsInScreen))
- return [child accessibilityHitTest:point];
+- (NSString*)AXSubrole {
+ ui::AXRole role = node_->GetData().role;
+ switch (role) {
+ case ui::AX_ROLE_TEXT_FIELD: {
+ if (ui::AXViewState::HasStateFlag(node_->GetData().state,
+ ui::AX_STATE_PROTECTED)) {
+ return NSAccessibilitySecureTextFieldSubrole;
+ }
+ } break;
tapted 2016/06/10 03:17:17 break would go inside the curlies, but I don't thi
Patti Lor 2016/06/16 07:05:21 Done.
+ default:
+ break;
}
- return NSAccessibilityUnignoredAncestor(self);
+ return [AXPlatformNodeCocoa nativeSubroleFromAXRole:role];
}
-- (NSArray*)accessibilityActionNames {
- return nil;
-}
-
-- (NSArray*)accessibilityAttributeNames {
- // These attributes are required on all accessibility objects.
- return @[
- NSAccessibilityChildrenAttribute,
- NSAccessibilityParentAttribute,
- NSAccessibilityPositionAttribute,
- NSAccessibilityRoleAttribute,
- NSAccessibilitySizeAttribute,
-
- // Title is required for most elements. Cocoa asks for the value even if it
- // is omitted here, but won't present it to accessibility APIs without this.
- NSAccessibilityTitleAttribute,
- ];
- // TODO(tapted): Add additional attributes based on role.
+- (NSString*)AXTitle {
+ return [self getStringAttribute:ui::AX_ATTR_NAME];
}
-- (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute {
- return NO;
+- (NSString*)AXRoleDescription {
+ NSString* description = [self getStringAttribute:ui::AX_ATTR_DESCRIPTION];
+ if (!description)
+ return NSAccessibilityRoleDescription([self AXRole], [self AXSubrole]);
+ return description;
}
-- (id)accessibilityAttributeValue:(NSString*)attribute {
- SEL selector = NSSelectorFromString(attribute);
- if ([self respondsToSelector:selector])
- return [self performSelector:selector];
- return nil;
+- (NSString*)AXValue {
+ return [self getStringAttribute:ui::AX_ATTR_VALUE];
}
@end

Powered by Google App Engine
This is Rietveld 408576698