Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 30 matching lines...) Expand all Loading... | |
| 41 struct MapEntry { | 41 struct MapEntry { |
| 42 WebAccessibility::Role webKitValue; | 42 WebAccessibility::Role webKitValue; |
| 43 NSString* nativeValue; | 43 NSString* nativeValue; |
| 44 }; | 44 }; |
| 45 | 45 |
| 46 struct AttributeToMethodNameEntry { | 46 struct AttributeToMethodNameEntry { |
| 47 NSString* attribute; | 47 NSString* attribute; |
| 48 NSString* methodName; | 48 NSString* methodName; |
| 49 }; | 49 }; |
| 50 | 50 |
| 51 static const MapEntry roles[] = { | 51 static const MapEntry roles[] = { |
|
Mark Mentovai
2011/11/07 22:34:15
While poking through here, I noticed…
This is bot
| |
| 52 { WebAccessibility::ROLE_ALERT, NSAccessibilityGroupRole }, | 52 { WebAccessibility::ROLE_ALERT, NSAccessibilityGroupRole }, |
| 53 { WebAccessibility::ROLE_ALERT_DIALOG, NSAccessibilityGroupRole }, | 53 { WebAccessibility::ROLE_ALERT_DIALOG, NSAccessibilityGroupRole }, |
| 54 { WebAccessibility::ROLE_ANNOTATION, NSAccessibilityUnknownRole }, | 54 { WebAccessibility::ROLE_ANNOTATION, NSAccessibilityUnknownRole }, |
| 55 { WebAccessibility::ROLE_APPLICATION, NSAccessibilityGroupRole }, | 55 { WebAccessibility::ROLE_APPLICATION, NSAccessibilityGroupRole }, |
| 56 { WebAccessibility::ROLE_ARTICLE, NSAccessibilityGroupRole }, | 56 { WebAccessibility::ROLE_ARTICLE, NSAccessibilityGroupRole }, |
| 57 { WebAccessibility::ROLE_BROWSER, NSAccessibilityBrowserRole }, | 57 { WebAccessibility::ROLE_BROWSER, NSAccessibilityBrowserRole }, |
| 58 { WebAccessibility::ROLE_BUSY_INDICATOR, NSAccessibilityBusyIndicatorRole }, | 58 { WebAccessibility::ROLE_BUSY_INDICATOR, NSAccessibilityBusyIndicatorRole }, |
| 59 { WebAccessibility::ROLE_BUTTON, NSAccessibilityButtonRole }, | 59 { WebAccessibility::ROLE_BUTTON, NSAccessibilityButtonRole }, |
| 60 { WebAccessibility::ROLE_CELL, @"AXCell" }, | 60 { WebAccessibility::ROLE_CELL, @"AXCell" }, |
| 61 { WebAccessibility::ROLE_CHECKBOX, NSAccessibilityCheckBoxRole }, | 61 { WebAccessibility::ROLE_CHECKBOX, NSAccessibilityCheckBoxRole }, |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 211 { @"AXVisited", @"visited" }, | 211 { @"AXVisited", @"visited" }, |
| 212 }; | 212 }; |
| 213 | 213 |
| 214 // GetState checks the bitmask used in webaccessibility.h to check | 214 // GetState checks the bitmask used in webaccessibility.h to check |
| 215 // if the given state was set on the accessibility object. | 215 // if the given state was set on the accessibility object. |
| 216 bool GetState(BrowserAccessibility* accessibility, int state) { | 216 bool GetState(BrowserAccessibility* accessibility, int state) { |
| 217 return ((accessibility->state() >> state) & 1); | 217 return ((accessibility->state() >> state) & 1); |
| 218 } | 218 } |
| 219 | 219 |
| 220 // A mapping of webkit roles to native roles. | 220 // A mapping of webkit roles to native roles. |
| 221 std::map<WebAccessibility::Role, NSString*> webAccessibilityToNativeRole; | 221 NSString* NativeRoleFromWebAccessibilityRole( |
| 222 const WebAccessibility::Role& role) { | |
| 223 CR_DEFINE_STATIC_LOCAL(std::map<WebAccessibility::Role, NSString*>, | |
| 224 webAccessibilityToNativeRole, ()); | |
|
Mark Mentovai
2011/11/07 22:34:15
This would properly be named web_accessibility_to_
Nico
2011/11/07 23:29:21
Done.
| |
| 225 if (webAccessibilityToNativeRole.empty()) { | |
|
Mark Mentovai
2011/11/07 22:34:15
I don’t like this pattern, because it treats “empt
Nico
2011/11/07 23:29:21
Done-ish
| |
| 226 for (size_t i = 0; i < arraysize(roles); ++i) { | |
| 227 webAccessibilityToNativeRole[roles[i].webKitValue] = roles[i].nativeValue; | |
| 228 } | |
| 229 } | |
| 230 | |
| 231 std::map<WebAccessibility::Role, NSString*>::iterator it = | |
| 232 webAccessibilityToNativeRole.find(role); | |
| 233 if (it != webAccessibilityToNativeRole.end()) | |
| 234 return it->second; | |
| 235 else | |
| 236 return NSAccessibilityUnknownRole; | |
| 237 } | |
| 238 | |
| 222 // A mapping of webkit roles to native subroles. | 239 // A mapping of webkit roles to native subroles. |
| 223 std::map<WebAccessibility::Role, NSString*> webAccessibilityToNativeSubrole; | 240 NSString* NativeSubroleFromWebAccessibilityRole( |
| 241 const WebAccessibility::Role& role) { | |
| 242 CR_DEFINE_STATIC_LOCAL(std::map<WebAccessibility::Role, NSString*>, | |
| 243 webAccessibilityToNativeSubrole, ()); | |
|
Mark Mentovai
2011/11/07 22:34:15
Same.
Nico
2011/11/07 23:29:21
Done.
| |
| 244 if (webAccessibilityToNativeSubrole.empty()) { | |
|
Mark Mentovai
2011/11/07 22:34:15
And same.
Nico
2011/11/07 23:29:21
Done.
| |
| 245 for (size_t i = 0; i < arraysize(subroles); ++i) { | |
| 246 webAccessibilityToNativeSubrole[subroles[i].webKitValue] = | |
| 247 subroles[i].nativeValue; | |
| 248 } | |
| 249 } | |
| 250 | |
| 251 std::map<WebAccessibility::Role, NSString*>::iterator it = | |
| 252 webAccessibilityToNativeSubrole.find(role); | |
| 253 if (it != webAccessibilityToNativeSubrole.end()) | |
| 254 return it->second; | |
| 255 else | |
| 256 return nil; | |
| 257 } | |
| 258 | |
| 224 // A mapping from an accessibility attribute to its method name. | 259 // A mapping from an accessibility attribute to its method name. |
| 225 NSDictionary* attributeToMethodNameMap = nil; | 260 NSDictionary* attributeToMethodNameMap = nil; |
| 226 | 261 |
| 227 } // namespace | 262 } // namespace |
| 228 | 263 |
| 229 @implementation BrowserAccessibilityCocoa | 264 @implementation BrowserAccessibilityCocoa |
| 230 | 265 |
| 231 + (void)initialize { | 266 + (void)initialize { |
| 232 const size_t numRoles = sizeof(roles) / sizeof(roles[0]); | |
| 233 for (size_t i = 0; i < numRoles; ++i) { | |
| 234 webAccessibilityToNativeRole[roles[i].webKitValue] = roles[i].nativeValue; | |
| 235 } | |
| 236 | |
| 237 const size_t numSubroles = sizeof(subroles) / sizeof(subroles[0]); | |
| 238 for (size_t i = 0; i < numSubroles; ++i) { | |
| 239 webAccessibilityToNativeSubrole[subroles[i].webKitValue] = | |
| 240 subroles[i].nativeValue; | |
| 241 } | |
| 242 | |
| 243 NSMutableDictionary* dict = [[NSMutableDictionary alloc] init]; | 267 NSMutableDictionary* dict = [[NSMutableDictionary alloc] init]; |
| 244 const size_t numAttributes = sizeof(attributeToMethodNameContainer) / | 268 const size_t numAttributes = sizeof(attributeToMethodNameContainer) / |
| 245 sizeof(attributeToMethodNameContainer[0]); | 269 sizeof(attributeToMethodNameContainer[0]); |
| 246 for (size_t i = 0; i < numAttributes; ++i) { | 270 for (size_t i = 0; i < numAttributes; ++i) { |
| 247 [dict setObject:attributeToMethodNameContainer[i].methodName | 271 [dict setObject:attributeToMethodNameContainer[i].methodName |
| 248 forKey:attributeToMethodNameContainer[i].attribute]; | 272 forKey:attributeToMethodNameContainer[i].attribute]; |
| 249 } | 273 } |
| 250 attributeToMethodNameMap = dict; | 274 attributeToMethodNameMap = dict; |
| 251 dict = nil; | 275 dict = nil; |
| 252 } | 276 } |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 443 return [NSNumber numberWithBool: | 467 return [NSNumber numberWithBool: |
| 444 GetState(browserAccessibility_, WebAccessibility::STATE_REQUIRED)]; | 468 GetState(browserAccessibility_, WebAccessibility::STATE_REQUIRED)]; |
| 445 } | 469 } |
| 446 | 470 |
| 447 // Returns a string indicating the role of this object. | 471 // Returns a string indicating the role of this object. |
| 448 - (NSString*)role { | 472 - (NSString*)role { |
| 449 WebAccessibility::Role browserAccessibilityRole = | 473 WebAccessibility::Role browserAccessibilityRole = |
| 450 static_cast<WebAccessibility::Role>( browserAccessibility_->role()); | 474 static_cast<WebAccessibility::Role>( browserAccessibility_->role()); |
| 451 | 475 |
| 452 // Roles that we only determine at runtime. | 476 // Roles that we only determine at runtime. |
| 453 std::map<WebAccessibility::Role, NSString*>::iterator it = | 477 return NativeRoleFromWebAccessibilityRole(browserAccessibilityRole); |
| 454 webAccessibilityToNativeRole.find(browserAccessibilityRole); | |
| 455 | |
| 456 if (it != webAccessibilityToNativeRole.end()) | |
| 457 return it->second; | |
| 458 else | |
| 459 return NSAccessibilityUnknownRole; | |
| 460 } | 478 } |
| 461 | 479 |
| 462 // Returns a string indicating the role description of this object. | 480 // Returns a string indicating the role description of this object. |
| 463 - (NSString*)roleDescription { | 481 - (NSString*)roleDescription { |
| 464 NSString* role = [self role]; | 482 NSString* role = [self role]; |
| 465 | 483 |
| 466 content::ContentClient* content_client = content::GetContentClient(); | 484 content::ContentClient* content_client = content::GetContentClient(); |
| 467 | 485 |
| 468 // The following descriptions are specific to webkit. | 486 // The following descriptions are specific to webkit. |
| 469 if ([role isEqualToString:@"AXWebArea"]) { | 487 if ([role isEqualToString:@"AXWebArea"]) { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 536 | 554 |
| 537 if (browserAccessibilityRole == WebAccessibility::ROLE_LIST) { | 555 if (browserAccessibilityRole == WebAccessibility::ROLE_LIST) { |
| 538 if ([htmlTag isEqualToString:@"ul"] || | 556 if ([htmlTag isEqualToString:@"ul"] || |
| 539 [htmlTag isEqualToString:@"ol"]) { | 557 [htmlTag isEqualToString:@"ol"]) { |
| 540 return @"AXContentList"; | 558 return @"AXContentList"; |
| 541 } else if ([htmlTag isEqualToString:@"dl"]) { | 559 } else if ([htmlTag isEqualToString:@"dl"]) { |
| 542 return @"AXDefinitionList"; | 560 return @"AXDefinitionList"; |
| 543 } | 561 } |
| 544 } | 562 } |
| 545 | 563 |
| 546 std::map<WebAccessibility::Role, NSString*>::iterator it = | 564 return NativeSubroleFromWebAccessibilityRole(browserAccessibilityRole); |
| 547 webAccessibilityToNativeSubrole.find(browserAccessibilityRole); | |
| 548 if (it != webAccessibilityToNativeSubrole.end()) | |
| 549 return it->second; | |
| 550 else | |
| 551 return nil; | |
| 552 } | 565 } |
| 553 | 566 |
| 554 // Returns all tabs in this subtree. | 567 // Returns all tabs in this subtree. |
| 555 - (NSArray*)tabs { | 568 - (NSArray*)tabs { |
| 556 NSMutableArray* tabSubtree = [[[NSMutableArray alloc] init] autorelease]; | 569 NSMutableArray* tabSubtree = [[[NSMutableArray alloc] init] autorelease]; |
| 557 | 570 |
| 558 if (browserAccessibility_->role() == WebAccessibility::ROLE_TAB) | 571 if (browserAccessibility_->role() == WebAccessibility::ROLE_TAB) |
| 559 [tabSubtree addObject:self]; | 572 [tabSubtree addObject:self]; |
| 560 | 573 |
| 561 for (uint i=0; i < [[self children] count]; ++i) { | 574 for (uint i=0; i < [[self children] count]; ++i) { |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 989 return [super hash]; | 1002 return [super hash]; |
| 990 return browserAccessibility_->renderer_id(); | 1003 return browserAccessibility_->renderer_id(); |
| 991 } | 1004 } |
| 992 | 1005 |
| 993 - (BOOL)accessibilityShouldUseUniqueId { | 1006 - (BOOL)accessibilityShouldUseUniqueId { |
| 994 return YES; | 1007 return YES; |
| 995 } | 1008 } |
| 996 | 1009 |
| 997 @end | 1010 @end |
| 998 | 1011 |
| OLD | NEW |