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

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

Issue 224803005: Refactor BrowserAccessibility to prepare for AXNode (re-land) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Win fix Created 6 years, 8 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 struct MapEntry { 42 struct MapEntry {
43 ui::AXRole webKitValue; 43 ui::AXRole webKitValue;
44 NSString* nativeValue; 44 NSString* nativeValue;
45 }; 45 };
46 46
47 typedef std::map<ui::AXRole, NSString*> RoleMap; 47 typedef std::map<ui::AXRole, NSString*> RoleMap;
48 48
49 // GetState checks the bitmask used in AXNodeData to check 49 // GetState checks the bitmask used in AXNodeData to check
50 // if the given state was set on the accessibility object. 50 // if the given state was set on the accessibility object.
51 bool GetState(BrowserAccessibility* accessibility, ui::AXState state) { 51 bool GetState(BrowserAccessibility* accessibility, ui::AXState state) {
52 return ((accessibility->state() >> state) & 1); 52 return ((accessibility->GetState() >> state) & 1);
53 } 53 }
54 54
55 RoleMap BuildRoleMap() { 55 RoleMap BuildRoleMap() {
56 const MapEntry roles[] = { 56 const MapEntry roles[] = {
57 { ui::AX_ROLE_ALERT, NSAccessibilityGroupRole }, 57 { ui::AX_ROLE_ALERT, NSAccessibilityGroupRole },
58 { ui::AX_ROLE_ALERT_DIALOG, NSAccessibilityGroupRole }, 58 { ui::AX_ROLE_ALERT_DIALOG, NSAccessibilityGroupRole },
59 { ui::AX_ROLE_ANNOTATION, NSAccessibilityUnknownRole }, 59 { ui::AX_ROLE_ANNOTATION, NSAccessibilityUnknownRole },
60 { ui::AX_ROLE_APPLICATION, NSAccessibilityGroupRole }, 60 { ui::AX_ROLE_APPLICATION, NSAccessibilityGroupRole },
61 { ui::AX_ROLE_ARTICLE, NSAccessibilityGroupRole }, 61 { ui::AX_ROLE_ARTICLE, NSAccessibilityGroupRole },
62 { ui::AX_ROLE_BANNER, NSAccessibilityGroupRole }, 62 { ui::AX_ROLE_BANNER, NSAccessibilityGroupRole },
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 } 383 }
384 } 384 }
385 } 385 }
386 return children_; 386 return children_;
387 } 387 }
388 388
389 - (void)childrenChanged { 389 - (void)childrenChanged {
390 if (![self isIgnored]) { 390 if (![self isIgnored]) {
391 children_.reset(); 391 children_.reset();
392 } else { 392 } else {
393 [browserAccessibility_->parent()->ToBrowserAccessibilityCocoa() 393 [browserAccessibility_->GetParent()->ToBrowserAccessibilityCocoa()
394 childrenChanged]; 394 childrenChanged];
395 } 395 }
396 } 396 }
397 397
398 - (NSArray*)columnHeaders { 398 - (NSArray*)columnHeaders {
399 if ([self internalRole] != ui::AX_ROLE_TABLE && 399 if ([self internalRole] != ui::AX_ROLE_TABLE &&
400 [self internalRole] != ui::AX_ROLE_GRID) { 400 [self internalRole] != ui::AX_ROLE_GRID) {
401 return nil; 401 return nil;
402 } 402 }
403 403
404 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; 404 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease];
405 const std::vector<int32>& uniqueCellIds = 405 const std::vector<int32>& uniqueCellIds =
406 browserAccessibility_->GetIntListAttribute( 406 browserAccessibility_->GetIntListAttribute(
407 ui::AX_ATTR_UNIQUE_CELL_IDS); 407 ui::AX_ATTR_UNIQUE_CELL_IDS);
408 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { 408 for (size_t i = 0; i < uniqueCellIds.size(); ++i) {
409 int id = uniqueCellIds[i]; 409 int id = uniqueCellIds[i];
410 BrowserAccessibility* cell = 410 BrowserAccessibility* cell =
411 browserAccessibility_->manager()->GetFromRendererID(id); 411 browserAccessibility_->manager()->GetFromRendererID(id);
412 if (cell && cell->role() == ui::AX_ROLE_COLUMN_HEADER) 412 if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER)
413 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; 413 [ret addObject:cell->ToBrowserAccessibilityCocoa()];
414 } 414 }
415 return ret; 415 return ret;
416 } 416 }
417 417
418 - (NSValue*)columnIndexRange { 418 - (NSValue*)columnIndexRange {
419 if ([self internalRole] != ui::AX_ROLE_CELL) 419 if ([self internalRole] != ui::AX_ROLE_CELL)
420 return nil; 420 return nil;
421 421
422 int column = -1; 422 int column = -1;
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 // The origin of this accessibility object in the page's document. 643 // The origin of this accessibility object in the page's document.
644 // This is relative to webkit's top-left origin, not Cocoa's 644 // This is relative to webkit's top-left origin, not Cocoa's
645 // bottom-left origin. 645 // bottom-left origin.
646 - (NSPoint)origin { 646 - (NSPoint)origin {
647 gfx::Rect bounds = browserAccessibility_->GetLocalBoundsRect(); 647 gfx::Rect bounds = browserAccessibility_->GetLocalBoundsRect();
648 return NSMakePoint(bounds.x(), bounds.y()); 648 return NSMakePoint(bounds.x(), bounds.y());
649 } 649 }
650 650
651 - (id)parent { 651 - (id)parent {
652 // A nil parent means we're the root. 652 // A nil parent means we're the root.
653 if (browserAccessibility_->parent()) { 653 if (browserAccessibility_->GetParent()) {
654 return NSAccessibilityUnignoredAncestor( 654 return NSAccessibilityUnignoredAncestor(
655 browserAccessibility_->parent()->ToBrowserAccessibilityCocoa()); 655 browserAccessibility_->GetParent()->ToBrowserAccessibilityCocoa());
656 } else { 656 } else {
657 // Hook back up to RenderWidgetHostViewCocoa. 657 // Hook back up to RenderWidgetHostViewCocoa.
658 BrowserAccessibilityManagerMac* manager = 658 BrowserAccessibilityManagerMac* manager =
659 static_cast<BrowserAccessibilityManagerMac*>( 659 static_cast<BrowserAccessibilityManagerMac*>(
660 browserAccessibility_->manager()); 660 browserAccessibility_->manager());
661 return manager->parent_view(); 661 return manager->parent_view();
662 } 662 }
663 } 663 }
664 664
665 - (NSValue*)position { 665 - (NSValue*)position {
666 NSPoint origin = [self origin]; 666 NSPoint origin = [self origin];
667 NSSize size = [[self size] sizeValue]; 667 NSSize size = [[self size] sizeValue];
668 NSPoint pointInScreen = 668 NSPoint pointInScreen =
669 [delegate_ accessibilityPointInScreen:origin size:size]; 669 [delegate_ accessibilityPointInScreen:origin size:size];
670 return [NSValue valueWithPoint:pointInScreen]; 670 return [NSValue valueWithPoint:pointInScreen];
671 } 671 }
672 672
673 - (NSNumber*)required { 673 - (NSNumber*)required {
674 return [NSNumber numberWithBool: 674 return [NSNumber numberWithBool:
675 GetState(browserAccessibility_, ui::AX_STATE_REQUIRED)]; 675 GetState(browserAccessibility_, ui::AX_STATE_REQUIRED)];
676 } 676 }
677 677
678 // Returns an enum indicating the role from browserAccessibility_. 678 // Returns an enum indicating the role from browserAccessibility_.
679 - (ui::AXRole)internalRole { 679 - (ui::AXRole)internalRole {
680 return static_cast<ui::AXRole>(browserAccessibility_->role()); 680 return static_cast<ui::AXRole>(browserAccessibility_->GetRole());
681 } 681 }
682 682
683 // Returns a string indicating the NSAccessibility role of this object. 683 // Returns a string indicating the NSAccessibility role of this object.
684 - (NSString*)role { 684 - (NSString*)role {
685 ui::AXRole role = [self internalRole]; 685 ui::AXRole role = [self internalRole];
686 if (role == ui::AX_ROLE_CANVAS && 686 if (role == ui::AX_ROLE_CANVAS &&
687 browserAccessibility_->GetBoolAttribute( 687 browserAccessibility_->GetBoolAttribute(
688 ui::AX_ATTR_CANVAS_HAS_FALLBACK)) { 688 ui::AX_ATTR_CANVAS_HAS_FALLBACK)) {
689 return NSAccessibilityGroupRole; 689 return NSAccessibilityGroupRole;
690 } 690 }
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
763 } 763 }
764 764
765 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; 765 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease];
766 const std::vector<int32>& uniqueCellIds = 766 const std::vector<int32>& uniqueCellIds =
767 browserAccessibility_->GetIntListAttribute( 767 browserAccessibility_->GetIntListAttribute(
768 ui::AX_ATTR_UNIQUE_CELL_IDS); 768 ui::AX_ATTR_UNIQUE_CELL_IDS);
769 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { 769 for (size_t i = 0; i < uniqueCellIds.size(); ++i) {
770 int id = uniqueCellIds[i]; 770 int id = uniqueCellIds[i];
771 BrowserAccessibility* cell = 771 BrowserAccessibility* cell =
772 browserAccessibility_->manager()->GetFromRendererID(id); 772 browserAccessibility_->manager()->GetFromRendererID(id);
773 if (cell && cell->role() == ui::AX_ROLE_ROW_HEADER) 773 if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER)
774 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; 774 [ret addObject:cell->ToBrowserAccessibilityCocoa()];
775 } 775 }
776 return ret; 776 return ret;
777 } 777 }
778 778
779 - (NSValue*)rowIndexRange { 779 - (NSValue*)rowIndexRange {
780 if ([self internalRole] != ui::AX_ROLE_CELL) 780 if ([self internalRole] != ui::AX_ROLE_CELL)
781 return nil; 781 return nil;
782 782
783 int row = -1; 783 int row = -1;
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
1107 int num_rows = browserAccessibility_->GetIntAttribute( 1107 int num_rows = browserAccessibility_->GetIntAttribute(
1108 ui::AX_ATTR_TABLE_ROW_COUNT); 1108 ui::AX_ATTR_TABLE_ROW_COUNT);
1109 if (column < 0 || column >= num_columns || 1109 if (column < 0 || column >= num_columns ||
1110 row < 0 || row >= num_rows) { 1110 row < 0 || row >= num_rows) {
1111 return nil; 1111 return nil;
1112 } 1112 }
1113 for (size_t i = 0; 1113 for (size_t i = 0;
1114 i < browserAccessibility_->PlatformChildCount(); 1114 i < browserAccessibility_->PlatformChildCount();
1115 ++i) { 1115 ++i) {
1116 BrowserAccessibility* child = browserAccessibility_->PlatformGetChild(i); 1116 BrowserAccessibility* child = browserAccessibility_->PlatformGetChild(i);
1117 if (child->role() != ui::AX_ROLE_ROW) 1117 if (child->GetRole() != ui::AX_ROLE_ROW)
1118 continue; 1118 continue;
1119 int rowIndex; 1119 int rowIndex;
1120 if (!child->GetIntAttribute( 1120 if (!child->GetIntAttribute(
1121 ui::AX_ATTR_TABLE_ROW_INDEX, &rowIndex)) { 1121 ui::AX_ATTR_TABLE_ROW_INDEX, &rowIndex)) {
1122 continue; 1122 continue;
1123 } 1123 }
1124 if (rowIndex < row) 1124 if (rowIndex < row)
1125 continue; 1125 continue;
1126 if (rowIndex > row) 1126 if (rowIndex > row)
1127 break; 1127 break;
1128 for (size_t j = 0; 1128 for (size_t j = 0;
1129 j < child->PlatformChildCount(); 1129 j < child->PlatformChildCount();
1130 ++j) { 1130 ++j) {
1131 BrowserAccessibility* cell = child->PlatformGetChild(j); 1131 BrowserAccessibility* cell = child->PlatformGetChild(j);
1132 if (cell->role() != ui::AX_ROLE_CELL) 1132 if (cell->GetRole() != ui::AX_ROLE_CELL)
1133 continue; 1133 continue;
1134 int colIndex; 1134 int colIndex;
1135 if (!cell->GetIntAttribute( 1135 if (!cell->GetIntAttribute(
1136 ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, 1136 ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX,
1137 &colIndex)) { 1137 &colIndex)) {
1138 continue; 1138 continue;
1139 } 1139 }
1140 if (colIndex == column) 1140 if (colIndex == column)
1141 return cell->ToBrowserAccessibilityCocoa(); 1141 return cell->ToBrowserAccessibilityCocoa();
1142 if (colIndex > column) 1142 if (colIndex > column)
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
1346 NSAccessibilityValueDescriptionAttribute, 1346 NSAccessibilityValueDescriptionAttribute,
1347 nil]]; 1347 nil]];
1348 } else if ([subrole isEqualToString:NSAccessibilityOutlineRowSubrole]) { 1348 } else if ([subrole isEqualToString:NSAccessibilityOutlineRowSubrole]) {
1349 [ret addObjectsFromArray:[NSArray arrayWithObjects: 1349 [ret addObjectsFromArray:[NSArray arrayWithObjects:
1350 NSAccessibilityDisclosingAttribute, 1350 NSAccessibilityDisclosingAttribute,
1351 NSAccessibilityDisclosedByRowAttribute, 1351 NSAccessibilityDisclosedByRowAttribute,
1352 NSAccessibilityDisclosureLevelAttribute, 1352 NSAccessibilityDisclosureLevelAttribute,
1353 NSAccessibilityDisclosedRowsAttribute, 1353 NSAccessibilityDisclosedRowsAttribute,
1354 nil]]; 1354 nil]];
1355 } else if ([role isEqualToString:NSAccessibilityRowRole]) { 1355 } else if ([role isEqualToString:NSAccessibilityRowRole]) {
1356 if (browserAccessibility_->parent()) { 1356 if (browserAccessibility_->GetParent()) {
1357 base::string16 parentRole; 1357 base::string16 parentRole;
1358 browserAccessibility_->parent()->GetHtmlAttribute( 1358 browserAccessibility_->GetParent()->GetHtmlAttribute(
1359 "role", &parentRole); 1359 "role", &parentRole);
1360 const base::string16 treegridRole(base::ASCIIToUTF16("treegrid")); 1360 const base::string16 treegridRole(base::ASCIIToUTF16("treegrid"));
1361 if (parentRole == treegridRole) { 1361 if (parentRole == treegridRole) {
1362 [ret addObjectsFromArray:[NSArray arrayWithObjects: 1362 [ret addObjectsFromArray:[NSArray arrayWithObjects:
1363 NSAccessibilityDisclosingAttribute, 1363 NSAccessibilityDisclosingAttribute,
1364 NSAccessibilityDisclosedByRowAttribute, 1364 NSAccessibilityDisclosedByRowAttribute,
1365 NSAccessibilityDisclosureLevelAttribute, 1365 NSAccessibilityDisclosureLevelAttribute,
1366 NSAccessibilityDisclosedRowsAttribute, 1366 NSAccessibilityDisclosedRowsAttribute,
1367 nil]]; 1367 nil]];
1368 } else { 1368 } else {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1449 } 1449 }
1450 1450
1451 // Performs the given accessibilty action on the webkit accessibility object 1451 // Performs the given accessibilty action on the webkit accessibility object
1452 // that backs this object. 1452 // that backs this object.
1453 - (void)accessibilityPerformAction:(NSString*)action { 1453 - (void)accessibilityPerformAction:(NSString*)action {
1454 if (!browserAccessibility_) 1454 if (!browserAccessibility_)
1455 return; 1455 return;
1456 1456
1457 // TODO(feldstein): Support more actions. 1457 // TODO(feldstein): Support more actions.
1458 if ([action isEqualToString:NSAccessibilityPressAction]) 1458 if ([action isEqualToString:NSAccessibilityPressAction])
1459 [delegate_ doDefaultAction:browserAccessibility_->renderer_id()]; 1459 [delegate_ doDefaultAction:browserAccessibility_->GetId()];
1460 else if ([action isEqualToString:NSAccessibilityShowMenuAction]) 1460 else if ([action isEqualToString:NSAccessibilityShowMenuAction])
1461 [delegate_ performShowMenuAction:self]; 1461 [delegate_ performShowMenuAction:self];
1462 } 1462 }
1463 1463
1464 // Returns the description of the given action. 1464 // Returns the description of the given action.
1465 - (NSString*)accessibilityActionDescription:(NSString*)action { 1465 - (NSString*)accessibilityActionDescription:(NSString*)action {
1466 if (!browserAccessibility_) 1466 if (!browserAccessibility_)
1467 return nil; 1467 return nil;
1468 1468
1469 return NSAccessibilityActionDescription(action); 1469 return NSAccessibilityActionDescription(action);
1470 } 1470 }
1471 1471
1472 // Sets an override value for a specific accessibility attribute. 1472 // Sets an override value for a specific accessibility attribute.
1473 // This class does not support this. 1473 // This class does not support this.
1474 - (BOOL)accessibilitySetOverrideValue:(id)value 1474 - (BOOL)accessibilitySetOverrideValue:(id)value
1475 forAttribute:(NSString*)attribute { 1475 forAttribute:(NSString*)attribute {
1476 return NO; 1476 return NO;
1477 } 1477 }
1478 1478
1479 // Sets the value for an accessibility attribute via the accessibility API. 1479 // Sets the value for an accessibility attribute via the accessibility API.
1480 - (void)accessibilitySetValue:(id)value forAttribute:(NSString*)attribute { 1480 - (void)accessibilitySetValue:(id)value forAttribute:(NSString*)attribute {
1481 if (!browserAccessibility_) 1481 if (!browserAccessibility_)
1482 return; 1482 return;
1483 1483
1484 if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) { 1484 if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) {
1485 NSNumber* focusedNumber = value; 1485 NSNumber* focusedNumber = value;
1486 BOOL focused = [focusedNumber intValue]; 1486 BOOL focused = [focusedNumber intValue];
1487 [delegate_ setAccessibilityFocus:focused 1487 [delegate_ setAccessibilityFocus:focused
1488 accessibilityId:browserAccessibility_->renderer_id()]; 1488 accessibilityId:browserAccessibility_->GetId()];
1489 } 1489 }
1490 if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute]) { 1490 if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute]) {
1491 NSRange range = [(NSValue*)value rangeValue]; 1491 NSRange range = [(NSValue*)value rangeValue];
1492 [delegate_ 1492 [delegate_
1493 accessibilitySetTextSelection:browserAccessibility_->renderer_id() 1493 accessibilitySetTextSelection:browserAccessibility_->GetId()
1494 startOffset:range.location 1494 startOffset:range.location
1495 endOffset:range.location + range.length]; 1495 endOffset:range.location + range.length];
1496 } 1496 }
1497 } 1497 }
1498 1498
1499 // Returns the deepest accessibility child that should not be ignored. 1499 // Returns the deepest accessibility child that should not be ignored.
1500 // It is assumed that the hit test has been narrowed down to this object 1500 // It is assumed that the hit test has been narrowed down to this object
1501 // or one of its children, so this will never return nil unless this 1501 // or one of its children, so this will never return nil unless this
1502 // object is invalid. 1502 // object is invalid.
1503 - (id)accessibilityHitTest:(NSPoint)point { 1503 - (id)accessibilityHitTest:(NSPoint)point {
(...skipping 24 matching lines...) Expand all
1528 - (BOOL)isEqual:(id)object { 1528 - (BOOL)isEqual:(id)object {
1529 if (![object isKindOfClass:[BrowserAccessibilityCocoa class]]) 1529 if (![object isKindOfClass:[BrowserAccessibilityCocoa class]])
1530 return NO; 1530 return NO;
1531 return ([self hash] == [object hash]); 1531 return ([self hash] == [object hash]);
1532 } 1532 }
1533 1533
1534 - (NSUInteger)hash { 1534 - (NSUInteger)hash {
1535 // Potentially called during dealloc. 1535 // Potentially called during dealloc.
1536 if (!browserAccessibility_) 1536 if (!browserAccessibility_)
1537 return [super hash]; 1537 return [super hash];
1538 return browserAccessibility_->renderer_id(); 1538 return browserAccessibility_->GetId();
1539 } 1539 }
1540 1540
1541 - (BOOL)accessibilityShouldUseUniqueId { 1541 - (BOOL)accessibilityShouldUseUniqueId {
1542 return YES; 1542 return YES;
1543 } 1543 }
1544 1544
1545 @end 1545 @end
1546 1546
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698