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 |