| 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 15 matching lines...) Expand all Loading... |
| 26 using content::BrowserAccessibility; | 26 using content::BrowserAccessibility; |
| 27 using content::BrowserAccessibilityManager; | 27 using content::BrowserAccessibilityManager; |
| 28 using content::BrowserAccessibilityManagerMac; | 28 using content::BrowserAccessibilityManagerMac; |
| 29 using content::ContentClient; | 29 using content::ContentClient; |
| 30 typedef AccessibilityNodeData::StringAttribute StringAttribute; | 30 typedef AccessibilityNodeData::StringAttribute StringAttribute; |
| 31 | 31 |
| 32 namespace { | 32 namespace { |
| 33 | 33 |
| 34 // Returns an autoreleased copy of the AccessibilityNodeData's attribute. | 34 // Returns an autoreleased copy of the AccessibilityNodeData's attribute. |
| 35 NSString* NSStringForStringAttribute( | 35 NSString* NSStringForStringAttribute( |
| 36 const std::map<StringAttribute, string16>& attributes, | 36 BrowserAccessibility* browserAccessibility, |
| 37 StringAttribute attribute) { | 37 StringAttribute attribute) { |
| 38 std::map<StringAttribute, string16>::const_iterator iter = | 38 return base::SysUTF8ToNSString( |
| 39 attributes.find(attribute); | 39 browserAccessibility->GetStringAttribute(attribute)); |
| 40 NSString* returnValue = @""; | |
| 41 if (iter != attributes.end()) { | |
| 42 returnValue = base::SysUTF16ToNSString(iter->second); | |
| 43 } | |
| 44 return returnValue; | |
| 45 } | 40 } |
| 46 | 41 |
| 47 struct MapEntry { | 42 struct MapEntry { |
| 48 AccessibilityNodeData::Role webKitValue; | 43 AccessibilityNodeData::Role webKitValue; |
| 49 NSString* nativeValue; | 44 NSString* nativeValue; |
| 50 }; | 45 }; |
| 51 | 46 |
| 52 typedef std::map<AccessibilityNodeData::Role, NSString*> RoleMap; | 47 typedef std::map<AccessibilityNodeData::Role, NSString*> RoleMap; |
| 53 | 48 |
| 54 // GetState checks the bitmask used in AccessibilityNodeData to check | 49 // GetState checks the bitmask used in AccessibilityNodeData to check |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 | 341 |
| 347 - (void)detach { | 342 - (void)detach { |
| 348 if (browserAccessibility_) { | 343 if (browserAccessibility_) { |
| 349 NSAccessibilityUnregisterUniqueIdForUIElement(self); | 344 NSAccessibilityUnregisterUniqueIdForUIElement(self); |
| 350 browserAccessibility_ = NULL; | 345 browserAccessibility_ = NULL; |
| 351 } | 346 } |
| 352 } | 347 } |
| 353 | 348 |
| 354 - (NSString*)accessKey { | 349 - (NSString*)accessKey { |
| 355 return NSStringForStringAttribute( | 350 return NSStringForStringAttribute( |
| 356 browserAccessibility_->string_attributes(), | 351 browserAccessibility_, AccessibilityNodeData::ATTR_ACCESS_KEY); |
| 357 AccessibilityNodeData::ATTR_ACCESS_KEY); | |
| 358 } | 352 } |
| 359 | 353 |
| 360 - (NSNumber*)ariaAtomic { | 354 - (NSNumber*)ariaAtomic { |
| 361 bool boolValue = false; | 355 bool boolValue = browserAccessibility_->GetBoolAttribute( |
| 362 browserAccessibility_->GetBoolAttribute( | 356 AccessibilityNodeData::ATTR_LIVE_ATOMIC); |
| 363 AccessibilityNodeData::ATTR_LIVE_ATOMIC, &boolValue); | |
| 364 return [NSNumber numberWithBool:boolValue]; | 357 return [NSNumber numberWithBool:boolValue]; |
| 365 } | 358 } |
| 366 | 359 |
| 367 - (NSNumber*)ariaBusy { | 360 - (NSNumber*)ariaBusy { |
| 368 bool boolValue = false; | 361 bool boolValue = browserAccessibility_->GetBoolAttribute( |
| 369 browserAccessibility_->GetBoolAttribute( | 362 AccessibilityNodeData::ATTR_LIVE_BUSY); |
| 370 AccessibilityNodeData::ATTR_LIVE_BUSY, &boolValue); | |
| 371 return [NSNumber numberWithBool:boolValue]; | 363 return [NSNumber numberWithBool:boolValue]; |
| 372 } | 364 } |
| 373 | 365 |
| 374 - (NSString*)ariaLive { | 366 - (NSString*)ariaLive { |
| 375 return NSStringForStringAttribute( | 367 return NSStringForStringAttribute( |
| 376 browserAccessibility_->string_attributes(), | 368 browserAccessibility_, AccessibilityNodeData::ATTR_LIVE_STATUS); |
| 377 AccessibilityNodeData::ATTR_LIVE_STATUS); | |
| 378 } | 369 } |
| 379 | 370 |
| 380 - (NSString*)ariaRelevant { | 371 - (NSString*)ariaRelevant { |
| 381 return NSStringForStringAttribute( | 372 return NSStringForStringAttribute( |
| 382 browserAccessibility_->string_attributes(), | 373 browserAccessibility_, AccessibilityNodeData::ATTR_LIVE_RELEVANT); |
| 383 AccessibilityNodeData::ATTR_LIVE_RELEVANT); | |
| 384 } | 374 } |
| 385 | 375 |
| 386 // Returns an array of BrowserAccessibilityCocoa objects, representing the | 376 // Returns an array of BrowserAccessibilityCocoa objects, representing the |
| 387 // accessibility children of this object. | 377 // accessibility children of this object. |
| 388 - (NSArray*)children { | 378 - (NSArray*)children { |
| 389 if (!children_) { | 379 if (!children_) { |
| 390 children_.reset([[NSMutableArray alloc] | 380 children_.reset([[NSMutableArray alloc] |
| 391 initWithCapacity:browserAccessibility_->child_count()] ); | 381 initWithCapacity:browserAccessibility_->child_count()] ); |
| 392 for (uint32 index = 0; | 382 for (uint32 index = 0; |
| 393 index < browserAccessibility_->child_count(); | 383 index < browserAccessibility_->child_count(); |
| 394 ++index) { | 384 ++index) { |
| 395 BrowserAccessibilityCocoa* child = | 385 BrowserAccessibilityCocoa* child = |
| 396 browserAccessibility_->GetChild(index)->ToBrowserAccessibilityCocoa(); | 386 browserAccessibility_->GetChild(index)->ToBrowserAccessibilityCocoa(); |
| 397 if ([child isIgnored]) | 387 if ([child isIgnored]) |
| 398 [children_ addObjectsFromArray:[child children]]; | 388 [children_ addObjectsFromArray:[child children]]; |
| 399 else | 389 else |
| 400 [children_ addObject:child]; | 390 [children_ addObject:child]; |
| 401 } | 391 } |
| 402 | 392 |
| 403 // Also, add indirect children (if any). | 393 // Also, add indirect children (if any). |
| 404 for (uint32 i = 0; | 394 const std::vector<int32>& indirectChildIds = |
| 405 i < browserAccessibility_->indirect_child_ids().size(); | 395 browserAccessibility_->GetIntListAttribute( |
| 406 ++i) { | 396 AccessibilityNodeData::ATTR_INDIRECT_CHILD_IDS); |
| 407 int32 child_id = browserAccessibility_->indirect_child_ids()[i]; | 397 for (uint32 i = 0; i < indirectChildIds.size(); ++i) { |
| 398 int32 child_id = indirectChildIds[i]; |
| 408 BrowserAccessibility* child = | 399 BrowserAccessibility* child = |
| 409 browserAccessibility_->manager()->GetFromRendererID(child_id); | 400 browserAccessibility_->manager()->GetFromRendererID(child_id); |
| 410 | 401 |
| 411 // This only became necessary as a result of crbug.com/93095. It should be | 402 // This only became necessary as a result of crbug.com/93095. It should be |
| 412 // a DCHECK in the future. | 403 // a DCHECK in the future. |
| 413 if (child) { | 404 if (child) { |
| 414 BrowserAccessibilityCocoa* child_cocoa = | 405 BrowserAccessibilityCocoa* child_cocoa = |
| 415 child->ToBrowserAccessibilityCocoa(); | 406 child->ToBrowserAccessibilityCocoa(); |
| 416 [children_ addObject:child_cocoa]; | 407 [children_ addObject:child_cocoa]; |
| 417 } | 408 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 430 } | 421 } |
| 431 | 422 |
| 432 - (NSArray*)columnHeaders { | 423 - (NSArray*)columnHeaders { |
| 433 if ([self internalRole] != AccessibilityNodeData::ROLE_TABLE && | 424 if ([self internalRole] != AccessibilityNodeData::ROLE_TABLE && |
| 434 [self internalRole] != AccessibilityNodeData::ROLE_GRID) { | 425 [self internalRole] != AccessibilityNodeData::ROLE_GRID) { |
| 435 return nil; | 426 return nil; |
| 436 } | 427 } |
| 437 | 428 |
| 438 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; | 429 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; |
| 439 const std::vector<int32>& uniqueCellIds = | 430 const std::vector<int32>& uniqueCellIds = |
| 440 browserAccessibility_->unique_cell_ids(); | 431 browserAccessibility_->GetIntListAttribute( |
| 432 AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS); |
| 441 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { | 433 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { |
| 442 int id = uniqueCellIds[i]; | 434 int id = uniqueCellIds[i]; |
| 443 BrowserAccessibility* cell = | 435 BrowserAccessibility* cell = |
| 444 browserAccessibility_->manager()->GetFromRendererID(id); | 436 browserAccessibility_->manager()->GetFromRendererID(id); |
| 445 if (cell && cell->role() == AccessibilityNodeData::ROLE_COLUMN_HEADER) | 437 if (cell && cell->role() == AccessibilityNodeData::ROLE_COLUMN_HEADER) |
| 446 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; | 438 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; |
| 447 } | 439 } |
| 448 return ret; | 440 return ret; |
| 449 } | 441 } |
| 450 | 442 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 466 - (NSArray*)columns { | 458 - (NSArray*)columns { |
| 467 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; | 459 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; |
| 468 for (BrowserAccessibilityCocoa* child in [self children]) { | 460 for (BrowserAccessibilityCocoa* child in [self children]) { |
| 469 if ([[child role] isEqualToString:NSAccessibilityColumnRole]) | 461 if ([[child role] isEqualToString:NSAccessibilityColumnRole]) |
| 470 [ret addObject:child]; | 462 [ret addObject:child]; |
| 471 } | 463 } |
| 472 return ret; | 464 return ret; |
| 473 } | 465 } |
| 474 | 466 |
| 475 - (NSString*)description { | 467 - (NSString*)description { |
| 476 const std::map<StringAttribute, string16>& attributes = | 468 std::string description; |
| 477 browserAccessibility_->string_attributes(); | 469 if (browserAccessibility_->GetStringAttribute( |
| 478 std::map<StringAttribute, string16>::const_iterator iter = | 470 AccessibilityNodeData::ATTR_DESCRIPTION, &description)) { |
| 479 attributes.find(AccessibilityNodeData::ATTR_DESCRIPTION); | 471 return base::SysUTF8ToNSString(description); |
| 480 if (iter != attributes.end()) | 472 } |
| 481 return base::SysUTF16ToNSString(iter->second); | |
| 482 | 473 |
| 483 // If the role is anything other than an image, or if there's | 474 // If the role is anything other than an image, or if there's |
| 484 // a title or title UI element, just return an empty string. | 475 // a title or title UI element, just return an empty string. |
| 485 if (![[self role] isEqualToString:NSAccessibilityImageRole]) | 476 if (![[self role] isEqualToString:NSAccessibilityImageRole]) |
| 486 return @""; | 477 return @""; |
| 487 if (!browserAccessibility_->name().empty()) | 478 if (browserAccessibility_->HasStringAttribute( |
| 479 AccessibilityNodeData::ATTR_NAME)) { |
| 488 return @""; | 480 return @""; |
| 481 } |
| 489 if ([self titleUIElement]) | 482 if ([self titleUIElement]) |
| 490 return @""; | 483 return @""; |
| 491 | 484 |
| 492 // The remaining case is an image where there's no other title. | 485 // The remaining case is an image where there's no other title. |
| 493 // Return the base part of the filename as the description. | 486 // Return the base part of the filename as the description. |
| 494 iter = attributes.find(AccessibilityNodeData::ATTR_URL); | 487 std::string url; |
| 495 if (iter != attributes.end()) { | 488 if (browserAccessibility_->GetStringAttribute( |
| 496 string16 filename = iter->second; | 489 AccessibilityNodeData::ATTR_URL, &url)) { |
| 497 // Given a url like http://foo.com/bar/baz.png, just return the | 490 // Given a url like http://foo.com/bar/baz.png, just return the |
| 498 // base name, e.g., "baz.png". | 491 // base name, e.g., "baz.png". |
| 499 size_t leftIndex = filename.size(); | 492 size_t leftIndex = url.rfind('/'); |
| 500 while (leftIndex > 0 && filename[leftIndex - 1] != '/') | 493 std::string basename = |
| 501 leftIndex--; | 494 leftIndex != std::string::npos ? url.substr(leftIndex) : url; |
| 502 string16 basename = filename.substr(leftIndex); | 495 return base::SysUTF8ToNSString(basename); |
| 503 | |
| 504 return base::SysUTF16ToNSString(basename); | |
| 505 } | 496 } |
| 506 | 497 |
| 507 return @""; | 498 return @""; |
| 508 } | 499 } |
| 509 | 500 |
| 510 - (NSNumber*)disclosing { | 501 - (NSNumber*)disclosing { |
| 511 if ([self internalRole] == AccessibilityNodeData::ROLE_TREE_ITEM) { | 502 if ([self internalRole] == AccessibilityNodeData::ROLE_TREE_ITEM) { |
| 512 return [NSNumber numberWithBool: | 503 return [NSNumber numberWithBool: |
| 513 GetState(browserAccessibility_, AccessibilityNodeData::STATE_EXPANDED)]; | 504 GetState(browserAccessibility_, AccessibilityNodeData::STATE_EXPANDED)]; |
| 514 } else { | 505 } else { |
| 515 return nil; | 506 return nil; |
| 516 } | 507 } |
| 517 } | 508 } |
| 518 | 509 |
| 519 - (id)disclosedByRow { | 510 - (id)disclosedByRow { |
| 520 // The row that contains this row. | 511 // The row that contains this row. |
| 521 // It should be the same as the first parent that is a treeitem. | 512 // It should be the same as the first parent that is a treeitem. |
| 522 return nil; | 513 return nil; |
| 523 } | 514 } |
| 524 | 515 |
| 525 - (NSNumber*)disclosureLevel { | 516 - (NSNumber*)disclosureLevel { |
| 526 AccessibilityNodeData::Role role = [self internalRole]; | 517 AccessibilityNodeData::Role role = [self internalRole]; |
| 527 if (role == AccessibilityNodeData::ROLE_ROW || | 518 if (role == AccessibilityNodeData::ROLE_ROW || |
| 528 role == AccessibilityNodeData::ROLE_TREE_ITEM) { | 519 role == AccessibilityNodeData::ROLE_TREE_ITEM) { |
| 529 int level = 0; | 520 int level = browserAccessibility_->GetIntAttribute( |
| 530 browserAccessibility_->GetIntAttribute( | 521 AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL); |
| 531 AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL, &level); | |
| 532 // Mac disclosureLevel is 0-based, but web levels are 1-based. | 522 // Mac disclosureLevel is 0-based, but web levels are 1-based. |
| 533 if (level > 0) | 523 if (level > 0) |
| 534 level--; | 524 level--; |
| 535 return [NSNumber numberWithInt:level]; | 525 return [NSNumber numberWithInt:level]; |
| 536 } else { | 526 } else { |
| 537 return nil; | 527 return nil; |
| 538 } | 528 } |
| 539 } | 529 } |
| 540 | 530 |
| 541 - (id)disclosedRows { | 531 - (id)disclosedRows { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 574 BrowserAccessibility* headerObject = | 564 BrowserAccessibility* headerObject = |
| 575 browserAccessibility_->manager()->GetFromRendererID(headerElementId); | 565 browserAccessibility_->manager()->GetFromRendererID(headerElementId); |
| 576 if (headerObject) | 566 if (headerObject) |
| 577 return headerObject->ToBrowserAccessibilityCocoa(); | 567 return headerObject->ToBrowserAccessibilityCocoa(); |
| 578 } | 568 } |
| 579 return nil; | 569 return nil; |
| 580 } | 570 } |
| 581 | 571 |
| 582 - (NSString*)help { | 572 - (NSString*)help { |
| 583 return NSStringForStringAttribute( | 573 return NSStringForStringAttribute( |
| 584 browserAccessibility_->string_attributes(), | 574 browserAccessibility_, AccessibilityNodeData::ATTR_HELP); |
| 585 AccessibilityNodeData::ATTR_HELP); | |
| 586 } | 575 } |
| 587 | 576 |
| 588 - (NSNumber*)index { | 577 - (NSNumber*)index { |
| 589 if ([self internalRole] == AccessibilityNodeData::ROLE_COLUMN) { | 578 if ([self internalRole] == AccessibilityNodeData::ROLE_COLUMN) { |
| 590 int columnIndex; | 579 int columnIndex = browserAccessibility_->GetIntAttribute( |
| 591 if (browserAccessibility_->GetIntAttribute( | 580 AccessibilityNodeData::ATTR_TABLE_COLUMN_INDEX); |
| 592 AccessibilityNodeData::ATTR_TABLE_COLUMN_INDEX, &columnIndex)) { | 581 return [NSNumber numberWithInt:columnIndex]; |
| 593 return [NSNumber numberWithInt:columnIndex]; | |
| 594 } | |
| 595 } else if ([self internalRole] == AccessibilityNodeData::ROLE_ROW) { | 582 } else if ([self internalRole] == AccessibilityNodeData::ROLE_ROW) { |
| 596 int rowIndex; | 583 int rowIndex = browserAccessibility_->GetIntAttribute( |
| 597 if (browserAccessibility_->GetIntAttribute( | 584 AccessibilityNodeData::ATTR_TABLE_ROW_INDEX); |
| 598 AccessibilityNodeData::ATTR_TABLE_ROW_INDEX, &rowIndex)) { | 585 return [NSNumber numberWithInt:rowIndex]; |
| 599 return [NSNumber numberWithInt:rowIndex]; | |
| 600 } | |
| 601 } | 586 } |
| 602 | 587 |
| 603 return nil; | 588 return nil; |
| 604 } | 589 } |
| 605 | 590 |
| 606 // Returns whether or not this node should be ignored in the | 591 // Returns whether or not this node should be ignored in the |
| 607 // accessibility tree. | 592 // accessibility tree. |
| 608 - (BOOL)isIgnored { | 593 - (BOOL)isIgnored { |
| 609 return [[self role] isEqualToString:NSAccessibilityUnknownRole]; | 594 return [[self role] isEqualToString:NSAccessibilityUnknownRole]; |
| 610 } | 595 } |
| 611 | 596 |
| 612 - (NSString*)invalid { | 597 - (NSString*)invalid { |
| 613 string16 invalidUTF; | 598 string16 invalidUTF; |
| 614 if (!browserAccessibility_->GetHtmlAttribute("aria-invalid", &invalidUTF)) | 599 if (!browserAccessibility_->GetHtmlAttribute("aria-invalid", &invalidUTF)) |
| 615 return NULL; | 600 return NULL; |
| 616 NSString* invalid = base::SysUTF16ToNSString(invalidUTF); | 601 NSString* invalid = base::SysUTF16ToNSString(invalidUTF); |
| 617 if ([invalid isEqualToString:@"false"] || | 602 if ([invalid isEqualToString:@"false"] || |
| 618 [invalid isEqualToString:@""]) { | 603 [invalid isEqualToString:@""]) { |
| 619 return @"false"; | 604 return @"false"; |
| 620 } | 605 } |
| 621 return invalid; | 606 return invalid; |
| 622 } | 607 } |
| 623 | 608 |
| 624 - (NSNumber*)loaded { | 609 - (NSNumber*)loaded { |
| 625 return [NSNumber numberWithBool:YES]; | 610 return [NSNumber numberWithBool:YES]; |
| 626 } | 611 } |
| 627 | 612 |
| 628 - (NSNumber*)loadingProgress { | 613 - (NSNumber*)loadingProgress { |
| 629 float floatValue = 0.0; | 614 float floatValue = browserAccessibility_->GetFloatAttribute( |
| 630 browserAccessibility_->GetFloatAttribute( | 615 AccessibilityNodeData::ATTR_DOC_LOADING_PROGRESS); |
| 631 AccessibilityNodeData::ATTR_DOC_LOADING_PROGRESS, &floatValue); | |
| 632 return [NSNumber numberWithFloat:floatValue]; | 616 return [NSNumber numberWithFloat:floatValue]; |
| 633 } | 617 } |
| 634 | 618 |
| 635 - (NSNumber*)maxValue { | 619 - (NSNumber*)maxValue { |
| 636 float floatValue = 0.0; | 620 float floatValue = browserAccessibility_->GetFloatAttribute( |
| 637 browserAccessibility_->GetFloatAttribute( | 621 AccessibilityNodeData::ATTR_MAX_VALUE_FOR_RANGE); |
| 638 AccessibilityNodeData::ATTR_MAX_VALUE_FOR_RANGE, &floatValue); | |
| 639 return [NSNumber numberWithFloat:floatValue]; | 622 return [NSNumber numberWithFloat:floatValue]; |
| 640 } | 623 } |
| 641 | 624 |
| 642 - (NSNumber*)minValue { | 625 - (NSNumber*)minValue { |
| 643 float floatValue = 0.0; | 626 float floatValue = browserAccessibility_->GetFloatAttribute( |
| 644 browserAccessibility_->GetFloatAttribute( | 627 AccessibilityNodeData::ATTR_MIN_VALUE_FOR_RANGE); |
| 645 AccessibilityNodeData::ATTR_MIN_VALUE_FOR_RANGE, &floatValue); | |
| 646 return [NSNumber numberWithFloat:floatValue]; | 628 return [NSNumber numberWithFloat:floatValue]; |
| 647 } | 629 } |
| 648 | 630 |
| 649 - (NSString*)orientation { | 631 - (NSString*)orientation { |
| 650 // We present a spin button as a vertical slider, with a role description | 632 // We present a spin button as a vertical slider, with a role description |
| 651 // of "spin button". | 633 // of "spin button". |
| 652 if ([self internalRole] == AccessibilityNodeData::ROLE_SPIN_BUTTON) | 634 if ([self internalRole] == AccessibilityNodeData::ROLE_SPIN_BUTTON) |
| 653 return NSAccessibilityVerticalOrientationValue; | 635 return NSAccessibilityVerticalOrientationValue; |
| 654 | 636 |
| 655 if (GetState(browserAccessibility_, AccessibilityNodeData::STATE_VERTICAL)) | 637 if (GetState(browserAccessibility_, AccessibilityNodeData::STATE_VERTICAL)) |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 721 IDS_AX_ROLE_LINK)); | 703 IDS_AX_ROLE_LINK)); |
| 722 } | 704 } |
| 723 | 705 |
| 724 if ([role isEqualToString:@"AXHeading"]) { | 706 if ([role isEqualToString:@"AXHeading"]) { |
| 725 return base::SysUTF16ToNSString(content_client->GetLocalizedString( | 707 return base::SysUTF16ToNSString(content_client->GetLocalizedString( |
| 726 IDS_AX_ROLE_HEADING)); | 708 IDS_AX_ROLE_HEADING)); |
| 727 } | 709 } |
| 728 | 710 |
| 729 if ([role isEqualToString:NSAccessibilityGroupRole] || | 711 if ([role isEqualToString:NSAccessibilityGroupRole] || |
| 730 [role isEqualToString:NSAccessibilityRadioButtonRole]) { | 712 [role isEqualToString:NSAccessibilityRadioButtonRole]) { |
| 731 const std::vector<std::pair<string16, string16> >& htmlAttributes = | 713 std::string role; |
| 732 browserAccessibility_->html_attributes(); | 714 if (browserAccessibility_->GetHtmlAttribute("role", &role)) { |
| 733 AccessibilityNodeData::Role browserAccessibilityRole = [self internalRole]; | 715 AccessibilityNodeData::Role internalRole = |
| 734 if ((browserAccessibilityRole != AccessibilityNodeData::ROLE_GROUP && | 716 [self internalRole]; |
| 735 browserAccessibilityRole != AccessibilityNodeData::ROLE_LIST_ITEM) || | 717 if ((internalRole != AccessibilityNodeData::ROLE_GROUP && |
| 736 browserAccessibilityRole == AccessibilityNodeData::ROLE_TAB) { | 718 internalRole != AccessibilityNodeData::ROLE_LIST_ITEM) || |
| 737 for (size_t i = 0; i < htmlAttributes.size(); ++i) { | 719 internalRole == AccessibilityNodeData::ROLE_TAB) { |
| 738 const std::pair<string16, string16>& htmlAttribute = htmlAttributes[i]; | 720 // TODO(dtseng): This is not localized; see crbug/84814. |
| 739 if (htmlAttribute.first == ASCIIToUTF16("role")) { | 721 return base::SysUTF8ToNSString(role); |
| 740 // TODO(dtseng): This is not localized; see crbug/84814. | |
| 741 return base::SysUTF16ToNSString(htmlAttribute.second); | |
| 742 } | |
| 743 } | 722 } |
| 744 } | 723 } |
| 745 } | 724 } |
| 746 | 725 |
| 747 switch([self internalRole]) { | 726 switch([self internalRole]) { |
| 748 case AccessibilityNodeData::ROLE_FOOTER: | 727 case AccessibilityNodeData::ROLE_FOOTER: |
| 749 return base::SysUTF16ToNSString(content_client->GetLocalizedString( | 728 return base::SysUTF16ToNSString(content_client->GetLocalizedString( |
| 750 IDS_AX_ROLE_FOOTER)); | 729 IDS_AX_ROLE_FOOTER)); |
| 751 case AccessibilityNodeData::ROLE_SPIN_BUTTON: | 730 case AccessibilityNodeData::ROLE_SPIN_BUTTON: |
| 752 // This control is similar to what VoiceOver calls a "stepper". | 731 // This control is similar to what VoiceOver calls a "stepper". |
| 753 return base::SysUTF16ToNSString(content_client->GetLocalizedString( | 732 return base::SysUTF16ToNSString(content_client->GetLocalizedString( |
| 754 IDS_AX_ROLE_STEPPER)); | 733 IDS_AX_ROLE_STEPPER)); |
| 755 default: | 734 default: |
| 756 break; | 735 break; |
| 757 } | 736 } |
| 758 | 737 |
| 759 return NSAccessibilityRoleDescription(role, nil); | 738 return NSAccessibilityRoleDescription(role, nil); |
| 760 } | 739 } |
| 761 | 740 |
| 762 - (NSArray*)rowHeaders { | 741 - (NSArray*)rowHeaders { |
| 763 if ([self internalRole] != AccessibilityNodeData::ROLE_TABLE && | 742 if ([self internalRole] != AccessibilityNodeData::ROLE_TABLE && |
| 764 [self internalRole] != AccessibilityNodeData::ROLE_GRID) { | 743 [self internalRole] != AccessibilityNodeData::ROLE_GRID) { |
| 765 return nil; | 744 return nil; |
| 766 } | 745 } |
| 767 | 746 |
| 768 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; | 747 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; |
| 769 const std::vector<int32>& uniqueCellIds = | 748 const std::vector<int32>& uniqueCellIds = |
| 770 browserAccessibility_->unique_cell_ids(); | 749 browserAccessibility_->GetIntListAttribute( |
| 750 AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS); |
| 771 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { | 751 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { |
| 772 int id = uniqueCellIds[i]; | 752 int id = uniqueCellIds[i]; |
| 773 BrowserAccessibility* cell = | 753 BrowserAccessibility* cell = |
| 774 browserAccessibility_->manager()->GetFromRendererID(id); | 754 browserAccessibility_->manager()->GetFromRendererID(id); |
| 775 if (cell && cell->role() == AccessibilityNodeData::ROLE_ROW_HEADER) | 755 if (cell && cell->role() == AccessibilityNodeData::ROLE_ROW_HEADER) |
| 776 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; | 756 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; |
| 777 } | 757 } |
| 778 return ret; | 758 return ret; |
| 779 } | 759 } |
| 780 | 760 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 797 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; | 777 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; |
| 798 | 778 |
| 799 if ([self internalRole] == AccessibilityNodeData::ROLE_TABLE|| | 779 if ([self internalRole] == AccessibilityNodeData::ROLE_TABLE|| |
| 800 [self internalRole] == AccessibilityNodeData::ROLE_GRID) { | 780 [self internalRole] == AccessibilityNodeData::ROLE_GRID) { |
| 801 for (BrowserAccessibilityCocoa* child in [self children]) { | 781 for (BrowserAccessibilityCocoa* child in [self children]) { |
| 802 if ([[child role] isEqualToString:NSAccessibilityRowRole]) | 782 if ([[child role] isEqualToString:NSAccessibilityRowRole]) |
| 803 [ret addObject:child]; | 783 [ret addObject:child]; |
| 804 } | 784 } |
| 805 } else if ([self internalRole] == AccessibilityNodeData::ROLE_COLUMN) { | 785 } else if ([self internalRole] == AccessibilityNodeData::ROLE_COLUMN) { |
| 806 const std::vector<int32>& indirectChildIds = | 786 const std::vector<int32>& indirectChildIds = |
| 807 browserAccessibility_->indirect_child_ids(); | 787 browserAccessibility_->GetIntListAttribute( |
| 788 AccessibilityNodeData::ATTR_INDIRECT_CHILD_IDS); |
| 808 for (uint32 i = 0; i < indirectChildIds.size(); ++i) { | 789 for (uint32 i = 0; i < indirectChildIds.size(); ++i) { |
| 809 int id = indirectChildIds[i]; | 790 int id = indirectChildIds[i]; |
| 810 BrowserAccessibility* rowElement = | 791 BrowserAccessibility* rowElement = |
| 811 browserAccessibility_->manager()->GetFromRendererID(id); | 792 browserAccessibility_->manager()->GetFromRendererID(id); |
| 812 if (rowElement) | 793 if (rowElement) |
| 813 [ret addObject:rowElement->ToBrowserAccessibilityCocoa()]; | 794 [ret addObject:rowElement->ToBrowserAccessibilityCocoa()]; |
| 814 } | 795 } |
| 815 } | 796 } |
| 816 | 797 |
| 817 return ret; | 798 return ret; |
| 818 } | 799 } |
| 819 | 800 |
| 820 // Returns the size of this object. | 801 // Returns the size of this object. |
| 821 - (NSValue*)size { | 802 - (NSValue*)size { |
| 822 gfx::Rect bounds = browserAccessibility_->GetLocalBoundsRect(); | 803 gfx::Rect bounds = browserAccessibility_->GetLocalBoundsRect(); |
| 823 return [NSValue valueWithSize:NSMakeSize(bounds.width(), bounds.height())]; | 804 return [NSValue valueWithSize:NSMakeSize(bounds.width(), bounds.height())]; |
| 824 } | 805 } |
| 825 | 806 |
| 826 // Returns a subrole based upon the role. | 807 // Returns a subrole based upon the role. |
| 827 - (NSString*) subrole { | 808 - (NSString*) subrole { |
| 828 AccessibilityNodeData::Role browserAccessibilityRole = [self internalRole]; | 809 AccessibilityNodeData::Role browserAccessibilityRole = [self internalRole]; |
| 829 if (browserAccessibilityRole == AccessibilityNodeData::ROLE_TEXT_FIELD && | 810 if (browserAccessibilityRole == AccessibilityNodeData::ROLE_TEXT_FIELD && |
| 830 GetState(browserAccessibility_, AccessibilityNodeData::STATE_PROTECTED)) { | 811 GetState(browserAccessibility_, AccessibilityNodeData::STATE_PROTECTED)) { |
| 831 return @"AXSecureTextField"; | 812 return @"AXSecureTextField"; |
| 832 } | 813 } |
| 833 | 814 |
| 834 NSString* htmlTag = NSStringForStringAttribute( | 815 NSString* htmlTag = NSStringForStringAttribute( |
| 835 browserAccessibility_->string_attributes(), | 816 browserAccessibility_, AccessibilityNodeData::ATTR_HTML_TAG); |
| 836 AccessibilityNodeData::ATTR_HTML_TAG); | |
| 837 | 817 |
| 838 if (browserAccessibilityRole == AccessibilityNodeData::ROLE_LIST) { | 818 if (browserAccessibilityRole == AccessibilityNodeData::ROLE_LIST) { |
| 839 if ([htmlTag isEqualToString:@"ul"] || | 819 if ([htmlTag isEqualToString:@"ul"] || |
| 840 [htmlTag isEqualToString:@"ol"]) { | 820 [htmlTag isEqualToString:@"ol"]) { |
| 841 return @"AXContentList"; | 821 return @"AXContentList"; |
| 842 } else if ([htmlTag isEqualToString:@"dl"]) { | 822 } else if ([htmlTag isEqualToString:@"dl"]) { |
| 843 return @"AXDescriptionList"; | 823 return @"AXDescriptionList"; |
| 844 } | 824 } |
| 845 } | 825 } |
| 846 | 826 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 857 for (uint i=0; i < [[self children] count]; ++i) { | 837 for (uint i=0; i < [[self children] count]; ++i) { |
| 858 NSArray* tabChildren = [[[self children] objectAtIndex:i] tabs]; | 838 NSArray* tabChildren = [[[self children] objectAtIndex:i] tabs]; |
| 859 if ([tabChildren count] > 0) | 839 if ([tabChildren count] > 0) |
| 860 [tabSubtree addObjectsFromArray:tabChildren]; | 840 [tabSubtree addObjectsFromArray:tabChildren]; |
| 861 } | 841 } |
| 862 | 842 |
| 863 return tabSubtree; | 843 return tabSubtree; |
| 864 } | 844 } |
| 865 | 845 |
| 866 - (NSString*)title { | 846 - (NSString*)title { |
| 867 return base::SysUTF16ToNSString(browserAccessibility_->name()); | 847 return NSStringForStringAttribute( |
| 848 browserAccessibility_, AccessibilityNodeData::ATTR_NAME); |
| 868 } | 849 } |
| 869 | 850 |
| 870 - (id)titleUIElement { | 851 - (id)titleUIElement { |
| 871 int titleElementId; | 852 int titleElementId; |
| 872 if (browserAccessibility_->GetIntAttribute( | 853 if (browserAccessibility_->GetIntAttribute( |
| 873 AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT, &titleElementId)) { | 854 AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT, &titleElementId)) { |
| 874 BrowserAccessibility* titleElement = | 855 BrowserAccessibility* titleElement = |
| 875 browserAccessibility_->manager()->GetFromRendererID(titleElementId); | 856 browserAccessibility_->manager()->GetFromRendererID(titleElementId); |
| 876 if (titleElement) | 857 if (titleElement) |
| 877 return titleElement->ToBrowserAccessibilityCocoa(); | 858 return titleElement->ToBrowserAccessibilityCocoa(); |
| 878 } | 859 } |
| 879 return nil; | 860 return nil; |
| 880 } | 861 } |
| 881 | 862 |
| 882 - (NSString*)url { | 863 - (NSString*)url { |
| 883 StringAttribute urlAttribute = | 864 StringAttribute urlAttribute = |
| 884 [[self role] isEqualToString:@"AXWebArea"] ? | 865 [[self role] isEqualToString:@"AXWebArea"] ? |
| 885 AccessibilityNodeData::ATTR_DOC_URL : | 866 AccessibilityNodeData::ATTR_DOC_URL : |
| 886 AccessibilityNodeData::ATTR_URL; | 867 AccessibilityNodeData::ATTR_URL; |
| 887 return NSStringForStringAttribute( | 868 return NSStringForStringAttribute(browserAccessibility_, urlAttribute); |
| 888 browserAccessibility_->string_attributes(), | |
| 889 urlAttribute); | |
| 890 } | 869 } |
| 891 | 870 |
| 892 - (id)value { | 871 - (id)value { |
| 893 // WebCore uses an attachmentView to get the below behavior. | 872 // WebCore uses an attachmentView to get the below behavior. |
| 894 // We do not have any native views backing this object, so need | 873 // We do not have any native views backing this object, so need |
| 895 // to approximate Cocoa ax behavior best as we can. | 874 // to approximate Cocoa ax behavior best as we can. |
| 896 NSString* role = [self role]; | 875 NSString* role = [self role]; |
| 897 if ([role isEqualToString:@"AXHeading"]) { | 876 if ([role isEqualToString:@"AXHeading"]) { |
| 898 int level; | 877 int level = 0; |
| 899 if (browserAccessibility_->GetIntAttribute( | 878 if (browserAccessibility_->GetIntAttribute( |
| 900 AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL, &level)) { | 879 AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL, &level)) { |
| 901 return [NSNumber numberWithInt:level]; | 880 return [NSNumber numberWithInt:level]; |
| 902 } | 881 } |
| 903 } else if ([role isEqualToString:NSAccessibilityButtonRole]) { | 882 } else if ([role isEqualToString:NSAccessibilityButtonRole]) { |
| 904 // AXValue does not make sense for pure buttons. | 883 // AXValue does not make sense for pure buttons. |
| 905 return @""; | 884 return @""; |
| 906 } else if ([role isEqualToString:NSAccessibilityCheckBoxRole] || | 885 } else if ([role isEqualToString:NSAccessibilityCheckBoxRole] || |
| 907 [role isEqualToString:NSAccessibilityRadioButtonRole]) { | 886 [role isEqualToString:NSAccessibilityRadioButtonRole]) { |
| 908 int value = 0; | 887 int value = 0; |
| 909 value = GetState( | 888 value = GetState( |
| 910 browserAccessibility_, AccessibilityNodeData::STATE_CHECKED) ? 1 : 0; | 889 browserAccessibility_, AccessibilityNodeData::STATE_CHECKED) ? 1 : 0; |
| 911 value = GetState( | 890 value = GetState( |
| 912 browserAccessibility_, AccessibilityNodeData::STATE_SELECTED) ? | 891 browserAccessibility_, AccessibilityNodeData::STATE_SELECTED) ? |
| 913 1 : | 892 1 : |
| 914 value; | 893 value; |
| 915 | 894 |
| 916 bool mixed = false; | 895 if (browserAccessibility_->GetBoolAttribute( |
| 917 browserAccessibility_->GetBoolAttribute( | 896 AccessibilityNodeData::ATTR_BUTTON_MIXED)) { |
| 918 AccessibilityNodeData::ATTR_BUTTON_MIXED, &mixed); | |
| 919 if (mixed) | |
| 920 value = 2; | 897 value = 2; |
| 898 } |
| 921 return [NSNumber numberWithInt:value]; | 899 return [NSNumber numberWithInt:value]; |
| 922 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] || | 900 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] || |
| 923 [role isEqualToString:NSAccessibilitySliderRole] || | 901 [role isEqualToString:NSAccessibilitySliderRole] || |
| 924 [role isEqualToString:NSAccessibilityScrollBarRole]) { | 902 [role isEqualToString:NSAccessibilityScrollBarRole]) { |
| 925 float floatValue; | 903 float floatValue; |
| 926 if (browserAccessibility_->GetFloatAttribute( | 904 if (browserAccessibility_->GetFloatAttribute( |
| 927 AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &floatValue)) { | 905 AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &floatValue)) { |
| 928 return [NSNumber numberWithFloat:floatValue]; | 906 return [NSNumber numberWithFloat:floatValue]; |
| 929 } | 907 } |
| 930 } else if ([role isEqualToString:NSAccessibilityColorWellRole]) { | 908 } else if ([role isEqualToString:NSAccessibilityColorWellRole]) { |
| 931 int r, g, b; | 909 int r = browserAccessibility_->GetIntAttribute( |
| 932 browserAccessibility_->GetIntAttribute( | 910 AccessibilityNodeData::ATTR_COLOR_VALUE_RED); |
| 933 AccessibilityNodeData::ATTR_COLOR_VALUE_RED, &r); | 911 int g = browserAccessibility_->GetIntAttribute( |
| 934 browserAccessibility_->GetIntAttribute( | 912 AccessibilityNodeData::ATTR_COLOR_VALUE_GREEN); |
| 935 AccessibilityNodeData::ATTR_COLOR_VALUE_GREEN, &g); | 913 int b = browserAccessibility_->GetIntAttribute( |
| 936 browserAccessibility_->GetIntAttribute( | 914 AccessibilityNodeData::ATTR_COLOR_VALUE_BLUE); |
| 937 AccessibilityNodeData::ATTR_COLOR_VALUE_BLUE, &b); | |
| 938 // This string matches the one returned by a native Mac color well. | 915 // This string matches the one returned by a native Mac color well. |
| 939 return [NSString stringWithFormat:@"rgb %7.5f %7.5f %7.5f 1", | 916 return [NSString stringWithFormat:@"rgb %7.5f %7.5f %7.5f 1", |
| 940 r / 255., g / 255., b / 255.]; | 917 r / 255., g / 255., b / 255.]; |
| 941 } | 918 } |
| 942 | 919 |
| 943 return base::SysUTF16ToNSString(browserAccessibility_->value()); | 920 return NSStringForStringAttribute( |
| 921 browserAccessibility_, AccessibilityNodeData::ATTR_VALUE); |
| 944 } | 922 } |
| 945 | 923 |
| 946 - (NSString*)valueDescription { | 924 - (NSString*)valueDescription { |
| 947 if (!browserAccessibility_->value().empty()) | 925 return NSStringForStringAttribute( |
| 948 return base::SysUTF16ToNSString(browserAccessibility_->value()); | 926 browserAccessibility_, AccessibilityNodeData::ATTR_VALUE); |
| 949 else | |
| 950 return nil; | |
| 951 } | 927 } |
| 952 | 928 |
| 953 - (NSValue*)visibleCharacterRange { | 929 - (NSValue*)visibleCharacterRange { |
| 954 return [NSValue valueWithRange: | 930 return [NSValue valueWithRange: |
| 955 NSMakeRange(0, browserAccessibility_->value().length())]; | 931 NSMakeRange(0, browserAccessibility_->value().length())]; |
| 956 } | 932 } |
| 957 | 933 |
| 958 - (NSArray*)visibleCells { | 934 - (NSArray*)visibleCells { |
| 959 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; | 935 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; |
| 960 const std::vector<int32>& uniqueCellIds = | 936 const std::vector<int32>& uniqueCellIds = |
| 961 browserAccessibility_->unique_cell_ids(); | 937 browserAccessibility_->GetIntListAttribute( |
| 938 AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS); |
| 962 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { | 939 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { |
| 963 int id = uniqueCellIds[i]; | 940 int id = uniqueCellIds[i]; |
| 964 BrowserAccessibility* cell = | 941 BrowserAccessibility* cell = |
| 965 browserAccessibility_->manager()->GetFromRendererID(id); | 942 browserAccessibility_->manager()->GetFromRendererID(id); |
| 966 if (cell) | 943 if (cell) |
| 967 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; | 944 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; |
| 968 } | 945 } |
| 969 return ret; | 946 return ret; |
| 970 } | 947 } |
| 971 | 948 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1006 if (browserAccessibility_->GetIntAttribute( | 983 if (browserAccessibility_->GetIntAttribute( |
| 1007 AccessibilityNodeData::ATTR_TEXT_SEL_START, &selStart) && | 984 AccessibilityNodeData::ATTR_TEXT_SEL_START, &selStart) && |
| 1008 browserAccessibility_-> | 985 browserAccessibility_-> |
| 1009 GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &selEnd)) { | 986 GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &selEnd)) { |
| 1010 if (selStart > selEnd) | 987 if (selStart > selEnd) |
| 1011 std::swap(selStart, selEnd); | 988 std::swap(selStart, selEnd); |
| 1012 int selLength = selEnd - selStart; | 989 int selLength = selEnd - selStart; |
| 1013 if ([attribute isEqualToString: | 990 if ([attribute isEqualToString: |
| 1014 NSAccessibilityInsertionPointLineNumberAttribute]) { | 991 NSAccessibilityInsertionPointLineNumberAttribute]) { |
| 1015 const std::vector<int32>& line_breaks = | 992 const std::vector<int32>& line_breaks = |
| 1016 browserAccessibility_->line_breaks(); | 993 browserAccessibility_->GetIntListAttribute( |
| 994 AccessibilityNodeData::ATTR_LINE_BREAKS); |
| 1017 for (int i = 0; i < static_cast<int>(line_breaks.size()); ++i) { | 995 for (int i = 0; i < static_cast<int>(line_breaks.size()); ++i) { |
| 1018 if (line_breaks[i] > selStart) | 996 if (line_breaks[i] > selStart) |
| 1019 return [NSNumber numberWithInt:i]; | 997 return [NSNumber numberWithInt:i]; |
| 1020 } | 998 } |
| 1021 return [NSNumber numberWithInt:static_cast<int>(line_breaks.size())]; | 999 return [NSNumber numberWithInt:static_cast<int>(line_breaks.size())]; |
| 1022 } | 1000 } |
| 1023 if ([attribute isEqualToString:NSAccessibilitySelectedTextAttribute]) { | 1001 if ([attribute isEqualToString:NSAccessibilitySelectedTextAttribute]) { |
| 1024 return base::SysUTF16ToNSString(browserAccessibility_->value().substr( | 1002 std::string value = browserAccessibility_->GetStringAttribute( |
| 1025 selStart, selLength)); | 1003 AccessibilityNodeData::ATTR_VALUE); |
| 1004 return base::SysUTF8ToNSString(value.substr(selStart, selLength)); |
| 1026 } | 1005 } |
| 1027 if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute]) { | 1006 if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute]) { |
| 1028 return [NSValue valueWithRange:NSMakeRange(selStart, selLength)]; | 1007 return [NSValue valueWithRange:NSMakeRange(selStart, selLength)]; |
| 1029 } | 1008 } |
| 1030 } | 1009 } |
| 1031 return nil; | 1010 return nil; |
| 1032 } | 1011 } |
| 1033 | 1012 |
| 1034 // Returns the accessibility value for the given attribute and parameter. If the | 1013 // Returns the accessibility value for the given attribute and parameter. If the |
| 1035 // value isn't supported this will return nil. | 1014 // value isn't supported this will return nil. |
| 1036 - (id)accessibilityAttributeValue:(NSString*)attribute | 1015 - (id)accessibilityAttributeValue:(NSString*)attribute |
| 1037 forParameter:(id)parameter { | 1016 forParameter:(id)parameter { |
| 1038 if (!browserAccessibility_) | 1017 if (!browserAccessibility_) |
| 1039 return nil; | 1018 return nil; |
| 1040 | 1019 |
| 1041 const std::vector<int32>& line_breaks = browserAccessibility_->line_breaks(); | 1020 const std::vector<int32>& line_breaks = |
| 1021 browserAccessibility_->GetIntListAttribute( |
| 1022 AccessibilityNodeData::ATTR_LINE_BREAKS); |
| 1042 int len = static_cast<int>(browserAccessibility_->value().size()); | 1023 int len = static_cast<int>(browserAccessibility_->value().size()); |
| 1043 | 1024 |
| 1044 if ([attribute isEqualToString: | 1025 if ([attribute isEqualToString: |
| 1045 NSAccessibilityStringForRangeParameterizedAttribute]) { | 1026 NSAccessibilityStringForRangeParameterizedAttribute]) { |
| 1046 NSRange range = [(NSValue*)parameter rangeValue]; | 1027 NSRange range = [(NSValue*)parameter rangeValue]; |
| 1047 return base::SysUTF16ToNSString( | 1028 std::string value = browserAccessibility_->GetStringAttribute( |
| 1048 browserAccessibility_->value().substr(range.location, range.length)); | 1029 AccessibilityNodeData::ATTR_VALUE); |
| 1030 return base::SysUTF8ToNSString(value.substr(range.location, range.length)); |
| 1049 } | 1031 } |
| 1050 | 1032 |
| 1051 if ([attribute isEqualToString: | 1033 if ([attribute isEqualToString: |
| 1052 NSAccessibilityLineForIndexParameterizedAttribute]) { | 1034 NSAccessibilityLineForIndexParameterizedAttribute]) { |
| 1053 int index = [(NSNumber*)parameter intValue]; | 1035 int index = [(NSNumber*)parameter intValue]; |
| 1054 for (int i = 0; i < static_cast<int>(line_breaks.size()); ++i) { | 1036 for (int i = 0; i < static_cast<int>(line_breaks.size()); ++i) { |
| 1055 if (line_breaks[i] > index) | 1037 if (line_breaks[i] > index) |
| 1056 return [NSNumber numberWithInt:i]; | 1038 return [NSNumber numberWithInt:i]; |
| 1057 } | 1039 } |
| 1058 return [NSNumber numberWithInt:static_cast<int>(line_breaks.size())]; | 1040 return [NSNumber numberWithInt:static_cast<int>(line_breaks.size())]; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1074 NSAccessibilityCellForColumnAndRowParameterizedAttribute]) { | 1056 NSAccessibilityCellForColumnAndRowParameterizedAttribute]) { |
| 1075 if ([self internalRole] != AccessibilityNodeData::ROLE_TABLE && | 1057 if ([self internalRole] != AccessibilityNodeData::ROLE_TABLE && |
| 1076 [self internalRole] != AccessibilityNodeData::ROLE_GRID) { | 1058 [self internalRole] != AccessibilityNodeData::ROLE_GRID) { |
| 1077 return nil; | 1059 return nil; |
| 1078 } | 1060 } |
| 1079 if (![parameter isKindOfClass:[NSArray self]]) | 1061 if (![parameter isKindOfClass:[NSArray self]]) |
| 1080 return nil; | 1062 return nil; |
| 1081 NSArray* array = parameter; | 1063 NSArray* array = parameter; |
| 1082 int column = [[array objectAtIndex:0] intValue]; | 1064 int column = [[array objectAtIndex:0] intValue]; |
| 1083 int row = [[array objectAtIndex:1] intValue]; | 1065 int row = [[array objectAtIndex:1] intValue]; |
| 1084 int num_columns = 0; | 1066 int num_columns = browserAccessibility_->GetIntAttribute( |
| 1085 int num_rows = 0; | 1067 AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT); |
| 1086 browserAccessibility_->GetIntAttribute( | 1068 int num_rows = browserAccessibility_->GetIntAttribute( |
| 1087 AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &num_columns); | 1069 AccessibilityNodeData::ATTR_TABLE_ROW_COUNT); |
| 1088 browserAccessibility_->GetIntAttribute( | |
| 1089 AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &num_rows); | |
| 1090 if (column < 0 || column >= num_columns || | 1070 if (column < 0 || column >= num_columns || |
| 1091 row < 0 || row >= num_rows) { | 1071 row < 0 || row >= num_rows) { |
| 1092 return nil; | 1072 return nil; |
| 1093 } | 1073 } |
| 1094 for (size_t i = 0; | 1074 for (size_t i = 0; |
| 1095 i < browserAccessibility_->child_count(); | 1075 i < browserAccessibility_->child_count(); |
| 1096 ++i) { | 1076 ++i) { |
| 1097 BrowserAccessibility* child = browserAccessibility_->GetChild(i); | 1077 BrowserAccessibility* child = browserAccessibility_->GetChild(i); |
| 1098 if (child->role() != AccessibilityNodeData::ROLE_ROW) | 1078 if (child->role() != AccessibilityNodeData::ROLE_ROW) |
| 1099 continue; | 1079 continue; |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1328 nil]]; | 1308 nil]]; |
| 1329 } else { | 1309 } else { |
| 1330 [ret addObjectsFromArray:[NSArray arrayWithObjects: | 1310 [ret addObjectsFromArray:[NSArray arrayWithObjects: |
| 1331 NSAccessibilityIndexAttribute, | 1311 NSAccessibilityIndexAttribute, |
| 1332 nil]]; | 1312 nil]]; |
| 1333 } | 1313 } |
| 1334 } | 1314 } |
| 1335 } | 1315 } |
| 1336 | 1316 |
| 1337 // Live regions. | 1317 // Live regions. |
| 1338 string16 s; | 1318 if (browserAccessibility_->HasStringAttribute( |
| 1339 if (browserAccessibility_->GetStringAttribute( | 1319 AccessibilityNodeData::ATTR_LIVE_STATUS)) { |
| 1340 AccessibilityNodeData::ATTR_LIVE_STATUS, &s)) { | |
| 1341 [ret addObjectsFromArray:[NSArray arrayWithObjects: | 1320 [ret addObjectsFromArray:[NSArray arrayWithObjects: |
| 1342 @"AXARIALive", | 1321 @"AXARIALive", |
| 1343 @"AXARIARelevant", | 1322 @"AXARIARelevant", |
| 1344 nil]]; | 1323 nil]]; |
| 1345 } | 1324 } |
| 1346 if (browserAccessibility_->GetStringAttribute( | 1325 if (browserAccessibility_->HasStringAttribute( |
| 1347 AccessibilityNodeData::ATTR_CONTAINER_LIVE_STATUS, &s)) { | 1326 AccessibilityNodeData::ATTR_CONTAINER_LIVE_STATUS)) { |
| 1348 [ret addObjectsFromArray:[NSArray arrayWithObjects: | 1327 [ret addObjectsFromArray:[NSArray arrayWithObjects: |
| 1349 @"AXARIAAtomic", | 1328 @"AXARIAAtomic", |
| 1350 @"AXARIABusy", | 1329 @"AXARIABusy", |
| 1351 nil]]; | 1330 nil]]; |
| 1352 } | 1331 } |
| 1353 | 1332 |
| 1354 // Title UI Element. | 1333 // Title UI Element. |
| 1355 int i; | 1334 if (browserAccessibility_->HasIntAttribute( |
| 1356 if (browserAccessibility_->GetIntAttribute( | 1335 AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT)) { |
| 1357 AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT, &i)) { | |
| 1358 [ret addObjectsFromArray:[NSArray arrayWithObjects: | 1336 [ret addObjectsFromArray:[NSArray arrayWithObjects: |
| 1359 NSAccessibilityTitleUIElementAttribute, | 1337 NSAccessibilityTitleUIElementAttribute, |
| 1360 nil]]; | 1338 nil]]; |
| 1361 } | 1339 } |
| 1362 | 1340 |
| 1363 return ret; | 1341 return ret; |
| 1364 } | 1342 } |
| 1365 | 1343 |
| 1366 // Returns the index of the child in this objects array of children. | 1344 // Returns the index of the child in this objects array of children. |
| 1367 - (NSUInteger)accessibilityGetIndexOf:(id)child { | 1345 - (NSUInteger)accessibilityGetIndexOf:(id)child { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1380 // Returns whether or not the specified attribute can be set by the | 1358 // Returns whether or not the specified attribute can be set by the |
| 1381 // accessibility API via |accessibilitySetValue:forAttribute:|. | 1359 // accessibility API via |accessibilitySetValue:forAttribute:|. |
| 1382 - (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute { | 1360 - (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute { |
| 1383 if (!browserAccessibility_) | 1361 if (!browserAccessibility_) |
| 1384 return nil; | 1362 return nil; |
| 1385 | 1363 |
| 1386 if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) | 1364 if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) |
| 1387 return GetState(browserAccessibility_, | 1365 return GetState(browserAccessibility_, |
| 1388 AccessibilityNodeData::STATE_FOCUSABLE); | 1366 AccessibilityNodeData::STATE_FOCUSABLE); |
| 1389 if ([attribute isEqualToString:NSAccessibilityValueAttribute]) { | 1367 if ([attribute isEqualToString:NSAccessibilityValueAttribute]) { |
| 1390 bool canSetValue = false; | 1368 return browserAccessibility_->GetBoolAttribute( |
| 1391 browserAccessibility_->GetBoolAttribute( | 1369 AccessibilityNodeData::ATTR_CAN_SET_VALUE); |
| 1392 AccessibilityNodeData::ATTR_CAN_SET_VALUE, &canSetValue); | |
| 1393 return canSetValue; | |
| 1394 } | 1370 } |
| 1395 if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute] && | 1371 if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute] && |
| 1396 ([[self role] isEqualToString:NSAccessibilityTextFieldRole] || | 1372 ([[self role] isEqualToString:NSAccessibilityTextFieldRole] || |
| 1397 [[self role] isEqualToString:NSAccessibilityTextAreaRole])) | 1373 [[self role] isEqualToString:NSAccessibilityTextAreaRole])) |
| 1398 return YES; | 1374 return YES; |
| 1399 | 1375 |
| 1400 return NO; | 1376 return NO; |
| 1401 } | 1377 } |
| 1402 | 1378 |
| 1403 // Returns whether or not this object should be ignored in the accessibilty | 1379 // Returns whether or not this object should be ignored in the accessibilty |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1496 return [super hash]; | 1472 return [super hash]; |
| 1497 return browserAccessibility_->renderer_id(); | 1473 return browserAccessibility_->renderer_id(); |
| 1498 } | 1474 } |
| 1499 | 1475 |
| 1500 - (BOOL)accessibilityShouldUseUniqueId { | 1476 - (BOOL)accessibilityShouldUseUniqueId { |
| 1501 return YES; | 1477 return YES; |
| 1502 } | 1478 } |
| 1503 | 1479 |
| 1504 @end | 1480 @end |
| 1505 | 1481 |
| OLD | NEW |