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

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

Issue 2578303003: a11y: Add a11y information to views::Tab and manually ignore its a11y children. (Closed)
Patch Set: Add tests. Created 3 years, 11 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 b06cb439dfc32467381b54aaa1d3a25868ed1589..221ef764dbcb51613de8b7644233b4234256ff93 100644
--- a/ui/accessibility/platform/ax_platform_node_mac.mm
+++ b/ui/accessibility/platform/ax_platform_node_mac.mm
@@ -12,7 +12,9 @@
#include "ui/accessibility/ax_action_data.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/accessibility/platform/ax_platform_node_delegate.h"
+#include "ui/base/l10n/l10n_util.h"
#import "ui/gfx/mac/coordinate_conversion.h"
+#include "ui/strings/grit/ui_strings.h"
namespace {
@@ -184,6 +186,7 @@ RoleMap BuildSubroleMap() {
{ui::AX_ROLE_SEARCH_BOX, @"AXSearchField"},
{ui::AX_ROLE_STATUS, @"AXApplicationStatus"},
{ui::AX_ROLE_SWITCH, @"AXSwitch"},
+ {ui::AX_ROLE_TAB, @"AXTab"},
{ui::AX_ROLE_TAB_PANEL, @"AXTabPanel"},
{ui::AX_ROLE_TIMER, @"AXApplicationTimer"},
{ui::AX_ROLE_TOGGLE_BUTTON, @"AXToggleButton"},
@@ -369,8 +372,7 @@ void NotifyMacEvent(AXPlatformNodeCocoa* target, ui::AXEvent event_type) {
// Allow certain attributes to be written via an accessibility client. A
// writable attribute will only appear as such if the accessibility element
// has a value set for that attribute.
- if ([attributeName isEqualToString:NSAccessibilitySelectedAttribute] ||
- [attributeName
+ if ([attributeName
isEqualToString:NSAccessibilitySelectedChildrenAttribute] ||
[attributeName
isEqualToString:NSAccessibilitySelectedTextRangeAttribute] ||
@@ -379,6 +381,13 @@ void NotifyMacEvent(AXPlatformNodeCocoa* target, ui::AXEvent event_type) {
return NO;
}
+ // Since tabs use the Radio Button role on Mac, the standard way to set them
+ // is via the value attribute rather than the selected attribute.
+ if ([attributeName isEqualToString:NSAccessibilityValueAttribute] &&
+ node_->GetData().role == ui::AX_ROLE_TAB) {
+ return !node_->GetData().HasStateFlag(ui::AX_STATE_SELECTED);
+ }
+
if ([attributeName isEqualToString:NSAccessibilityValueAttribute] ||
[attributeName isEqualToString:NSAccessibilitySelectedTextAttribute])
return !ui::AXNodeData::IsFlagSet(node_->GetData().state,
@@ -399,7 +408,9 @@ void NotifyMacEvent(AXPlatformNodeCocoa* target, ui::AXEvent event_type) {
if ([value isKindOfClass:[NSString class]]) {
data.value = base::SysNSStringToUTF16(value);
if ([attribute isEqualToString:NSAccessibilityValueAttribute]) {
- data.action = ui::AX_ACTION_SET_VALUE;
+ data.action = node_->GetData().role == ui::AX_ROLE_TAB
+ ? ui::AX_ACTION_SET_SELECTION
+ : ui::AX_ACTION_SET_VALUE;
} else if ([attribute
isEqualToString:NSAccessibilitySelectedTextAttribute]) {
data.action = ui::AX_ACTION_REPLACE_SELECTED_TEXT;
@@ -468,6 +479,14 @@ void NotifyMacEvent(AXPlatformNodeCocoa* target, ui::AXEvent event_type) {
}
- (NSString*)AXRoleDescription {
+ switch (node_->GetData().role) {
+ case ui::AX_ROLE_TAB:
+ // There is no NSAccessibilityTabRole or similar (AXRadioButton is used
+ // instead). Do the same as NSTabView and put "tab" in the description.
+ return [l10n_util::GetNSStringWithFixup(IDS_ACCNAME_TAB) lowercaseString];
+ default:
+ break;
+ }
return NSAccessibilityRoleDescription([self AXRole], [self AXSubrole]);
}
@@ -480,6 +499,8 @@ void NotifyMacEvent(AXPlatformNodeCocoa* target, ui::AXEvent event_type) {
}
- (NSString*)AXValue {
+ if (node_->GetData().role == ui::AX_ROLE_TAB)
+ return [[self AXSelected] stringValue];
return [self getStringAttribute:ui::AX_ATTR_VALUE];
}
@@ -550,6 +571,13 @@ void NotifyMacEvent(AXPlatformNodeCocoa* target, ui::AXEvent event_type) {
valueWithRange:NSMakeRange(0, [[self AXNumberOfCharacters] intValue])];
}
+// Misc NSAccessibility attributes.
+
+- (NSNumber*)AXSelected {
+ return [NSNumber
+ numberWithBool:node_->GetData().HasStateFlag(ui::AX_STATE_SELECTED)];
+}
+
@end
namespace ui {

Powered by Google App Engine
This is Rietveld 408576698