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 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |