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

Side by Side Diff: content/browser/accessibility/browser_accessibility_cocoa.mm

Issue 184103036: Follow ARIA spec guidelines for role=button with aria-pressed. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix togglebutton test and expectation on mac Created 6 years, 9 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | content/test/data/accessibility/aria-pressed.html » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <execinfo.h> 5 #include <execinfo.h>
6 6
7 #import "content/browser/accessibility/browser_accessibility_cocoa.h" 7 #import "content/browser/accessibility/browser_accessibility_cocoa.h"
8 8
9 #include <map> 9 #include <map>
10 10
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 { ui::AX_ROLE_SVG_ROOT, NSAccessibilityGroupRole }, 141 { ui::AX_ROLE_SVG_ROOT, NSAccessibilityGroupRole },
142 { ui::AX_ROLE_SYSTEM_WIDE, NSAccessibilityUnknownRole }, 142 { ui::AX_ROLE_SYSTEM_WIDE, NSAccessibilityUnknownRole },
143 { ui::AX_ROLE_TAB, NSAccessibilityRadioButtonRole }, 143 { ui::AX_ROLE_TAB, NSAccessibilityRadioButtonRole },
144 { ui::AX_ROLE_TABLE, NSAccessibilityTableRole }, 144 { ui::AX_ROLE_TABLE, NSAccessibilityTableRole },
145 { ui::AX_ROLE_TABLE_HEADER_CONTAINER, NSAccessibilityGroupRole }, 145 { ui::AX_ROLE_TABLE_HEADER_CONTAINER, NSAccessibilityGroupRole },
146 { ui::AX_ROLE_TAB_LIST, NSAccessibilityTabGroupRole }, 146 { ui::AX_ROLE_TAB_LIST, NSAccessibilityTabGroupRole },
147 { ui::AX_ROLE_TAB_PANEL, NSAccessibilityGroupRole }, 147 { ui::AX_ROLE_TAB_PANEL, NSAccessibilityGroupRole },
148 { ui::AX_ROLE_TEXT_AREA, NSAccessibilityTextAreaRole }, 148 { ui::AX_ROLE_TEXT_AREA, NSAccessibilityTextAreaRole },
149 { ui::AX_ROLE_TEXT_FIELD, NSAccessibilityTextFieldRole }, 149 { ui::AX_ROLE_TEXT_FIELD, NSAccessibilityTextFieldRole },
150 { ui::AX_ROLE_TIMER, NSAccessibilityGroupRole }, 150 { ui::AX_ROLE_TIMER, NSAccessibilityGroupRole },
151 { ui::AX_ROLE_TOGGLE_BUTTON, NSAccessibilityButtonRole }, 151 { ui::AX_ROLE_TOGGLE_BUTTON, NSAccessibilityCheckBoxRole },
152 { ui::AX_ROLE_TOOLBAR, NSAccessibilityToolbarRole }, 152 { ui::AX_ROLE_TOOLBAR, NSAccessibilityToolbarRole },
153 { ui::AX_ROLE_TOOLTIP, NSAccessibilityGroupRole }, 153 { ui::AX_ROLE_TOOLTIP, NSAccessibilityGroupRole },
154 { ui::AX_ROLE_TREE, NSAccessibilityOutlineRole }, 154 { ui::AX_ROLE_TREE, NSAccessibilityOutlineRole },
155 { ui::AX_ROLE_TREE_GRID, NSAccessibilityTableRole }, 155 { ui::AX_ROLE_TREE_GRID, NSAccessibilityTableRole },
156 { ui::AX_ROLE_TREE_ITEM, NSAccessibilityRowRole }, 156 { ui::AX_ROLE_TREE_ITEM, NSAccessibilityRowRole },
157 { ui::AX_ROLE_VALUE_INDICATOR, NSAccessibilityValueIndicatorRole }, 157 { ui::AX_ROLE_VALUE_INDICATOR, NSAccessibilityValueIndicatorRole },
158 { ui::AX_ROLE_WEB_AREA, @"AXWebArea" }, 158 { ui::AX_ROLE_WEB_AREA, @"AXWebArea" },
159 { ui::AX_ROLE_WINDOW, NSAccessibilityWindowRole }, 159 { ui::AX_ROLE_WINDOW, NSAccessibilityWindowRole },
160 160
161 // TODO(dtseng): we don't correctly support the attributes for these roles. 161 // TODO(dtseng): we don't correctly support the attributes for these roles.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 { ui::AX_ROLE_NAVIGATION, @"AXLandmarkNavigation" }, 199 { ui::AX_ROLE_NAVIGATION, @"AXLandmarkNavigation" },
200 { ui::AX_ROLE_SEARCH, @"AXLandmarkSearch" }, 200 { ui::AX_ROLE_SEARCH, @"AXLandmarkSearch" },
201 { ui::AX_ROLE_LOG, @"AXApplicationLog" }, 201 { ui::AX_ROLE_LOG, @"AXApplicationLog" },
202 { ui::AX_ROLE_MARQUEE, @"AXApplicationMarquee" }, 202 { ui::AX_ROLE_MARQUEE, @"AXApplicationMarquee" },
203 { ui::AX_ROLE_MATH, @"AXDocumentMath" }, 203 { ui::AX_ROLE_MATH, @"AXDocumentMath" },
204 { ui::AX_ROLE_NOTE, @"AXDocumentNote" }, 204 { ui::AX_ROLE_NOTE, @"AXDocumentNote" },
205 { ui::AX_ROLE_REGION, @"AXDocumentRegion" }, 205 { ui::AX_ROLE_REGION, @"AXDocumentRegion" },
206 { ui::AX_ROLE_STATUS, @"AXApplicationStatus" }, 206 { ui::AX_ROLE_STATUS, @"AXApplicationStatus" },
207 { ui::AX_ROLE_TAB_PANEL, @"AXTabPanel" }, 207 { ui::AX_ROLE_TAB_PANEL, @"AXTabPanel" },
208 { ui::AX_ROLE_TIMER, @"AXApplicationTimer" }, 208 { ui::AX_ROLE_TIMER, @"AXApplicationTimer" },
209 { ui::AX_ROLE_TOGGLE_BUTTON, @"AXToggleButton" },
209 { ui::AX_ROLE_TOOLTIP, @"AXUserInterfaceTooltip" }, 210 { ui::AX_ROLE_TOOLTIP, @"AXUserInterfaceTooltip" },
210 { ui::AX_ROLE_TREE_ITEM, NSAccessibilityOutlineRowSubrole }, 211 { ui::AX_ROLE_TREE_ITEM, NSAccessibilityOutlineRowSubrole },
211 }; 212 };
212 213
213 RoleMap subrole_map; 214 RoleMap subrole_map;
214 for (size_t i = 0; i < arraysize(subroles); ++i) 215 for (size_t i = 0; i < arraysize(subroles); ++i)
215 subrole_map[subroles[i].webKitValue] = subroles[i].nativeValue; 216 subrole_map[subroles[i].webKitValue] = subroles[i].nativeValue;
216 return subrole_map; 217 return subrole_map;
217 } 218 }
218 219
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after
656 } 657 }
657 658
658 // Returns a string indicating the NSAccessibility role of this object. 659 // Returns a string indicating the NSAccessibility role of this object.
659 - (NSString*)role { 660 - (NSString*)role {
660 ui::AXRole role = [self internalRole]; 661 ui::AXRole role = [self internalRole];
661 if (role == ui::AX_ROLE_CANVAS && 662 if (role == ui::AX_ROLE_CANVAS &&
662 browserAccessibility_->GetBoolAttribute( 663 browserAccessibility_->GetBoolAttribute(
663 ui::AX_ATTR_CANVAS_HAS_FALLBACK)) { 664 ui::AX_ATTR_CANVAS_HAS_FALLBACK)) {
664 return NSAccessibilityGroupRole; 665 return NSAccessibilityGroupRole;
665 } 666 }
667 if (role == ui::AX_ROLE_BUTTON || role == ui::AX_ROLE_TOGGLE_BUTTON) {
668 bool isAriaPressedDefined;
669 bool isMixed;
670 browserAccessibility_->GetAriaTristate("aria-pressed",
671 &isAriaPressedDefined,
672 &isMixed);
673 if (isAriaPressedDefined)
674 return NSAccessibilityCheckBoxRole;
675 else
676 return NSAccessibilityButtonRole;
677 }
666 return NativeRoleFromAXRole(role); 678 return NativeRoleFromAXRole(role);
667 } 679 }
668 680
669 // Returns a string indicating the role description of this object. 681 // Returns a string indicating the role description of this object.
670 - (NSString*)roleDescription { 682 - (NSString*)roleDescription {
671 NSString* role = [self role]; 683 NSString* role = [self role];
672 684
673 ContentClient* content_client = content::GetContentClient(); 685 ContentClient* content_client = content::GetContentClient();
674 686
675 // The following descriptions are specific to webkit. 687 // The following descriptions are specific to webkit.
(...skipping 27 matching lines...) Expand all
703 } 715 }
704 716
705 switch([self internalRole]) { 717 switch([self internalRole]) {
706 case ui::AX_ROLE_FOOTER: 718 case ui::AX_ROLE_FOOTER:
707 return base::SysUTF16ToNSString(content_client->GetLocalizedString( 719 return base::SysUTF16ToNSString(content_client->GetLocalizedString(
708 IDS_AX_ROLE_FOOTER)); 720 IDS_AX_ROLE_FOOTER));
709 case ui::AX_ROLE_SPIN_BUTTON: 721 case ui::AX_ROLE_SPIN_BUTTON:
710 // This control is similar to what VoiceOver calls a "stepper". 722 // This control is similar to what VoiceOver calls a "stepper".
711 return base::SysUTF16ToNSString(content_client->GetLocalizedString( 723 return base::SysUTF16ToNSString(content_client->GetLocalizedString(
712 IDS_AX_ROLE_STEPPER)); 724 IDS_AX_ROLE_STEPPER));
725 case ui::AX_ROLE_TOGGLE_BUTTON:
726 return base::SysUTF16ToNSString(content_client->GetLocalizedString(
727 IDS_AX_ROLE_TOGGLE_BUTTON));
713 default: 728 default:
714 break; 729 break;
715 } 730 }
716 731
717 return NSAccessibilityRoleDescription(role, nil); 732 return NSAccessibilityRoleDescription(role, nil);
718 } 733 }
719 734
720 - (NSArray*)rowHeaders { 735 - (NSArray*)rowHeaders {
721 if ([self internalRole] != ui::AX_ROLE_TABLE && 736 if ([self internalRole] != ui::AX_ROLE_TABLE &&
722 [self internalRole] != ui::AX_ROLE_GRID) { 737 [self internalRole] != ui::AX_ROLE_GRID) {
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
854 NSString* role = [self role]; 869 NSString* role = [self role];
855 if ([role isEqualToString:@"AXHeading"]) { 870 if ([role isEqualToString:@"AXHeading"]) {
856 int level = 0; 871 int level = 0;
857 if (browserAccessibility_->GetIntAttribute( 872 if (browserAccessibility_->GetIntAttribute(
858 ui::AX_ATTR_HIERARCHICAL_LEVEL, &level)) { 873 ui::AX_ATTR_HIERARCHICAL_LEVEL, &level)) {
859 return [NSNumber numberWithInt:level]; 874 return [NSNumber numberWithInt:level];
860 } 875 }
861 } else if ([role isEqualToString:NSAccessibilityButtonRole]) { 876 } else if ([role isEqualToString:NSAccessibilityButtonRole]) {
862 // AXValue does not make sense for pure buttons. 877 // AXValue does not make sense for pure buttons.
863 return @""; 878 return @"";
879 } else if ([self internalRole] == ui::AX_ROLE_TOGGLE_BUTTON) {
880 int value = 0;
881 bool isAriaPressedDefined;
882 bool isMixed;
883 value = browserAccessibility_->GetAriaTristate(
884 "aria-pressed", &isAriaPressedDefined, &isMixed) ? 1 : 0;
885
886 if (isMixed)
887 value = 2;
888
889 return [NSNumber numberWithInt:value];
890
864 } else if ([role isEqualToString:NSAccessibilityCheckBoxRole] || 891 } else if ([role isEqualToString:NSAccessibilityCheckBoxRole] ||
865 [role isEqualToString:NSAccessibilityRadioButtonRole]) { 892 [role isEqualToString:NSAccessibilityRadioButtonRole]) {
866 int value = 0; 893 int value = 0;
867 value = GetState( 894 value = GetState(
868 browserAccessibility_, ui::AX_STATE_CHECKED) ? 1 : 0; 895 browserAccessibility_, ui::AX_STATE_CHECKED) ? 1 : 0;
869 value = GetState( 896 value = GetState(
870 browserAccessibility_, ui::AX_STATE_SELECTED) ? 897 browserAccessibility_, ui::AX_STATE_SELECTED) ?
871 1 : 898 1 :
872 value; 899 value;
873 900
(...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after
1472 return [super hash]; 1499 return [super hash];
1473 return browserAccessibility_->renderer_id(); 1500 return browserAccessibility_->renderer_id();
1474 } 1501 }
1475 1502
1476 - (BOOL)accessibilityShouldUseUniqueId { 1503 - (BOOL)accessibilityShouldUseUniqueId {
1477 return YES; 1504 return YES;
1478 } 1505 }
1479 1506
1480 @end 1507 @end
1481 1508
OLDNEW
« no previous file with comments | « no previous file | content/test/data/accessibility/aria-pressed.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698