OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |