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 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 138 { AccessibilityNodeData::ROLE_REGION, NSAccessibilityGroupRole }, | 138 { AccessibilityNodeData::ROLE_REGION, NSAccessibilityGroupRole }, |
| 139 { AccessibilityNodeData::ROLE_ROOT_WEB_AREA, @"AXWebArea" }, | 139 { AccessibilityNodeData::ROLE_ROOT_WEB_AREA, @"AXWebArea" }, |
| 140 { AccessibilityNodeData::ROLE_ROW, NSAccessibilityRowRole }, | 140 { AccessibilityNodeData::ROLE_ROW, NSAccessibilityRowRole }, |
| 141 { AccessibilityNodeData::ROLE_ROW_HEADER, @"AXCell" }, | 141 { AccessibilityNodeData::ROLE_ROW_HEADER, @"AXCell" }, |
| 142 { AccessibilityNodeData::ROLE_RULER, NSAccessibilityRulerRole }, | 142 { AccessibilityNodeData::ROLE_RULER, NSAccessibilityRulerRole }, |
| 143 { AccessibilityNodeData::ROLE_RULER_MARKER, | 143 { AccessibilityNodeData::ROLE_RULER_MARKER, |
| 144 NSAccessibilityRulerMarkerRole }, | 144 NSAccessibilityRulerMarkerRole }, |
| 145 // TODO(dtseng): we don't correctly support the attributes for these roles. | 145 // TODO(dtseng): we don't correctly support the attributes for these roles. |
| 146 // { AccessibilityNodeData::ROLE_SCROLLAREA, | 146 // { AccessibilityNodeData::ROLE_SCROLLAREA, |
| 147 // NSAccessibilityScrollAreaRole }, | 147 // NSAccessibilityScrollAreaRole }, |
| 148 // { AccessibilityNodeData::ROLE_SCROLLBAR, NSAccessibilityScrollBarRole }, | 148 { AccessibilityNodeData::ROLE_SCROLLBAR, NSAccessibilityScrollBarRole }, |
| 149 { AccessibilityNodeData::ROLE_SHEET, NSAccessibilitySheetRole }, | 149 { AccessibilityNodeData::ROLE_SHEET, NSAccessibilitySheetRole }, |
| 150 { AccessibilityNodeData::ROLE_SLIDER, NSAccessibilitySliderRole }, | 150 { AccessibilityNodeData::ROLE_SLIDER, NSAccessibilitySliderRole }, |
| 151 { AccessibilityNodeData::ROLE_SLIDER_THUMB, NSAccessibilityGroupRole }, | 151 { AccessibilityNodeData::ROLE_SLIDER_THUMB, NSAccessibilityGroupRole }, |
| 152 { AccessibilityNodeData::ROLE_SPIN_BUTTON, NSAccessibilityTextFieldRole }, | 152 { AccessibilityNodeData::ROLE_SPIN_BUTTON, NSAccessibilitySliderRole }, |
|
David Tseng
2012/09/13 19:00:57
I think we actually want to map to NSAccessibility
dmazzoni
2012/09/13 19:32:29
That's what WebKit maps it to on Mac, but it doesn
David Tseng
2012/09/13 22:00:28
On 2012/09/13 19:32:29, Dominic Mazzoni wrote:
Ac
| |
| 153 { AccessibilityNodeData::ROLE_SPLITTER, NSAccessibilitySplitterRole }, | 153 { AccessibilityNodeData::ROLE_SPLITTER, NSAccessibilitySplitterRole }, |
| 154 { AccessibilityNodeData::ROLE_SPLIT_GROUP, NSAccessibilitySplitGroupRole }, | 154 { AccessibilityNodeData::ROLE_SPLIT_GROUP, NSAccessibilitySplitGroupRole }, |
| 155 { AccessibilityNodeData::ROLE_STATIC_TEXT, NSAccessibilityStaticTextRole }, | 155 { AccessibilityNodeData::ROLE_STATIC_TEXT, NSAccessibilityStaticTextRole }, |
| 156 { AccessibilityNodeData::ROLE_STATUS, NSAccessibilityGroupRole }, | 156 { AccessibilityNodeData::ROLE_STATUS, NSAccessibilityGroupRole }, |
| 157 { AccessibilityNodeData::ROLE_SYSTEM_WIDE, NSAccessibilityUnknownRole }, | 157 { AccessibilityNodeData::ROLE_SYSTEM_WIDE, NSAccessibilityUnknownRole }, |
| 158 { AccessibilityNodeData::ROLE_TAB, NSAccessibilityRadioButtonRole }, | 158 { AccessibilityNodeData::ROLE_TAB, NSAccessibilityRadioButtonRole }, |
| 159 { AccessibilityNodeData::ROLE_TAB_LIST, NSAccessibilityTabGroupRole }, | 159 { AccessibilityNodeData::ROLE_TAB_LIST, NSAccessibilityTabGroupRole }, |
| 160 { AccessibilityNodeData::ROLE_TAB_PANEL, NSAccessibilityGroupRole }, | 160 { AccessibilityNodeData::ROLE_TAB_PANEL, NSAccessibilityGroupRole }, |
| 161 { AccessibilityNodeData::ROLE_TABLE, NSAccessibilityTableRole }, | 161 { AccessibilityNodeData::ROLE_TABLE, NSAccessibilityTableRole }, |
| 162 { AccessibilityNodeData::ROLE_TABLE_HEADER_CONTAINER, | 162 { AccessibilityNodeData::ROLE_TABLE_HEADER_CONTAINER, |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 262 } attributeToMethodNameContainer[] = { | 262 } attributeToMethodNameContainer[] = { |
| 263 { NSAccessibilityChildrenAttribute, @"children" }, | 263 { NSAccessibilityChildrenAttribute, @"children" }, |
| 264 { NSAccessibilityColumnsAttribute, @"columns" }, | 264 { NSAccessibilityColumnsAttribute, @"columns" }, |
| 265 { NSAccessibilityDescriptionAttribute, @"description" }, | 265 { NSAccessibilityDescriptionAttribute, @"description" }, |
| 266 { NSAccessibilityEnabledAttribute, @"enabled" }, | 266 { NSAccessibilityEnabledAttribute, @"enabled" }, |
| 267 { NSAccessibilityFocusedAttribute, @"focused" }, | 267 { NSAccessibilityFocusedAttribute, @"focused" }, |
| 268 { NSAccessibilityHelpAttribute, @"help" }, | 268 { NSAccessibilityHelpAttribute, @"help" }, |
| 269 { NSAccessibilityMaxValueAttribute, @"maxValue" }, | 269 { NSAccessibilityMaxValueAttribute, @"maxValue" }, |
| 270 { NSAccessibilityMinValueAttribute, @"minValue" }, | 270 { NSAccessibilityMinValueAttribute, @"minValue" }, |
| 271 { NSAccessibilityNumberOfCharactersAttribute, @"numberOfCharacters" }, | 271 { NSAccessibilityNumberOfCharactersAttribute, @"numberOfCharacters" }, |
| 272 { NSAccessibilityOrientationAttribute, @"orientation" }, | |
| 272 { NSAccessibilityParentAttribute, @"parent" }, | 273 { NSAccessibilityParentAttribute, @"parent" }, |
| 273 { NSAccessibilityPositionAttribute, @"position" }, | 274 { NSAccessibilityPositionAttribute, @"position" }, |
| 274 { NSAccessibilityRoleAttribute, @"role" }, | 275 { NSAccessibilityRoleAttribute, @"role" }, |
| 275 { NSAccessibilityRoleDescriptionAttribute, @"roleDescription" }, | 276 { NSAccessibilityRoleDescriptionAttribute, @"roleDescription" }, |
| 276 { NSAccessibilityRowsAttribute, @"rows" }, | 277 { NSAccessibilityRowsAttribute, @"rows" }, |
| 277 { NSAccessibilitySizeAttribute, @"size" }, | 278 { NSAccessibilitySizeAttribute, @"size" }, |
| 278 { NSAccessibilitySubroleAttribute, @"subrole" }, | 279 { NSAccessibilitySubroleAttribute, @"subrole" }, |
| 279 { NSAccessibilityTabsAttribute, @"tabs" }, | 280 { NSAccessibilityTabsAttribute, @"tabs" }, |
| 280 { NSAccessibilityTitleAttribute, @"title" }, | 281 { NSAccessibilityTitleAttribute, @"title" }, |
| 281 { NSAccessibilityTitleUIElementAttribute, @"titleUIElement" }, | 282 { NSAccessibilityTitleUIElementAttribute, @"titleUIElement" }, |
| 282 { NSAccessibilityTopLevelUIElementAttribute, @"window" }, | 283 { NSAccessibilityTopLevelUIElementAttribute, @"window" }, |
| 283 { NSAccessibilityURLAttribute, @"url" }, | 284 { NSAccessibilityURLAttribute, @"url" }, |
| 284 { NSAccessibilityValueAttribute, @"value" }, | 285 { NSAccessibilityValueAttribute, @"value" }, |
| 286 { NSAccessibilityValueDescriptionAttribute, @"valueDescription" }, | |
| 285 { NSAccessibilityVisibleCharacterRangeAttribute, @"visibleCharacterRange" }, | 287 { NSAccessibilityVisibleCharacterRangeAttribute, @"visibleCharacterRange" }, |
| 286 { NSAccessibilityWindowAttribute, @"window" }, | 288 { NSAccessibilityWindowAttribute, @"window" }, |
| 287 { @"AXAccessKey", @"accessKey" }, | 289 { @"AXAccessKey", @"accessKey" }, |
| 288 { @"AXARIAAtomic", @"ariaAtomic" }, | 290 { @"AXARIAAtomic", @"ariaAtomic" }, |
| 289 { @"AXARIABusy", @"ariaBusy" }, | 291 { @"AXARIABusy", @"ariaBusy" }, |
| 290 { @"AXARIALive", @"ariaLive" }, | 292 { @"AXARIALive", @"ariaLive" }, |
| 291 { @"AXARIARelevant", @"ariaRelevant" }, | 293 { @"AXARIARelevant", @"ariaRelevant" }, |
| 292 { @"AXLoaded", @"loaded" }, | 294 { @"AXLoaded", @"loaded" }, |
| 293 { @"AXLoadingProgress", @"loadingProgress" }, | 295 { @"AXLoadingProgress", @"loadingProgress" }, |
| 294 { @"AXRequired", @"required" }, | 296 { @"AXRequired", @"required" }, |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 491 return [NSNumber numberWithFloat:floatValue]; | 493 return [NSNumber numberWithFloat:floatValue]; |
| 492 } | 494 } |
| 493 | 495 |
| 494 - (NSNumber*)minValue { | 496 - (NSNumber*)minValue { |
| 495 float floatValue = 0.0; | 497 float floatValue = 0.0; |
| 496 browserAccessibility_->GetFloatAttribute( | 498 browserAccessibility_->GetFloatAttribute( |
| 497 AccessibilityNodeData::ATTR_MIN_VALUE_FOR_RANGE, &floatValue); | 499 AccessibilityNodeData::ATTR_MIN_VALUE_FOR_RANGE, &floatValue); |
| 498 return [NSNumber numberWithFloat:floatValue]; | 500 return [NSNumber numberWithFloat:floatValue]; |
| 499 } | 501 } |
| 500 | 502 |
| 503 - (NSString*)orientation { | |
| 504 // We present a spin button as a vertical slider, with a role description | |
| 505 // of "spin button". | |
|
David Tseng
2012/09/13 22:00:28
Can we at least call it something more familiar li
| |
| 506 AccessibilityNodeData::Role internal_role = | |
| 507 static_cast<AccessibilityNodeData::Role>(browserAccessibility_->role()); | |
| 508 if (internal_role == AccessibilityNodeData::ROLE_SPIN_BUTTON) | |
| 509 return NSAccessibilityVerticalOrientationValue; | |
| 510 | |
| 511 if (GetState(browserAccessibility_, AccessibilityNodeData::STATE_VERTICAL)) | |
| 512 return NSAccessibilityVerticalOrientationValue; | |
| 513 else | |
| 514 return NSAccessibilityHorizontalOrientationValue; | |
| 515 } | |
| 516 | |
| 501 - (NSNumber*)numberOfCharacters { | 517 - (NSNumber*)numberOfCharacters { |
| 502 return [NSNumber numberWithInt:browserAccessibility_->value().length()]; | 518 return [NSNumber numberWithInt:browserAccessibility_->value().length()]; |
| 503 } | 519 } |
| 504 | 520 |
| 505 // The origin of this accessibility object in the page's document. | 521 // The origin of this accessibility object in the page's document. |
| 506 // This is relative to webkit's top-left origin, not Cocoa's | 522 // This is relative to webkit's top-left origin, not Cocoa's |
| 507 // bottom-left origin. | 523 // bottom-left origin. |
| 508 - (NSPoint)origin { | 524 - (NSPoint)origin { |
| 509 gfx::Rect bounds = browserAccessibility_->GetLocalBoundsRect(); | 525 gfx::Rect bounds = browserAccessibility_->GetLocalBoundsRect(); |
| 510 return NSMakePoint(bounds.x(), bounds.y()); | 526 return NSMakePoint(bounds.x(), bounds.y()); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 576 if (htmlAttribute.first == ASCIIToUTF16("role")) { | 592 if (htmlAttribute.first == ASCIIToUTF16("role")) { |
| 577 // TODO(dtseng): This is not localized; see crbug/84814. | 593 // TODO(dtseng): This is not localized; see crbug/84814. |
| 578 return base::SysUTF16ToNSString(htmlAttribute.second); | 594 return base::SysUTF16ToNSString(htmlAttribute.second); |
| 579 } | 595 } |
| 580 } | 596 } |
| 581 } | 597 } |
| 582 } | 598 } |
| 583 | 599 |
| 584 AccessibilityNodeData::Role internal_role = | 600 AccessibilityNodeData::Role internal_role = |
| 585 static_cast<AccessibilityNodeData::Role>(browserAccessibility_->role()); | 601 static_cast<AccessibilityNodeData::Role>(browserAccessibility_->role()); |
| 586 if (internal_role == AccessibilityNodeData::ROLE_FOOTER) { | 602 switch(internal_role) { |
| 587 return base::SysUTF16ToNSString(content_client->GetLocalizedString( | 603 case AccessibilityNodeData::ROLE_FOOTER: |
| 588 IDS_AX_ROLE_FOOTER)); | 604 return base::SysUTF16ToNSString(content_client->GetLocalizedString( |
| 605 IDS_AX_ROLE_FOOTER)); | |
| 606 case AccessibilityNodeData::ROLE_SPIN_BUTTON: | |
| 607 return base::SysUTF16ToNSString(content_client->GetLocalizedString( | |
| 608 IDS_AX_ROLE_SPIN_BUTTON)); | |
| 609 default: | |
| 610 break; | |
| 589 } | 611 } |
| 590 | 612 |
| 591 return NSAccessibilityRoleDescription(role, nil); | 613 return NSAccessibilityRoleDescription(role, nil); |
| 592 } | 614 } |
| 593 | 615 |
| 594 - (NSArray*)rows { | 616 - (NSArray*)rows { |
| 595 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; | 617 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; |
| 596 for (BrowserAccessibilityCocoa* child in [self children]) { | 618 for (BrowserAccessibilityCocoa* child in [self children]) { |
| 597 if ([[child role] isEqualToString:NSAccessibilityRowRole]) | 619 if ([[child role] isEqualToString:NSAccessibilityRowRole]) |
| 598 [ret addObject:child]; | 620 [ret addObject:child]; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 713 float floatValue; | 735 float floatValue; |
| 714 if (browserAccessibility_->GetFloatAttribute( | 736 if (browserAccessibility_->GetFloatAttribute( |
| 715 AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &floatValue)) { | 737 AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &floatValue)) { |
| 716 return [NSNumber numberWithFloat:floatValue]; | 738 return [NSNumber numberWithFloat:floatValue]; |
| 717 } | 739 } |
| 718 } | 740 } |
| 719 | 741 |
| 720 return base::SysUTF16ToNSString(browserAccessibility_->value()); | 742 return base::SysUTF16ToNSString(browserAccessibility_->value()); |
| 721 } | 743 } |
| 722 | 744 |
| 745 - (NSString*)valueDescription { | |
| 746 if (!browserAccessibility_->value().empty()) | |
| 747 return base::SysUTF16ToNSString(browserAccessibility_->value()); | |
| 748 else | |
| 749 return nil; | |
| 750 } | |
| 751 | |
| 723 - (NSValue*)visibleCharacterRange { | 752 - (NSValue*)visibleCharacterRange { |
| 724 return [NSValue valueWithRange: | 753 return [NSValue valueWithRange: |
| 725 NSMakeRange(0, browserAccessibility_->value().length())]; | 754 NSMakeRange(0, browserAccessibility_->value().length())]; |
| 726 } | 755 } |
| 727 | 756 |
| 728 - (NSNumber*)visited { | 757 - (NSNumber*)visited { |
| 729 return [NSNumber numberWithBool: | 758 return [NSNumber numberWithBool: |
| 730 GetState(browserAccessibility_, AccessibilityNodeData::STATE_TRAVERSED)]; | 759 GetState(browserAccessibility_, AccessibilityNodeData::STATE_TRAVERSED)]; |
| 731 } | 760 } |
| 732 | 761 |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 935 NSAccessibilityVisibleCharacterRangeAttribute, | 964 NSAccessibilityVisibleCharacterRangeAttribute, |
| 936 nil]]; | 965 nil]]; |
| 937 } else if ([role isEqualToString:NSAccessibilityTabGroupRole]) { | 966 } else if ([role isEqualToString:NSAccessibilityTabGroupRole]) { |
| 938 [ret addObject:NSAccessibilityTabsAttribute]; | 967 [ret addObject:NSAccessibilityTabsAttribute]; |
| 939 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] || | 968 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] || |
| 940 [role isEqualToString:NSAccessibilitySliderRole] || | 969 [role isEqualToString:NSAccessibilitySliderRole] || |
| 941 [role isEqualToString:NSAccessibilityScrollBarRole]) { | 970 [role isEqualToString:NSAccessibilityScrollBarRole]) { |
| 942 [ret addObjectsFromArray:[NSArray arrayWithObjects: | 971 [ret addObjectsFromArray:[NSArray arrayWithObjects: |
| 943 NSAccessibilityMaxValueAttribute, | 972 NSAccessibilityMaxValueAttribute, |
| 944 NSAccessibilityMinValueAttribute, | 973 NSAccessibilityMinValueAttribute, |
| 974 NSAccessibilityOrientationAttribute, | |
| 975 NSAccessibilityValueDescriptionAttribute, | |
| 945 nil]]; | 976 nil]]; |
| 946 } | 977 } |
| 947 | 978 |
| 948 // Live regions. | 979 // Live regions. |
| 949 string16 s; | 980 string16 s; |
| 950 if (browserAccessibility_->GetStringAttribute( | 981 if (browserAccessibility_->GetStringAttribute( |
| 951 AccessibilityNodeData::ATTR_LIVE_STATUS, &s)) { | 982 AccessibilityNodeData::ATTR_LIVE_STATUS, &s)) { |
| 952 [ret addObjectsFromArray:[NSArray arrayWithObjects: | 983 [ret addObjectsFromArray:[NSArray arrayWithObjects: |
| 953 @"AXARIALive", | 984 @"AXARIALive", |
| 954 @"AXARIARelevant", | 985 @"AXARIARelevant", |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1004 | 1035 |
| 1005 return NO; | 1036 return NO; |
| 1006 } | 1037 } |
| 1007 | 1038 |
| 1008 // Returns whether or not this object should be ignored in the accessibilty | 1039 // Returns whether or not this object should be ignored in the accessibilty |
| 1009 // tree. | 1040 // tree. |
| 1010 - (BOOL)accessibilityIsIgnored { | 1041 - (BOOL)accessibilityIsIgnored { |
| 1011 return [self isIgnored]; | 1042 return [self isIgnored]; |
| 1012 } | 1043 } |
| 1013 | 1044 |
| 1014 // Performs the given accessibilty action on the webkit accessibility object | 1045 // Performs the given accessibilty action on the webkit accessibility object |
|
David Tseng
2012/09/13 19:00:57
If we go with NSAccessibilityIncrementorRole, hook
dmazzoni
2012/09/13 19:32:29
Right now that's impossible, there's no way for a
| |
| 1015 // that backs this object. | 1046 // that backs this object. |
| 1016 - (void)accessibilityPerformAction:(NSString*)action { | 1047 - (void)accessibilityPerformAction:(NSString*)action { |
| 1017 // TODO(feldstein): Support more actions. | 1048 // TODO(feldstein): Support more actions. |
| 1018 if ([action isEqualToString:NSAccessibilityPressAction]) | 1049 if ([action isEqualToString:NSAccessibilityPressAction]) |
| 1019 [delegate_ doDefaultAction:browserAccessibility_->renderer_id()]; | 1050 [delegate_ doDefaultAction:browserAccessibility_->renderer_id()]; |
| 1020 else if ([action isEqualToString:NSAccessibilityShowMenuAction]) | 1051 else if ([action isEqualToString:NSAccessibilityShowMenuAction]) |
| 1021 [delegate_ performShowMenuAction:self]; | 1052 [delegate_ performShowMenuAction:self]; |
| 1022 } | 1053 } |
| 1023 | 1054 |
| 1024 // Returns the description of the given action. | 1055 // Returns the description of the given action. |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1085 return [super hash]; | 1116 return [super hash]; |
| 1086 return browserAccessibility_->renderer_id(); | 1117 return browserAccessibility_->renderer_id(); |
| 1087 } | 1118 } |
| 1088 | 1119 |
| 1089 - (BOOL)accessibilityShouldUseUniqueId { | 1120 - (BOOL)accessibilityShouldUseUniqueId { |
| 1090 return YES; | 1121 return YES; |
| 1091 } | 1122 } |
| 1092 | 1123 |
| 1093 @end | 1124 @end |
| 1094 | 1125 |
| OLD | NEW |