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

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

Issue 21269002: Make AccessibilityNodeData more compact. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address feedback, compile fixes Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <execinfo.h> 5 #include <execinfo.h>
6 6
7 #import "content/browser/accessibility/browser_accessibility_cocoa.h" 7 #import "content/browser/accessibility/browser_accessibility_cocoa.h"
8 8
9 #include <map> 9 #include <map>
10 10
(...skipping 15 matching lines...) Expand all
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
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
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
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
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
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 browserAccessibility_->GetHtmlAttribute("role", &role);
733 AccessibilityNodeData::Role browserAccessibilityRole = [self internalRole]; 715 AccessibilityNodeData::Role browserAccessibilityRole = [self internalRole];
734 if ((browserAccessibilityRole != AccessibilityNodeData::ROLE_GROUP && 716 if ((browserAccessibilityRole != AccessibilityNodeData::ROLE_GROUP &&
735 browserAccessibilityRole != AccessibilityNodeData::ROLE_LIST_ITEM) || 717 browserAccessibilityRole != AccessibilityNodeData::ROLE_LIST_ITEM) ||
736 browserAccessibilityRole == AccessibilityNodeData::ROLE_TAB) { 718 browserAccessibilityRole == AccessibilityNodeData::ROLE_TAB) {
737 for (size_t i = 0; i < htmlAttributes.size(); ++i) { 719 // TODO(dtseng): This is not localized; see crbug/84814.
738 const std::pair<string16, string16>& htmlAttribute = htmlAttributes[i]; 720 return base::SysUTF8ToNSString(role);
739 if (htmlAttribute.first == ASCIIToUTF16("role")) {
740 // TODO(dtseng): This is not localized; see crbug/84814.
741 return base::SysUTF16ToNSString(htmlAttribute.second);
742 }
743 }
744 } 721 }
745 } 722 }
746 723
747 switch([self internalRole]) { 724 switch([self internalRole]) {
748 case AccessibilityNodeData::ROLE_FOOTER: 725 case AccessibilityNodeData::ROLE_FOOTER:
749 return base::SysUTF16ToNSString(content_client->GetLocalizedString( 726 return base::SysUTF16ToNSString(content_client->GetLocalizedString(
750 IDS_AX_ROLE_FOOTER)); 727 IDS_AX_ROLE_FOOTER));
751 case AccessibilityNodeData::ROLE_SPIN_BUTTON: 728 case AccessibilityNodeData::ROLE_SPIN_BUTTON:
752 // This control is similar to what VoiceOver calls a "stepper". 729 // This control is similar to what VoiceOver calls a "stepper".
753 return base::SysUTF16ToNSString(content_client->GetLocalizedString( 730 return base::SysUTF16ToNSString(content_client->GetLocalizedString(
754 IDS_AX_ROLE_STEPPER)); 731 IDS_AX_ROLE_STEPPER));
755 default: 732 default:
756 break; 733 break;
757 } 734 }
758 735
759 return NSAccessibilityRoleDescription(role, nil); 736 return NSAccessibilityRoleDescription(role, nil);
760 } 737 }
761 738
762 - (NSArray*)rowHeaders { 739 - (NSArray*)rowHeaders {
763 if ([self internalRole] != AccessibilityNodeData::ROLE_TABLE && 740 if ([self internalRole] != AccessibilityNodeData::ROLE_TABLE &&
764 [self internalRole] != AccessibilityNodeData::ROLE_GRID) { 741 [self internalRole] != AccessibilityNodeData::ROLE_GRID) {
765 return nil; 742 return nil;
766 } 743 }
767 744
768 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; 745 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease];
769 const std::vector<int32>& uniqueCellIds = 746 const std::vector<int32>& uniqueCellIds =
770 browserAccessibility_->unique_cell_ids(); 747 browserAccessibility_->GetIntListAttribute(
748 AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS);
771 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { 749 for (size_t i = 0; i < uniqueCellIds.size(); ++i) {
772 int id = uniqueCellIds[i]; 750 int id = uniqueCellIds[i];
773 BrowserAccessibility* cell = 751 BrowserAccessibility* cell =
774 browserAccessibility_->manager()->GetFromRendererID(id); 752 browserAccessibility_->manager()->GetFromRendererID(id);
775 if (cell && cell->role() == AccessibilityNodeData::ROLE_ROW_HEADER) 753 if (cell && cell->role() == AccessibilityNodeData::ROLE_ROW_HEADER)
776 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; 754 [ret addObject:cell->ToBrowserAccessibilityCocoa()];
777 } 755 }
778 return ret; 756 return ret;
779 } 757 }
780 758
(...skipping 16 matching lines...) Expand all
797 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; 775 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease];
798 776
799 if ([self internalRole] == AccessibilityNodeData::ROLE_TABLE|| 777 if ([self internalRole] == AccessibilityNodeData::ROLE_TABLE||
800 [self internalRole] == AccessibilityNodeData::ROLE_GRID) { 778 [self internalRole] == AccessibilityNodeData::ROLE_GRID) {
801 for (BrowserAccessibilityCocoa* child in [self children]) { 779 for (BrowserAccessibilityCocoa* child in [self children]) {
802 if ([[child role] isEqualToString:NSAccessibilityRowRole]) 780 if ([[child role] isEqualToString:NSAccessibilityRowRole])
803 [ret addObject:child]; 781 [ret addObject:child];
804 } 782 }
805 } else if ([self internalRole] == AccessibilityNodeData::ROLE_COLUMN) { 783 } else if ([self internalRole] == AccessibilityNodeData::ROLE_COLUMN) {
806 const std::vector<int32>& indirectChildIds = 784 const std::vector<int32>& indirectChildIds =
807 browserAccessibility_->indirect_child_ids(); 785 browserAccessibility_->GetIntListAttribute(
786 AccessibilityNodeData::ATTR_INDIRECT_CHILD_IDS);
808 for (uint32 i = 0; i < indirectChildIds.size(); ++i) { 787 for (uint32 i = 0; i < indirectChildIds.size(); ++i) {
809 int id = indirectChildIds[i]; 788 int id = indirectChildIds[i];
810 BrowserAccessibility* rowElement = 789 BrowserAccessibility* rowElement =
811 browserAccessibility_->manager()->GetFromRendererID(id); 790 browserAccessibility_->manager()->GetFromRendererID(id);
812 if (rowElement) 791 if (rowElement)
813 [ret addObject:rowElement->ToBrowserAccessibilityCocoa()]; 792 [ret addObject:rowElement->ToBrowserAccessibilityCocoa()];
814 } 793 }
815 } 794 }
816 795
817 return ret; 796 return ret;
818 } 797 }
819 798
820 // Returns the size of this object. 799 // Returns the size of this object.
821 - (NSValue*)size { 800 - (NSValue*)size {
822 gfx::Rect bounds = browserAccessibility_->GetLocalBoundsRect(); 801 gfx::Rect bounds = browserAccessibility_->GetLocalBoundsRect();
823 return [NSValue valueWithSize:NSMakeSize(bounds.width(), bounds.height())]; 802 return [NSValue valueWithSize:NSMakeSize(bounds.width(), bounds.height())];
824 } 803 }
825 804
826 // Returns a subrole based upon the role. 805 // Returns a subrole based upon the role.
827 - (NSString*) subrole { 806 - (NSString*) subrole {
828 AccessibilityNodeData::Role browserAccessibilityRole = [self internalRole]; 807 AccessibilityNodeData::Role browserAccessibilityRole = [self internalRole];
829 if (browserAccessibilityRole == AccessibilityNodeData::ROLE_TEXT_FIELD && 808 if (browserAccessibilityRole == AccessibilityNodeData::ROLE_TEXT_FIELD &&
830 GetState(browserAccessibility_, AccessibilityNodeData::STATE_PROTECTED)) { 809 GetState(browserAccessibility_, AccessibilityNodeData::STATE_PROTECTED)) {
831 return @"AXSecureTextField"; 810 return @"AXSecureTextField";
832 } 811 }
833 812
834 NSString* htmlTag = NSStringForStringAttribute( 813 NSString* htmlTag = NSStringForStringAttribute(
835 browserAccessibility_->string_attributes(), 814 browserAccessibility_, AccessibilityNodeData::ATTR_HTML_TAG);
836 AccessibilityNodeData::ATTR_HTML_TAG);
837 815
838 if (browserAccessibilityRole == AccessibilityNodeData::ROLE_LIST) { 816 if (browserAccessibilityRole == AccessibilityNodeData::ROLE_LIST) {
839 if ([htmlTag isEqualToString:@"ul"] || 817 if ([htmlTag isEqualToString:@"ul"] ||
840 [htmlTag isEqualToString:@"ol"]) { 818 [htmlTag isEqualToString:@"ol"]) {
841 return @"AXContentList"; 819 return @"AXContentList";
842 } else if ([htmlTag isEqualToString:@"dl"]) { 820 } else if ([htmlTag isEqualToString:@"dl"]) {
843 return @"AXDescriptionList"; 821 return @"AXDescriptionList";
844 } 822 }
845 } 823 }
846 824
(...skipping 10 matching lines...) Expand all
857 for (uint i=0; i < [[self children] count]; ++i) { 835 for (uint i=0; i < [[self children] count]; ++i) {
858 NSArray* tabChildren = [[[self children] objectAtIndex:i] tabs]; 836 NSArray* tabChildren = [[[self children] objectAtIndex:i] tabs];
859 if ([tabChildren count] > 0) 837 if ([tabChildren count] > 0)
860 [tabSubtree addObjectsFromArray:tabChildren]; 838 [tabSubtree addObjectsFromArray:tabChildren];
861 } 839 }
862 840
863 return tabSubtree; 841 return tabSubtree;
864 } 842 }
865 843
866 - (NSString*)title { 844 - (NSString*)title {
867 return base::SysUTF16ToNSString(browserAccessibility_->name()); 845 return NSStringForStringAttribute(
846 browserAccessibility_, AccessibilityNodeData::ATTR_NAME);
868 } 847 }
869 848
870 - (id)titleUIElement { 849 - (id)titleUIElement {
871 int titleElementId; 850 int titleElementId;
872 if (browserAccessibility_->GetIntAttribute( 851 if (browserAccessibility_->GetIntAttribute(
873 AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT, &titleElementId)) { 852 AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT, &titleElementId)) {
874 BrowserAccessibility* titleElement = 853 BrowserAccessibility* titleElement =
875 browserAccessibility_->manager()->GetFromRendererID(titleElementId); 854 browserAccessibility_->manager()->GetFromRendererID(titleElementId);
876 if (titleElement) 855 if (titleElement)
877 return titleElement->ToBrowserAccessibilityCocoa(); 856 return titleElement->ToBrowserAccessibilityCocoa();
878 } 857 }
879 return nil; 858 return nil;
880 } 859 }
881 860
882 - (NSString*)url { 861 - (NSString*)url {
883 StringAttribute urlAttribute = 862 StringAttribute urlAttribute =
884 [[self role] isEqualToString:@"AXWebArea"] ? 863 [[self role] isEqualToString:@"AXWebArea"] ?
885 AccessibilityNodeData::ATTR_DOC_URL : 864 AccessibilityNodeData::ATTR_DOC_URL :
886 AccessibilityNodeData::ATTR_URL; 865 AccessibilityNodeData::ATTR_URL;
887 return NSStringForStringAttribute( 866 return NSStringForStringAttribute(browserAccessibility_, urlAttribute);
888 browserAccessibility_->string_attributes(),
889 urlAttribute);
890 } 867 }
891 868
892 - (id)value { 869 - (id)value {
893 // WebCore uses an attachmentView to get the below behavior. 870 // WebCore uses an attachmentView to get the below behavior.
894 // We do not have any native views backing this object, so need 871 // We do not have any native views backing this object, so need
895 // to approximate Cocoa ax behavior best as we can. 872 // to approximate Cocoa ax behavior best as we can.
896 NSString* role = [self role]; 873 NSString* role = [self role];
897 if ([role isEqualToString:@"AXHeading"]) { 874 if ([role isEqualToString:@"AXHeading"]) {
898 int level; 875 int level = 0;
899 if (browserAccessibility_->GetIntAttribute( 876 if (browserAccessibility_->GetIntAttribute(
900 AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL, &level)) { 877 AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL, &level)) {
901 return [NSNumber numberWithInt:level]; 878 return [NSNumber numberWithInt:level];
902 } 879 }
903 } else if ([role isEqualToString:NSAccessibilityButtonRole]) { 880 } else if ([role isEqualToString:NSAccessibilityButtonRole]) {
904 // AXValue does not make sense for pure buttons. 881 // AXValue does not make sense for pure buttons.
905 return @""; 882 return @"";
906 } else if ([role isEqualToString:NSAccessibilityCheckBoxRole] || 883 } else if ([role isEqualToString:NSAccessibilityCheckBoxRole] ||
907 [role isEqualToString:NSAccessibilityRadioButtonRole]) { 884 [role isEqualToString:NSAccessibilityRadioButtonRole]) {
908 int value = 0; 885 int value = 0;
909 value = GetState( 886 value = GetState(
910 browserAccessibility_, AccessibilityNodeData::STATE_CHECKED) ? 1 : 0; 887 browserAccessibility_, AccessibilityNodeData::STATE_CHECKED) ? 1 : 0;
911 value = GetState( 888 value = GetState(
912 browserAccessibility_, AccessibilityNodeData::STATE_SELECTED) ? 889 browserAccessibility_, AccessibilityNodeData::STATE_SELECTED) ?
913 1 : 890 1 :
914 value; 891 value;
915 892
916 bool mixed = false; 893 if (browserAccessibility_->GetBoolAttribute(
917 browserAccessibility_->GetBoolAttribute( 894 AccessibilityNodeData::ATTR_BUTTON_MIXED)) {
918 AccessibilityNodeData::ATTR_BUTTON_MIXED, &mixed);
919 if (mixed)
920 value = 2; 895 value = 2;
896 }
921 return [NSNumber numberWithInt:value]; 897 return [NSNumber numberWithInt:value];
922 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] || 898 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] ||
923 [role isEqualToString:NSAccessibilitySliderRole] || 899 [role isEqualToString:NSAccessibilitySliderRole] ||
924 [role isEqualToString:NSAccessibilityScrollBarRole]) { 900 [role isEqualToString:NSAccessibilityScrollBarRole]) {
925 float floatValue; 901 float floatValue;
926 if (browserAccessibility_->GetFloatAttribute( 902 if (browserAccessibility_->GetFloatAttribute(
927 AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &floatValue)) { 903 AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &floatValue)) {
928 return [NSNumber numberWithFloat:floatValue]; 904 return [NSNumber numberWithFloat:floatValue];
929 } 905 }
930 } else if ([role isEqualToString:NSAccessibilityColorWellRole]) { 906 } else if ([role isEqualToString:NSAccessibilityColorWellRole]) {
931 int r, g, b; 907 int r = browserAccessibility_->GetIntAttribute(
932 browserAccessibility_->GetIntAttribute( 908 AccessibilityNodeData::ATTR_COLOR_VALUE_RED);
933 AccessibilityNodeData::ATTR_COLOR_VALUE_RED, &r); 909 int g = browserAccessibility_->GetIntAttribute(
934 browserAccessibility_->GetIntAttribute( 910 AccessibilityNodeData::ATTR_COLOR_VALUE_GREEN);
935 AccessibilityNodeData::ATTR_COLOR_VALUE_GREEN, &g); 911 int b = browserAccessibility_->GetIntAttribute(
936 browserAccessibility_->GetIntAttribute( 912 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. 913 // This string matches the one returned by a native Mac color well.
939 return [NSString stringWithFormat:@"rgb %7.5f %7.5f %7.5f 1", 914 return [NSString stringWithFormat:@"rgb %7.5f %7.5f %7.5f 1",
940 r / 255., g / 255., b / 255.]; 915 r / 255., g / 255., b / 255.];
941 } 916 }
942 917
943 return base::SysUTF16ToNSString(browserAccessibility_->value()); 918 return NSStringForStringAttribute(
919 browserAccessibility_, AccessibilityNodeData::ATTR_VALUE);
944 } 920 }
945 921
946 - (NSString*)valueDescription { 922 - (NSString*)valueDescription {
947 if (!browserAccessibility_->value().empty()) 923 return NSStringForStringAttribute(
948 return base::SysUTF16ToNSString(browserAccessibility_->value()); 924 browserAccessibility_, AccessibilityNodeData::ATTR_VALUE);
949 else
950 return nil;
951 } 925 }
952 926
953 - (NSValue*)visibleCharacterRange { 927 - (NSValue*)visibleCharacterRange {
954 return [NSValue valueWithRange: 928 return [NSValue valueWithRange:
955 NSMakeRange(0, browserAccessibility_->value().length())]; 929 NSMakeRange(0, browserAccessibility_->value().length())];
956 } 930 }
957 931
958 - (NSArray*)visibleCells { 932 - (NSArray*)visibleCells {
959 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; 933 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease];
960 const std::vector<int32>& uniqueCellIds = 934 const std::vector<int32>& uniqueCellIds =
961 browserAccessibility_->unique_cell_ids(); 935 browserAccessibility_->GetIntListAttribute(
936 AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS);
962 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { 937 for (size_t i = 0; i < uniqueCellIds.size(); ++i) {
963 int id = uniqueCellIds[i]; 938 int id = uniqueCellIds[i];
964 BrowserAccessibility* cell = 939 BrowserAccessibility* cell =
965 browserAccessibility_->manager()->GetFromRendererID(id); 940 browserAccessibility_->manager()->GetFromRendererID(id);
966 if (cell) 941 if (cell)
967 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; 942 [ret addObject:cell->ToBrowserAccessibilityCocoa()];
968 } 943 }
969 return ret; 944 return ret;
970 } 945 }
971 946
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1006 if (browserAccessibility_->GetIntAttribute( 981 if (browserAccessibility_->GetIntAttribute(
1007 AccessibilityNodeData::ATTR_TEXT_SEL_START, &selStart) && 982 AccessibilityNodeData::ATTR_TEXT_SEL_START, &selStart) &&
1008 browserAccessibility_-> 983 browserAccessibility_->
1009 GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &selEnd)) { 984 GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &selEnd)) {
1010 if (selStart > selEnd) 985 if (selStart > selEnd)
1011 std::swap(selStart, selEnd); 986 std::swap(selStart, selEnd);
1012 int selLength = selEnd - selStart; 987 int selLength = selEnd - selStart;
1013 if ([attribute isEqualToString: 988 if ([attribute isEqualToString:
1014 NSAccessibilityInsertionPointLineNumberAttribute]) { 989 NSAccessibilityInsertionPointLineNumberAttribute]) {
1015 const std::vector<int32>& line_breaks = 990 const std::vector<int32>& line_breaks =
1016 browserAccessibility_->line_breaks(); 991 browserAccessibility_->GetIntListAttribute(
992 AccessibilityNodeData::ATTR_LINE_BREAKS);
1017 for (int i = 0; i < static_cast<int>(line_breaks.size()); ++i) { 993 for (int i = 0; i < static_cast<int>(line_breaks.size()); ++i) {
1018 if (line_breaks[i] > selStart) 994 if (line_breaks[i] > selStart)
1019 return [NSNumber numberWithInt:i]; 995 return [NSNumber numberWithInt:i];
1020 } 996 }
1021 return [NSNumber numberWithInt:static_cast<int>(line_breaks.size())]; 997 return [NSNumber numberWithInt:static_cast<int>(line_breaks.size())];
1022 } 998 }
1023 if ([attribute isEqualToString:NSAccessibilitySelectedTextAttribute]) { 999 if ([attribute isEqualToString:NSAccessibilitySelectedTextAttribute]) {
1024 return base::SysUTF16ToNSString(browserAccessibility_->value().substr( 1000 std::string value = browserAccessibility_->GetStringAttribute(
1025 selStart, selLength)); 1001 AccessibilityNodeData::ATTR_VALUE);
1002 return base::SysUTF8ToNSString(value.substr(selStart, selLength));
1026 } 1003 }
1027 if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute]) { 1004 if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute]) {
1028 return [NSValue valueWithRange:NSMakeRange(selStart, selLength)]; 1005 return [NSValue valueWithRange:NSMakeRange(selStart, selLength)];
1029 } 1006 }
1030 } 1007 }
1031 return nil; 1008 return nil;
1032 } 1009 }
1033 1010
1034 // Returns the accessibility value for the given attribute and parameter. If the 1011 // Returns the accessibility value for the given attribute and parameter. If the
1035 // value isn't supported this will return nil. 1012 // value isn't supported this will return nil.
1036 - (id)accessibilityAttributeValue:(NSString*)attribute 1013 - (id)accessibilityAttributeValue:(NSString*)attribute
1037 forParameter:(id)parameter { 1014 forParameter:(id)parameter {
1038 if (!browserAccessibility_) 1015 if (!browserAccessibility_)
1039 return nil; 1016 return nil;
1040 1017
1041 const std::vector<int32>& line_breaks = browserAccessibility_->line_breaks(); 1018 const std::vector<int32>& line_breaks =
1019 browserAccessibility_->GetIntListAttribute(
1020 AccessibilityNodeData::ATTR_LINE_BREAKS);
1042 int len = static_cast<int>(browserAccessibility_->value().size()); 1021 int len = static_cast<int>(browserAccessibility_->value().size());
1043 1022
1044 if ([attribute isEqualToString: 1023 if ([attribute isEqualToString:
1045 NSAccessibilityStringForRangeParameterizedAttribute]) { 1024 NSAccessibilityStringForRangeParameterizedAttribute]) {
1046 NSRange range = [(NSValue*)parameter rangeValue]; 1025 NSRange range = [(NSValue*)parameter rangeValue];
1047 return base::SysUTF16ToNSString( 1026 std::string value = browserAccessibility_->GetStringAttribute(
1048 browserAccessibility_->value().substr(range.location, range.length)); 1027 AccessibilityNodeData::ATTR_VALUE);
1028 return base::SysUTF8ToNSString(value.substr(range.location, range.length));
1049 } 1029 }
1050 1030
1051 if ([attribute isEqualToString: 1031 if ([attribute isEqualToString:
1052 NSAccessibilityLineForIndexParameterizedAttribute]) { 1032 NSAccessibilityLineForIndexParameterizedAttribute]) {
1053 int index = [(NSNumber*)parameter intValue]; 1033 int index = [(NSNumber*)parameter intValue];
1054 for (int i = 0; i < static_cast<int>(line_breaks.size()); ++i) { 1034 for (int i = 0; i < static_cast<int>(line_breaks.size()); ++i) {
1055 if (line_breaks[i] > index) 1035 if (line_breaks[i] > index)
1056 return [NSNumber numberWithInt:i]; 1036 return [NSNumber numberWithInt:i];
1057 } 1037 }
1058 return [NSNumber numberWithInt:static_cast<int>(line_breaks.size())]; 1038 return [NSNumber numberWithInt:static_cast<int>(line_breaks.size())];
(...skipping 15 matching lines...) Expand all
1074 NSAccessibilityCellForColumnAndRowParameterizedAttribute]) { 1054 NSAccessibilityCellForColumnAndRowParameterizedAttribute]) {
1075 if ([self internalRole] != AccessibilityNodeData::ROLE_TABLE && 1055 if ([self internalRole] != AccessibilityNodeData::ROLE_TABLE &&
1076 [self internalRole] != AccessibilityNodeData::ROLE_GRID) { 1056 [self internalRole] != AccessibilityNodeData::ROLE_GRID) {
1077 return nil; 1057 return nil;
1078 } 1058 }
1079 if (![parameter isKindOfClass:[NSArray self]]) 1059 if (![parameter isKindOfClass:[NSArray self]])
1080 return nil; 1060 return nil;
1081 NSArray* array = parameter; 1061 NSArray* array = parameter;
1082 int column = [[array objectAtIndex:0] intValue]; 1062 int column = [[array objectAtIndex:0] intValue];
1083 int row = [[array objectAtIndex:1] intValue]; 1063 int row = [[array objectAtIndex:1] intValue];
1084 int num_columns = 0; 1064 int num_columns = browserAccessibility_->GetIntAttribute(
1085 int num_rows = 0; 1065 AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT);
1086 browserAccessibility_->GetIntAttribute( 1066 int num_rows = browserAccessibility_->GetIntAttribute(
1087 AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT, &num_columns); 1067 AccessibilityNodeData::ATTR_TABLE_ROW_COUNT);
1088 browserAccessibility_->GetIntAttribute(
1089 AccessibilityNodeData::ATTR_TABLE_ROW_COUNT, &num_rows);
1090 if (column < 0 || column >= num_columns || 1068 if (column < 0 || column >= num_columns ||
1091 row < 0 || row >= num_rows) { 1069 row < 0 || row >= num_rows) {
1092 return nil; 1070 return nil;
1093 } 1071 }
1094 for (size_t i = 0; 1072 for (size_t i = 0;
1095 i < browserAccessibility_->child_count(); 1073 i < browserAccessibility_->child_count();
1096 ++i) { 1074 ++i) {
1097 BrowserAccessibility* child = browserAccessibility_->GetChild(i); 1075 BrowserAccessibility* child = browserAccessibility_->GetChild(i);
1098 if (child->role() != AccessibilityNodeData::ROLE_ROW) 1076 if (child->role() != AccessibilityNodeData::ROLE_ROW)
1099 continue; 1077 continue;
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
1328 nil]]; 1306 nil]];
1329 } else { 1307 } else {
1330 [ret addObjectsFromArray:[NSArray arrayWithObjects: 1308 [ret addObjectsFromArray:[NSArray arrayWithObjects:
1331 NSAccessibilityIndexAttribute, 1309 NSAccessibilityIndexAttribute,
1332 nil]]; 1310 nil]];
1333 } 1311 }
1334 } 1312 }
1335 } 1313 }
1336 1314
1337 // Live regions. 1315 // Live regions.
1338 string16 s; 1316 if (browserAccessibility_->HasStringAttribute(
1339 if (browserAccessibility_->GetStringAttribute( 1317 AccessibilityNodeData::ATTR_LIVE_STATUS)) {
1340 AccessibilityNodeData::ATTR_LIVE_STATUS, &s)) {
1341 [ret addObjectsFromArray:[NSArray arrayWithObjects: 1318 [ret addObjectsFromArray:[NSArray arrayWithObjects:
1342 @"AXARIALive", 1319 @"AXARIALive",
1343 @"AXARIARelevant", 1320 @"AXARIARelevant",
1344 nil]]; 1321 nil]];
1345 } 1322 }
1346 if (browserAccessibility_->GetStringAttribute( 1323 if (browserAccessibility_->HasStringAttribute(
1347 AccessibilityNodeData::ATTR_CONTAINER_LIVE_STATUS, &s)) { 1324 AccessibilityNodeData::ATTR_CONTAINER_LIVE_STATUS)) {
1348 [ret addObjectsFromArray:[NSArray arrayWithObjects: 1325 [ret addObjectsFromArray:[NSArray arrayWithObjects:
1349 @"AXARIAAtomic", 1326 @"AXARIAAtomic",
1350 @"AXARIABusy", 1327 @"AXARIABusy",
1351 nil]]; 1328 nil]];
1352 } 1329 }
1353 1330
1354 // Title UI Element. 1331 // Title UI Element.
1355 int i; 1332 if (browserAccessibility_->HasIntAttribute(
1356 if (browserAccessibility_->GetIntAttribute( 1333 AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT)) {
1357 AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT, &i)) {
1358 [ret addObjectsFromArray:[NSArray arrayWithObjects: 1334 [ret addObjectsFromArray:[NSArray arrayWithObjects:
1359 NSAccessibilityTitleUIElementAttribute, 1335 NSAccessibilityTitleUIElementAttribute,
1360 nil]]; 1336 nil]];
1361 } 1337 }
1362 1338
1363 return ret; 1339 return ret;
1364 } 1340 }
1365 1341
1366 // Returns the index of the child in this objects array of children. 1342 // Returns the index of the child in this objects array of children.
1367 - (NSUInteger)accessibilityGetIndexOf:(id)child { 1343 - (NSUInteger)accessibilityGetIndexOf:(id)child {
(...skipping 12 matching lines...) Expand all
1380 // Returns whether or not the specified attribute can be set by the 1356 // Returns whether or not the specified attribute can be set by the
1381 // accessibility API via |accessibilitySetValue:forAttribute:|. 1357 // accessibility API via |accessibilitySetValue:forAttribute:|.
1382 - (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute { 1358 - (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute {
1383 if (!browserAccessibility_) 1359 if (!browserAccessibility_)
1384 return nil; 1360 return nil;
1385 1361
1386 if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) 1362 if ([attribute isEqualToString:NSAccessibilityFocusedAttribute])
1387 return GetState(browserAccessibility_, 1363 return GetState(browserAccessibility_,
1388 AccessibilityNodeData::STATE_FOCUSABLE); 1364 AccessibilityNodeData::STATE_FOCUSABLE);
1389 if ([attribute isEqualToString:NSAccessibilityValueAttribute]) { 1365 if ([attribute isEqualToString:NSAccessibilityValueAttribute]) {
1390 bool canSetValue = false; 1366 return browserAccessibility_->GetBoolAttribute(
1391 browserAccessibility_->GetBoolAttribute( 1367 AccessibilityNodeData::ATTR_CAN_SET_VALUE);
1392 AccessibilityNodeData::ATTR_CAN_SET_VALUE, &canSetValue);
1393 return canSetValue;
1394 } 1368 }
1395 if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute] && 1369 if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute] &&
1396 ([[self role] isEqualToString:NSAccessibilityTextFieldRole] || 1370 ([[self role] isEqualToString:NSAccessibilityTextFieldRole] ||
1397 [[self role] isEqualToString:NSAccessibilityTextAreaRole])) 1371 [[self role] isEqualToString:NSAccessibilityTextAreaRole]))
1398 return YES; 1372 return YES;
1399 1373
1400 return NO; 1374 return NO;
1401 } 1375 }
1402 1376
1403 // Returns whether or not this object should be ignored in the accessibilty 1377 // Returns whether or not this object should be ignored in the accessibilty
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1496 return [super hash]; 1470 return [super hash];
1497 return browserAccessibility_->renderer_id(); 1471 return browserAccessibility_->renderer_id();
1498 } 1472 }
1499 1473
1500 - (BOOL)accessibilityShouldUseUniqueId { 1474 - (BOOL)accessibilityShouldUseUniqueId {
1501 return YES; 1475 return YES;
1502 } 1476 }
1503 1477
1504 @end 1478 @end
1505 1479
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698