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

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: Fix win test 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 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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698