| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <execinfo.h> | 5 #include <execinfo.h> |
| 6 #include <stddef.h> | 6 #include <stddef.h> |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #import "content/browser/accessibility/browser_accessibility_cocoa.h" | 9 #import "content/browser/accessibility/browser_accessibility_cocoa.h" |
| 10 | 10 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 using ui::AXNodeData; | 37 using ui::AXNodeData; |
| 38 using StringAttribute = ui::AXStringAttribute; | 38 using StringAttribute = ui::AXStringAttribute; |
| 39 using AXTextMarkerRef = CFTypeRef; | 39 using AXTextMarkerRef = CFTypeRef; |
| 40 using AXTextMarkerRangeRef = CFTypeRef; | 40 using AXTextMarkerRangeRef = CFTypeRef; |
| 41 | 41 |
| 42 namespace { | 42 namespace { |
| 43 | 43 |
| 44 // Private WebKit accessibility attributes. | 44 // Private WebKit accessibility attributes. |
| 45 NSString* const NSAccessibilityARIAAtomicAttribute = @"AXARIAAtomic"; | 45 NSString* const NSAccessibilityARIAAtomicAttribute = @"AXARIAAtomic"; |
| 46 NSString* const NSAccessibilityARIABusyAttribute = @"AXARIABusy"; | 46 NSString* const NSAccessibilityARIABusyAttribute = @"AXARIABusy"; |
| 47 NSString* const NSAccessibilityARIAColumnCountAttribute = @"AXARIAColumnCount"; |
| 48 NSString* const NSAccessibilityARIAColumnIndexAttribute = @"AXARIAColumnIndex"; |
| 47 NSString* const NSAccessibilityARIALiveAttribute = @"AXARIALive"; | 49 NSString* const NSAccessibilityARIALiveAttribute = @"AXARIALive"; |
| 48 NSString* const NSAccessibilityARIAPosInSetAttribute = @"AXARIAPosInSet"; | 50 NSString* const NSAccessibilityARIAPosInSetAttribute = @"AXARIAPosInSet"; |
| 49 NSString* const NSAccessibilityARIARelevantAttribute = @"AXARIARelevant"; | 51 NSString* const NSAccessibilityARIARelevantAttribute = @"AXARIARelevant"; |
| 52 NSString* const NSAccessibilityARIARowCountAttribute = @"AXARIARowCount"; |
| 53 NSString* const NSAccessibilityARIARowIndexAttribute = @"AXARIARowIndex"; |
| 50 NSString* const NSAccessibilityARIASetSizeAttribute = @"AXARIASetSize"; | 54 NSString* const NSAccessibilityARIASetSizeAttribute = @"AXARIASetSize"; |
| 51 NSString* const NSAccessibilityAccessKeyAttribute = @"AXAccessKey"; | 55 NSString* const NSAccessibilityAccessKeyAttribute = @"AXAccessKey"; |
| 52 NSString* const NSAccessibilityDropEffectsAttribute = @"AXDropEffects"; | 56 NSString* const NSAccessibilityDropEffectsAttribute = @"AXDropEffects"; |
| 53 NSString* const NSAccessibilityGrabbedAttribute = @"AXGrabbed"; | 57 NSString* const NSAccessibilityGrabbedAttribute = @"AXGrabbed"; |
| 54 NSString* const NSAccessibilityInvalidAttribute = @"AXInvalid"; | 58 NSString* const NSAccessibilityInvalidAttribute = @"AXInvalid"; |
| 55 NSString* const NSAccessibilityIsMultiSelectableAttribute = | 59 NSString* const NSAccessibilityIsMultiSelectableAttribute = |
| 56 @"AXIsMultiSelectable"; | 60 @"AXIsMultiSelectable"; |
| 57 NSString* const NSAccessibilityLoadingProgressAttribute = @"AXLoadingProgress"; | 61 NSString* const NSAccessibilityLoadingProgressAttribute = @"AXLoadingProgress"; |
| 58 NSString* const | 62 NSString* const |
| 59 NSAccessibilityUIElementCountForSearchPredicateParameterizedAttribute = | 63 NSAccessibilityUIElementCountForSearchPredicateParameterizedAttribute = |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 | 521 |
| 518 @implementation BrowserAccessibilityCocoa | 522 @implementation BrowserAccessibilityCocoa |
| 519 | 523 |
| 520 + (void)initialize { | 524 + (void)initialize { |
| 521 const struct { | 525 const struct { |
| 522 NSString* attribute; | 526 NSString* attribute; |
| 523 NSString* methodName; | 527 NSString* methodName; |
| 524 } attributeToMethodNameContainer[] = { | 528 } attributeToMethodNameContainer[] = { |
| 525 {NSAccessibilityARIAAtomicAttribute, @"ariaAtomic"}, | 529 {NSAccessibilityARIAAtomicAttribute, @"ariaAtomic"}, |
| 526 {NSAccessibilityARIABusyAttribute, @"ariaBusy"}, | 530 {NSAccessibilityARIABusyAttribute, @"ariaBusy"}, |
| 531 {NSAccessibilityARIAColumnCountAttribute, @"ariaColumnCount"}, |
| 532 {NSAccessibilityARIAColumnIndexAttribute, @"ariaColumnIndex"}, |
| 527 {NSAccessibilityARIALiveAttribute, @"ariaLive"}, | 533 {NSAccessibilityARIALiveAttribute, @"ariaLive"}, |
| 528 {NSAccessibilityARIAPosInSetAttribute, @"ariaPosInSet"}, | 534 {NSAccessibilityARIAPosInSetAttribute, @"ariaPosInSet"}, |
| 529 {NSAccessibilityARIARelevantAttribute, @"ariaRelevant"}, | 535 {NSAccessibilityARIARelevantAttribute, @"ariaRelevant"}, |
| 536 {NSAccessibilityARIARowCountAttribute, @"ariaRowCount"}, |
| 537 {NSAccessibilityARIARowIndexAttribute, @"ariaRowIndex"}, |
| 530 {NSAccessibilityARIASetSizeAttribute, @"ariaSetSize"}, | 538 {NSAccessibilityARIASetSizeAttribute, @"ariaSetSize"}, |
| 531 {NSAccessibilityAccessKeyAttribute, @"accessKey"}, | 539 {NSAccessibilityAccessKeyAttribute, @"accessKey"}, |
| 532 {NSAccessibilityChildrenAttribute, @"children"}, | 540 {NSAccessibilityChildrenAttribute, @"children"}, |
| 533 {NSAccessibilityColumnsAttribute, @"columns"}, | 541 {NSAccessibilityColumnsAttribute, @"columns"}, |
| 534 {NSAccessibilityColumnHeaderUIElementsAttribute, @"columnHeaders"}, | 542 {NSAccessibilityColumnHeaderUIElementsAttribute, @"columnHeaders"}, |
| 535 {NSAccessibilityColumnIndexRangeAttribute, @"columnIndexRange"}, | 543 {NSAccessibilityColumnIndexRangeAttribute, @"columnIndexRange"}, |
| 536 {NSAccessibilityContentsAttribute, @"contents"}, | 544 {NSAccessibilityContentsAttribute, @"contents"}, |
| 537 {NSAccessibilityDescriptionAttribute, @"description"}, | 545 {NSAccessibilityDescriptionAttribute, @"description"}, |
| 538 {NSAccessibilityDisclosingAttribute, @"disclosing"}, | 546 {NSAccessibilityDisclosingAttribute, @"disclosing"}, |
| 539 {NSAccessibilityDisclosedByRowAttribute, @"disclosedByRow"}, | 547 {NSAccessibilityDisclosedByRowAttribute, @"disclosedByRow"}, |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 return [NSNumber numberWithBool:boolValue]; | 644 return [NSNumber numberWithBool:boolValue]; |
| 637 } | 645 } |
| 638 | 646 |
| 639 - (NSNumber*)ariaBusy { | 647 - (NSNumber*)ariaBusy { |
| 640 if (![self instanceActive]) | 648 if (![self instanceActive]) |
| 641 return nil; | 649 return nil; |
| 642 return [NSNumber numberWithBool: | 650 return [NSNumber numberWithBool: |
| 643 GetState(browserAccessibility_, ui::AX_STATE_BUSY)]; | 651 GetState(browserAccessibility_, ui::AX_STATE_BUSY)]; |
| 644 } | 652 } |
| 645 | 653 |
| 654 - (NSNumber*)ariaColumnCount { |
| 655 if (!browserAccessibility_->IsTableOrGridOrTreeGridRole()) |
| 656 return nil; |
| 657 int count = -1; |
| 658 if (!browserAccessibility_->GetIntAttribute( |
| 659 ui::AX_ATTR_ARIA_COL_COUNT, &count)) |
| 660 return nil; |
| 661 return [NSNumber numberWithInt:count]; |
| 662 } |
| 663 |
| 664 - (NSNumber*)ariaColumnIndex { |
| 665 if (!browserAccessibility_->IsCellOrTableHeaderRole()) |
| 666 return nil; |
| 667 int index = -1; |
| 668 if (!browserAccessibility_->GetIntAttribute( |
| 669 ui::AX_ATTR_ARIA_COL_INDEX, &index)) |
| 670 return nil; |
| 671 return [NSNumber numberWithInt:index]; |
| 672 } |
| 673 |
| 646 - (NSString*)ariaLive { | 674 - (NSString*)ariaLive { |
| 647 if (![self instanceActive]) | 675 if (![self instanceActive]) |
| 648 return nil; | 676 return nil; |
| 649 return NSStringForStringAttribute( | 677 return NSStringForStringAttribute( |
| 650 browserAccessibility_, ui::AX_ATTR_LIVE_STATUS); | 678 browserAccessibility_, ui::AX_ATTR_LIVE_STATUS); |
| 651 } | 679 } |
| 652 | 680 |
| 653 - (NSNumber*)ariaPosInSet { | 681 - (NSNumber*)ariaPosInSet { |
| 654 if (![self instanceActive]) | 682 if (![self instanceActive]) |
| 655 return nil; | 683 return nil; |
| 656 return [NSNumber numberWithInt: | 684 return [NSNumber numberWithInt: |
| 657 browserAccessibility_->GetIntAttribute(ui::AX_ATTR_POS_IN_SET)]; | 685 browserAccessibility_->GetIntAttribute(ui::AX_ATTR_POS_IN_SET)]; |
| 658 } | 686 } |
| 659 | 687 |
| 660 - (NSString*)ariaRelevant { | 688 - (NSString*)ariaRelevant { |
| 661 if (![self instanceActive]) | 689 if (![self instanceActive]) |
| 662 return nil; | 690 return nil; |
| 663 return NSStringForStringAttribute(browserAccessibility_, | 691 return NSStringForStringAttribute(browserAccessibility_, |
| 664 ui::AX_ATTR_LIVE_RELEVANT); | 692 ui::AX_ATTR_LIVE_RELEVANT); |
| 665 } | 693 } |
| 666 | 694 |
| 695 - (NSNumber*)ariaRowCount { |
| 696 if (!browserAccessibility_->IsTableOrGridOrTreeGridRole()) |
| 697 return nil; |
| 698 int count = -1; |
| 699 if (!browserAccessibility_->GetIntAttribute( |
| 700 ui::AX_ATTR_ARIA_ROW_COUNT, &count)) |
| 701 return nil; |
| 702 return [NSNumber numberWithInt:count]; |
| 703 } |
| 704 |
| 705 - (NSNumber*)ariaRowIndex { |
| 706 if (!browserAccessibility_->IsCellOrTableHeaderRole()) |
| 707 return nil; |
| 708 int index = -1; |
| 709 if (!browserAccessibility_->GetIntAttribute( |
| 710 ui::AX_ATTR_ARIA_ROW_INDEX, &index)) |
| 711 return nil; |
| 712 return [NSNumber numberWithInt:index]; |
| 713 } |
| 714 |
| 667 - (NSNumber*)ariaSetSize { | 715 - (NSNumber*)ariaSetSize { |
| 668 if (![self instanceActive]) | 716 if (![self instanceActive]) |
| 669 return nil; | 717 return nil; |
| 670 return [NSNumber numberWithInt: | 718 return [NSNumber numberWithInt: |
| 671 browserAccessibility_->GetIntAttribute(ui::AX_ATTR_SET_SIZE)]; | 719 browserAccessibility_->GetIntAttribute(ui::AX_ATTR_SET_SIZE)]; |
| 672 } | 720 } |
| 673 | 721 |
| 674 // Returns an array of BrowserAccessibilityCocoa objects, representing the | 722 // Returns an array of BrowserAccessibilityCocoa objects, representing the |
| 675 // accessibility children of this object. | 723 // accessibility children of this object. |
| 676 - (NSArray*)children { | 724 - (NSArray*)children { |
| (...skipping 1918 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2595 // Specific role attributes. | 2643 // Specific role attributes. |
| 2596 NSString* role = [self role]; | 2644 NSString* role = [self role]; |
| 2597 NSString* subrole = [self subrole]; | 2645 NSString* subrole = [self subrole]; |
| 2598 if ([role isEqualToString:NSAccessibilityTableRole] || | 2646 if ([role isEqualToString:NSAccessibilityTableRole] || |
| 2599 [role isEqualToString:NSAccessibilityGridRole]) { | 2647 [role isEqualToString:NSAccessibilityGridRole]) { |
| 2600 [ret addObjectsFromArray:@[ | 2648 [ret addObjectsFromArray:@[ |
| 2601 NSAccessibilityColumnsAttribute, NSAccessibilityVisibleColumnsAttribute, | 2649 NSAccessibilityColumnsAttribute, NSAccessibilityVisibleColumnsAttribute, |
| 2602 NSAccessibilityRowsAttribute, NSAccessibilityVisibleRowsAttribute, | 2650 NSAccessibilityRowsAttribute, NSAccessibilityVisibleRowsAttribute, |
| 2603 NSAccessibilityVisibleCellsAttribute, NSAccessibilityHeaderAttribute, | 2651 NSAccessibilityVisibleCellsAttribute, NSAccessibilityHeaderAttribute, |
| 2604 NSAccessibilityColumnHeaderUIElementsAttribute, | 2652 NSAccessibilityColumnHeaderUIElementsAttribute, |
| 2605 NSAccessibilityRowHeaderUIElementsAttribute | 2653 NSAccessibilityRowHeaderUIElementsAttribute, |
| 2654 NSAccessibilityARIAColumnCountAttribute, |
| 2655 NSAccessibilityARIARowCountAttribute, |
| 2606 ]]; | 2656 ]]; |
| 2607 } else if ([role isEqualToString:NSAccessibilityColumnRole]) { | 2657 } else if ([role isEqualToString:NSAccessibilityColumnRole]) { |
| 2608 [ret addObjectsFromArray:@[ | 2658 [ret addObjectsFromArray:@[ |
| 2609 NSAccessibilityIndexAttribute, NSAccessibilityHeaderAttribute, | 2659 NSAccessibilityIndexAttribute, NSAccessibilityHeaderAttribute, |
| 2610 NSAccessibilityRowsAttribute, NSAccessibilityVisibleRowsAttribute | 2660 NSAccessibilityRowsAttribute, NSAccessibilityVisibleRowsAttribute |
| 2611 ]]; | 2661 ]]; |
| 2612 } else if ([role isEqualToString:NSAccessibilityCellRole]) { | 2662 } else if ([role isEqualToString:NSAccessibilityCellRole]) { |
| 2613 [ret addObjectsFromArray:@[ | 2663 [ret addObjectsFromArray:@[ |
| 2614 NSAccessibilityColumnIndexRangeAttribute, | 2664 NSAccessibilityColumnIndexRangeAttribute, |
| 2615 NSAccessibilityRowIndexRangeAttribute, @"AXSortDirection" | 2665 NSAccessibilityRowIndexRangeAttribute, |
| 2666 NSAccessibilityARIAColumnIndexAttribute, |
| 2667 NSAccessibilityARIARowIndexAttribute, |
| 2668 @"AXSortDirection", |
| 2616 ]]; | 2669 ]]; |
| 2617 } else if ([role isEqualToString:@"AXWebArea"]) { | 2670 } else if ([role isEqualToString:@"AXWebArea"]) { |
| 2618 [ret addObjectsFromArray:@[ | 2671 [ret addObjectsFromArray:@[ |
| 2619 @"AXLoaded", NSAccessibilityLoadingProgressAttribute | 2672 @"AXLoaded", NSAccessibilityLoadingProgressAttribute |
| 2620 ]]; | 2673 ]]; |
| 2621 } else if ([role isEqualToString:NSAccessibilityTabGroupRole]) { | 2674 } else if ([role isEqualToString:NSAccessibilityTabGroupRole]) { |
| 2622 [ret addObject:NSAccessibilityTabsAttribute]; | 2675 [ret addObject:NSAccessibilityTabsAttribute]; |
| 2623 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] || | 2676 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] || |
| 2624 [role isEqualToString:NSAccessibilitySliderRole] || | 2677 [role isEqualToString:NSAccessibilitySliderRole] || |
| 2625 [role isEqualToString:NSAccessibilityIncrementorRole] || | 2678 [role isEqualToString:NSAccessibilityIncrementorRole] || |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2883 } | 2936 } |
| 2884 | 2937 |
| 2885 - (BOOL)accessibilityNotifiesWhenDestroyed { | 2938 - (BOOL)accessibilityNotifiesWhenDestroyed { |
| 2886 // Indicate that BrowserAccessibilityCocoa will post a notification when it's | 2939 // Indicate that BrowserAccessibilityCocoa will post a notification when it's |
| 2887 // destroyed (see -detach). This allows VoiceOver to do some internal things | 2940 // destroyed (see -detach). This allows VoiceOver to do some internal things |
| 2888 // more efficiently. | 2941 // more efficiently. |
| 2889 return YES; | 2942 return YES; |
| 2890 } | 2943 } |
| 2891 | 2944 |
| 2892 @end | 2945 @end |
| OLD | NEW |