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

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

Issue 7003067: Fix up accessibility. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix up missing braces Created 9 years, 6 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "chrome/browser/accessibility/browser_accessibility_cocoa.h" 7 #import "chrome/browser/accessibility/browser_accessibility_cocoa.h"
8 8
9 #include "base/string16.h" 9 #include "base/string16.h"
10 #include "base/sys_string_conversions.h" 10 #include "base/sys_string_conversions.h"
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 children_.reset(); 155 children_.reset();
156 } else { 156 } else {
157 [browserAccessibility_->parent()->toBrowserAccessibilityCocoa() 157 [browserAccessibility_->parent()->toBrowserAccessibilityCocoa()
158 childrenChanged]; 158 childrenChanged];
159 } 159 }
160 } 160 }
161 161
162 // Returns whether or not this node should be ignored in the 162 // Returns whether or not this node should be ignored in the
163 // accessibility tree. 163 // accessibility tree.
164 - (BOOL)isIgnored { 164 - (BOOL)isIgnored {
165 return [self role] == NSAccessibilityUnknownRole; 165 return [[self role] isEqualToString:NSAccessibilityUnknownRole];
166 } 166 }
167 167
168 // The origin of this accessibility object in the page's document. 168 // The origin of this accessibility object in the page's document.
169 // This is relative to webkit's top-left origin, not Cocoa's 169 // This is relative to webkit's top-left origin, not Cocoa's
170 // bottom-left origin. 170 // bottom-left origin.
171 - (NSPoint)origin { 171 - (NSPoint)origin {
172 return NSMakePoint(browserAccessibility_->location().x(), 172 return NSMakePoint(browserAccessibility_->location().x(),
173 browserAccessibility_->location().y()); 173 browserAccessibility_->location().y());
174 } 174 }
175 175
(...skipping 15 matching lines...) Expand all
191 role = roles[i].string; 191 role = roles[i].string;
192 break; 192 break;
193 } 193 }
194 } 194 }
195 195
196 return role; 196 return role;
197 } 197 }
198 198
199 // Returns a string indicating the role description of this object. 199 // Returns a string indicating the role description of this object.
200 - (NSString*)roleDescription { 200 - (NSString*)roleDescription {
201 NSString* role = [self role];
201 // The following descriptions are specific to webkit. 202 // The following descriptions are specific to webkit.
202 if ([[self role] isEqualToString:@"AXWebArea"]) 203 if ([role isEqualToString:@"AXWebArea"])
203 return l10n_util::GetNSString(IDS_AX_ROLE_WEB_AREA); 204 return l10n_util::GetNSString(IDS_AX_ROLE_WEB_AREA);
204 205
205 if ([[self role] isEqualToString:@"NSAccessibilityLinkRole"]) 206 if ([role isEqualToString:@"NSAccessibilityLinkRole"])
206 return l10n_util::GetNSString(IDS_AX_ROLE_LINK); 207 return l10n_util::GetNSString(IDS_AX_ROLE_LINK);
207 208
208 if ([[self role] isEqualToString:@"AXHeading"]) 209 if ([role isEqualToString:@"AXHeading"])
209 return l10n_util::GetNSString(IDS_AX_ROLE_HEADING); 210 return l10n_util::GetNSString(IDS_AX_ROLE_HEADING);
210 211
211 if ([[self role] isEqualToString:NSAccessibilityGroupRole] || 212 if ([role isEqualToString:NSAccessibilityGroupRole] ||
212 [[self role] isEqualToString:NSAccessibilityRadioButtonRole]) { 213 [role isEqualToString:NSAccessibilityRadioButtonRole]) {
213 const std::vector<std::pair<string16, string16> >& htmlAttributes = 214 const std::vector<std::pair<string16, string16> >& htmlAttributes =
214 browserAccessibility_->html_attributes(); 215 browserAccessibility_->html_attributes();
215 WebAccessibility::Role browserAccessibilityRole = 216 WebAccessibility::Role browserAccessibilityRole =
216 static_cast<WebAccessibility::Role>(browserAccessibility_->role()); 217 static_cast<WebAccessibility::Role>(browserAccessibility_->role());
217 218
218 if ((browserAccessibilityRole != WebAccessibility::ROLE_GROUP && 219 if ((browserAccessibilityRole != WebAccessibility::ROLE_GROUP &&
219 browserAccessibilityRole != WebAccessibility::ROLE_LIST_ITEM) || 220 browserAccessibilityRole != WebAccessibility::ROLE_LIST_ITEM) ||
220 browserAccessibilityRole == WebAccessibility::ROLE_TAB) { 221 browserAccessibilityRole == WebAccessibility::ROLE_TAB) {
221 for (size_t i = 0; i < htmlAttributes.size(); ++i) { 222 for (size_t i = 0; i < htmlAttributes.size(); ++i) {
222 const std::pair<string16, string16>& htmlAttribute = htmlAttributes[i]; 223 const std::pair<string16, string16>& htmlAttribute = htmlAttributes[i];
223 if (htmlAttribute.first == ASCIIToUTF16("role")) { 224 if (htmlAttribute.first == ASCIIToUTF16("role")) {
224 // TODO(dtseng): This is not localized; see crbug/84814. 225 // TODO(dtseng): This is not localized; see crbug/84814.
225 return base::SysUTF16ToNSString(htmlAttribute.second); 226 return base::SysUTF16ToNSString(htmlAttribute.second);
226 } 227 }
227 } 228 }
228 } 229 }
229 } 230 }
230 231
231 return NSAccessibilityRoleDescription([self role], nil); 232 return NSAccessibilityRoleDescription(role, nil);
232 } 233 }
233 234
234 // Returns the size of this object. 235 // Returns the size of this object.
235 - (NSSize)size { 236 - (NSSize)size {
236 return NSMakeSize(browserAccessibility_->location().width(), 237 return NSMakeSize(browserAccessibility_->location().width(),
237 browserAccessibility_->location().height()); 238 browserAccessibility_->location().height());
238 } 239 }
239 240
240 // Returns all tabs in this subtree. 241 // Returns all tabs in this subtree.
241 - (NSArray*)tabs { 242 - (NSArray*)tabs {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 } 296 }
296 if ([attribute isEqualToString:NSAccessibilityHelpAttribute]) { 297 if ([attribute isEqualToString:NSAccessibilityHelpAttribute]) {
297 return NSStringForWebAccessibilityAttribute( 298 return NSStringForWebAccessibilityAttribute(
298 browserAccessibility_->attributes(), 299 browserAccessibility_->attributes(),
299 WebAccessibility::ATTR_HELP); 300 WebAccessibility::ATTR_HELP);
300 } 301 }
301 if ([attribute isEqualToString:NSAccessibilityValueAttribute]) { 302 if ([attribute isEqualToString:NSAccessibilityValueAttribute]) {
302 // WebCore uses an attachmentView to get the below behavior. 303 // WebCore uses an attachmentView to get the below behavior.
303 // We do not have any native views backing this object, so need 304 // We do not have any native views backing this object, so need
304 // to approximate Cocoa ax behavior best as we can. 305 // to approximate Cocoa ax behavior best as we can.
305 if ([self role] == @"AXHeading") { 306 NSString* role = [self role];
307 if ([role isEqualToString:@"AXHeading"]) {
306 NSString* headingLevel = 308 NSString* headingLevel =
307 NSStringForWebAccessibilityAttribute( 309 NSStringForWebAccessibilityAttribute(
308 browserAccessibility_->attributes(), 310 browserAccessibility_->attributes(),
309 WebAccessibility::ATTR_HTML_TAG); 311 WebAccessibility::ATTR_HTML_TAG);
310 if ([headingLevel length] >= 2) { 312 if ([headingLevel length] >= 2) {
311 return [NSNumber numberWithInt: 313 return [NSNumber numberWithInt:
312 [[headingLevel substringFromIndex:1] intValue]]; 314 [[headingLevel substringFromIndex:1] intValue]];
313 } 315 }
314 } else if ([self role] == NSAccessibilityButtonRole) { 316 } else if ([role isEqualToString:NSAccessibilityButtonRole]) {
315 // AXValue does not make sense for pure buttons. 317 // AXValue does not make sense for pure buttons.
316 return @""; 318 return @"";
317 } else if ([self role] == NSAccessibilityCheckBoxRole || 319 } else if ([role isEqualToString:NSAccessibilityCheckBoxRole] ||
318 [self role] == NSAccessibilityRadioButtonRole) { 320 [role isEqualToString:NSAccessibilityRadioButtonRole]) {
319 return [NSNumber numberWithInt:GetState( 321 return [NSNumber numberWithInt:GetState(
320 browserAccessibility_, WebAccessibility::STATE_CHECKED) ? 1 : 0]; 322 browserAccessibility_, WebAccessibility::STATE_CHECKED) ? 1 : 0];
321 } else { 323 } else {
322 return base::SysUTF16ToNSString(browserAccessibility_->value()); 324 return base::SysUTF16ToNSString(browserAccessibility_->value());
323 } 325 }
324 } 326 }
325 if ([attribute isEqualToString:NSAccessibilityRoleDescriptionAttribute]) { 327 if ([attribute isEqualToString:NSAccessibilityRoleDescriptionAttribute]) {
326 return [self roleDescription]; 328 return [self roleDescription];
327 } 329 }
328 if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) { 330 if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) {
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 [attribute isEqualTo: 431 [attribute isEqualTo:
430 NSAccessibilityStyleRangeForIndexParameterizedAttribute]) { 432 NSAccessibilityStyleRangeForIndexParameterizedAttribute]) {
431 return nil; 433 return nil;
432 } 434 }
433 return nil; 435 return nil;
434 } 436 }
435 437
436 // Returns an array of parameterized attributes names that this object will 438 // Returns an array of parameterized attributes names that this object will
437 // respond to. 439 // respond to.
438 - (NSArray*)accessibilityParameterizedAttributeNames { 440 - (NSArray*)accessibilityParameterizedAttributeNames {
439 if ([self role] == NSAccessibilityTextFieldRole) { 441 if ([[self role] isEqualToString:NSAccessibilityTextFieldRole]) {
440 return [NSArray arrayWithObjects: 442 return [NSArray arrayWithObjects:
441 NSAccessibilityLineForIndexParameterizedAttribute, 443 NSAccessibilityLineForIndexParameterizedAttribute,
442 NSAccessibilityRangeForLineParameterizedAttribute, 444 NSAccessibilityRangeForLineParameterizedAttribute,
443 NSAccessibilityStringForRangeParameterizedAttribute, 445 NSAccessibilityStringForRangeParameterizedAttribute,
444 NSAccessibilityRangeForPositionParameterizedAttribute, 446 NSAccessibilityRangeForPositionParameterizedAttribute,
445 NSAccessibilityRangeForIndexParameterizedAttribute, 447 NSAccessibilityRangeForIndexParameterizedAttribute,
446 NSAccessibilityBoundsForRangeParameterizedAttribute, 448 NSAccessibilityBoundsForRangeParameterizedAttribute,
447 NSAccessibilityRTFForRangeParameterizedAttribute, 449 NSAccessibilityRTFForRangeParameterizedAttribute,
448 NSAccessibilityAttributedStringForRangeParameterizedAttribute, 450 NSAccessibilityAttributedStringForRangeParameterizedAttribute,
449 NSAccessibilityStyleRangeForIndexParameterizedAttribute, 451 NSAccessibilityStyleRangeForIndexParameterizedAttribute,
450 nil]; 452 nil];
451 } 453 }
452 return nil; 454 return nil;
453 } 455 }
454 456
455 // Returns an array of action names that this object will respond to. 457 // Returns an array of action names that this object will respond to.
456 - (NSArray*)accessibilityActionNames { 458 - (NSArray*)accessibilityActionNames {
457 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; 459 NSMutableArray* ret =
458 460 [NSMutableArray arrayWithObject:NSAccessibilityShowMenuAction];
459 // General actions. 461 NSString* role = [self role];
460 [ret addObject:NSAccessibilityShowMenuAction];
461
462 // TODO(dtseng): this should only get set when there's a default action. 462 // TODO(dtseng): this should only get set when there's a default action.
463 if ([self role] != NSAccessibilityStaticTextRole && 463 if (![role isEqualToString:NSAccessibilityStaticTextRole] &&
464 [self role] != NSAccessibilityTextAreaRole && 464 ![role isEqualToString:NSAccessibilityTextAreaRole] &&
465 [self role] != NSAccessibilityTextFieldRole) { 465 ![role isEqualToString:NSAccessibilityTextFieldRole]) {
466 [ret addObject:NSAccessibilityPressAction]; 466 [ret addObject:NSAccessibilityPressAction];
467 } 467 }
468 468
469 return ret; 469 return ret;
470 } 470 }
471 471
472 // Returns a sub-array of values for the given attribute value, starting at 472 // Returns a sub-array of values for the given attribute value, starting at
473 // index, with up to maxCount items. If the given index is out of bounds, 473 // index, with up to maxCount items. If the given index is out of bounds,
474 // or there are no values for the given attribute, it will return nil. 474 // or there are no values for the given attribute, it will return nil.
475 // This method is used for querying subsets of values, without having to 475 // This method is used for querying subsets of values, without having to
(...skipping 18 matching lines...) Expand all
494 } 494 }
495 495
496 // Returns the count of the specified accessibility array attribute. 496 // Returns the count of the specified accessibility array attribute.
497 - (NSUInteger)accessibilityArrayAttributeCount:(NSString*)attribute { 497 - (NSUInteger)accessibilityArrayAttributeCount:(NSString*)attribute {
498 NSArray* fullArray = [self accessibilityAttributeValue:attribute]; 498 NSArray* fullArray = [self accessibilityAttributeValue:attribute];
499 return [fullArray count]; 499 return [fullArray count];
500 } 500 }
501 501
502 // Returns the list of accessibility attributes that this object supports. 502 // Returns the list of accessibility attributes that this object supports.
503 - (NSArray*)accessibilityAttributeNames { 503 - (NSArray*)accessibilityAttributeNames {
504 NSMutableArray* ret = [[NSMutableArray alloc] init];
505
506 // General attributes. 504 // General attributes.
507 [ret addObjectsFromArray:[NSArray arrayWithObjects: 505 NSMutableArray* ret = [NSMutableArray arrayWithObjects:
508 NSAccessibilityChildrenAttribute, 506 NSAccessibilityChildrenAttribute,
509 NSAccessibilityDescriptionAttribute, 507 NSAccessibilityDescriptionAttribute,
510 NSAccessibilityEnabledAttribute, 508 NSAccessibilityEnabledAttribute,
511 NSAccessibilityFocusedAttribute, 509 NSAccessibilityFocusedAttribute,
512 NSAccessibilityHelpAttribute, 510 NSAccessibilityHelpAttribute,
513 NSAccessibilityParentAttribute, 511 NSAccessibilityParentAttribute,
514 NSAccessibilityPositionAttribute, 512 NSAccessibilityPositionAttribute,
515 NSAccessibilityRoleAttribute, 513 NSAccessibilityRoleAttribute,
516 NSAccessibilityRoleDescriptionAttribute, 514 NSAccessibilityRoleDescriptionAttribute,
517 NSAccessibilitySizeAttribute, 515 NSAccessibilitySizeAttribute,
518 NSAccessibilityTitleAttribute, 516 NSAccessibilityTitleAttribute,
519 NSAccessibilityTopLevelUIElementAttribute, 517 NSAccessibilityTopLevelUIElementAttribute,
520 NSAccessibilityValueAttribute, 518 NSAccessibilityValueAttribute,
521 NSAccessibilityWindowAttribute, 519 NSAccessibilityWindowAttribute,
522 NSAccessibilityURLAttribute, 520 NSAccessibilityURLAttribute,
523 @"AXVisited", 521 @"AXVisited",
524 nil]]; 522 nil];
525 523
526 // Specific role attributes. 524 // Specific role attributes.
527 if ([self role] == NSAccessibilityTableRole) { 525 NSString* role = [self role];
526 if ([role isEqualToString:NSAccessibilityTableRole]) {
528 [ret addObjectsFromArray:[NSArray arrayWithObjects: 527 [ret addObjectsFromArray:[NSArray arrayWithObjects:
529 NSAccessibilityColumnsAttribute, 528 NSAccessibilityColumnsAttribute,
530 NSAccessibilityRowsAttribute, 529 NSAccessibilityRowsAttribute,
531 nil]]; 530 nil]];
532 } 531 } else if ([role isEqualToString:@"AXWebArea"]) {
533 532 [ret addObject:@"AXLoaded"];
534 if ([self role] == @"AXWebArea") { 533 } else if ([role isEqualToString:NSAccessibilityTextFieldRole]) {
535 [ret addObjectsFromArray:[NSArray arrayWithObjects:
536 @"AXLoaded",
537 nil]];
538 }
539
540 if ([self role] == NSAccessibilityTextFieldRole) {
541 [ret addObjectsFromArray:[NSArray arrayWithObjects: 534 [ret addObjectsFromArray:[NSArray arrayWithObjects:
542 NSAccessibilityInsertionPointLineNumberAttribute, 535 NSAccessibilityInsertionPointLineNumberAttribute,
543 NSAccessibilityNumberOfCharactersAttribute, 536 NSAccessibilityNumberOfCharactersAttribute,
544 NSAccessibilitySelectedTextAttribute, 537 NSAccessibilitySelectedTextAttribute,
545 NSAccessibilitySelectedTextRangeAttribute, 538 NSAccessibilitySelectedTextRangeAttribute,
546 NSAccessibilityVisibleCharacterRangeAttribute, 539 NSAccessibilityVisibleCharacterRangeAttribute,
547 nil]]; 540 nil]];
541 } else if ([role isEqualToString:NSAccessibilityTabGroupRole]) {
542 [ret addObject:NSAccessibilityTabsAttribute];
548 } 543 }
549 544
550 if ([self role] == NSAccessibilityTabGroupRole)
551 [ret addObject:NSAccessibilityTabsAttribute];
552
553 return ret; 545 return ret;
554 } 546 }
555 547
556 // Returns the index of the child in this objects array of children. 548 // Returns the index of the child in this objects array of children.
557 - (NSUInteger)accessibilityGetIndexOf:(id)child { 549 - (NSUInteger)accessibilityGetIndexOf:(id)child {
558 NSUInteger index = 0; 550 NSUInteger index = 0;
559 for (BrowserAccessibilityCocoa* childToCheck in [self children]) { 551 for (BrowserAccessibilityCocoa* childToCheck in [self children]) {
560 if ([child isEqual:childToCheck]) 552 if ([child isEqual:childToCheck])
561 return index; 553 return index;
562 ++index; 554 ++index;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 635
644 - (NSUInteger)hash { 636 - (NSUInteger)hash {
645 // Potentially called during dealloc. 637 // Potentially called during dealloc.
646 if (!browserAccessibility_) 638 if (!browserAccessibility_)
647 return [super hash]; 639 return [super hash];
648 return browserAccessibility_->renderer_id(); 640 return browserAccessibility_->renderer_id();
649 } 641 }
650 642
651 @end 643 @end
652 644
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698