| 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 |