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

Side by Side Diff: ui/accessibility/platform/ax_platform_node_mac.mm

Issue 2957743002: MacViews: Fix VoiceOver feedback in editable fields. (Closed)
Patch Set: kSelectableTextAttributes Created 3 years, 5 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
« no previous file with comments | « no previous file | ui/views/widget/native_widget_mac_accessibility_unittest.mm » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "ui/accessibility/platform/ax_platform_node_mac.h" 5 #import "ui/accessibility/platform/ax_platform_node_mac.h"
6 6
7 #import <Cocoa/Cocoa.h> 7 #import <Cocoa/Cocoa.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 case ui::AX_ROLE_TOGGLE_BUTTON: 405 case ui::AX_ROLE_TOGGLE_BUTTON:
406 [axAttributes addObjectsFromArray:kValueAttributes]; 406 [axAttributes addObjectsFromArray:kValueAttributes];
407 break; 407 break;
408 // TODO(tapted): Add additional attributes based on role. 408 // TODO(tapted): Add additional attributes based on role.
409 default: 409 default:
410 break; 410 break;
411 } 411 }
412 return axAttributes.autorelease(); 412 return axAttributes.autorelease();
413 } 413 }
414 414
415 - (NSArray*)accessibilityParameterizedAttributeNames {
416 if (!node_)
417 return nil;
418
419 static NSArray* const kSelectableTextAttributes = [@[
420 NSAccessibilityLineForIndexParameterizedAttribute,
421 NSAccessibilityRangeForLineParameterizedAttribute,
422 NSAccessibilityStringForRangeParameterizedAttribute,
423 NSAccessibilityRangeForPositionParameterizedAttribute,
424 NSAccessibilityRangeForIndexParameterizedAttribute,
425 NSAccessibilityBoundsForRangeParameterizedAttribute,
426 NSAccessibilityRTFForRangeParameterizedAttribute,
427 NSAccessibilityStyleRangeForIndexParameterizedAttribute,
428 NSAccessibilityAttributedStringForRangeParameterizedAttribute,
429 ] retain];
430
431 switch (node_->GetData().role) {
432 case ui::AX_ROLE_TEXT_FIELD:
433 case ui::AX_ROLE_STATIC_TEXT:
434 return kSelectableTextAttributes;
435 default:
436 break;
437 }
438 return nil;
439 }
440
415 - (BOOL)accessibilityIsAttributeSettable:(NSString*)attributeName { 441 - (BOOL)accessibilityIsAttributeSettable:(NSString*)attributeName {
416 if (node_->GetData().HasState(ui::AX_STATE_DISABLED)) 442 if (node_->GetData().HasState(ui::AX_STATE_DISABLED))
417 return NO; 443 return NO;
418 444
419 // Allow certain attributes to be written via an accessibility client. A 445 // Allow certain attributes to be written via an accessibility client. A
420 // writable attribute will only appear as such if the accessibility element 446 // writable attribute will only appear as such if the accessibility element
421 // has a value set for that attribute. 447 // has a value set for that attribute.
422 if ([attributeName 448 if ([attributeName
423 isEqualToString:NSAccessibilitySelectedChildrenAttribute] || 449 isEqualToString:NSAccessibilitySelectedChildrenAttribute] ||
424 [attributeName 450 [attributeName
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 // specified in accessibilityIsAttributeSettable. 513 // specified in accessibilityIsAttributeSettable.
488 } 514 }
489 515
490 - (id)accessibilityAttributeValue:(NSString*)attribute { 516 - (id)accessibilityAttributeValue:(NSString*)attribute {
491 SEL selector = NSSelectorFromString(attribute); 517 SEL selector = NSSelectorFromString(attribute);
492 if ([self respondsToSelector:selector]) 518 if ([self respondsToSelector:selector])
493 return [self performSelector:selector]; 519 return [self performSelector:selector];
494 return nil; 520 return nil;
495 } 521 }
496 522
523 - (id)accessibilityAttributeValue:(NSString*)attribute
524 forParameter:(id)parameter {
525 SEL selector = NSSelectorFromString([attribute stringByAppendingString:@":"]);
526 if ([self respondsToSelector:selector])
527 return [self performSelector:selector withObject:parameter];
528 return nil;
529 }
530
497 // NSAccessibility attributes. Order them according to 531 // NSAccessibility attributes. Order them according to
498 // NSAccessibilityConstants.h, or see https://crbug.com/678898. 532 // NSAccessibilityConstants.h, or see https://crbug.com/678898.
499 533
500 - (NSString*)AXRole { 534 - (NSString*)AXRole {
501 if (!node_) 535 if (!node_)
502 return nil; 536 return nil;
503 return [[self class] nativeRoleFromAXRole:node_->GetData().role]; 537 return [[self class] nativeRoleFromAXRole:node_->GetData().role];
504 } 538 }
505 539
506 - (NSString*)AXRoleDescription { 540 - (NSString*)AXRoleDescription {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 660
627 - (NSValue*)AXVisibleCharacterRange { 661 - (NSValue*)AXVisibleCharacterRange {
628 return [NSValue valueWithRange:{0, [[self getAXValueAsString] length]}]; 662 return [NSValue valueWithRange:{0, [[self getAXValueAsString] length]}];
629 } 663 }
630 664
631 - (NSNumber*)AXInsertionPointLineNumber { 665 - (NSNumber*)AXInsertionPointLineNumber {
632 // Multiline is not supported on views. 666 // Multiline is not supported on views.
633 return @0; 667 return @0;
634 } 668 }
635 669
670 // Parameterized text-specific attributes.
671
672 - (id)AXLineForIndex:(id)parameter {
673 DCHECK([parameter isKindOfClass:[NSNumber class]]);
674 // Multiline is not supported on views.
675 return @0;
676 }
677
678 - (id)AXRangeForLine:(id)parameter {
679 DCHECK([parameter isKindOfClass:[NSNumber class]]);
680 DCHECK_EQ(0, [parameter intValue]);
681 return [NSValue valueWithRange:{0, [[self getAXValueAsString] length]}];
682 }
683
684 - (id)AXStringForRange:(id)parameter {
685 DCHECK([parameter isKindOfClass:[NSValue class]]);
686 return [[self getAXValueAsString] substringWithRange:[parameter rangeValue]];
687 }
688
689 - (id)AXRangeForPosition:(id)parameter {
690 DCHECK([parameter isKindOfClass:[NSValue class]]);
691 // TODO(tapted): Hit-test [parameter pointValue] and return an NSRange.
692 NOTIMPLEMENTED();
693 return nil;
694 }
695
696 - (id)AXRangeForIndex:(id)parameter {
697 DCHECK([parameter isKindOfClass:[NSNumber class]]);
698 NOTIMPLEMENTED();
699 return nil;
700 }
701
702 - (id)AXBoundsForRange:(id)parameter {
703 DCHECK([parameter isKindOfClass:[NSValue class]]);
704 // TODO(tapted): Provide an accessor on AXPlatformNodeDelegate to obtain this
705 // from ui::TextInputClient::GetCompositionCharacterBounds().
706 NOTIMPLEMENTED();
707 return nil;
708 }
709
710 - (id)AXRTFForRange:(id)parameter {
711 DCHECK([parameter isKindOfClass:[NSValue class]]);
712 NOTIMPLEMENTED();
713 return nil;
714 }
715
716 - (id)AXStyleRangeForIndex:(id)parameter {
717 DCHECK([parameter isKindOfClass:[NSNumber class]]);
718 NOTIMPLEMENTED();
719 return nil;
720 }
721
722 - (id)AXAttributedStringForRange:(id)parameter {
723 DCHECK([parameter isKindOfClass:[NSValue class]]);
724 base::scoped_nsobject<NSAttributedString> attributedString(
725 [[NSAttributedString alloc]
726 initWithString:[self AXStringForRange:parameter]]);
727 // TODO(tapted): views::WordLookupClient has a way to obtain the actual
728 // decorations, and BridgedContentView has a conversion function that creates
729 // an NSAttributedString. Refactor things so they can be used here.
730 return attributedString.autorelease();
731 }
732
636 @end 733 @end
637 734
638 namespace ui { 735 namespace ui {
639 736
640 // static 737 // static
641 AXPlatformNode* AXPlatformNode::Create(AXPlatformNodeDelegate* delegate) { 738 AXPlatformNode* AXPlatformNode::Create(AXPlatformNodeDelegate* delegate) {
642 AXPlatformNodeBase* node = new AXPlatformNodeMac(); 739 AXPlatformNodeBase* node = new AXPlatformNodeMac();
643 node->Init(delegate); 740 node->Init(delegate);
644 return node; 741 return node;
645 } 742 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 } 784 }
688 NotifyMacEvent(native_node_, event_type); 785 NotifyMacEvent(native_node_, event_type);
689 } 786 }
690 787
691 int AXPlatformNodeMac::GetIndexInParent() { 788 int AXPlatformNodeMac::GetIndexInParent() {
692 // TODO(dmazzoni): implement this. http://crbug.com/396137 789 // TODO(dmazzoni): implement this. http://crbug.com/396137
693 return -1; 790 return -1;
694 } 791 }
695 792
696 } // namespace ui 793 } // namespace ui
OLDNEW
« no previous file with comments | « no previous file | ui/views/widget/native_widget_mac_accessibility_unittest.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698