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