| 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 |