OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "content/public/test/accessibility_test_utils_win.h" | |
6 | |
7 #include <oleacc.h> | |
8 | |
9 #include <map> | |
10 #include <string> | |
11 | |
12 #include "base/memory/singleton.h" | |
13 #include "base/string_util.h" | |
14 #include "third_party/iaccessible2/ia2_api_all.h" | |
15 | |
16 namespace { | |
17 | |
18 class AccessibilityRoleStateMap { | |
19 public: | |
20 static AccessibilityRoleStateMap* GetInstance(); | |
21 | |
22 std::map<int32, string16> ia_role_string_map; | |
23 std::map<int32, string16> ia2_role_string_map; | |
24 std::map<int32, string16> ia_state_string_map; | |
25 std::map<int32, string16> ia2_state_string_map; | |
26 | |
27 private: | |
28 AccessibilityRoleStateMap(); | |
29 virtual ~AccessibilityRoleStateMap() {} | |
30 | |
31 friend struct DefaultSingletonTraits<AccessibilityRoleStateMap>; | |
32 | |
33 DISALLOW_COPY_AND_ASSIGN(AccessibilityRoleStateMap); | |
34 }; | |
35 | |
36 // static | |
37 AccessibilityRoleStateMap* AccessibilityRoleStateMap::GetInstance() { | |
38 return Singleton<AccessibilityRoleStateMap, | |
39 LeakySingletonTraits<AccessibilityRoleStateMap> >::get(); | |
40 } | |
41 | |
42 AccessibilityRoleStateMap::AccessibilityRoleStateMap() { | |
43 // Convenience macros for generating readable strings. | |
44 #define IA_ROLE_MAP(x) ia_role_string_map[x] = L#x; \ | |
45 ia2_role_string_map[x] = L#x; | |
46 #define IA2_ROLE_MAP(x) ia2_role_string_map[x] = L#x; | |
47 #define IA_STATE_MAP(x) ia_state_string_map[STATE_SYSTEM_##x] = L#x; | |
48 #define IA2_STATE_MAP(x) ia2_state_string_map[x] = L#x; | |
49 | |
50 // MSAA / IAccessible roles. Each one of these is also a valid | |
51 // IAccessible2 role, the IA_ROLE_MAP macro adds it to both. | |
52 IA_ROLE_MAP(ROLE_SYSTEM_ALERT) | |
53 IA_ROLE_MAP(ROLE_SYSTEM_ANIMATION) | |
54 IA_ROLE_MAP(ROLE_SYSTEM_APPLICATION) | |
55 IA_ROLE_MAP(ROLE_SYSTEM_BORDER) | |
56 IA_ROLE_MAP(ROLE_SYSTEM_BUTTONDROPDOWN) | |
57 IA_ROLE_MAP(ROLE_SYSTEM_BUTTONDROPDOWNGRID) | |
58 IA_ROLE_MAP(ROLE_SYSTEM_BUTTONMENU) | |
59 IA_ROLE_MAP(ROLE_SYSTEM_CARET) | |
60 IA_ROLE_MAP(ROLE_SYSTEM_CELL) | |
61 IA_ROLE_MAP(ROLE_SYSTEM_CHARACTER) | |
62 IA_ROLE_MAP(ROLE_SYSTEM_CHART) | |
63 IA_ROLE_MAP(ROLE_SYSTEM_CHECKBUTTON) | |
64 IA_ROLE_MAP(ROLE_SYSTEM_CLIENT) | |
65 IA_ROLE_MAP(ROLE_SYSTEM_CLOCK) | |
66 IA_ROLE_MAP(ROLE_SYSTEM_COLUMN) | |
67 IA_ROLE_MAP(ROLE_SYSTEM_COLUMNHEADER) | |
68 IA_ROLE_MAP(ROLE_SYSTEM_COMBOBOX) | |
69 IA_ROLE_MAP(ROLE_SYSTEM_CURSOR) | |
70 IA_ROLE_MAP(ROLE_SYSTEM_DIAGRAM) | |
71 IA_ROLE_MAP(ROLE_SYSTEM_DIAL) | |
72 IA_ROLE_MAP(ROLE_SYSTEM_DIALOG) | |
73 IA_ROLE_MAP(ROLE_SYSTEM_DOCUMENT) | |
74 IA_ROLE_MAP(ROLE_SYSTEM_DROPLIST) | |
75 IA_ROLE_MAP(ROLE_SYSTEM_EQUATION) | |
76 IA_ROLE_MAP(ROLE_SYSTEM_GRAPHIC) | |
77 IA_ROLE_MAP(ROLE_SYSTEM_GRIP) | |
78 IA_ROLE_MAP(ROLE_SYSTEM_GROUPING) | |
79 IA_ROLE_MAP(ROLE_SYSTEM_HELPBALLOON) | |
80 IA_ROLE_MAP(ROLE_SYSTEM_HOTKEYFIELD) | |
81 IA_ROLE_MAP(ROLE_SYSTEM_INDICATOR) | |
82 IA_ROLE_MAP(ROLE_SYSTEM_IPADDRESS) | |
83 IA_ROLE_MAP(ROLE_SYSTEM_LINK) | |
84 IA_ROLE_MAP(ROLE_SYSTEM_LIST) | |
85 IA_ROLE_MAP(ROLE_SYSTEM_LISTITEM) | |
86 IA_ROLE_MAP(ROLE_SYSTEM_MENUBAR) | |
87 IA_ROLE_MAP(ROLE_SYSTEM_MENUITEM) | |
88 IA_ROLE_MAP(ROLE_SYSTEM_MENUPOPUP) | |
89 IA_ROLE_MAP(ROLE_SYSTEM_OUTLINE) | |
90 IA_ROLE_MAP(ROLE_SYSTEM_OUTLINEBUTTON) | |
91 IA_ROLE_MAP(ROLE_SYSTEM_OUTLINEITEM) | |
92 IA_ROLE_MAP(ROLE_SYSTEM_PAGETAB) | |
93 IA_ROLE_MAP(ROLE_SYSTEM_PAGETABLIST) | |
94 IA_ROLE_MAP(ROLE_SYSTEM_PANE) | |
95 IA_ROLE_MAP(ROLE_SYSTEM_PROGRESSBAR) | |
96 IA_ROLE_MAP(ROLE_SYSTEM_PROPERTYPAGE) | |
97 IA_ROLE_MAP(ROLE_SYSTEM_PUSHBUTTON) | |
98 IA_ROLE_MAP(ROLE_SYSTEM_RADIOBUTTON) | |
99 IA_ROLE_MAP(ROLE_SYSTEM_ROW) | |
100 IA_ROLE_MAP(ROLE_SYSTEM_ROWHEADER) | |
101 IA_ROLE_MAP(ROLE_SYSTEM_SCROLLBAR) | |
102 IA_ROLE_MAP(ROLE_SYSTEM_SEPARATOR) | |
103 IA_ROLE_MAP(ROLE_SYSTEM_SLIDER) | |
104 IA_ROLE_MAP(ROLE_SYSTEM_SOUND) | |
105 IA_ROLE_MAP(ROLE_SYSTEM_SPINBUTTON) | |
106 IA_ROLE_MAP(ROLE_SYSTEM_SPLITBUTTON) | |
107 IA_ROLE_MAP(ROLE_SYSTEM_STATICTEXT) | |
108 IA_ROLE_MAP(ROLE_SYSTEM_STATUSBAR) | |
109 IA_ROLE_MAP(ROLE_SYSTEM_TABLE) | |
110 IA_ROLE_MAP(ROLE_SYSTEM_TEXT) | |
111 IA_ROLE_MAP(ROLE_SYSTEM_TITLEBAR) | |
112 IA_ROLE_MAP(ROLE_SYSTEM_TOOLBAR) | |
113 IA_ROLE_MAP(ROLE_SYSTEM_TOOLTIP) | |
114 IA_ROLE_MAP(ROLE_SYSTEM_WHITESPACE) | |
115 IA_ROLE_MAP(ROLE_SYSTEM_WINDOW) | |
116 | |
117 // IAccessible2 roles. | |
118 IA2_ROLE_MAP(IA2_ROLE_CANVAS) | |
119 IA2_ROLE_MAP(IA2_ROLE_CAPTION) | |
120 IA2_ROLE_MAP(IA2_ROLE_CHECK_MENU_ITEM) | |
121 IA2_ROLE_MAP(IA2_ROLE_COLOR_CHOOSER) | |
122 IA2_ROLE_MAP(IA2_ROLE_DATE_EDITOR) | |
123 IA2_ROLE_MAP(IA2_ROLE_DESKTOP_ICON) | |
124 IA2_ROLE_MAP(IA2_ROLE_DESKTOP_PANE) | |
125 IA2_ROLE_MAP(IA2_ROLE_DIRECTORY_PANE) | |
126 IA2_ROLE_MAP(IA2_ROLE_EDITBAR) | |
127 IA2_ROLE_MAP(IA2_ROLE_EMBEDDED_OBJECT) | |
128 IA2_ROLE_MAP(IA2_ROLE_ENDNOTE) | |
129 IA2_ROLE_MAP(IA2_ROLE_FILE_CHOOSER) | |
130 IA2_ROLE_MAP(IA2_ROLE_FONT_CHOOSER) | |
131 IA2_ROLE_MAP(IA2_ROLE_FOOTER) | |
132 IA2_ROLE_MAP(IA2_ROLE_FOOTNOTE) | |
133 IA2_ROLE_MAP(IA2_ROLE_FORM) | |
134 IA2_ROLE_MAP(IA2_ROLE_FRAME) | |
135 IA2_ROLE_MAP(IA2_ROLE_GLASS_PANE) | |
136 IA2_ROLE_MAP(IA2_ROLE_HEADER) | |
137 IA2_ROLE_MAP(IA2_ROLE_HEADING) | |
138 IA2_ROLE_MAP(IA2_ROLE_ICON) | |
139 IA2_ROLE_MAP(IA2_ROLE_IMAGE_MAP) | |
140 IA2_ROLE_MAP(IA2_ROLE_INPUT_METHOD_WINDOW) | |
141 IA2_ROLE_MAP(IA2_ROLE_INTERNAL_FRAME) | |
142 IA2_ROLE_MAP(IA2_ROLE_LABEL) | |
143 IA2_ROLE_MAP(IA2_ROLE_LAYERED_PANE) | |
144 IA2_ROLE_MAP(IA2_ROLE_NOTE) | |
145 IA2_ROLE_MAP(IA2_ROLE_OPTION_PANE) | |
146 IA2_ROLE_MAP(IA2_ROLE_PAGE) | |
147 IA2_ROLE_MAP(IA2_ROLE_PARAGRAPH) | |
148 IA2_ROLE_MAP(IA2_ROLE_RADIO_MENU_ITEM) | |
149 IA2_ROLE_MAP(IA2_ROLE_REDUNDANT_OBJECT) | |
150 IA2_ROLE_MAP(IA2_ROLE_ROOT_PANE) | |
151 IA2_ROLE_MAP(IA2_ROLE_RULER) | |
152 IA2_ROLE_MAP(IA2_ROLE_SCROLL_PANE) | |
153 IA2_ROLE_MAP(IA2_ROLE_SECTION) | |
154 IA2_ROLE_MAP(IA2_ROLE_SHAPE) | |
155 IA2_ROLE_MAP(IA2_ROLE_SPLIT_PANE) | |
156 IA2_ROLE_MAP(IA2_ROLE_TEAR_OFF_MENU) | |
157 IA2_ROLE_MAP(IA2_ROLE_TERMINAL) | |
158 IA2_ROLE_MAP(IA2_ROLE_TEXT_FRAME) | |
159 IA2_ROLE_MAP(IA2_ROLE_TOGGLE_BUTTON) | |
160 IA2_ROLE_MAP(IA2_ROLE_UNKNOWN) | |
161 IA2_ROLE_MAP(IA2_ROLE_VIEW_PORT) | |
162 | |
163 // MSAA / IAccessible states. Unlike roles, these are not also IA2 states. | |
164 IA_STATE_MAP(ALERT_HIGH) | |
165 IA_STATE_MAP(ALERT_LOW) | |
166 IA_STATE_MAP(ALERT_MEDIUM) | |
167 IA_STATE_MAP(ANIMATED) | |
168 IA_STATE_MAP(BUSY) | |
169 IA_STATE_MAP(CHECKED) | |
170 IA_STATE_MAP(COLLAPSED) | |
171 IA_STATE_MAP(DEFAULT) | |
172 IA_STATE_MAP(EXPANDED) | |
173 IA_STATE_MAP(EXTSELECTABLE) | |
174 IA_STATE_MAP(FLOATING) | |
175 IA_STATE_MAP(FOCUSABLE) | |
176 IA_STATE_MAP(FOCUSED) | |
177 IA_STATE_MAP(HASPOPUP) | |
178 IA_STATE_MAP(HOTTRACKED) | |
179 IA_STATE_MAP(INVISIBLE) | |
180 IA_STATE_MAP(LINKED) | |
181 IA_STATE_MAP(MARQUEED) | |
182 IA_STATE_MAP(MIXED) | |
183 IA_STATE_MAP(MOVEABLE) | |
184 IA_STATE_MAP(MULTISELECTABLE) | |
185 IA_STATE_MAP(PRESSED) | |
186 IA_STATE_MAP(PROTECTED) | |
187 IA_STATE_MAP(READONLY) | |
188 IA_STATE_MAP(SELECTABLE) | |
189 IA_STATE_MAP(SELECTED) | |
190 IA_STATE_MAP(SELFVOICING) | |
191 IA_STATE_MAP(SIZEABLE) | |
192 IA_STATE_MAP(TRAVERSED) | |
193 IA_STATE_MAP(UNAVAILABLE) | |
194 | |
195 // Untested states include those that would be repeated on nearly every node, | |
196 // or would vary based on window size. | |
197 // IA_STATE_MAP(OFFSCREEN) // Untested. | |
198 | |
199 // IAccessible2 states. | |
200 IA2_STATE_MAP(IA2_STATE_ACTIVE) | |
201 IA2_STATE_MAP(IA2_STATE_ARMED) | |
202 IA2_STATE_MAP(IA2_STATE_DEFUNCT) | |
203 IA2_STATE_MAP(IA2_STATE_EDITABLE) | |
204 IA2_STATE_MAP(IA2_STATE_ICONIFIED) | |
205 IA2_STATE_MAP(IA2_STATE_INVALID_ENTRY) | |
206 IA2_STATE_MAP(IA2_STATE_MANAGES_DESCENDANTS) | |
207 IA2_STATE_MAP(IA2_STATE_MODAL) | |
208 IA2_STATE_MAP(IA2_STATE_MULTI_LINE) | |
209 IA2_STATE_MAP(IA2_STATE_REQUIRED) | |
210 IA2_STATE_MAP(IA2_STATE_SELECTABLE_TEXT) | |
211 IA2_STATE_MAP(IA2_STATE_SINGLE_LINE) | |
212 IA2_STATE_MAP(IA2_STATE_STALE) | |
213 IA2_STATE_MAP(IA2_STATE_SUPPORTS_AUTOCOMPLETION) | |
214 IA2_STATE_MAP(IA2_STATE_TRANSIENT) | |
215 | |
216 // Untested states include those that would be repeated on nearly every node, | |
217 // or would vary based on window size. | |
218 // IA2_STATE_MAP(IA2_STATE_HORIZONTAL) // Untested. | |
219 // IA2_STATE_MAP(IA2_STATE_OPAQUE) // Untested. | |
220 // IA2_STATE_MAP(IA2_STATE_VERTICAL) // Untested. | |
221 } | |
222 | |
223 } // namespace. | |
224 | |
225 string16 IAccessibleRoleToString(int32 ia_role) { | |
226 return AccessibilityRoleStateMap::GetInstance()->ia_role_string_map[ia_role]; | |
227 } | |
228 | |
229 string16 IAccessible2RoleToString(int32 ia_role) { | |
230 return AccessibilityRoleStateMap::GetInstance()->ia2_role_string_map[ia_role]; | |
231 } | |
232 | |
233 void IAccessibleStateToStringVector(int32 ia_state, | |
234 std::vector<string16>* result) { | |
235 const std::map<int32, string16>& state_string_map = | |
236 AccessibilityRoleStateMap::GetInstance()->ia_state_string_map; | |
237 std::map<int32, string16>::const_iterator it; | |
238 for (it = state_string_map.begin(); it != state_string_map.end(); ++it) { | |
239 if (it->first & ia_state) | |
240 result->push_back(it->second); | |
241 } | |
242 } | |
243 | |
244 string16 IAccessibleStateToString(int32 ia_state) { | |
245 std::vector<string16> strings; | |
246 IAccessibleStateToStringVector(ia_state, &strings); | |
247 return JoinString(strings, ','); | |
248 } | |
249 | |
250 void IAccessible2StateToStringVector(int32 ia2_state, | |
251 std::vector<string16>* result) { | |
252 const std::map<int32, string16>& state_string_map = | |
253 AccessibilityRoleStateMap::GetInstance()->ia2_state_string_map; | |
254 std::map<int32, string16>::const_iterator it; | |
255 for (it = state_string_map.begin(); it != state_string_map.end(); ++it) { | |
256 if (it->first & ia2_state) | |
257 result->push_back(it->second); | |
258 } | |
259 } | |
260 | |
261 string16 IAccessible2StateToString(int32 ia2_state) { | |
262 std::vector<string16> strings; | |
263 IAccessible2StateToStringVector(ia2_state, &strings); | |
264 return JoinString(strings, ','); | |
265 } | |
OLD | NEW |