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 "content/browser/accessibility/accessibility_tree_formatter_utils_win.h
" | 5 #include "content/browser/accessibility/accessibility_tree_formatter_utils_win.h
" |
6 | 6 |
7 #include <oleacc.h> | 7 #include <oleacc.h> |
8 | 8 |
9 #include <map> | 9 #include <map> |
10 #include <string> | 10 #include <string> |
11 | 11 |
12 #include "base/memory/singleton.h" | 12 #include "base/memory/singleton.h" |
13 #include "base/strings/string_util.h" | 13 #include "base/strings/string_util.h" |
14 #include "third_party/iaccessible2/ia2_api_all.h" | 14 #include "third_party/iaccessible2/ia2_api_all.h" |
15 | 15 |
16 namespace content { | 16 namespace content { |
17 namespace { | 17 namespace { |
18 | 18 |
19 class AccessibilityEnumMap { | 19 class AccessibilityRoleStateMap { |
20 public: | 20 public: |
21 static AccessibilityEnumMap* GetInstance(); | 21 static AccessibilityRoleStateMap* GetInstance(); |
22 | 22 |
23 std::map<int32, base::string16> ia_role_string_map; | 23 std::map<int32, base::string16> ia_role_string_map; |
24 std::map<int32, base::string16> ia2_role_string_map; | 24 std::map<int32, base::string16> ia2_role_string_map; |
25 std::map<int32, base::string16> ia_state_string_map; | 25 std::map<int32, base::string16> ia_state_string_map; |
26 std::map<int32, base::string16> ia2_state_string_map; | 26 std::map<int32, base::string16> ia2_state_string_map; |
27 std::map<int32, base::string16> event_string_map; | |
28 | 27 |
29 private: | 28 private: |
30 AccessibilityEnumMap(); | 29 AccessibilityRoleStateMap(); |
31 virtual ~AccessibilityEnumMap() {} | 30 virtual ~AccessibilityRoleStateMap() {} |
32 | 31 |
33 friend struct DefaultSingletonTraits<AccessibilityEnumMap>; | 32 friend struct DefaultSingletonTraits<AccessibilityRoleStateMap>; |
34 | 33 |
35 DISALLOW_COPY_AND_ASSIGN(AccessibilityEnumMap); | 34 DISALLOW_COPY_AND_ASSIGN(AccessibilityRoleStateMap); |
36 }; | 35 }; |
37 | 36 |
38 // static | 37 // static |
39 AccessibilityEnumMap* AccessibilityEnumMap::GetInstance() { | 38 AccessibilityRoleStateMap* AccessibilityRoleStateMap::GetInstance() { |
40 return Singleton<AccessibilityEnumMap, | 39 return Singleton<AccessibilityRoleStateMap, |
41 LeakySingletonTraits<AccessibilityEnumMap> >::get(); | 40 LeakySingletonTraits<AccessibilityRoleStateMap> >::get(); |
42 } | 41 } |
43 | 42 |
44 AccessibilityEnumMap::AccessibilityEnumMap() { | 43 AccessibilityRoleStateMap::AccessibilityRoleStateMap() { |
45 // Convenience macros for generating readable strings. | 44 // Convenience macros for generating readable strings. |
46 #define IA_ROLE_MAP(x) ia_role_string_map[x] = L###x; \ | 45 #define IA_ROLE_MAP(x) ia_role_string_map[x] = L###x; \ |
47 ia2_role_string_map[x] = L###x; | 46 ia2_role_string_map[x] = L###x; |
48 #define IA2_ROLE_MAP(x) ia2_role_string_map[x] = L###x; | 47 #define IA2_ROLE_MAP(x) ia2_role_string_map[x] = L###x; |
49 #define IA_STATE_MAP(x) ia_state_string_map[STATE_SYSTEM_##x] = L###x; | 48 #define IA_STATE_MAP(x) ia_state_string_map[STATE_SYSTEM_##x] = L###x; |
50 #define IA2_STATE_MAP(x) ia2_state_string_map[x] = L###x; | 49 #define IA2_STATE_MAP(x) ia2_state_string_map[x] = L###x; |
51 #define EVENT_MAP(x) event_string_map[x] = L###x; | |
52 | 50 |
53 // MSAA / IAccessible roles. Each one of these is also a valid | 51 // MSAA / IAccessible roles. Each one of these is also a valid |
54 // IAccessible2 role, the IA_ROLE_MAP macro adds it to both. | 52 // IAccessible2 role, the IA_ROLE_MAP macro adds it to both. |
55 IA_ROLE_MAP(ROLE_SYSTEM_ALERT) | 53 IA_ROLE_MAP(ROLE_SYSTEM_ALERT) |
56 IA_ROLE_MAP(ROLE_SYSTEM_ANIMATION) | 54 IA_ROLE_MAP(ROLE_SYSTEM_ANIMATION) |
57 IA_ROLE_MAP(ROLE_SYSTEM_APPLICATION) | 55 IA_ROLE_MAP(ROLE_SYSTEM_APPLICATION) |
58 IA_ROLE_MAP(ROLE_SYSTEM_BORDER) | 56 IA_ROLE_MAP(ROLE_SYSTEM_BORDER) |
59 IA_ROLE_MAP(ROLE_SYSTEM_BUTTONDROPDOWN) | 57 IA_ROLE_MAP(ROLE_SYSTEM_BUTTONDROPDOWN) |
60 IA_ROLE_MAP(ROLE_SYSTEM_BUTTONDROPDOWNGRID) | 58 IA_ROLE_MAP(ROLE_SYSTEM_BUTTONDROPDOWNGRID) |
61 IA_ROLE_MAP(ROLE_SYSTEM_BUTTONMENU) | 59 IA_ROLE_MAP(ROLE_SYSTEM_BUTTONMENU) |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 IA2_STATE_MAP(IA2_STATE_SELECTABLE_TEXT) | 210 IA2_STATE_MAP(IA2_STATE_SELECTABLE_TEXT) |
213 IA2_STATE_MAP(IA2_STATE_SINGLE_LINE) | 211 IA2_STATE_MAP(IA2_STATE_SINGLE_LINE) |
214 IA2_STATE_MAP(IA2_STATE_STALE) | 212 IA2_STATE_MAP(IA2_STATE_STALE) |
215 IA2_STATE_MAP(IA2_STATE_SUPPORTS_AUTOCOMPLETION) | 213 IA2_STATE_MAP(IA2_STATE_SUPPORTS_AUTOCOMPLETION) |
216 IA2_STATE_MAP(IA2_STATE_TRANSIENT) | 214 IA2_STATE_MAP(IA2_STATE_TRANSIENT) |
217 IA2_STATE_MAP(IA2_STATE_VERTICAL) | 215 IA2_STATE_MAP(IA2_STATE_VERTICAL) |
218 | 216 |
219 // Untested states include those that would be repeated on nearly every node, | 217 // Untested states include those that would be repeated on nearly every node, |
220 // or would vary based on window size. | 218 // or would vary based on window size. |
221 // IA2_STATE_MAP(IA2_STATE_OPAQUE) // Untested. | 219 // IA2_STATE_MAP(IA2_STATE_OPAQUE) // Untested. |
222 | |
223 EVENT_MAP(EVENT_OBJECT_CREATE) | |
224 EVENT_MAP(EVENT_OBJECT_DESTROY) | |
225 EVENT_MAP(EVENT_OBJECT_SHOW) | |
226 EVENT_MAP(EVENT_OBJECT_HIDE) | |
227 EVENT_MAP(EVENT_OBJECT_REORDER) | |
228 EVENT_MAP(EVENT_OBJECT_FOCUS) | |
229 EVENT_MAP(EVENT_OBJECT_SELECTION) | |
230 EVENT_MAP(EVENT_OBJECT_SELECTIONADD) | |
231 EVENT_MAP(EVENT_OBJECT_SELECTIONREMOVE) | |
232 EVENT_MAP(EVENT_OBJECT_SELECTIONWITHIN) | |
233 EVENT_MAP(EVENT_OBJECT_STATECHANGE) | |
234 EVENT_MAP(EVENT_OBJECT_LOCATIONCHANGE) | |
235 EVENT_MAP(EVENT_OBJECT_NAMECHANGE) | |
236 EVENT_MAP(EVENT_OBJECT_DESCRIPTIONCHANGE) | |
237 EVENT_MAP(EVENT_OBJECT_VALUECHANGE) | |
238 EVENT_MAP(EVENT_OBJECT_PARENTCHANGE) | |
239 EVENT_MAP(EVENT_OBJECT_HELPCHANGE) | |
240 EVENT_MAP(EVENT_OBJECT_DEFACTIONCHANGE) | |
241 EVENT_MAP(EVENT_OBJECT_ACCELERATORCHANGE) | |
242 EVENT_MAP(EVENT_OBJECT_INVOKED) | |
243 EVENT_MAP(EVENT_OBJECT_TEXTSELECTIONCHANGED) | |
244 EVENT_MAP(EVENT_OBJECT_CONTENTSCROLLED) | |
245 EVENT_MAP(EVENT_OBJECT_LIVEREGIONCHANGED) | |
246 EVENT_MAP(EVENT_OBJECT_HOSTEDOBJECTSINVALIDATED) | |
247 EVENT_MAP(EVENT_OBJECT_DRAGSTART) | |
248 EVENT_MAP(EVENT_OBJECT_DRAGCANCEL) | |
249 EVENT_MAP(EVENT_OBJECT_DRAGCOMPLETE) | |
250 EVENT_MAP(EVENT_OBJECT_DRAGENTER) | |
251 EVENT_MAP(EVENT_OBJECT_DRAGLEAVE) | |
252 EVENT_MAP(EVENT_OBJECT_DRAGDROPPED) | |
253 EVENT_MAP(EVENT_SYSTEM_ALERT) | |
254 EVENT_MAP(EVENT_SYSTEM_SCROLLINGSTART) | |
255 EVENT_MAP(EVENT_SYSTEM_SCROLLINGEND) | |
256 EVENT_MAP(IA2_EVENT_ACTION_CHANGED) | |
257 EVENT_MAP(IA2_EVENT_ACTIVE_DECENDENT_CHANGED) | |
258 EVENT_MAP(IA2_EVENT_ACTIVE_DESCENDANT_CHANGED) | |
259 EVENT_MAP(IA2_EVENT_DOCUMENT_ATTRIBUTE_CHANGED) | |
260 EVENT_MAP(IA2_EVENT_DOCUMENT_CONTENT_CHANGED) | |
261 EVENT_MAP(IA2_EVENT_DOCUMENT_LOAD_COMPLETE) | |
262 EVENT_MAP(IA2_EVENT_DOCUMENT_LOAD_STOPPED) | |
263 EVENT_MAP(IA2_EVENT_DOCUMENT_RELOAD) | |
264 EVENT_MAP(IA2_EVENT_HYPERLINK_END_INDEX_CHANGED) | |
265 EVENT_MAP(IA2_EVENT_HYPERLINK_NUMBER_OF_ANCHORS_CHANGED) | |
266 EVENT_MAP(IA2_EVENT_HYPERLINK_SELECTED_LINK_CHANGED) | |
267 EVENT_MAP(IA2_EVENT_HYPERTEXT_LINK_ACTIVATED) | |
268 EVENT_MAP(IA2_EVENT_HYPERTEXT_LINK_SELECTED) | |
269 EVENT_MAP(IA2_EVENT_HYPERLINK_START_INDEX_CHANGED) | |
270 EVENT_MAP(IA2_EVENT_HYPERTEXT_CHANGED) | |
271 EVENT_MAP(IA2_EVENT_HYPERTEXT_NLINKS_CHANGED) | |
272 EVENT_MAP(IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED) | |
273 EVENT_MAP(IA2_EVENT_PAGE_CHANGED) | |
274 EVENT_MAP(IA2_EVENT_SECTION_CHANGED) | |
275 EVENT_MAP(IA2_EVENT_TABLE_CAPTION_CHANGED) | |
276 EVENT_MAP(IA2_EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED) | |
277 EVENT_MAP(IA2_EVENT_TABLE_COLUMN_HEADER_CHANGED) | |
278 EVENT_MAP(IA2_EVENT_TABLE_MODEL_CHANGED) | |
279 EVENT_MAP(IA2_EVENT_TABLE_ROW_DESCRIPTION_CHANGED) | |
280 EVENT_MAP(IA2_EVENT_TABLE_ROW_HEADER_CHANGED) | |
281 EVENT_MAP(IA2_EVENT_TABLE_SUMMARY_CHANGED) | |
282 EVENT_MAP(IA2_EVENT_TEXT_ATTRIBUTE_CHANGED) | |
283 EVENT_MAP(IA2_EVENT_TEXT_CARET_MOVED) | |
284 EVENT_MAP(IA2_EVENT_TEXT_CHANGED) | |
285 EVENT_MAP(IA2_EVENT_TEXT_COLUMN_CHANGED) | |
286 EVENT_MAP(IA2_EVENT_TEXT_INSERTED) | |
287 EVENT_MAP(IA2_EVENT_TEXT_REMOVED) | |
288 EVENT_MAP(IA2_EVENT_TEXT_UPDATED) | |
289 EVENT_MAP(IA2_EVENT_TEXT_SELECTION_CHANGED) | |
290 EVENT_MAP(IA2_EVENT_VISIBLE_DATA_CHANGED) | |
291 } | 220 } |
292 | 221 |
293 } // namespace. | 222 } // namespace. |
294 | 223 |
295 base::string16 IAccessibleRoleToString(int32 ia_role) { | 224 base::string16 IAccessibleRoleToString(int32 ia_role) { |
296 return AccessibilityEnumMap::GetInstance()->ia_role_string_map[ia_role]; | 225 return AccessibilityRoleStateMap::GetInstance()->ia_role_string_map[ia_role]; |
297 } | 226 } |
298 | 227 |
299 base::string16 IAccessible2RoleToString(int32 ia_role) { | 228 base::string16 IAccessible2RoleToString(int32 ia_role) { |
300 return AccessibilityEnumMap::GetInstance()->ia2_role_string_map[ia_role]; | 229 return AccessibilityRoleStateMap::GetInstance()->ia2_role_string_map[ia_role]; |
301 } | 230 } |
302 | 231 |
303 void IAccessibleStateToStringVector(int32 ia_state, | 232 void IAccessibleStateToStringVector(int32 ia_state, |
304 std::vector<base::string16>* result) { | 233 std::vector<base::string16>* result) { |
305 const std::map<int32, base::string16>& state_string_map = | 234 const std::map<int32, base::string16>& state_string_map = |
306 AccessibilityEnumMap::GetInstance()->ia_state_string_map; | 235 AccessibilityRoleStateMap::GetInstance()->ia_state_string_map; |
307 std::map<int32, base::string16>::const_iterator it; | 236 std::map<int32, base::string16>::const_iterator it; |
308 for (it = state_string_map.begin(); it != state_string_map.end(); ++it) { | 237 for (it = state_string_map.begin(); it != state_string_map.end(); ++it) { |
309 if (it->first & ia_state) | 238 if (it->first & ia_state) |
310 result->push_back(it->second); | 239 result->push_back(it->second); |
311 } | 240 } |
312 } | 241 } |
313 | 242 |
314 base::string16 IAccessibleStateToString(int32 ia_state) { | 243 base::string16 IAccessibleStateToString(int32 ia_state) { |
315 std::vector<base::string16> strings; | 244 std::vector<base::string16> strings; |
316 IAccessibleStateToStringVector(ia_state, &strings); | 245 IAccessibleStateToStringVector(ia_state, &strings); |
317 return JoinString(strings, ','); | 246 return JoinString(strings, ','); |
318 } | 247 } |
319 | 248 |
320 void IAccessible2StateToStringVector(int32 ia2_state, | 249 void IAccessible2StateToStringVector(int32 ia2_state, |
321 std::vector<base::string16>* result) { | 250 std::vector<base::string16>* result) { |
322 const std::map<int32, base::string16>& state_string_map = | 251 const std::map<int32, base::string16>& state_string_map = |
323 AccessibilityEnumMap::GetInstance()->ia2_state_string_map; | 252 AccessibilityRoleStateMap::GetInstance()->ia2_state_string_map; |
324 std::map<int32, base::string16>::const_iterator it; | 253 std::map<int32, base::string16>::const_iterator it; |
325 for (it = state_string_map.begin(); it != state_string_map.end(); ++it) { | 254 for (it = state_string_map.begin(); it != state_string_map.end(); ++it) { |
326 if (it->first & ia2_state) | 255 if (it->first & ia2_state) |
327 result->push_back(it->second); | 256 result->push_back(it->second); |
328 } | 257 } |
329 } | 258 } |
330 | 259 |
331 base::string16 IAccessible2StateToString(int32 ia2_state) { | 260 base::string16 IAccessible2StateToString(int32 ia2_state) { |
332 std::vector<base::string16> strings; | 261 std::vector<base::string16> strings; |
333 IAccessible2StateToStringVector(ia2_state, &strings); | 262 IAccessible2StateToStringVector(ia2_state, &strings); |
334 return JoinString(strings, ','); | 263 return JoinString(strings, ','); |
335 } | 264 } |
336 | 265 |
337 base::string16 AccessibilityEventToString(int32 event_id) { | |
338 return AccessibilityEnumMap::GetInstance()->event_string_map[event_id]; | |
339 } | |
340 | |
341 } // namespace content | 266 } // namespace content |
OLD | NEW |