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 |
| 11 #include "base/basictypes.h" |
11 #include "base/string16.h" | 12 #include "base/string16.h" |
12 #include "base/sys_string_conversions.h" | 13 #include "base/sys_string_conversions.h" |
13 #include "base/utf_string_conversions.h" | 14 #include "base/utf_string_conversions.h" |
14 #include "content/browser/accessibility/browser_accessibility_manager.h" | 15 #include "content/browser/accessibility/browser_accessibility_manager.h" |
15 #include "content/public/common/content_client.h" | 16 #include "content/public/common/content_client.h" |
16 #include "grit/webkit_strings.h" | 17 #include "grit/webkit_strings.h" |
17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h" | 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h" |
18 | 19 |
19 // See http://openradar.appspot.com/9896491. This SPI has been tested on 10.5, | 20 // See http://openradar.appspot.com/9896491. This SPI has been tested on 10.5, |
20 // 10.6, and 10.7. It allows accessibility clients to observe events posted on | 21 // 10.6, and 10.7. It allows accessibility clients to observe events posted on |
(...skipping 15 matching lines...) Expand all Loading... |
36 returnValue = base::SysUTF16ToNSString(iter->second); | 37 returnValue = base::SysUTF16ToNSString(iter->second); |
37 } | 38 } |
38 return returnValue; | 39 return returnValue; |
39 } | 40 } |
40 | 41 |
41 struct MapEntry { | 42 struct MapEntry { |
42 WebAccessibility::Role webKitValue; | 43 WebAccessibility::Role webKitValue; |
43 NSString* nativeValue; | 44 NSString* nativeValue; |
44 }; | 45 }; |
45 | 46 |
| 47 typedef std::map<WebAccessibility::Role, NSString*> RoleMap; |
| 48 |
46 struct AttributeToMethodNameEntry { | 49 struct AttributeToMethodNameEntry { |
47 NSString* attribute; | 50 NSString* attribute; |
48 NSString* methodName; | 51 NSString* methodName; |
49 }; | 52 }; |
50 | 53 |
51 static const MapEntry roles[] = { | 54 const AttributeToMethodNameEntry attributeToMethodNameContainer[] = { |
52 { WebAccessibility::ROLE_ALERT, NSAccessibilityGroupRole }, | |
53 { WebAccessibility::ROLE_ALERT_DIALOG, NSAccessibilityGroupRole }, | |
54 { WebAccessibility::ROLE_ANNOTATION, NSAccessibilityUnknownRole }, | |
55 { WebAccessibility::ROLE_APPLICATION, NSAccessibilityGroupRole }, | |
56 { WebAccessibility::ROLE_ARTICLE, NSAccessibilityGroupRole }, | |
57 { WebAccessibility::ROLE_BROWSER, NSAccessibilityBrowserRole }, | |
58 { WebAccessibility::ROLE_BUSY_INDICATOR, NSAccessibilityBusyIndicatorRole }, | |
59 { WebAccessibility::ROLE_BUTTON, NSAccessibilityButtonRole }, | |
60 { WebAccessibility::ROLE_CELL, @"AXCell" }, | |
61 { WebAccessibility::ROLE_CHECKBOX, NSAccessibilityCheckBoxRole }, | |
62 { WebAccessibility::ROLE_COLOR_WELL, NSAccessibilityColorWellRole }, | |
63 { WebAccessibility::ROLE_COLUMN, NSAccessibilityColumnRole }, | |
64 { WebAccessibility::ROLE_COLUMN_HEADER, @"AXCell" }, | |
65 { WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION, | |
66 NSAccessibilityGroupRole }, | |
67 { WebAccessibility::ROLE_DEFINITION_LIST_TERM, NSAccessibilityGroupRole }, | |
68 { WebAccessibility::ROLE_DIALOG, NSAccessibilityGroupRole }, | |
69 { WebAccessibility::ROLE_DIRECTORY, NSAccessibilityListRole }, | |
70 { WebAccessibility::ROLE_DISCLOSURE_TRIANGLE, | |
71 NSAccessibilityDisclosureTriangleRole }, | |
72 { WebAccessibility::ROLE_DOCUMENT, NSAccessibilityGroupRole }, | |
73 { WebAccessibility::ROLE_DRAWER, NSAccessibilityDrawerRole }, | |
74 { WebAccessibility::ROLE_EDITABLE_TEXT, NSAccessibilityTextFieldRole }, | |
75 { WebAccessibility::ROLE_GRID, NSAccessibilityGridRole }, | |
76 { WebAccessibility::ROLE_GROUP, NSAccessibilityGroupRole }, | |
77 { WebAccessibility::ROLE_GROW_AREA, NSAccessibilityGrowAreaRole }, | |
78 { WebAccessibility::ROLE_HEADING, @"AXHeading" }, | |
79 { WebAccessibility::ROLE_HELP_TAG, NSAccessibilityHelpTagRole }, | |
80 { WebAccessibility::ROLE_IGNORED, NSAccessibilityUnknownRole }, | |
81 { WebAccessibility::ROLE_IMAGE, NSAccessibilityImageRole }, | |
82 { WebAccessibility::ROLE_IMAGE_MAP, NSAccessibilityGroupRole }, | |
83 { WebAccessibility::ROLE_IMAGE_MAP_LINK, NSAccessibilityLinkRole }, | |
84 { WebAccessibility::ROLE_INCREMENTOR, NSAccessibilityIncrementorRole }, | |
85 { WebAccessibility::ROLE_LANDMARK_APPLICATION, NSAccessibilityGroupRole }, | |
86 { WebAccessibility::ROLE_LANDMARK_BANNER, NSAccessibilityGroupRole }, | |
87 { WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY, NSAccessibilityGroupRole }, | |
88 { WebAccessibility::ROLE_LANDMARK_CONTENTINFO, NSAccessibilityGroupRole }, | |
89 { WebAccessibility::ROLE_LANDMARK_MAIN, NSAccessibilityGroupRole }, | |
90 { WebAccessibility::ROLE_LANDMARK_NAVIGATION, NSAccessibilityGroupRole }, | |
91 { WebAccessibility::ROLE_LANDMARK_SEARCH, NSAccessibilityGroupRole }, | |
92 { WebAccessibility::ROLE_LINK, NSAccessibilityLinkRole }, | |
93 { WebAccessibility::ROLE_LIST, NSAccessibilityListRole }, | |
94 { WebAccessibility::ROLE_LIST_ITEM, NSAccessibilityGroupRole }, | |
95 { WebAccessibility::ROLE_LIST_MARKER, NSAccessibilityGroupRole }, | |
96 { WebAccessibility::ROLE_LISTBOX, NSAccessibilityListRole }, | |
97 { WebAccessibility::ROLE_LISTBOX_OPTION, NSAccessibilityGroupRole }, | |
98 { WebAccessibility::ROLE_LOG, NSAccessibilityGroupRole }, | |
99 { WebAccessibility::ROLE_MARQUEE, NSAccessibilityGroupRole }, | |
100 { WebAccessibility::ROLE_MATH, NSAccessibilityGroupRole }, | |
101 { WebAccessibility::ROLE_MATTE, NSAccessibilityMatteRole }, | |
102 { WebAccessibility::ROLE_MENU, NSAccessibilityMenuRole }, | |
103 { WebAccessibility::ROLE_MENU_ITEM, NSAccessibilityMenuItemRole }, | |
104 { WebAccessibility::ROLE_MENU_BUTTON, NSAccessibilityButtonRole }, | |
105 { WebAccessibility::ROLE_MENU_LIST_OPTION, NSAccessibilityMenuItemRole }, | |
106 { WebAccessibility::ROLE_MENU_LIST_POPUP, NSAccessibilityUnknownRole }, | |
107 { WebAccessibility::ROLE_NOTE, NSAccessibilityGroupRole }, | |
108 { WebAccessibility::ROLE_OUTLINE, NSAccessibilityOutlineRole }, | |
109 { WebAccessibility::ROLE_POPUP_BUTTON, NSAccessibilityPopUpButtonRole }, | |
110 { WebAccessibility::ROLE_PROGRESS_INDICATOR, | |
111 NSAccessibilityProgressIndicatorRole }, | |
112 { WebAccessibility::ROLE_RADIO_BUTTON, NSAccessibilityRadioButtonRole }, | |
113 { WebAccessibility::ROLE_RADIO_GROUP, NSAccessibilityRadioGroupRole }, | |
114 { WebAccessibility::ROLE_REGION, NSAccessibilityGroupRole }, | |
115 { WebAccessibility::ROLE_ROOT_WEB_AREA, @"AXWebArea" }, | |
116 { WebAccessibility::ROLE_ROW, NSAccessibilityRowRole }, | |
117 { WebAccessibility::ROLE_ROW_HEADER, @"AXCell" }, | |
118 { WebAccessibility::ROLE_RULER, NSAccessibilityRulerRole }, | |
119 { WebAccessibility::ROLE_RULER_MARKER, NSAccessibilityRulerMarkerRole }, | |
120 // TODO(dtseng): we don't correctly support the attributes for these roles. | |
121 // { WebAccessibility::ROLE_SCROLLAREA, NSAccessibilityScrollAreaRole }, | |
122 // { WebAccessibility::ROLE_SCROLLBAR, NSAccessibilityScrollBarRole }, | |
123 { WebAccessibility::ROLE_SHEET, NSAccessibilitySheetRole }, | |
124 { WebAccessibility::ROLE_SLIDER, NSAccessibilitySliderRole }, | |
125 { WebAccessibility::ROLE_SLIDER_THUMB, NSAccessibilityGroupRole }, | |
126 { WebAccessibility::ROLE_SPLITTER, NSAccessibilitySplitterRole }, | |
127 { WebAccessibility::ROLE_SPLIT_GROUP, NSAccessibilitySplitGroupRole }, | |
128 { WebAccessibility::ROLE_STATIC_TEXT, NSAccessibilityStaticTextRole }, | |
129 { WebAccessibility::ROLE_STATUS, NSAccessibilityGroupRole }, | |
130 { WebAccessibility::ROLE_SYSTEM_WIDE, NSAccessibilityUnknownRole }, | |
131 { WebAccessibility::ROLE_TAB, NSAccessibilityRadioButtonRole }, | |
132 { WebAccessibility::ROLE_TAB_LIST, NSAccessibilityTabGroupRole }, | |
133 { WebAccessibility::ROLE_TAB_PANEL, NSAccessibilityGroupRole }, | |
134 { WebAccessibility::ROLE_TABLE, NSAccessibilityTableRole }, | |
135 { WebAccessibility::ROLE_TABLE_HEADER_CONTAINER, NSAccessibilityGroupRole }, | |
136 { WebAccessibility::ROLE_TAB_GROUP, NSAccessibilityTabGroupRole }, | |
137 { WebAccessibility::ROLE_TEXTAREA, NSAccessibilityTextAreaRole }, | |
138 { WebAccessibility::ROLE_TEXT_FIELD, NSAccessibilityTextFieldRole }, | |
139 { WebAccessibility::ROLE_TIMER, NSAccessibilityGroupRole }, | |
140 { WebAccessibility::ROLE_TOOLBAR, NSAccessibilityToolbarRole }, | |
141 { WebAccessibility::ROLE_TOOLTIP, NSAccessibilityGroupRole }, | |
142 { WebAccessibility::ROLE_TREE, NSAccessibilityOutlineRole }, | |
143 { WebAccessibility::ROLE_TREE_GRID, NSAccessibilityTableRole }, | |
144 { WebAccessibility::ROLE_TREE_ITEM, NSAccessibilityRowRole }, | |
145 { WebAccessibility::ROLE_VALUE_INDICATOR, NSAccessibilityValueIndicatorRole }, | |
146 { WebAccessibility::ROLE_WEBCORE_LINK, NSAccessibilityLinkRole }, | |
147 { WebAccessibility::ROLE_WEB_AREA, @"AXWebArea" }, | |
148 { WebAccessibility::ROLE_WINDOW, NSAccessibilityUnknownRole }, | |
149 }; | |
150 | |
151 static const MapEntry subroles[] = { | |
152 { WebAccessibility::ROLE_ALERT, @"AXApplicationAlert" }, | |
153 { WebAccessibility::ROLE_ALERT_DIALOG, @"AXApplicationAlertDialog" }, | |
154 { WebAccessibility::ROLE_ARTICLE, @"AXDocumentArticle" }, | |
155 { WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION, @"AXDefinition" }, | |
156 { WebAccessibility::ROLE_DEFINITION_LIST_TERM, @"AXTerm" }, | |
157 { WebAccessibility::ROLE_DIALOG, @"AXApplicationDialog" }, | |
158 { WebAccessibility::ROLE_DOCUMENT, @"AXDocument" }, | |
159 { WebAccessibility::ROLE_LANDMARK_APPLICATION, @"AXLandmarkApplication" }, | |
160 { WebAccessibility::ROLE_LANDMARK_BANNER, @"AXLandmarkBanner" }, | |
161 { WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY, @"AXLandmarkComplementary" }, | |
162 { WebAccessibility::ROLE_LANDMARK_CONTENTINFO, @"AXLandmarkContentInfo" }, | |
163 { WebAccessibility::ROLE_LANDMARK_MAIN, @"AXLandmarkMain" }, | |
164 { WebAccessibility::ROLE_LANDMARK_NAVIGATION, @"AXLandmarkNavigation" }, | |
165 { WebAccessibility::ROLE_LANDMARK_SEARCH, @"AXLandmarkSearch" }, | |
166 { WebAccessibility::ROLE_LOG, @"AXApplicationLog" }, | |
167 { WebAccessibility::ROLE_MARQUEE, @"AXApplicationMarquee" }, | |
168 { WebAccessibility::ROLE_MATH, @"AXDocumentMath" }, | |
169 { WebAccessibility::ROLE_NOTE, @"AXDocumentNote" }, | |
170 { WebAccessibility::ROLE_REGION, @"AXDocumentRegion" }, | |
171 { WebAccessibility::ROLE_STATUS, @"AXApplicationStatus" }, | |
172 { WebAccessibility::ROLE_TAB_PANEL, @"AXTabPanel" }, | |
173 { WebAccessibility::ROLE_TIMER, @"AXApplicationTimer" }, | |
174 { WebAccessibility::ROLE_TOOLTIP, @"AXUserInterfaceTooltip" }, | |
175 { WebAccessibility::ROLE_TREE_ITEM, NSAccessibilityOutlineRowSubrole }, | |
176 }; | |
177 | |
178 static const AttributeToMethodNameEntry attributeToMethodNameContainer[] = { | |
179 { NSAccessibilityChildrenAttribute, @"children" }, | 55 { NSAccessibilityChildrenAttribute, @"children" }, |
180 { NSAccessibilityColumnsAttribute, @"columns" }, | 56 { NSAccessibilityColumnsAttribute, @"columns" }, |
181 { NSAccessibilityDescriptionAttribute, @"description" }, | 57 { NSAccessibilityDescriptionAttribute, @"description" }, |
182 { NSAccessibilityEnabledAttribute, @"enabled" }, | 58 { NSAccessibilityEnabledAttribute, @"enabled" }, |
183 { NSAccessibilityFocusedAttribute, @"focused" }, | 59 { NSAccessibilityFocusedAttribute, @"focused" }, |
184 { NSAccessibilityHelpAttribute, @"help" }, | 60 { NSAccessibilityHelpAttribute, @"help" }, |
185 { NSAccessibilityMaxValueAttribute, @"maxValue" }, | 61 { NSAccessibilityMaxValueAttribute, @"maxValue" }, |
186 { NSAccessibilityMinValueAttribute, @"minValue" }, | 62 { NSAccessibilityMinValueAttribute, @"minValue" }, |
187 { NSAccessibilityNumberOfCharactersAttribute, @"numberOfCharacters" }, | 63 { NSAccessibilityNumberOfCharactersAttribute, @"numberOfCharacters" }, |
188 { NSAccessibilityParentAttribute, @"parent" }, | 64 { NSAccessibilityParentAttribute, @"parent" }, |
(...skipping 21 matching lines...) Expand all Loading... |
210 { @"AXRequired", @"required" }, | 86 { @"AXRequired", @"required" }, |
211 { @"AXVisited", @"visited" }, | 87 { @"AXVisited", @"visited" }, |
212 }; | 88 }; |
213 | 89 |
214 // GetState checks the bitmask used in webaccessibility.h to check | 90 // GetState checks the bitmask used in webaccessibility.h to check |
215 // if the given state was set on the accessibility object. | 91 // if the given state was set on the accessibility object. |
216 bool GetState(BrowserAccessibility* accessibility, int state) { | 92 bool GetState(BrowserAccessibility* accessibility, int state) { |
217 return ((accessibility->state() >> state) & 1); | 93 return ((accessibility->state() >> state) & 1); |
218 } | 94 } |
219 | 95 |
| 96 RoleMap BuildRoleMap() { |
| 97 const MapEntry roles[] = { |
| 98 { WebAccessibility::ROLE_ALERT, NSAccessibilityGroupRole }, |
| 99 { WebAccessibility::ROLE_ALERT_DIALOG, NSAccessibilityGroupRole }, |
| 100 { WebAccessibility::ROLE_ANNOTATION, NSAccessibilityUnknownRole }, |
| 101 { WebAccessibility::ROLE_APPLICATION, NSAccessibilityGroupRole }, |
| 102 { WebAccessibility::ROLE_ARTICLE, NSAccessibilityGroupRole }, |
| 103 { WebAccessibility::ROLE_BROWSER, NSAccessibilityBrowserRole }, |
| 104 { WebAccessibility::ROLE_BUSY_INDICATOR, NSAccessibilityBusyIndicatorRole }, |
| 105 { WebAccessibility::ROLE_BUTTON, NSAccessibilityButtonRole }, |
| 106 { WebAccessibility::ROLE_CELL, @"AXCell" }, |
| 107 { WebAccessibility::ROLE_CHECKBOX, NSAccessibilityCheckBoxRole }, |
| 108 { WebAccessibility::ROLE_COLOR_WELL, NSAccessibilityColorWellRole }, |
| 109 { WebAccessibility::ROLE_COLUMN, NSAccessibilityColumnRole }, |
| 110 { WebAccessibility::ROLE_COLUMN_HEADER, @"AXCell" }, |
| 111 { WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION, |
| 112 NSAccessibilityGroupRole }, |
| 113 { WebAccessibility::ROLE_DEFINITION_LIST_TERM, NSAccessibilityGroupRole }, |
| 114 { WebAccessibility::ROLE_DIALOG, NSAccessibilityGroupRole }, |
| 115 { WebAccessibility::ROLE_DIRECTORY, NSAccessibilityListRole }, |
| 116 { WebAccessibility::ROLE_DISCLOSURE_TRIANGLE, |
| 117 NSAccessibilityDisclosureTriangleRole }, |
| 118 { WebAccessibility::ROLE_DOCUMENT, NSAccessibilityGroupRole }, |
| 119 { WebAccessibility::ROLE_DRAWER, NSAccessibilityDrawerRole }, |
| 120 { WebAccessibility::ROLE_EDITABLE_TEXT, NSAccessibilityTextFieldRole }, |
| 121 { WebAccessibility::ROLE_GRID, NSAccessibilityGridRole }, |
| 122 { WebAccessibility::ROLE_GROUP, NSAccessibilityGroupRole }, |
| 123 { WebAccessibility::ROLE_GROW_AREA, NSAccessibilityGrowAreaRole }, |
| 124 { WebAccessibility::ROLE_HEADING, @"AXHeading" }, |
| 125 { WebAccessibility::ROLE_HELP_TAG, NSAccessibilityHelpTagRole }, |
| 126 { WebAccessibility::ROLE_IGNORED, NSAccessibilityUnknownRole }, |
| 127 { WebAccessibility::ROLE_IMAGE, NSAccessibilityImageRole }, |
| 128 { WebAccessibility::ROLE_IMAGE_MAP, NSAccessibilityGroupRole }, |
| 129 { WebAccessibility::ROLE_IMAGE_MAP_LINK, NSAccessibilityLinkRole }, |
| 130 { WebAccessibility::ROLE_INCREMENTOR, NSAccessibilityIncrementorRole }, |
| 131 { WebAccessibility::ROLE_LANDMARK_APPLICATION, NSAccessibilityGroupRole }, |
| 132 { WebAccessibility::ROLE_LANDMARK_BANNER, NSAccessibilityGroupRole }, |
| 133 { WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY, NSAccessibilityGroupRole }, |
| 134 { WebAccessibility::ROLE_LANDMARK_CONTENTINFO, NSAccessibilityGroupRole }, |
| 135 { WebAccessibility::ROLE_LANDMARK_MAIN, NSAccessibilityGroupRole }, |
| 136 { WebAccessibility::ROLE_LANDMARK_NAVIGATION, NSAccessibilityGroupRole }, |
| 137 { WebAccessibility::ROLE_LANDMARK_SEARCH, NSAccessibilityGroupRole }, |
| 138 { WebAccessibility::ROLE_LINK, NSAccessibilityLinkRole }, |
| 139 { WebAccessibility::ROLE_LIST, NSAccessibilityListRole }, |
| 140 { WebAccessibility::ROLE_LIST_ITEM, NSAccessibilityGroupRole }, |
| 141 { WebAccessibility::ROLE_LIST_MARKER, NSAccessibilityGroupRole }, |
| 142 { WebAccessibility::ROLE_LISTBOX, NSAccessibilityListRole }, |
| 143 { WebAccessibility::ROLE_LISTBOX_OPTION, NSAccessibilityGroupRole }, |
| 144 { WebAccessibility::ROLE_LOG, NSAccessibilityGroupRole }, |
| 145 { WebAccessibility::ROLE_MARQUEE, NSAccessibilityGroupRole }, |
| 146 { WebAccessibility::ROLE_MATH, NSAccessibilityGroupRole }, |
| 147 { WebAccessibility::ROLE_MATTE, NSAccessibilityMatteRole }, |
| 148 { WebAccessibility::ROLE_MENU, NSAccessibilityMenuRole }, |
| 149 { WebAccessibility::ROLE_MENU_ITEM, NSAccessibilityMenuItemRole }, |
| 150 { WebAccessibility::ROLE_MENU_BUTTON, NSAccessibilityButtonRole }, |
| 151 { WebAccessibility::ROLE_MENU_LIST_OPTION, NSAccessibilityMenuItemRole }, |
| 152 { WebAccessibility::ROLE_MENU_LIST_POPUP, NSAccessibilityUnknownRole }, |
| 153 { WebAccessibility::ROLE_NOTE, NSAccessibilityGroupRole }, |
| 154 { WebAccessibility::ROLE_OUTLINE, NSAccessibilityOutlineRole }, |
| 155 { WebAccessibility::ROLE_POPUP_BUTTON, NSAccessibilityPopUpButtonRole }, |
| 156 { WebAccessibility::ROLE_PROGRESS_INDICATOR, |
| 157 NSAccessibilityProgressIndicatorRole }, |
| 158 { WebAccessibility::ROLE_RADIO_BUTTON, NSAccessibilityRadioButtonRole }, |
| 159 { WebAccessibility::ROLE_RADIO_GROUP, NSAccessibilityRadioGroupRole }, |
| 160 { WebAccessibility::ROLE_REGION, NSAccessibilityGroupRole }, |
| 161 { WebAccessibility::ROLE_ROOT_WEB_AREA, @"AXWebArea" }, |
| 162 { WebAccessibility::ROLE_ROW, NSAccessibilityRowRole }, |
| 163 { WebAccessibility::ROLE_ROW_HEADER, @"AXCell" }, |
| 164 { WebAccessibility::ROLE_RULER, NSAccessibilityRulerRole }, |
| 165 { WebAccessibility::ROLE_RULER_MARKER, NSAccessibilityRulerMarkerRole }, |
| 166 // TODO(dtseng): we don't correctly support the attributes for these roles. |
| 167 // { WebAccessibility::ROLE_SCROLLAREA, NSAccessibilityScrollAreaRole }, |
| 168 // { WebAccessibility::ROLE_SCROLLBAR, NSAccessibilityScrollBarRole }, |
| 169 { WebAccessibility::ROLE_SHEET, NSAccessibilitySheetRole }, |
| 170 { WebAccessibility::ROLE_SLIDER, NSAccessibilitySliderRole }, |
| 171 { WebAccessibility::ROLE_SLIDER_THUMB, NSAccessibilityGroupRole }, |
| 172 { WebAccessibility::ROLE_SPLITTER, NSAccessibilitySplitterRole }, |
| 173 { WebAccessibility::ROLE_SPLIT_GROUP, NSAccessibilitySplitGroupRole }, |
| 174 { WebAccessibility::ROLE_STATIC_TEXT, NSAccessibilityStaticTextRole }, |
| 175 { WebAccessibility::ROLE_STATUS, NSAccessibilityGroupRole }, |
| 176 { WebAccessibility::ROLE_SYSTEM_WIDE, NSAccessibilityUnknownRole }, |
| 177 { WebAccessibility::ROLE_TAB, NSAccessibilityRadioButtonRole }, |
| 178 { WebAccessibility::ROLE_TAB_LIST, NSAccessibilityTabGroupRole }, |
| 179 { WebAccessibility::ROLE_TAB_PANEL, NSAccessibilityGroupRole }, |
| 180 { WebAccessibility::ROLE_TABLE, NSAccessibilityTableRole }, |
| 181 { WebAccessibility::ROLE_TABLE_HEADER_CONTAINER, NSAccessibilityGroupRole }, |
| 182 { WebAccessibility::ROLE_TAB_GROUP, NSAccessibilityTabGroupRole }, |
| 183 { WebAccessibility::ROLE_TEXTAREA, NSAccessibilityTextAreaRole }, |
| 184 { WebAccessibility::ROLE_TEXT_FIELD, NSAccessibilityTextFieldRole }, |
| 185 { WebAccessibility::ROLE_TIMER, NSAccessibilityGroupRole }, |
| 186 { WebAccessibility::ROLE_TOOLBAR, NSAccessibilityToolbarRole }, |
| 187 { WebAccessibility::ROLE_TOOLTIP, NSAccessibilityGroupRole }, |
| 188 { WebAccessibility::ROLE_TREE, NSAccessibilityOutlineRole }, |
| 189 { WebAccessibility::ROLE_TREE_GRID, NSAccessibilityTableRole }, |
| 190 { WebAccessibility::ROLE_TREE_ITEM, NSAccessibilityRowRole }, |
| 191 { WebAccessibility::ROLE_VALUE_INDICATOR, |
| 192 NSAccessibilityValueIndicatorRole }, |
| 193 { WebAccessibility::ROLE_WEBCORE_LINK, NSAccessibilityLinkRole }, |
| 194 { WebAccessibility::ROLE_WEB_AREA, @"AXWebArea" }, |
| 195 { WebAccessibility::ROLE_WINDOW, NSAccessibilityUnknownRole }, |
| 196 }; |
| 197 |
| 198 RoleMap role_map; |
| 199 for (size_t i = 0; i < arraysize(roles); ++i) |
| 200 role_map[roles[i].webKitValue] = roles[i].nativeValue; |
| 201 return role_map; |
| 202 } |
| 203 |
220 // A mapping of webkit roles to native roles. | 204 // A mapping of webkit roles to native roles. |
221 std::map<WebAccessibility::Role, NSString*> webAccessibilityToNativeRole; | 205 NSString* NativeRoleFromWebAccessibilityRole( |
| 206 const WebAccessibility::Role& role) { |
| 207 CR_DEFINE_STATIC_LOCAL(RoleMap, web_accessibility_to_native_role, |
| 208 (BuildRoleMap())); |
| 209 RoleMap::iterator it = web_accessibility_to_native_role.find(role); |
| 210 if (it != web_accessibility_to_native_role.end()) |
| 211 return it->second; |
| 212 else |
| 213 return NSAccessibilityUnknownRole; |
| 214 } |
| 215 |
| 216 RoleMap BuildSubroleMap() { |
| 217 const MapEntry subroles[] = { |
| 218 { WebAccessibility::ROLE_ALERT, @"AXApplicationAlert" }, |
| 219 { WebAccessibility::ROLE_ALERT_DIALOG, @"AXApplicationAlertDialog" }, |
| 220 { WebAccessibility::ROLE_ARTICLE, @"AXDocumentArticle" }, |
| 221 { WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION, @"AXDefinition" }, |
| 222 { WebAccessibility::ROLE_DEFINITION_LIST_TERM, @"AXTerm" }, |
| 223 { WebAccessibility::ROLE_DIALOG, @"AXApplicationDialog" }, |
| 224 { WebAccessibility::ROLE_DOCUMENT, @"AXDocument" }, |
| 225 { WebAccessibility::ROLE_LANDMARK_APPLICATION, @"AXLandmarkApplication" }, |
| 226 { WebAccessibility::ROLE_LANDMARK_BANNER, @"AXLandmarkBanner" }, |
| 227 { WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY, |
| 228 @"AXLandmarkComplementary" }, |
| 229 { WebAccessibility::ROLE_LANDMARK_CONTENTINFO, @"AXLandmarkContentInfo" }, |
| 230 { WebAccessibility::ROLE_LANDMARK_MAIN, @"AXLandmarkMain" }, |
| 231 { WebAccessibility::ROLE_LANDMARK_NAVIGATION, @"AXLandmarkNavigation" }, |
| 232 { WebAccessibility::ROLE_LANDMARK_SEARCH, @"AXLandmarkSearch" }, |
| 233 { WebAccessibility::ROLE_LOG, @"AXApplicationLog" }, |
| 234 { WebAccessibility::ROLE_MARQUEE, @"AXApplicationMarquee" }, |
| 235 { WebAccessibility::ROLE_MATH, @"AXDocumentMath" }, |
| 236 { WebAccessibility::ROLE_NOTE, @"AXDocumentNote" }, |
| 237 { WebAccessibility::ROLE_REGION, @"AXDocumentRegion" }, |
| 238 { WebAccessibility::ROLE_STATUS, @"AXApplicationStatus" }, |
| 239 { WebAccessibility::ROLE_TAB_PANEL, @"AXTabPanel" }, |
| 240 { WebAccessibility::ROLE_TIMER, @"AXApplicationTimer" }, |
| 241 { WebAccessibility::ROLE_TOOLTIP, @"AXUserInterfaceTooltip" }, |
| 242 { WebAccessibility::ROLE_TREE_ITEM, NSAccessibilityOutlineRowSubrole }, |
| 243 }; |
| 244 |
| 245 RoleMap subrole_map; |
| 246 for (size_t i = 0; i < arraysize(subroles); ++i) |
| 247 subrole_map[subroles[i].webKitValue] = subroles[i].nativeValue; |
| 248 return subrole_map; |
| 249 } |
| 250 |
222 // A mapping of webkit roles to native subroles. | 251 // A mapping of webkit roles to native subroles. |
223 std::map<WebAccessibility::Role, NSString*> webAccessibilityToNativeSubrole; | 252 NSString* NativeSubroleFromWebAccessibilityRole( |
| 253 const WebAccessibility::Role& role) { |
| 254 CR_DEFINE_STATIC_LOCAL(RoleMap, web_accessibility_to_native_subrole, |
| 255 (BuildSubroleMap())); |
| 256 RoleMap::iterator it = web_accessibility_to_native_subrole.find(role); |
| 257 if (it != web_accessibility_to_native_subrole.end()) |
| 258 return it->second; |
| 259 else |
| 260 return nil; |
| 261 } |
| 262 |
224 // A mapping from an accessibility attribute to its method name. | 263 // A mapping from an accessibility attribute to its method name. |
225 NSDictionary* attributeToMethodNameMap = nil; | 264 NSDictionary* attributeToMethodNameMap = nil; |
226 | 265 |
227 } // namespace | 266 } // namespace |
228 | 267 |
229 @implementation BrowserAccessibilityCocoa | 268 @implementation BrowserAccessibilityCocoa |
230 | 269 |
231 + (void)initialize { | 270 + (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]; | 271 NSMutableDictionary* dict = [[NSMutableDictionary alloc] init]; |
244 const size_t numAttributes = sizeof(attributeToMethodNameContainer) / | 272 const size_t numAttributes = sizeof(attributeToMethodNameContainer) / |
245 sizeof(attributeToMethodNameContainer[0]); | 273 sizeof(attributeToMethodNameContainer[0]); |
246 for (size_t i = 0; i < numAttributes; ++i) { | 274 for (size_t i = 0; i < numAttributes; ++i) { |
247 [dict setObject:attributeToMethodNameContainer[i].methodName | 275 [dict setObject:attributeToMethodNameContainer[i].methodName |
248 forKey:attributeToMethodNameContainer[i].attribute]; | 276 forKey:attributeToMethodNameContainer[i].attribute]; |
249 } | 277 } |
250 attributeToMethodNameMap = dict; | 278 attributeToMethodNameMap = dict; |
251 dict = nil; | 279 dict = nil; |
252 } | 280 } |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
443 return [NSNumber numberWithBool: | 471 return [NSNumber numberWithBool: |
444 GetState(browserAccessibility_, WebAccessibility::STATE_REQUIRED)]; | 472 GetState(browserAccessibility_, WebAccessibility::STATE_REQUIRED)]; |
445 } | 473 } |
446 | 474 |
447 // Returns a string indicating the role of this object. | 475 // Returns a string indicating the role of this object. |
448 - (NSString*)role { | 476 - (NSString*)role { |
449 WebAccessibility::Role browserAccessibilityRole = | 477 WebAccessibility::Role browserAccessibilityRole = |
450 static_cast<WebAccessibility::Role>( browserAccessibility_->role()); | 478 static_cast<WebAccessibility::Role>( browserAccessibility_->role()); |
451 | 479 |
452 // Roles that we only determine at runtime. | 480 // Roles that we only determine at runtime. |
453 std::map<WebAccessibility::Role, NSString*>::iterator it = | 481 return NativeRoleFromWebAccessibilityRole(browserAccessibilityRole); |
454 webAccessibilityToNativeRole.find(browserAccessibilityRole); | |
455 | |
456 if (it != webAccessibilityToNativeRole.end()) | |
457 return it->second; | |
458 else | |
459 return NSAccessibilityUnknownRole; | |
460 } | 482 } |
461 | 483 |
462 // Returns a string indicating the role description of this object. | 484 // Returns a string indicating the role description of this object. |
463 - (NSString*)roleDescription { | 485 - (NSString*)roleDescription { |
464 NSString* role = [self role]; | 486 NSString* role = [self role]; |
465 | 487 |
466 content::ContentClient* content_client = content::GetContentClient(); | 488 content::ContentClient* content_client = content::GetContentClient(); |
467 | 489 |
468 // The following descriptions are specific to webkit. | 490 // The following descriptions are specific to webkit. |
469 if ([role isEqualToString:@"AXWebArea"]) { | 491 if ([role isEqualToString:@"AXWebArea"]) { |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 | 558 |
537 if (browserAccessibilityRole == WebAccessibility::ROLE_LIST) { | 559 if (browserAccessibilityRole == WebAccessibility::ROLE_LIST) { |
538 if ([htmlTag isEqualToString:@"ul"] || | 560 if ([htmlTag isEqualToString:@"ul"] || |
539 [htmlTag isEqualToString:@"ol"]) { | 561 [htmlTag isEqualToString:@"ol"]) { |
540 return @"AXContentList"; | 562 return @"AXContentList"; |
541 } else if ([htmlTag isEqualToString:@"dl"]) { | 563 } else if ([htmlTag isEqualToString:@"dl"]) { |
542 return @"AXDefinitionList"; | 564 return @"AXDefinitionList"; |
543 } | 565 } |
544 } | 566 } |
545 | 567 |
546 std::map<WebAccessibility::Role, NSString*>::iterator it = | 568 return NativeSubroleFromWebAccessibilityRole(browserAccessibilityRole); |
547 webAccessibilityToNativeSubrole.find(browserAccessibilityRole); | |
548 if (it != webAccessibilityToNativeSubrole.end()) | |
549 return it->second; | |
550 else | |
551 return nil; | |
552 } | 569 } |
553 | 570 |
554 // Returns all tabs in this subtree. | 571 // Returns all tabs in this subtree. |
555 - (NSArray*)tabs { | 572 - (NSArray*)tabs { |
556 NSMutableArray* tabSubtree = [[[NSMutableArray alloc] init] autorelease]; | 573 NSMutableArray* tabSubtree = [[[NSMutableArray alloc] init] autorelease]; |
557 | 574 |
558 if (browserAccessibility_->role() == WebAccessibility::ROLE_TAB) | 575 if (browserAccessibility_->role() == WebAccessibility::ROLE_TAB) |
559 [tabSubtree addObject:self]; | 576 [tabSubtree addObject:self]; |
560 | 577 |
561 for (uint i=0; i < [[self children] count]; ++i) { | 578 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]; | 1006 return [super hash]; |
990 return browserAccessibility_->renderer_id(); | 1007 return browserAccessibility_->renderer_id(); |
991 } | 1008 } |
992 | 1009 |
993 - (BOOL)accessibilityShouldUseUniqueId { | 1010 - (BOOL)accessibilityShouldUseUniqueId { |
994 return YES; | 1011 return YES; |
995 } | 1012 } |
996 | 1013 |
997 @end | 1014 @end |
998 | 1015 |
OLD | NEW |