diff options
author | andresantoso <andresantoso@chromium.org> | 2014-09-23 21:42:57 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-09-24 04:43:05 +0000 |
commit | 1ccf1740236df20591e4cf5150d3a296faa0efb3 (patch) | |
tree | b12a23456d9f854877998289f72cee9429ea7c0e | |
parent | 2e44917894a92a0d6fb0e56e3220811f811d1c8e (diff) | |
download | chromium_src-1ccf1740236df20591e4cf5150d3a296faa0efb3.zip chromium_src-1ccf1740236df20591e4cf5150d3a296faa0efb3.tar.gz chromium_src-1ccf1740236df20591e4cf5150d3a296faa0efb3.tar.bz2 |
Mac: Fix tab view accessibility.
The close button was setting the AXDescription property, it somehow caused
VoiceOver to use it as the tab view's description. Change it to set the AXTitle
property instead to fix the issue, and to match Safari.
Also change the tab strips' AX children to be sorted from left to right, so
that VoiceOver's "Tab X of Y" order is always ascending left to right.
BUG=415570
Review URL: https://codereview.chromium.org/588393002
Cr-Commit-Position: refs/heads/master@{#296346}
-rw-r--r-- | chrome/browser/ui/cocoa/hover_close_button.mm | 2 | ||||
-rw-r--r-- | chrome/browser/ui/cocoa/tabs/tab_strip_view.mm | 53 |
2 files changed, 38 insertions, 17 deletions
diff --git a/chrome/browser/ui/cocoa/hover_close_button.mm b/chrome/browser/ui/cocoa/hover_close_button.mm index 94ecb0f..4f73f99 100644 --- a/chrome/browser/ui/cocoa/hover_close_button.mm +++ b/chrome/browser/ui/cocoa/hover_close_button.mm @@ -184,7 +184,7 @@ NSString* const kFadeOutValueKeyPath = @"fadeOutValue"; // Set accessibility description. NSCell* cell = [self cell]; [cell accessibilitySetOverrideValue:gDescription - forAttribute:NSAccessibilityDescriptionAttribute]; + forAttribute:NSAccessibilityTitleAttribute]; // Add a tooltip. Using 'owner:self' means that // -view:stringForToolTip:point:userData: will be called to provide the diff --git a/chrome/browser/ui/cocoa/tabs/tab_strip_view.mm b/chrome/browser/ui/cocoa/tabs/tab_strip_view.mm index 86ac8ce..2d546af 100644 --- a/chrome/browser/ui/cocoa/tabs/tab_strip_view.mm +++ b/chrome/browser/ui/cocoa/tabs/tab_strip_view.mm @@ -227,25 +227,46 @@ return NO; } +// Returns AX children (tabs and new tab button), sorted from left to right. +- (NSArray*)accessibilityChildren { + NSArray* children = + [super accessibilityAttributeValue:NSAccessibilityChildrenAttribute]; + return [children sortedArrayUsingComparator: + ^NSComparisonResult(id first, id second) { + NSPoint firstPosition = + [[first accessibilityAttributeValue: + NSAccessibilityPositionAttribute] pointValue]; + NSPoint secondPosition = + [[second accessibilityAttributeValue: + NSAccessibilityPositionAttribute] pointValue]; + if (firstPosition.x < secondPosition.x) + return NSOrderedAscending; + else if (firstPosition.x > secondPosition.x) + return NSOrderedDescending; + else + return NSOrderedSame; + }]; +} + - (id)accessibilityAttributeValue:(NSString*)attribute { - if ([attribute isEqual:NSAccessibilityRoleAttribute]) + if ([attribute isEqual:NSAccessibilityRoleAttribute]) { return NSAccessibilityTabGroupRole; - if ([attribute isEqual:NSAccessibilityTabsAttribute]) { - NSMutableArray* tabs = [[[NSMutableArray alloc] init] autorelease]; - NSArray* children = - [self accessibilityAttributeValue:NSAccessibilityChildrenAttribute]; - for (id child in children) { - if ([[child accessibilityAttributeValue:NSAccessibilityRoleAttribute] - isEqual:NSAccessibilityRadioButtonRole]) { - [tabs addObject:child]; - } - } - return tabs; - } - if ([attribute isEqual:NSAccessibilityContentsAttribute]) - return [self accessibilityAttributeValue:NSAccessibilityChildrenAttribute]; - if ([attribute isEqual:NSAccessibilityValueAttribute]) + } else if ([attribute isEqual:NSAccessibilityChildrenAttribute]) { + return [self accessibilityChildren]; + } else if ([attribute isEqual:NSAccessibilityTabsAttribute]) { + NSArray* children = [self accessibilityChildren]; + NSIndexSet* indexes = [children indexesOfObjectsPassingTest: + ^BOOL(id child, NSUInteger idx, BOOL* stop) { + NSString* role = [child + accessibilityAttributeValue:NSAccessibilityRoleAttribute]; + return [role isEqualToString:NSAccessibilityRadioButtonRole]; + }]; + return [children objectsAtIndexes:indexes]; + } else if ([attribute isEqual:NSAccessibilityContentsAttribute]) { + return [self accessibilityChildren]; + } else if ([attribute isEqual:NSAccessibilityValueAttribute]) { return [controller_ activeTabView]; + } return [super accessibilityAttributeValue:attribute]; } |