| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "content/browser/accessibility/browser_accessibility_cocoa.h" | 5 #import "content/browser/accessibility/browser_accessibility_cocoa.h" |
| 6 | 6 |
| 7 #include <execinfo.h> | 7 #include <execinfo.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 #include <string.h> | 10 #include <string.h> |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 using ui::AXNodeData; | 44 using ui::AXNodeData; |
| 45 using StringAttribute = ui::AXStringAttribute; | 45 using StringAttribute = ui::AXStringAttribute; |
| 46 using AXTextMarkerRef = CFTypeRef; | 46 using AXTextMarkerRef = CFTypeRef; |
| 47 using AXTextMarkerRangeRef = CFTypeRef; | 47 using AXTextMarkerRangeRef = CFTypeRef; |
| 48 | 48 |
| 49 namespace { | 49 namespace { |
| 50 | 50 |
| 51 // Private WebKit accessibility attributes. | 51 // Private WebKit accessibility attributes. |
| 52 NSString* const NSAccessibilityARIAAtomicAttribute = @"AXARIAAtomic"; | 52 NSString* const NSAccessibilityARIAAtomicAttribute = @"AXARIAAtomic"; |
| 53 NSString* const NSAccessibilityARIABusyAttribute = @"AXARIABusy"; | 53 NSString* const NSAccessibilityARIABusyAttribute = @"AXARIABusy"; |
| 54 NSString* const NSAccessibilityARIAColumnCountAttribute = @"AXARIAColumnCount"; |
| 55 NSString* const NSAccessibilityARIAColumnIndexAttribute = @"AXARIAColumnIndex"; |
| 54 NSString* const NSAccessibilityARIALiveAttribute = @"AXARIALive"; | 56 NSString* const NSAccessibilityARIALiveAttribute = @"AXARIALive"; |
| 55 NSString* const NSAccessibilityARIAPosInSetAttribute = @"AXARIAPosInSet"; | 57 NSString* const NSAccessibilityARIAPosInSetAttribute = @"AXARIAPosInSet"; |
| 56 NSString* const NSAccessibilityARIARelevantAttribute = @"AXARIARelevant"; | 58 NSString* const NSAccessibilityARIARelevantAttribute = @"AXARIARelevant"; |
| 59 NSString* const NSAccessibilityARIARowCountAttribute = @"AXARIARowCount"; |
| 60 NSString* const NSAccessibilityARIARowIndexAttribute = @"AXARIARowIndex"; |
| 57 NSString* const NSAccessibilityARIASetSizeAttribute = @"AXARIASetSize"; | 61 NSString* const NSAccessibilityARIASetSizeAttribute = @"AXARIASetSize"; |
| 58 NSString* const NSAccessibilityAccessKeyAttribute = @"AXAccessKey"; | 62 NSString* const NSAccessibilityAccessKeyAttribute = @"AXAccessKey"; |
| 59 NSString* const NSAccessibilityDropEffectsAttribute = @"AXDropEffects"; | 63 NSString* const NSAccessibilityDropEffectsAttribute = @"AXDropEffects"; |
| 60 NSString* const NSAccessibilityGrabbedAttribute = @"AXGrabbed"; | 64 NSString* const NSAccessibilityGrabbedAttribute = @"AXGrabbed"; |
| 61 NSString* const NSAccessibilityInvalidAttribute = @"AXInvalid"; | 65 NSString* const NSAccessibilityInvalidAttribute = @"AXInvalid"; |
| 62 NSString* const NSAccessibilityIsMultiSelectableAttribute = | 66 NSString* const NSAccessibilityIsMultiSelectableAttribute = |
| 63 @"AXIsMultiSelectable"; | 67 @"AXIsMultiSelectable"; |
| 64 NSString* const NSAccessibilityLoadingProgressAttribute = @"AXLoadingProgress"; | 68 NSString* const NSAccessibilityLoadingProgressAttribute = @"AXLoadingProgress"; |
| 65 NSString* const | 69 NSString* const |
| 66 NSAccessibilityUIElementCountForSearchPredicateParameterizedAttribute = | 70 NSAccessibilityUIElementCountForSearchPredicateParameterizedAttribute = |
| (...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 521 | 525 |
| 522 @implementation BrowserAccessibilityCocoa | 526 @implementation BrowserAccessibilityCocoa |
| 523 | 527 |
| 524 + (void)initialize { | 528 + (void)initialize { |
| 525 const struct { | 529 const struct { |
| 526 NSString* attribute; | 530 NSString* attribute; |
| 527 NSString* methodName; | 531 NSString* methodName; |
| 528 } attributeToMethodNameContainer[] = { | 532 } attributeToMethodNameContainer[] = { |
| 529 {NSAccessibilityARIAAtomicAttribute, @"ariaAtomic"}, | 533 {NSAccessibilityARIAAtomicAttribute, @"ariaAtomic"}, |
| 530 {NSAccessibilityARIABusyAttribute, @"ariaBusy"}, | 534 {NSAccessibilityARIABusyAttribute, @"ariaBusy"}, |
| 535 {NSAccessibilityARIAColumnCountAttribute, @"ariaColumnCount"}, |
| 536 {NSAccessibilityARIAColumnIndexAttribute, @"ariaColumnIndex"}, |
| 531 {NSAccessibilityARIALiveAttribute, @"ariaLive"}, | 537 {NSAccessibilityARIALiveAttribute, @"ariaLive"}, |
| 532 {NSAccessibilityARIAPosInSetAttribute, @"ariaPosInSet"}, | 538 {NSAccessibilityARIAPosInSetAttribute, @"ariaPosInSet"}, |
| 533 {NSAccessibilityARIARelevantAttribute, @"ariaRelevant"}, | 539 {NSAccessibilityARIARelevantAttribute, @"ariaRelevant"}, |
| 540 {NSAccessibilityARIARowCountAttribute, @"ariaRowCount"}, |
| 541 {NSAccessibilityARIARowIndexAttribute, @"ariaRowIndex"}, |
| 534 {NSAccessibilityARIASetSizeAttribute, @"ariaSetSize"}, | 542 {NSAccessibilityARIASetSizeAttribute, @"ariaSetSize"}, |
| 535 {NSAccessibilityAccessKeyAttribute, @"accessKey"}, | 543 {NSAccessibilityAccessKeyAttribute, @"accessKey"}, |
| 536 {NSAccessibilityChildrenAttribute, @"children"}, | 544 {NSAccessibilityChildrenAttribute, @"children"}, |
| 537 {NSAccessibilityColumnsAttribute, @"columns"}, | 545 {NSAccessibilityColumnsAttribute, @"columns"}, |
| 538 {NSAccessibilityColumnHeaderUIElementsAttribute, @"columnHeaders"}, | 546 {NSAccessibilityColumnHeaderUIElementsAttribute, @"columnHeaders"}, |
| 539 {NSAccessibilityColumnIndexRangeAttribute, @"columnIndexRange"}, | 547 {NSAccessibilityColumnIndexRangeAttribute, @"columnIndexRange"}, |
| 540 {NSAccessibilityContentsAttribute, @"contents"}, | 548 {NSAccessibilityContentsAttribute, @"contents"}, |
| 541 {NSAccessibilityDescriptionAttribute, @"description"}, | 549 {NSAccessibilityDescriptionAttribute, @"description"}, |
| 542 {NSAccessibilityDisclosingAttribute, @"disclosing"}, | 550 {NSAccessibilityDisclosingAttribute, @"disclosing"}, |
| 543 {NSAccessibilityDisclosedByRowAttribute, @"disclosedByRow"}, | 551 {NSAccessibilityDisclosedByRowAttribute, @"disclosedByRow"}, |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 return [NSNumber numberWithBool:boolValue]; | 648 return [NSNumber numberWithBool:boolValue]; |
| 641 } | 649 } |
| 642 | 650 |
| 643 - (NSNumber*)ariaBusy { | 651 - (NSNumber*)ariaBusy { |
| 644 if (![self instanceActive]) | 652 if (![self instanceActive]) |
| 645 return nil; | 653 return nil; |
| 646 return [NSNumber numberWithBool: | 654 return [NSNumber numberWithBool: |
| 647 GetState(browserAccessibility_, ui::AX_STATE_BUSY)]; | 655 GetState(browserAccessibility_, ui::AX_STATE_BUSY)]; |
| 648 } | 656 } |
| 649 | 657 |
| 658 - (NSNumber*)ariaColumnCount { |
| 659 if (!browserAccessibility_->IsTableOrGridOrTreeGridRole()) |
| 660 return nil; |
| 661 int count = -1; |
| 662 if (!browserAccessibility_->GetIntAttribute( |
| 663 ui::AX_ATTR_ARIA_COL_COUNT, &count)) |
| 664 return nil; |
| 665 return [NSNumber numberWithInt:count]; |
| 666 } |
| 667 |
| 668 - (NSNumber*)ariaColumnIndex { |
| 669 if (!browserAccessibility_->IsCellOrTableHeaderRole()) |
| 670 return nil; |
| 671 int index = -1; |
| 672 if (!browserAccessibility_->GetIntAttribute( |
| 673 ui::AX_ATTR_ARIA_COL_INDEX, &index)) |
| 674 return nil; |
| 675 return [NSNumber numberWithInt:index]; |
| 676 } |
| 677 |
| 650 - (NSString*)ariaLive { | 678 - (NSString*)ariaLive { |
| 651 if (![self instanceActive]) | 679 if (![self instanceActive]) |
| 652 return nil; | 680 return nil; |
| 653 return NSStringForStringAttribute( | 681 return NSStringForStringAttribute( |
| 654 browserAccessibility_, ui::AX_ATTR_LIVE_STATUS); | 682 browserAccessibility_, ui::AX_ATTR_LIVE_STATUS); |
| 655 } | 683 } |
| 656 | 684 |
| 657 - (NSNumber*)ariaPosInSet { | 685 - (NSNumber*)ariaPosInSet { |
| 658 if (![self instanceActive]) | 686 if (![self instanceActive]) |
| 659 return nil; | 687 return nil; |
| 660 return [NSNumber numberWithInt: | 688 return [NSNumber numberWithInt: |
| 661 browserAccessibility_->GetIntAttribute(ui::AX_ATTR_POS_IN_SET)]; | 689 browserAccessibility_->GetIntAttribute(ui::AX_ATTR_POS_IN_SET)]; |
| 662 } | 690 } |
| 663 | 691 |
| 664 - (NSString*)ariaRelevant { | 692 - (NSString*)ariaRelevant { |
| 665 if (![self instanceActive]) | 693 if (![self instanceActive]) |
| 666 return nil; | 694 return nil; |
| 667 return NSStringForStringAttribute(browserAccessibility_, | 695 return NSStringForStringAttribute(browserAccessibility_, |
| 668 ui::AX_ATTR_LIVE_RELEVANT); | 696 ui::AX_ATTR_LIVE_RELEVANT); |
| 669 } | 697 } |
| 670 | 698 |
| 699 - (NSNumber*)ariaRowCount { |
| 700 if (!browserAccessibility_->IsTableOrGridOrTreeGridRole()) |
| 701 return nil; |
| 702 int count = -1; |
| 703 if (!browserAccessibility_->GetIntAttribute( |
| 704 ui::AX_ATTR_ARIA_ROW_COUNT, &count)) |
| 705 return nil; |
| 706 return [NSNumber numberWithInt:count]; |
| 707 } |
| 708 |
| 709 - (NSNumber*)ariaRowIndex { |
| 710 if (!browserAccessibility_->IsCellOrTableHeaderRole()) |
| 711 return nil; |
| 712 int index = -1; |
| 713 if (!browserAccessibility_->GetIntAttribute( |
| 714 ui::AX_ATTR_ARIA_ROW_INDEX, &index)) |
| 715 return nil; |
| 716 return [NSNumber numberWithInt:index]; |
| 717 } |
| 718 |
| 671 - (NSNumber*)ariaSetSize { | 719 - (NSNumber*)ariaSetSize { |
| 672 if (![self instanceActive]) | 720 if (![self instanceActive]) |
| 673 return nil; | 721 return nil; |
| 674 return [NSNumber numberWithInt: | 722 return [NSNumber numberWithInt: |
| 675 browserAccessibility_->GetIntAttribute(ui::AX_ATTR_SET_SIZE)]; | 723 browserAccessibility_->GetIntAttribute(ui::AX_ATTR_SET_SIZE)]; |
| 676 } | 724 } |
| 677 | 725 |
| 678 // Returns an array of BrowserAccessibilityCocoa objects, representing the | 726 // Returns an array of BrowserAccessibilityCocoa objects, representing the |
| 679 // accessibility children of this object. | 727 // accessibility children of this object. |
| 680 - (NSArray*)children { | 728 - (NSArray*)children { |
| (...skipping 1786 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2467 // Specific role attributes. | 2515 // Specific role attributes. |
| 2468 NSString* role = [self role]; | 2516 NSString* role = [self role]; |
| 2469 NSString* subrole = [self subrole]; | 2517 NSString* subrole = [self subrole]; |
| 2470 if ([role isEqualToString:NSAccessibilityTableRole] || | 2518 if ([role isEqualToString:NSAccessibilityTableRole] || |
| 2471 [role isEqualToString:NSAccessibilityGridRole]) { | 2519 [role isEqualToString:NSAccessibilityGridRole]) { |
| 2472 [ret addObjectsFromArray:@[ | 2520 [ret addObjectsFromArray:@[ |
| 2473 NSAccessibilityColumnsAttribute, NSAccessibilityVisibleColumnsAttribute, | 2521 NSAccessibilityColumnsAttribute, NSAccessibilityVisibleColumnsAttribute, |
| 2474 NSAccessibilityRowsAttribute, NSAccessibilityVisibleRowsAttribute, | 2522 NSAccessibilityRowsAttribute, NSAccessibilityVisibleRowsAttribute, |
| 2475 NSAccessibilityVisibleCellsAttribute, NSAccessibilityHeaderAttribute, | 2523 NSAccessibilityVisibleCellsAttribute, NSAccessibilityHeaderAttribute, |
| 2476 NSAccessibilityColumnHeaderUIElementsAttribute, | 2524 NSAccessibilityColumnHeaderUIElementsAttribute, |
| 2477 NSAccessibilityRowHeaderUIElementsAttribute | 2525 NSAccessibilityRowHeaderUIElementsAttribute, |
| 2526 NSAccessibilityARIAColumnCountAttribute, |
| 2527 NSAccessibilityARIARowCountAttribute, |
| 2478 ]]; | 2528 ]]; |
| 2479 } else if ([role isEqualToString:NSAccessibilityColumnRole]) { | 2529 } else if ([role isEqualToString:NSAccessibilityColumnRole]) { |
| 2480 [ret addObjectsFromArray:@[ | 2530 [ret addObjectsFromArray:@[ |
| 2481 NSAccessibilityIndexAttribute, NSAccessibilityHeaderAttribute, | 2531 NSAccessibilityIndexAttribute, NSAccessibilityHeaderAttribute, |
| 2482 NSAccessibilityRowsAttribute, NSAccessibilityVisibleRowsAttribute | 2532 NSAccessibilityRowsAttribute, NSAccessibilityVisibleRowsAttribute |
| 2483 ]]; | 2533 ]]; |
| 2484 } else if ([role isEqualToString:NSAccessibilityCellRole]) { | 2534 } else if ([role isEqualToString:NSAccessibilityCellRole]) { |
| 2485 [ret addObjectsFromArray:@[ | 2535 [ret addObjectsFromArray:@[ |
| 2486 NSAccessibilityColumnIndexRangeAttribute, | 2536 NSAccessibilityColumnIndexRangeAttribute, |
| 2487 NSAccessibilityRowIndexRangeAttribute, @"AXSortDirection" | 2537 NSAccessibilityRowIndexRangeAttribute, |
| 2538 NSAccessibilityARIAColumnIndexAttribute, |
| 2539 NSAccessibilityARIARowIndexAttribute, |
| 2540 @"AXSortDirection", |
| 2488 ]]; | 2541 ]]; |
| 2489 } else if ([role isEqualToString:@"AXWebArea"]) { | 2542 } else if ([role isEqualToString:@"AXWebArea"]) { |
| 2490 [ret addObjectsFromArray:@[ | 2543 [ret addObjectsFromArray:@[ |
| 2491 @"AXLoaded", NSAccessibilityLoadingProgressAttribute | 2544 @"AXLoaded", NSAccessibilityLoadingProgressAttribute |
| 2492 ]]; | 2545 ]]; |
| 2493 } else if ([role isEqualToString:NSAccessibilityTabGroupRole]) { | 2546 } else if ([role isEqualToString:NSAccessibilityTabGroupRole]) { |
| 2494 [ret addObject:NSAccessibilityTabsAttribute]; | 2547 [ret addObject:NSAccessibilityTabsAttribute]; |
| 2495 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] || | 2548 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] || |
| 2496 [role isEqualToString:NSAccessibilitySliderRole] || | 2549 [role isEqualToString:NSAccessibilitySliderRole] || |
| 2497 [role isEqualToString:NSAccessibilityIncrementorRole] || | 2550 [role isEqualToString:NSAccessibilityIncrementorRole] || |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2755 } | 2808 } |
| 2756 | 2809 |
| 2757 - (BOOL)accessibilityNotifiesWhenDestroyed { | 2810 - (BOOL)accessibilityNotifiesWhenDestroyed { |
| 2758 // Indicate that BrowserAccessibilityCocoa will post a notification when it's | 2811 // Indicate that BrowserAccessibilityCocoa will post a notification when it's |
| 2759 // destroyed (see -detach). This allows VoiceOver to do some internal things | 2812 // destroyed (see -detach). This allows VoiceOver to do some internal things |
| 2760 // more efficiently. | 2813 // more efficiently. |
| 2761 return YES; | 2814 return YES; |
| 2762 } | 2815 } |
| 2763 | 2816 |
| 2764 @end | 2817 @end |
| OLD | NEW |