| 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 {
|
|
|