| 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 }, |
| 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". |
| 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 // This control is similar to what VoiceOver calls a "stepper". |
| 608 return base::SysUTF16ToNSString(content_client->GetLocalizedString( |
| 609 IDS_AX_ROLE_STEPPER)); |
| 610 default: |
| 611 break; |
| 589 } | 612 } |
| 590 | 613 |
| 591 return NSAccessibilityRoleDescription(role, nil); | 614 return NSAccessibilityRoleDescription(role, nil); |
| 592 } | 615 } |
| 593 | 616 |
| 594 - (NSArray*)rows { | 617 - (NSArray*)rows { |
| 595 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; | 618 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; |
| 596 for (BrowserAccessibilityCocoa* child in [self children]) { | 619 for (BrowserAccessibilityCocoa* child in [self children]) { |
| 597 if ([[child role] isEqualToString:NSAccessibilityRowRole]) | 620 if ([[child role] isEqualToString:NSAccessibilityRowRole]) |
| 598 [ret addObject:child]; | 621 [ret addObject:child]; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 float floatValue; | 736 float floatValue; |
| 714 if (browserAccessibility_->GetFloatAttribute( | 737 if (browserAccessibility_->GetFloatAttribute( |
| 715 AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &floatValue)) { | 738 AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &floatValue)) { |
| 716 return [NSNumber numberWithFloat:floatValue]; | 739 return [NSNumber numberWithFloat:floatValue]; |
| 717 } | 740 } |
| 718 } | 741 } |
| 719 | 742 |
| 720 return base::SysUTF16ToNSString(browserAccessibility_->value()); | 743 return base::SysUTF16ToNSString(browserAccessibility_->value()); |
| 721 } | 744 } |
| 722 | 745 |
| 746 - (NSString*)valueDescription { |
| 747 if (!browserAccessibility_->value().empty()) |
| 748 return base::SysUTF16ToNSString(browserAccessibility_->value()); |
| 749 else |
| 750 return nil; |
| 751 } |
| 752 |
| 723 - (NSValue*)visibleCharacterRange { | 753 - (NSValue*)visibleCharacterRange { |
| 724 return [NSValue valueWithRange: | 754 return [NSValue valueWithRange: |
| 725 NSMakeRange(0, browserAccessibility_->value().length())]; | 755 NSMakeRange(0, browserAccessibility_->value().length())]; |
| 726 } | 756 } |
| 727 | 757 |
| 728 - (NSNumber*)visited { | 758 - (NSNumber*)visited { |
| 729 return [NSNumber numberWithBool: | 759 return [NSNumber numberWithBool: |
| 730 GetState(browserAccessibility_, AccessibilityNodeData::STATE_TRAVERSED)]; | 760 GetState(browserAccessibility_, AccessibilityNodeData::STATE_TRAVERSED)]; |
| 731 } | 761 } |
| 732 | 762 |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 935 NSAccessibilityVisibleCharacterRangeAttribute, | 965 NSAccessibilityVisibleCharacterRangeAttribute, |
| 936 nil]]; | 966 nil]]; |
| 937 } else if ([role isEqualToString:NSAccessibilityTabGroupRole]) { | 967 } else if ([role isEqualToString:NSAccessibilityTabGroupRole]) { |
| 938 [ret addObject:NSAccessibilityTabsAttribute]; | 968 [ret addObject:NSAccessibilityTabsAttribute]; |
| 939 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] || | 969 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] || |
| 940 [role isEqualToString:NSAccessibilitySliderRole] || | 970 [role isEqualToString:NSAccessibilitySliderRole] || |
| 941 [role isEqualToString:NSAccessibilityScrollBarRole]) { | 971 [role isEqualToString:NSAccessibilityScrollBarRole]) { |
| 942 [ret addObjectsFromArray:[NSArray arrayWithObjects: | 972 [ret addObjectsFromArray:[NSArray arrayWithObjects: |
| 943 NSAccessibilityMaxValueAttribute, | 973 NSAccessibilityMaxValueAttribute, |
| 944 NSAccessibilityMinValueAttribute, | 974 NSAccessibilityMinValueAttribute, |
| 975 NSAccessibilityOrientationAttribute, |
| 976 NSAccessibilityValueDescriptionAttribute, |
| 945 nil]]; | 977 nil]]; |
| 946 } | 978 } |
| 947 | 979 |
| 948 // Live regions. | 980 // Live regions. |
| 949 string16 s; | 981 string16 s; |
| 950 if (browserAccessibility_->GetStringAttribute( | 982 if (browserAccessibility_->GetStringAttribute( |
| 951 AccessibilityNodeData::ATTR_LIVE_STATUS, &s)) { | 983 AccessibilityNodeData::ATTR_LIVE_STATUS, &s)) { |
| 952 [ret addObjectsFromArray:[NSArray arrayWithObjects: | 984 [ret addObjectsFromArray:[NSArray arrayWithObjects: |
| 953 @"AXARIALive", | 985 @"AXARIALive", |
| 954 @"AXARIARelevant", | 986 @"AXARIARelevant", |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1085 return [super hash]; | 1117 return [super hash]; |
| 1086 return browserAccessibility_->renderer_id(); | 1118 return browserAccessibility_->renderer_id(); |
| 1087 } | 1119 } |
| 1088 | 1120 |
| 1089 - (BOOL)accessibilityShouldUseUniqueId { | 1121 - (BOOL)accessibilityShouldUseUniqueId { |
| 1090 return YES; | 1122 return YES; |
| 1091 } | 1123 } |
| 1092 | 1124 |
| 1093 @end | 1125 @end |
| 1094 | 1126 |
| OLD | NEW |