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 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 { NSAccessibilityDescriptionAttribute, @"description" }, | 249 { NSAccessibilityDescriptionAttribute, @"description" }, |
250 { NSAccessibilityDisclosingAttribute, @"disclosing" }, | 250 { NSAccessibilityDisclosingAttribute, @"disclosing" }, |
251 { NSAccessibilityDisclosedByRowAttribute, @"disclosedByRow" }, | 251 { NSAccessibilityDisclosedByRowAttribute, @"disclosedByRow" }, |
252 { NSAccessibilityDisclosureLevelAttribute, @"disclosureLevel" }, | 252 { NSAccessibilityDisclosureLevelAttribute, @"disclosureLevel" }, |
253 { NSAccessibilityDisclosedRowsAttribute, @"disclosedRows" }, | 253 { NSAccessibilityDisclosedRowsAttribute, @"disclosedRows" }, |
254 { NSAccessibilityEnabledAttribute, @"enabled" }, | 254 { NSAccessibilityEnabledAttribute, @"enabled" }, |
255 { NSAccessibilityFocusedAttribute, @"focused" }, | 255 { NSAccessibilityFocusedAttribute, @"focused" }, |
256 { NSAccessibilityHeaderAttribute, @"header" }, | 256 { NSAccessibilityHeaderAttribute, @"header" }, |
257 { NSAccessibilityHelpAttribute, @"help" }, | 257 { NSAccessibilityHelpAttribute, @"help" }, |
258 { NSAccessibilityIndexAttribute, @"index" }, | 258 { NSAccessibilityIndexAttribute, @"index" }, |
| 259 { NSAccessibilityLinkedUIElementsAttribute, @"linkedUIElements" }, |
259 { NSAccessibilityMaxValueAttribute, @"maxValue" }, | 260 { NSAccessibilityMaxValueAttribute, @"maxValue" }, |
260 { NSAccessibilityMinValueAttribute, @"minValue" }, | 261 { NSAccessibilityMinValueAttribute, @"minValue" }, |
261 { NSAccessibilityNumberOfCharactersAttribute, @"numberOfCharacters" }, | 262 { NSAccessibilityNumberOfCharactersAttribute, @"numberOfCharacters" }, |
262 { NSAccessibilityOrientationAttribute, @"orientation" }, | 263 { NSAccessibilityOrientationAttribute, @"orientation" }, |
263 { NSAccessibilityParentAttribute, @"parent" }, | 264 { NSAccessibilityParentAttribute, @"parent" }, |
264 { NSAccessibilityPositionAttribute, @"position" }, | 265 { NSAccessibilityPositionAttribute, @"position" }, |
265 { NSAccessibilityRoleAttribute, @"role" }, | 266 { NSAccessibilityRoleAttribute, @"role" }, |
266 { NSAccessibilityRoleDescriptionAttribute, @"roleDescription" }, | 267 { NSAccessibilityRoleDescriptionAttribute, @"roleDescription" }, |
267 { NSAccessibilityRowHeaderUIElementsAttribute, @"rowHeaders" }, | 268 { NSAccessibilityRowHeaderUIElementsAttribute, @"rowHeaders" }, |
268 { NSAccessibilityRowIndexRangeAttribute, @"rowIndexRange" }, | 269 { NSAccessibilityRowIndexRangeAttribute, @"rowIndexRange" }, |
269 { NSAccessibilityRowsAttribute, @"rows" }, | 270 { NSAccessibilityRowsAttribute, @"rows" }, |
| 271 // TODO(aboxhall): expose NSAccessibilityServesAsTitleForUIElementsAttribute |
270 { NSAccessibilitySizeAttribute, @"size" }, | 272 { NSAccessibilitySizeAttribute, @"size" }, |
271 { NSAccessibilitySubroleAttribute, @"subrole" }, | 273 { NSAccessibilitySubroleAttribute, @"subrole" }, |
272 { NSAccessibilityTabsAttribute, @"tabs" }, | 274 { NSAccessibilityTabsAttribute, @"tabs" }, |
273 { NSAccessibilityTitleAttribute, @"title" }, | 275 { NSAccessibilityTitleAttribute, @"title" }, |
274 { NSAccessibilityTitleUIElementAttribute, @"titleUIElement" }, | 276 { NSAccessibilityTitleUIElementAttribute, @"titleUIElement" }, |
275 { NSAccessibilityTopLevelUIElementAttribute, @"window" }, | 277 { NSAccessibilityTopLevelUIElementAttribute, @"window" }, |
276 { NSAccessibilityURLAttribute, @"url" }, | 278 { NSAccessibilityURLAttribute, @"url" }, |
277 { NSAccessibilityValueAttribute, @"value" }, | 279 { NSAccessibilityValueAttribute, @"value" }, |
278 { NSAccessibilityValueDescriptionAttribute, @"valueDescription" }, | 280 { NSAccessibilityValueDescriptionAttribute, @"valueDescription" }, |
279 { NSAccessibilityVisibleCharacterRangeAttribute, @"visibleCharacterRange" }, | 281 { NSAccessibilityVisibleCharacterRangeAttribute, @"visibleCharacterRange" }, |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 if (!browserAccessibility_->GetHtmlAttribute("aria-invalid", &invalidUTF)) | 573 if (!browserAccessibility_->GetHtmlAttribute("aria-invalid", &invalidUTF)) |
572 return NULL; | 574 return NULL; |
573 NSString* invalid = base::SysUTF16ToNSString(invalidUTF); | 575 NSString* invalid = base::SysUTF16ToNSString(invalidUTF); |
574 if ([invalid isEqualToString:@"false"] || | 576 if ([invalid isEqualToString:@"false"] || |
575 [invalid isEqualToString:@""]) { | 577 [invalid isEqualToString:@""]) { |
576 return @"false"; | 578 return @"false"; |
577 } | 579 } |
578 return invalid; | 580 return invalid; |
579 } | 581 } |
580 | 582 |
| 583 - (void)addLinkedUIElementsFromAttribute:(ui::AXIntListAttribute)attribute |
| 584 addTo:(NSMutableArray*)outArray { |
| 585 const std::vector<int32>& attributeValues = |
| 586 browserAccessibility_->GetIntListAttribute(attribute); |
| 587 for (size_t i = 0; i < attributeValues.size(); ++i) { |
| 588 BrowserAccessibility* element = |
| 589 browserAccessibility_->manager()->GetFromRendererID(attributeValues[i]); |
| 590 if (element) |
| 591 [outArray addObject:element->ToBrowserAccessibilityCocoa()]; |
| 592 } |
| 593 } |
| 594 |
| 595 - (NSArray*)linkedUIElements { |
| 596 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; |
| 597 [self addLinkedUIElementsFromAttribute:ui::AX_ATTR_OWNS_IDS addTo:ret]; |
| 598 [self addLinkedUIElementsFromAttribute:ui::AX_ATTR_CONTROLS_IDS addTo:ret]; |
| 599 [self addLinkedUIElementsFromAttribute:ui::AX_ATTR_FLOWTO_IDS addTo:ret]; |
| 600 if ([ret count] == 0) |
| 601 return nil; |
| 602 return ret; |
| 603 } |
| 604 |
581 - (NSNumber*)loaded { | 605 - (NSNumber*)loaded { |
582 return [NSNumber numberWithBool:YES]; | 606 return [NSNumber numberWithBool:YES]; |
583 } | 607 } |
584 | 608 |
585 - (NSNumber*)loadingProgress { | 609 - (NSNumber*)loadingProgress { |
586 float floatValue = browserAccessibility_->GetFloatAttribute( | 610 float floatValue = browserAccessibility_->GetFloatAttribute( |
587 ui::AX_ATTR_DOC_LOADING_PROGRESS); | 611 ui::AX_ATTR_DOC_LOADING_PROGRESS); |
588 return [NSNumber numberWithFloat:floatValue]; | 612 return [NSNumber numberWithFloat:floatValue]; |
589 } | 613 } |
590 | 614 |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
844 | 868 |
845 - (id)titleUIElement { | 869 - (id)titleUIElement { |
846 int titleElementId; | 870 int titleElementId; |
847 if (browserAccessibility_->GetIntAttribute( | 871 if (browserAccessibility_->GetIntAttribute( |
848 ui::AX_ATTR_TITLE_UI_ELEMENT, &titleElementId)) { | 872 ui::AX_ATTR_TITLE_UI_ELEMENT, &titleElementId)) { |
849 BrowserAccessibility* titleElement = | 873 BrowserAccessibility* titleElement = |
850 browserAccessibility_->manager()->GetFromRendererID(titleElementId); | 874 browserAccessibility_->manager()->GetFromRendererID(titleElementId); |
851 if (titleElement) | 875 if (titleElement) |
852 return titleElement->ToBrowserAccessibilityCocoa(); | 876 return titleElement->ToBrowserAccessibilityCocoa(); |
853 } | 877 } |
| 878 std::vector<int32> labelledby_ids = |
| 879 browserAccessibility_->GetIntListAttribute(ui::AX_ATTR_LABELLEDBY_IDS); |
| 880 if (labelledby_ids.size() == 1) { |
| 881 BrowserAccessibility* titleElement = |
| 882 browserAccessibility_->manager()->GetFromRendererID(labelledby_ids[0]); |
| 883 if (titleElement) |
| 884 return titleElement->ToBrowserAccessibilityCocoa(); |
| 885 } |
| 886 |
854 return nil; | 887 return nil; |
855 } | 888 } |
856 | 889 |
857 - (NSString*)url { | 890 - (NSString*)url { |
858 StringAttribute urlAttribute = | 891 StringAttribute urlAttribute = |
859 [[self role] isEqualToString:@"AXWebArea"] ? | 892 [[self role] isEqualToString:@"AXWebArea"] ? |
860 ui::AX_ATTR_DOC_URL : | 893 ui::AX_ATTR_DOC_URL : |
861 ui::AX_ATTR_URL; | 894 ui::AX_ATTR_URL; |
862 return NSStringForStringAttribute(browserAccessibility_, urlAttribute); | 895 return NSStringForStringAttribute(browserAccessibility_, urlAttribute); |
863 } | 896 } |
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1235 if (!browserAccessibility_) | 1268 if (!browserAccessibility_) |
1236 return nil; | 1269 return nil; |
1237 | 1270 |
1238 // General attributes. | 1271 // General attributes. |
1239 NSMutableArray* ret = [NSMutableArray arrayWithObjects: | 1272 NSMutableArray* ret = [NSMutableArray arrayWithObjects: |
1240 NSAccessibilityChildrenAttribute, | 1273 NSAccessibilityChildrenAttribute, |
1241 NSAccessibilityDescriptionAttribute, | 1274 NSAccessibilityDescriptionAttribute, |
1242 NSAccessibilityEnabledAttribute, | 1275 NSAccessibilityEnabledAttribute, |
1243 NSAccessibilityFocusedAttribute, | 1276 NSAccessibilityFocusedAttribute, |
1244 NSAccessibilityHelpAttribute, | 1277 NSAccessibilityHelpAttribute, |
| 1278 NSAccessibilityLinkedUIElementsAttribute, |
1245 NSAccessibilityParentAttribute, | 1279 NSAccessibilityParentAttribute, |
1246 NSAccessibilityPositionAttribute, | 1280 NSAccessibilityPositionAttribute, |
1247 NSAccessibilityRoleAttribute, | 1281 NSAccessibilityRoleAttribute, |
1248 NSAccessibilityRoleDescriptionAttribute, | 1282 NSAccessibilityRoleDescriptionAttribute, |
1249 NSAccessibilitySizeAttribute, | 1283 NSAccessibilitySizeAttribute, |
1250 NSAccessibilitySubroleAttribute, | 1284 NSAccessibilitySubroleAttribute, |
1251 NSAccessibilityTitleAttribute, | 1285 NSAccessibilityTitleAttribute, |
1252 NSAccessibilityTopLevelUIElementAttribute, | 1286 NSAccessibilityTopLevelUIElementAttribute, |
1253 NSAccessibilityValueAttribute, | 1287 NSAccessibilityValueAttribute, |
1254 NSAccessibilityWindowAttribute, | 1288 NSAccessibilityWindowAttribute, |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1349 } | 1383 } |
1350 if (browserAccessibility_->HasStringAttribute( | 1384 if (browserAccessibility_->HasStringAttribute( |
1351 ui::AX_ATTR_CONTAINER_LIVE_STATUS)) { | 1385 ui::AX_ATTR_CONTAINER_LIVE_STATUS)) { |
1352 [ret addObjectsFromArray:[NSArray arrayWithObjects: | 1386 [ret addObjectsFromArray:[NSArray arrayWithObjects: |
1353 @"AXARIAAtomic", | 1387 @"AXARIAAtomic", |
1354 @"AXARIABusy", | 1388 @"AXARIABusy", |
1355 nil]]; | 1389 nil]]; |
1356 } | 1390 } |
1357 | 1391 |
1358 // Title UI Element. | 1392 // Title UI Element. |
1359 if (browserAccessibility_->HasIntAttribute( | 1393 if (browserAccessibility_->HasIntAttribute(ui::AX_ATTR_TITLE_UI_ELEMENT) || |
1360 ui::AX_ATTR_TITLE_UI_ELEMENT)) { | 1394 (browserAccessibility_->HasIntListAttribute(ui::AX_ATTR_LABELLEDBY_IDS) && |
| 1395 browserAccessibility_->GetIntListAttribute(ui::AX_ATTR_LABELLEDBY_IDS) |
| 1396 .size() == 1)) { |
1361 [ret addObjectsFromArray:[NSArray arrayWithObjects: | 1397 [ret addObjectsFromArray:[NSArray arrayWithObjects: |
1362 NSAccessibilityTitleUIElementAttribute, | 1398 NSAccessibilityTitleUIElementAttribute, |
1363 nil]]; | 1399 nil]]; |
1364 } | 1400 } |
| 1401 // TODO(aboxhall): expose NSAccessibilityServesAsTitleForUIElementsAttribute |
| 1402 // for elements which are referred to by labelledby or are labels |
1365 | 1403 |
1366 return ret; | 1404 return ret; |
1367 } | 1405 } |
1368 | 1406 |
1369 // Returns the index of the child in this objects array of children. | 1407 // Returns the index of the child in this objects array of children. |
1370 - (NSUInteger)accessibilityGetIndexOf:(id)child { | 1408 - (NSUInteger)accessibilityGetIndexOf:(id)child { |
1371 if (!browserAccessibility_) | 1409 if (!browserAccessibility_) |
1372 return nil; | 1410 return nil; |
1373 | 1411 |
1374 NSUInteger index = 0; | 1412 NSUInteger index = 0; |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1499 return [super hash]; | 1537 return [super hash]; |
1500 return browserAccessibility_->renderer_id(); | 1538 return browserAccessibility_->renderer_id(); |
1501 } | 1539 } |
1502 | 1540 |
1503 - (BOOL)accessibilityShouldUseUniqueId { | 1541 - (BOOL)accessibilityShouldUseUniqueId { |
1504 return YES; | 1542 return YES; |
1505 } | 1543 } |
1506 | 1544 |
1507 @end | 1545 @end |
1508 | 1546 |
OLD | NEW |