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 | 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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |