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

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

Issue 10911287: Make spin button accessible on Mac. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 3 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
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 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | content/test/data/accessibility/spinbutton.html » ('j') | webkit/glue/webkit_strings.grd » ('J')

Powered by Google App Engine
This is Rietveld 408576698