Chromium Code Reviews| 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) { | |
| 668 bool is_aria_pressed_defined; | |
|
dmazzoni
2014/03/06 06:09:09
Nit: Obj-C files use camelCase for local variables
aboxhall
2014/03/06 17:45:58
Done.
| |
| 669 bool is_mixed; | |
| 670 browserAccessibility_->GetAriaTristate("aria-pressed", | |
| 671 &is_aria_pressed_defined, | |
| 672 &is_mixed); | |
| 673 if (is_aria_pressed_defined) | |
| 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 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 869 value = GetState( | 884 value = GetState( |
| 870 browserAccessibility_, ui::AX_STATE_SELECTED) ? | 885 browserAccessibility_, ui::AX_STATE_SELECTED) ? |
| 871 1 : | 886 1 : |
| 872 value; | 887 value; |
| 873 | 888 |
| 874 if (browserAccessibility_->GetBoolAttribute( | 889 if (browserAccessibility_->GetBoolAttribute( |
| 875 ui::AX_ATTR_BUTTON_MIXED)) { | 890 ui::AX_ATTR_BUTTON_MIXED)) { |
| 876 value = 2; | 891 value = 2; |
| 877 } | 892 } |
| 878 return [NSNumber numberWithInt:value]; | 893 return [NSNumber numberWithInt:value]; |
| 894 } else if ([self internalRole] == ui::AX_ROLE_TOGGLE_BUTTON) { | |
| 895 int value = 0; | |
| 896 bool aria_pressed_defined; | |
| 897 bool aria_pressed_mixed; | |
| 898 value = browserAccessibility_->GetAriaTristate( | |
| 899 "aria-pressed", &aria_pressed_defined, &aria_pressed_mixed) ? 1 : 0; | |
| 900 | |
| 901 if (aria_pressed_mixed) | |
| 902 value = 2; | |
| 903 | |
| 904 return [NSNumber numberWithInt:value]; | |
| 905 | |
| 879 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] || | 906 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] || |
| 880 [role isEqualToString:NSAccessibilitySliderRole] || | 907 [role isEqualToString:NSAccessibilitySliderRole] || |
| 881 [role isEqualToString:NSAccessibilityScrollBarRole]) { | 908 [role isEqualToString:NSAccessibilityScrollBarRole]) { |
| 882 float floatValue; | 909 float floatValue; |
| 883 if (browserAccessibility_->GetFloatAttribute( | 910 if (browserAccessibility_->GetFloatAttribute( |
| 884 ui::AX_ATTR_VALUE_FOR_RANGE, &floatValue)) { | 911 ui::AX_ATTR_VALUE_FOR_RANGE, &floatValue)) { |
| 885 return [NSNumber numberWithFloat:floatValue]; | 912 return [NSNumber numberWithFloat:floatValue]; |
| 886 } | 913 } |
| 887 } else if ([role isEqualToString:NSAccessibilityColorWellRole]) { | 914 } else if ([role isEqualToString:NSAccessibilityColorWellRole]) { |
| 888 int r = browserAccessibility_->GetIntAttribute( | 915 int r = browserAccessibility_->GetIntAttribute( |
| (...skipping 583 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 |