OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |