1 // Copyright (c) 2013 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.
5 #include "content/renderer/accessibility/blink_ax_enum_conversion.h"
7 #include "base/logging.h"
11 uint32 AXStateFromBlink(const blink::WebAXObject& o) {
14 state |= (1 << ui::AX_STATE_CHECKED);
16 blink::WebAXExpanded expanded = o.isExpanded();
18 if (expanded == blink::WebAXExpandedCollapsed)
19 state |= (1 << ui::AX_STATE_COLLAPSED);
20 else if (expanded == blink::WebAXExpandedExpanded)
21 state |= (1 << ui::AX_STATE_EXPANDED);
24 if (o.canSetFocusAttribute())
25 state |= (1 << ui::AX_STATE_FOCUSABLE);
28 state |= (1 << ui::AX_STATE_FOCUSED);
30 if (o.role() == blink::WebAXRolePopUpButton ||
32 state |= (1 << ui::AX_STATE_HASPOPUP);
35 state |= (1 << ui::AX_STATE_HOVERED);
37 if (o.isIndeterminate())
38 state |= (1 << ui::AX_STATE_INDETERMINATE);
41 state |= (1 << ui::AX_STATE_INVISIBLE);
44 state |= (1 << ui::AX_STATE_LINKED);
46 if (o.isMultiSelectable())
47 state |= (1 << ui::AX_STATE_MULTISELECTABLE);
50 state |= (1 << ui::AX_STATE_OFFSCREEN);
53 state |= (1 << ui::AX_STATE_PRESSED);
55 if (o.isPasswordField())
56 state |= (1 << ui::AX_STATE_PROTECTED);
59 state |= (1 << ui::AX_STATE_READ_ONLY);
62 state |= (1 << ui::AX_STATE_REQUIRED);
64 if (o.canSetSelectedAttribute())
65 state |= (1 << ui::AX_STATE_SELECTABLE);
68 state |= (1 << ui::AX_STATE_SELECTED);
71 state |= (1 << ui::AX_STATE_VISITED);
74 state |= (1 << ui::AX_STATE_ENABLED);
77 state |= (1 << ui::AX_STATE_VERTICAL);
80 state |= (1 << ui::AX_STATE_VISITED);
85 ui::AXRole AXRoleFromBlink(blink::WebAXRole role) {
87 case blink::WebAXRoleAlert:
88 return ui::AX_ROLE_ALERT;
89 case blink::WebAXRoleAlertDialog:
90 return ui::AX_ROLE_ALERT_DIALOG;
91 case blink::WebAXRoleAnnotation:
92 return ui::AX_ROLE_ANNOTATION;
93 case blink::WebAXRoleApplication:
94 return ui::AX_ROLE_APPLICATION;
95 case blink::WebAXRoleArticle:
96 return ui::AX_ROLE_ARTICLE;
97 case blink::WebAXRoleBanner:
98 return ui::AX_ROLE_BANNER;
99 case blink::WebAXRoleBlockquote:
100 return ui::AX_ROLE_BLOCKQUOTE;
101 case blink::WebAXRoleBrowser:
102 return ui::AX_ROLE_BROWSER;
103 case blink::WebAXRoleBusyIndicator:
104 return ui::AX_ROLE_BUSY_INDICATOR;
105 case blink::WebAXRoleButton:
106 return ui::AX_ROLE_BUTTON;
107 case blink::WebAXRoleCanvas:
108 return ui::AX_ROLE_CANVAS;
109 case blink::WebAXRoleCell:
110 return ui::AX_ROLE_CELL;
111 case blink::WebAXRoleCheckBox:
112 return ui::AX_ROLE_CHECK_BOX;
113 case blink::WebAXRoleColorWell:
114 return ui::AX_ROLE_COLOR_WELL;
115 case blink::WebAXRoleColumn:
116 return ui::AX_ROLE_COLUMN;
117 case blink::WebAXRoleColumnHeader:
118 return ui::AX_ROLE_COLUMN_HEADER;
119 case blink::WebAXRoleComboBox:
120 return ui::AX_ROLE_COMBO_BOX;
121 case blink::WebAXRoleComplementary:
122 return ui::AX_ROLE_COMPLEMENTARY;
123 case blink::WebAXRoleContentInfo:
124 return ui::AX_ROLE_CONTENT_INFO;
125 case blink::WebAXRoleDate:
126 return ui::AX_ROLE_DATE;
127 case blink::WebAXRoleDateTime:
128 return ui::AX_ROLE_DATE_TIME;
129 case blink::WebAXRoleDefinition:
130 return ui::AX_ROLE_DEFINITION;
131 case blink::WebAXRoleDescriptionListDetail:
132 return ui::AX_ROLE_DESCRIPTION_LIST_DETAIL;
133 case blink::WebAXRoleDescriptionList:
134 return ui::AX_ROLE_DESCRIPTION_LIST;
135 case blink::WebAXRoleDescriptionListTerm:
136 return ui::AX_ROLE_DESCRIPTION_LIST_TERM;
137 case blink::WebAXRoleDetails:
138 return ui::AX_ROLE_DETAILS;
139 case blink::WebAXRoleDialog:
140 return ui::AX_ROLE_DIALOG;
141 case blink::WebAXRoleDirectory:
142 return ui::AX_ROLE_DIRECTORY;
143 case blink::WebAXRoleDisclosureTriangle:
144 return ui::AX_ROLE_DISCLOSURE_TRIANGLE;
145 case blink::WebAXRoleDiv:
146 return ui::AX_ROLE_DIV;
147 case blink::WebAXRoleDocument:
148 return ui::AX_ROLE_DOCUMENT;
149 case blink::WebAXRoleDrawer:
150 return ui::AX_ROLE_DRAWER;
151 case blink::WebAXRoleEditableText:
152 return ui::AX_ROLE_EDITABLE_TEXT;
153 case blink::WebAXRoleEmbeddedObject:
154 return ui::AX_ROLE_EMBEDDED_OBJECT;
155 case blink::WebAXRoleFigcaption:
156 return ui::AX_ROLE_FIGCAPTION;
157 case blink::WebAXRoleFigure:
158 return ui::AX_ROLE_FIGURE;
159 case blink::WebAXRoleFooter:
160 return ui::AX_ROLE_FOOTER;
161 case blink::WebAXRoleForm:
162 return ui::AX_ROLE_FORM;
163 case blink::WebAXRoleGrid:
164 return ui::AX_ROLE_GRID;
165 case blink::WebAXRoleGroup:
166 return ui::AX_ROLE_GROUP;
167 case blink::WebAXRoleGrowArea:
168 return ui::AX_ROLE_GROW_AREA;
169 case blink::WebAXRoleHeading:
170 return ui::AX_ROLE_HEADING;
171 case blink::WebAXRoleHelpTag:
172 return ui::AX_ROLE_HELP_TAG;
173 case blink::WebAXRoleHorizontalRule:
174 return ui::AX_ROLE_HORIZONTAL_RULE;
175 case blink::WebAXRoleIframe:
176 return ui::AX_ROLE_IFRAME;
177 case blink::WebAXRoleIgnored:
178 return ui::AX_ROLE_IGNORED;
179 case blink::WebAXRoleImage:
180 return ui::AX_ROLE_IMAGE;
181 case blink::WebAXRoleImageMap:
182 return ui::AX_ROLE_IMAGE_MAP;
183 case blink::WebAXRoleImageMapLink:
184 return ui::AX_ROLE_IMAGE_MAP_LINK;
185 case blink::WebAXRoleIncrementor:
186 return ui::AX_ROLE_INCREMENTOR;
187 case blink::WebAXRoleInlineTextBox:
188 return ui::AX_ROLE_INLINE_TEXT_BOX;
189 case blink::WebAXRoleLabel:
190 return ui::AX_ROLE_LABEL_TEXT;
191 case blink::WebAXRoleLegend:
192 return ui::AX_ROLE_LEGEND;
193 case blink::WebAXRoleLink:
194 return ui::AX_ROLE_LINK;
195 case blink::WebAXRoleList:
196 return ui::AX_ROLE_LIST;
197 case blink::WebAXRoleListBox:
198 return ui::AX_ROLE_LIST_BOX;
199 case blink::WebAXRoleListBoxOption:
200 return ui::AX_ROLE_LIST_BOX_OPTION;
201 case blink::WebAXRoleListItem:
202 return ui::AX_ROLE_LIST_ITEM;
203 case blink::WebAXRoleListMarker:
204 return ui::AX_ROLE_LIST_MARKER;
205 case blink::WebAXRoleLog:
206 return ui::AX_ROLE_LOG;
207 case blink::WebAXRoleMain:
208 return ui::AX_ROLE_MAIN;
209 case blink::WebAXRoleMarquee:
210 return ui::AX_ROLE_MARQUEE;
211 case blink::WebAXRoleMath:
212 return ui::AX_ROLE_MATH;
213 case blink::WebAXRoleMatte:
214 return ui::AX_ROLE_MATTE;
215 case blink::WebAXRoleMenu:
216 return ui::AX_ROLE_MENU;
217 case blink::WebAXRoleMenuBar:
218 return ui::AX_ROLE_MENU_BAR;
219 case blink::WebAXRoleMenuButton:
220 return ui::AX_ROLE_MENU_BUTTON;
221 case blink::WebAXRoleMenuItem:
222 return ui::AX_ROLE_MENU_ITEM;
223 case blink::WebAXRoleMenuItemCheckBox:
224 return ui::AX_ROLE_MENU_ITEM_CHECK_BOX;
225 case blink::WebAXRoleMenuItemRadio:
226 return ui::AX_ROLE_MENU_ITEM_RADIO;
227 case blink::WebAXRoleMenuListOption:
228 return ui::AX_ROLE_MENU_LIST_OPTION;
229 case blink::WebAXRoleMenuListPopup:
230 return ui::AX_ROLE_MENU_LIST_POPUP;
231 case blink::WebAXRoleMeter:
232 return ui::AX_ROLE_METER;
233 case blink::WebAXRoleNavigation:
234 return ui::AX_ROLE_NAVIGATION;
235 case blink::WebAXRoleNone:
236 return ui::AX_ROLE_NONE;
237 case blink::WebAXRoleNote:
238 return ui::AX_ROLE_NOTE;
239 case blink::WebAXRoleOutline:
240 return ui::AX_ROLE_OUTLINE;
241 case blink::WebAXRoleParagraph:
242 return ui::AX_ROLE_PARAGRAPH;
243 case blink::WebAXRolePopUpButton:
244 return ui::AX_ROLE_POP_UP_BUTTON;
245 case blink::WebAXRolePre:
246 return ui::AX_ROLE_PRE;
247 case blink::WebAXRolePresentational:
248 return ui::AX_ROLE_PRESENTATIONAL;
249 case blink::WebAXRoleProgressIndicator:
250 return ui::AX_ROLE_PROGRESS_INDICATOR;
251 case blink::WebAXRoleRadioButton:
252 return ui::AX_ROLE_RADIO_BUTTON;
253 case blink::WebAXRoleRadioGroup:
254 return ui::AX_ROLE_RADIO_GROUP;
255 case blink::WebAXRoleRegion:
256 return ui::AX_ROLE_REGION;
257 case blink::WebAXRoleRootWebArea:
258 return ui::AX_ROLE_ROOT_WEB_AREA;
259 case blink::WebAXRoleRow:
260 return ui::AX_ROLE_ROW;
261 case blink::WebAXRoleRowHeader:
262 return ui::AX_ROLE_ROW_HEADER;
263 case blink::WebAXRoleRuler:
264 return ui::AX_ROLE_RULER;
265 case blink::WebAXRoleRulerMarker:
266 return ui::AX_ROLE_RULER_MARKER;
267 case blink::WebAXRoleSVGRoot:
268 return ui::AX_ROLE_SVG_ROOT;
269 case blink::WebAXRoleScrollArea:
270 return ui::AX_ROLE_SCROLL_AREA;
271 case blink::WebAXRoleScrollBar:
272 return ui::AX_ROLE_SCROLL_BAR;
273 case blink::WebAXRoleSeamlessWebArea:
274 return ui::AX_ROLE_SEAMLESS_WEB_AREA;
275 case blink::WebAXRoleSearch:
276 return ui::AX_ROLE_SEARCH;
277 case blink::WebAXRoleSheet:
278 return ui::AX_ROLE_SHEET;
279 case blink::WebAXRoleSlider:
280 return ui::AX_ROLE_SLIDER;
281 case blink::WebAXRoleSliderThumb:
282 return ui::AX_ROLE_SLIDER_THUMB;
283 case blink::WebAXRoleSpinButton:
284 return ui::AX_ROLE_SPIN_BUTTON;
285 case blink::WebAXRoleSpinButtonPart:
286 return ui::AX_ROLE_SPIN_BUTTON_PART;
287 case blink::WebAXRoleSplitGroup:
288 return ui::AX_ROLE_SPLIT_GROUP;
289 case blink::WebAXRoleSplitter:
290 return ui::AX_ROLE_SPLITTER;
291 case blink::WebAXRoleStaticText:
292 return ui::AX_ROLE_STATIC_TEXT;
293 case blink::WebAXRoleStatus:
294 return ui::AX_ROLE_STATUS;
295 case blink::WebAXRoleSystemWide:
296 return ui::AX_ROLE_SYSTEM_WIDE;
297 case blink::WebAXRoleTab:
298 return ui::AX_ROLE_TAB;
299 case blink::WebAXRoleTabGroup:
300 return ui::AX_ROLE_TAB_GROUP;
301 case blink::WebAXRoleTabList:
302 return ui::AX_ROLE_TAB_LIST;
303 case blink::WebAXRoleTabPanel:
304 return ui::AX_ROLE_TAB_PANEL;
305 case blink::WebAXRoleTable:
306 return ui::AX_ROLE_TABLE;
307 case blink::WebAXRoleTableHeaderContainer:
308 return ui::AX_ROLE_TABLE_HEADER_CONTAINER;
309 case blink::WebAXRoleTextArea:
310 return ui::AX_ROLE_TEXT_AREA;
311 case blink::WebAXRoleTextField:
312 return ui::AX_ROLE_TEXT_FIELD;
313 case blink::WebAXRoleTime:
314 return ui::AX_ROLE_TIME;
315 case blink::WebAXRoleTimer:
316 return ui::AX_ROLE_TIMER;
317 case blink::WebAXRoleToggleButton:
318 return ui::AX_ROLE_TOGGLE_BUTTON;
319 case blink::WebAXRoleToolbar:
320 return ui::AX_ROLE_TOOLBAR;
321 case blink::WebAXRoleTree:
322 return ui::AX_ROLE_TREE;
323 case blink::WebAXRoleTreeGrid:
324 return ui::AX_ROLE_TREE_GRID;
325 case blink::WebAXRoleTreeItem:
326 return ui::AX_ROLE_TREE_ITEM;
327 case blink::WebAXRoleUnknown:
328 return ui::AX_ROLE_UNKNOWN;
329 case blink::WebAXRoleUserInterfaceTooltip:
330 return ui::AX_ROLE_TOOLTIP;
331 case blink::WebAXRoleValueIndicator:
332 return ui::AX_ROLE_VALUE_INDICATOR;
333 case blink::WebAXRoleWebArea:
334 return ui::AX_ROLE_WEB_AREA;
335 case blink::WebAXRoleWindow:
336 return ui::AX_ROLE_WINDOW;
338 // We can't add an assertion here, that prevents us
339 // from adding new role enums in Blink.
340 LOG(WARNING) << "Warning: Blink WebAXRole " << role
341 << " not handled by Chromium yet.";
342 return ui::AX_ROLE_UNKNOWN;
346 ui::AXEvent AXEventFromBlink(blink::WebAXEvent event) {
348 case blink::WebAXEventActiveDescendantChanged:
349 return ui::AX_EVENT_ACTIVEDESCENDANTCHANGED;
350 case blink::WebAXEventAlert:
351 return ui::AX_EVENT_ALERT;
352 case blink::WebAXEventAriaAttributeChanged:
353 return ui::AX_EVENT_ARIA_ATTRIBUTE_CHANGED;
354 case blink::WebAXEventAutocorrectionOccured:
355 return ui::AX_EVENT_AUTOCORRECTION_OCCURED;
356 case blink::WebAXEventCheckedStateChanged:
357 return ui::AX_EVENT_CHECKED_STATE_CHANGED;
358 case blink::WebAXEventChildrenChanged:
359 return ui::AX_EVENT_CHILDREN_CHANGED;
360 case blink::WebAXEventFocus:
361 return ui::AX_EVENT_FOCUS;
362 case blink::WebAXEventInvalidStatusChanged:
363 return ui::AX_EVENT_INVALID_STATUS_CHANGED;
364 case blink::WebAXEventLayoutComplete:
365 return ui::AX_EVENT_LAYOUT_COMPLETE;
366 case blink::WebAXEventLiveRegionChanged:
367 return ui::AX_EVENT_LIVE_REGION_CHANGED;
368 case blink::WebAXEventLoadComplete:
369 return ui::AX_EVENT_LOAD_COMPLETE;
370 case blink::WebAXEventLocationChanged:
371 return ui::AX_EVENT_LOCATION_CHANGED;
372 case blink::WebAXEventMenuListItemSelected:
373 return ui::AX_EVENT_MENU_LIST_ITEM_SELECTED;
374 case blink::WebAXEventMenuListValueChanged:
375 return ui::AX_EVENT_MENU_LIST_VALUE_CHANGED;
376 case blink::WebAXEventRowCollapsed:
377 return ui::AX_EVENT_ROW_COLLAPSED;
378 case blink::WebAXEventRowCountChanged:
379 return ui::AX_EVENT_ROW_COUNT_CHANGED;
380 case blink::WebAXEventRowExpanded:
381 return ui::AX_EVENT_ROW_EXPANDED;
382 case blink::WebAXEventScrollPositionChanged:
383 return ui::AX_EVENT_SCROLL_POSITION_CHANGED;
384 case blink::WebAXEventScrolledToAnchor:
385 return ui::AX_EVENT_SCROLLED_TO_ANCHOR;
386 case blink::WebAXEventSelectedChildrenChanged:
387 return ui::AX_EVENT_SELECTED_CHILDREN_CHANGED;
388 case blink::WebAXEventSelectedTextChanged:
389 return ui::AX_EVENT_TEXT_SELECTION_CHANGED;
390 case blink::WebAXEventTextChanged:
391 return ui::AX_EVENT_TEXT_CHANGED;
392 case blink::WebAXEventValueChanged:
393 return ui::AX_EVENT_VALUE_CHANGED;
395 // We can't add an assertion here, that prevents us
396 // from adding new event enums in Blink.
397 return ui::AX_EVENT_NONE;
401 ui::AXTextDirection AXTextDirectionFromBlink(
402 blink::WebAXTextDirection text_direction) {
403 switch (text_direction) {
404 case blink::WebAXTextDirectionLR:
405 return ui::AX_TEXT_DIRECTION_LR;
406 case blink::WebAXTextDirectionRL:
407 return ui::AX_TEXT_DIRECTION_RL;
408 case blink::WebAXTextDirectionTB:
409 return ui::AX_TEXT_DIRECTION_TB;
410 case blink::WebAXTextDirectionBT:
411 return ui::AX_TEXT_DIRECTION_BT;
416 return ui::AX_TEXT_DIRECTION_NONE;
419 } // namespace content