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

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

Powered by Google App Engine
This is Rietveld 408576698