| // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "content/renderer/accessibility/blink_ax_enum_conversion.h" |
| |
| #include "base/logging.h" |
| |
| namespace content { |
| |
| uint32 AXStateFromBlink(const blink::WebAXObject& o) { |
| uint32 state = 0; |
| if (o.isChecked()) |
| state |= (1 << ui::AX_STATE_CHECKED); |
| |
| blink::WebAXExpanded expanded = o.isExpanded(); |
| if (expanded) { |
| if (expanded == blink::WebAXExpandedCollapsed) |
| state |= (1 << ui::AX_STATE_COLLAPSED); |
| else if (expanded == blink::WebAXExpandedExpanded) |
| state |= (1 << ui::AX_STATE_EXPANDED); |
| } |
| |
| if (o.canSetFocusAttribute()) |
| state |= (1 << ui::AX_STATE_FOCUSABLE); |
| |
| if (o.isFocused()) |
| state |= (1 << ui::AX_STATE_FOCUSED); |
| |
| if (o.role() == blink::WebAXRolePopUpButton || |
| o.ariaHasPopup()) |
| state |= (1 << ui::AX_STATE_HASPOPUP); |
| |
| if (o.isHovered()) |
| state |= (1 << ui::AX_STATE_HOVERED); |
| |
| if (o.isIndeterminate()) |
| state |= (1 << ui::AX_STATE_INDETERMINATE); |
| |
| if (!o.isVisible()) |
| state |= (1 << ui::AX_STATE_INVISIBLE); |
| |
| if (o.isLinked()) |
| state |= (1 << ui::AX_STATE_LINKED); |
| |
| if (o.isMultiSelectable()) |
| state |= (1 << ui::AX_STATE_MULTISELECTABLE); |
| |
| if (o.isOffScreen()) |
| state |= (1 << ui::AX_STATE_OFFSCREEN); |
| |
| if (o.isPressed()) |
| state |= (1 << ui::AX_STATE_PRESSED); |
| |
| if (o.isPasswordField()) |
| state |= (1 << ui::AX_STATE_PROTECTED); |
| |
| if (o.isReadOnly()) |
| state |= (1 << ui::AX_STATE_READ_ONLY); |
| |
| if (o.isRequired()) |
| state |= (1 << ui::AX_STATE_REQUIRED); |
| |
| if (o.canSetSelectedAttribute()) |
| state |= (1 << ui::AX_STATE_SELECTABLE); |
| |
| if (o.isSelected()) |
| state |= (1 << ui::AX_STATE_SELECTED); |
| |
| if (o.isVisited()) |
| state |= (1 << ui::AX_STATE_VISITED); |
| |
| if (o.isEnabled()) |
| state |= (1 << ui::AX_STATE_ENABLED); |
| |
| if (o.orientation() == blink::WebAXOrientationVertical) |
| state |= (1 << ui::AX_STATE_VERTICAL); |
| else if (o.orientation() == blink::WebAXOrientationHorizontal) |
| state |= (1 << ui::AX_STATE_HORIZONTAL); |
| |
| if (o.isVisited()) |
| state |= (1 << ui::AX_STATE_VISITED); |
| |
| return state; |
| } |
| |
| ui::AXRole AXRoleFromBlink(blink::WebAXRole role) { |
| switch (role) { |
| case blink::WebAXRoleAlert: |
| return ui::AX_ROLE_ALERT; |
| case blink::WebAXRoleAlertDialog: |
| return ui::AX_ROLE_ALERT_DIALOG; |
| case blink::WebAXRoleAnnotation: |
| return ui::AX_ROLE_ANNOTATION; |
| case blink::WebAXRoleApplication: |
| return ui::AX_ROLE_APPLICATION; |
| case blink::WebAXRoleArticle: |
| return ui::AX_ROLE_ARTICLE; |
| case blink::WebAXRoleBanner: |
| return ui::AX_ROLE_BANNER; |
| case blink::WebAXRoleBlockquote: |
| return ui::AX_ROLE_BLOCKQUOTE; |
| case blink::WebAXRoleBusyIndicator: |
| return ui::AX_ROLE_BUSY_INDICATOR; |
| case blink::WebAXRoleButton: |
| return ui::AX_ROLE_BUTTON; |
| case blink::WebAXRoleCanvas: |
| return ui::AX_ROLE_CANVAS; |
| case blink::WebAXRoleCaption: |
| return ui::AX_ROLE_CAPTION; |
| case blink::WebAXRoleCell: |
| return ui::AX_ROLE_CELL; |
| case blink::WebAXRoleCheckBox: |
| return ui::AX_ROLE_CHECK_BOX; |
| case blink::WebAXRoleColorWell: |
| return ui::AX_ROLE_COLOR_WELL; |
| case blink::WebAXRoleColumn: |
| return ui::AX_ROLE_COLUMN; |
| case blink::WebAXRoleColumnHeader: |
| return ui::AX_ROLE_COLUMN_HEADER; |
| case blink::WebAXRoleComboBox: |
| return ui::AX_ROLE_COMBO_BOX; |
| case blink::WebAXRoleComplementary: |
| return ui::AX_ROLE_COMPLEMENTARY; |
| case blink::WebAXRoleContentInfo: |
| return ui::AX_ROLE_CONTENT_INFO; |
| case blink::WebAXRoleDate: |
| return ui::AX_ROLE_DATE; |
| case blink::WebAXRoleDateTime: |
| return ui::AX_ROLE_DATE_TIME; |
| case blink::WebAXRoleDefinition: |
| return ui::AX_ROLE_DEFINITION; |
| case blink::WebAXRoleDescriptionListDetail: |
| return ui::AX_ROLE_DESCRIPTION_LIST_DETAIL; |
| case blink::WebAXRoleDescriptionList: |
| return ui::AX_ROLE_DESCRIPTION_LIST; |
| case blink::WebAXRoleDescriptionListTerm: |
| return ui::AX_ROLE_DESCRIPTION_LIST_TERM; |
| case blink::WebAXRoleDetails: |
| return ui::AX_ROLE_DETAILS; |
| case blink::WebAXRoleDialog: |
| return ui::AX_ROLE_DIALOG; |
| case blink::WebAXRoleDirectory: |
| return ui::AX_ROLE_DIRECTORY; |
| case blink::WebAXRoleDisclosureTriangle: |
| return ui::AX_ROLE_DISCLOSURE_TRIANGLE; |
| case blink::WebAXRoleDiv: |
| return ui::AX_ROLE_DIV; |
| case blink::WebAXRoleDocument: |
| return ui::AX_ROLE_DOCUMENT; |
| case blink::WebAXRoleEmbeddedObject: |
| return ui::AX_ROLE_EMBEDDED_OBJECT; |
| case blink::WebAXRoleFigcaption: |
| return ui::AX_ROLE_FIGCAPTION; |
| case blink::WebAXRoleFigure: |
| return ui::AX_ROLE_FIGURE; |
| case blink::WebAXRoleFooter: |
| return ui::AX_ROLE_FOOTER; |
| case blink::WebAXRoleForm: |
| return ui::AX_ROLE_FORM; |
| case blink::WebAXRoleGrid: |
| return ui::AX_ROLE_GRID; |
| case blink::WebAXRoleGroup: |
| return ui::AX_ROLE_GROUP; |
| case blink::WebAXRoleHeading: |
| return ui::AX_ROLE_HEADING; |
| case blink::WebAXRoleIframe: |
| return ui::AX_ROLE_IFRAME; |
| case blink::WebAXRoleIframePresentational: |
| return ui::AX_ROLE_IFRAME_PRESENTATIONAL; |
| case blink::WebAXRoleIgnored: |
| return ui::AX_ROLE_IGNORED; |
| case blink::WebAXRoleImage: |
| return ui::AX_ROLE_IMAGE; |
| case blink::WebAXRoleImageMap: |
| return ui::AX_ROLE_IMAGE_MAP; |
| case blink::WebAXRoleImageMapLink: |
| return ui::AX_ROLE_IMAGE_MAP_LINK; |
| case blink::WebAXRoleInlineTextBox: |
| return ui::AX_ROLE_INLINE_TEXT_BOX; |
| case blink::WebAXRoleLabel: |
| return ui::AX_ROLE_LABEL_TEXT; |
| case blink::WebAXRoleLegend: |
| return ui::AX_ROLE_LEGEND; |
| case blink::WebAXRoleLink: |
| return ui::AX_ROLE_LINK; |
| case blink::WebAXRoleList: |
| return ui::AX_ROLE_LIST; |
| case blink::WebAXRoleListBox: |
| return ui::AX_ROLE_LIST_BOX; |
| case blink::WebAXRoleListBoxOption: |
| return ui::AX_ROLE_LIST_BOX_OPTION; |
| case blink::WebAXRoleListItem: |
| return ui::AX_ROLE_LIST_ITEM; |
| case blink::WebAXRoleListMarker: |
| return ui::AX_ROLE_LIST_MARKER; |
| case blink::WebAXRoleLog: |
| return ui::AX_ROLE_LOG; |
| case blink::WebAXRoleMain: |
| return ui::AX_ROLE_MAIN; |
| case blink::WebAXRoleMarquee: |
| return ui::AX_ROLE_MARQUEE; |
| case blink::WebAXRoleMath: |
| return ui::AX_ROLE_MATH; |
| case blink::WebAXRoleMenu: |
| return ui::AX_ROLE_MENU; |
| case blink::WebAXRoleMenuBar: |
| return ui::AX_ROLE_MENU_BAR; |
| case blink::WebAXRoleMenuButton: |
| return ui::AX_ROLE_MENU_BUTTON; |
| case blink::WebAXRoleMenuItem: |
| return ui::AX_ROLE_MENU_ITEM; |
| case blink::WebAXRoleMenuItemCheckBox: |
| return ui::AX_ROLE_MENU_ITEM_CHECK_BOX; |
| case blink::WebAXRoleMenuItemRadio: |
| return ui::AX_ROLE_MENU_ITEM_RADIO; |
| case blink::WebAXRoleMenuListOption: |
| return ui::AX_ROLE_MENU_LIST_OPTION; |
| case blink::WebAXRoleMenuListPopup: |
| return ui::AX_ROLE_MENU_LIST_POPUP; |
| case blink::WebAXRoleMeter: |
| return ui::AX_ROLE_METER; |
| case blink::WebAXRoleNavigation: |
| return ui::AX_ROLE_NAVIGATION; |
| case blink::WebAXRoleNone: |
| return ui::AX_ROLE_NONE; |
| case blink::WebAXRoleNote: |
| return ui::AX_ROLE_NOTE; |
| case blink::WebAXRoleOutline: |
| return ui::AX_ROLE_OUTLINE; |
| case blink::WebAXRoleParagraph: |
| return ui::AX_ROLE_PARAGRAPH; |
| case blink::WebAXRolePopUpButton: |
| return ui::AX_ROLE_POP_UP_BUTTON; |
| case blink::WebAXRolePre: |
| return ui::AX_ROLE_PRE; |
| case blink::WebAXRolePresentational: |
| return ui::AX_ROLE_PRESENTATIONAL; |
| case blink::WebAXRoleProgressIndicator: |
| return ui::AX_ROLE_PROGRESS_INDICATOR; |
| case blink::WebAXRoleRadioButton: |
| return ui::AX_ROLE_RADIO_BUTTON; |
| case blink::WebAXRoleRadioGroup: |
| return ui::AX_ROLE_RADIO_GROUP; |
| case blink::WebAXRoleRegion: |
| return ui::AX_ROLE_REGION; |
| case blink::WebAXRoleRootWebArea: |
| return ui::AX_ROLE_ROOT_WEB_AREA; |
| case blink::WebAXRoleRow: |
| return ui::AX_ROLE_ROW; |
| case blink::WebAXRoleRuby: |
| return ui::AX_ROLE_RUBY; |
| case blink::WebAXRoleRowHeader: |
| return ui::AX_ROLE_ROW_HEADER; |
| case blink::WebAXRoleRuler: |
| return ui::AX_ROLE_RULER; |
| case blink::WebAXRoleSVGRoot: |
| return ui::AX_ROLE_SVG_ROOT; |
| case blink::WebAXRoleScrollArea: |
| return ui::AX_ROLE_SCROLL_AREA; |
| case blink::WebAXRoleScrollBar: |
| return ui::AX_ROLE_SCROLL_BAR; |
| case blink::WebAXRoleSeamlessWebArea: |
| return ui::AX_ROLE_SEAMLESS_WEB_AREA; |
| case blink::WebAXRoleSearch: |
| return ui::AX_ROLE_SEARCH; |
| case blink::WebAXRoleSearchBox: |
| return ui::AX_ROLE_SEARCH_BOX; |
| case blink::WebAXRoleSlider: |
| return ui::AX_ROLE_SLIDER; |
| case blink::WebAXRoleSliderThumb: |
| return ui::AX_ROLE_SLIDER_THUMB; |
| case blink::WebAXRoleSpinButton: |
| return ui::AX_ROLE_SPIN_BUTTON; |
| case blink::WebAXRoleSpinButtonPart: |
| return ui::AX_ROLE_SPIN_BUTTON_PART; |
| case blink::WebAXRoleSplitter: |
| return ui::AX_ROLE_SPLITTER; |
| case blink::WebAXRoleStaticText: |
| return ui::AX_ROLE_STATIC_TEXT; |
| case blink::WebAXRoleStatus: |
| return ui::AX_ROLE_STATUS; |
| case blink::WebAXRoleSwitch: |
| return ui::AX_ROLE_SWITCH; |
| case blink::WebAXRoleTab: |
| return ui::AX_ROLE_TAB; |
| case blink::WebAXRoleTabGroup: |
| return ui::AX_ROLE_TAB_GROUP; |
| case blink::WebAXRoleTabList: |
| return ui::AX_ROLE_TAB_LIST; |
| case blink::WebAXRoleTabPanel: |
| return ui::AX_ROLE_TAB_PANEL; |
| case blink::WebAXRoleTable: |
| return ui::AX_ROLE_TABLE; |
| case blink::WebAXRoleTableHeaderContainer: |
| return ui::AX_ROLE_TABLE_HEADER_CONTAINER; |
| case blink::WebAXRoleTextArea: |
| return ui::AX_ROLE_TEXT_AREA; |
| case blink::WebAXRoleTextField: |
| return ui::AX_ROLE_TEXT_FIELD; |
| case blink::WebAXRoleTime: |
| return ui::AX_ROLE_TIME; |
| case blink::WebAXRoleTimer: |
| return ui::AX_ROLE_TIMER; |
| case blink::WebAXRoleToggleButton: |
| return ui::AX_ROLE_TOGGLE_BUTTON; |
| case blink::WebAXRoleToolbar: |
| return ui::AX_ROLE_TOOLBAR; |
| case blink::WebAXRoleTree: |
| return ui::AX_ROLE_TREE; |
| case blink::WebAXRoleTreeGrid: |
| return ui::AX_ROLE_TREE_GRID; |
| case blink::WebAXRoleTreeItem: |
| return ui::AX_ROLE_TREE_ITEM; |
| case blink::WebAXRoleUnknown: |
| return ui::AX_ROLE_UNKNOWN; |
| case blink::WebAXRoleUserInterfaceTooltip: |
| return ui::AX_ROLE_TOOLTIP; |
| case blink::WebAXRoleWebArea: |
| return ui::AX_ROLE_WEB_AREA; |
| case blink::WebAXRoleLineBreak: |
| return ui::AX_ROLE_LINE_BREAK; |
| case blink::WebAXRoleWindow: |
| return ui::AX_ROLE_WINDOW; |
| default: |
| // We can't add an assertion here, that prevents us |
| // from adding new role enums in Blink. |
| LOG(WARNING) << "Warning: Blink WebAXRole " << role |
| << " not handled by Chromium yet."; |
| return ui::AX_ROLE_UNKNOWN; |
| } |
| } |
| |
| ui::AXEvent AXEventFromBlink(blink::WebAXEvent event) { |
| switch (event) { |
| case blink::WebAXEventActiveDescendantChanged: |
| return ui::AX_EVENT_ACTIVEDESCENDANTCHANGED; |
| case blink::WebAXEventAlert: |
| return ui::AX_EVENT_ALERT; |
| case blink::WebAXEventAriaAttributeChanged: |
| return ui::AX_EVENT_ARIA_ATTRIBUTE_CHANGED; |
| case blink::WebAXEventAutocorrectionOccured: |
| return ui::AX_EVENT_AUTOCORRECTION_OCCURED; |
| case blink::WebAXEventCheckedStateChanged: |
| return ui::AX_EVENT_CHECKED_STATE_CHANGED; |
| case blink::WebAXEventChildrenChanged: |
| return ui::AX_EVENT_CHILDREN_CHANGED; |
| case blink::WebAXEventFocus: |
| return ui::AX_EVENT_FOCUS; |
| case blink::WebAXEventInvalidStatusChanged: |
| return ui::AX_EVENT_INVALID_STATUS_CHANGED; |
| case blink::WebAXEventLayoutComplete: |
| return ui::AX_EVENT_LAYOUT_COMPLETE; |
| case blink::WebAXEventLiveRegionChanged: |
| return ui::AX_EVENT_LIVE_REGION_CHANGED; |
| case blink::WebAXEventLoadComplete: |
| return ui::AX_EVENT_LOAD_COMPLETE; |
| case blink::WebAXEventLocationChanged: |
| return ui::AX_EVENT_LOCATION_CHANGED; |
| case blink::WebAXEventMenuListItemSelected: |
| return ui::AX_EVENT_MENU_LIST_ITEM_SELECTED; |
| case blink::WebAXEventMenuListValueChanged: |
| return ui::AX_EVENT_MENU_LIST_VALUE_CHANGED; |
| case blink::WebAXEventRowCollapsed: |
| return ui::AX_EVENT_ROW_COLLAPSED; |
| case blink::WebAXEventRowCountChanged: |
| return ui::AX_EVENT_ROW_COUNT_CHANGED; |
| case blink::WebAXEventRowExpanded: |
| return ui::AX_EVENT_ROW_EXPANDED; |
| case blink::WebAXEventScrollPositionChanged: |
| return ui::AX_EVENT_SCROLL_POSITION_CHANGED; |
| case blink::WebAXEventScrolledToAnchor: |
| return ui::AX_EVENT_SCROLLED_TO_ANCHOR; |
| case blink::WebAXEventSelectedChildrenChanged: |
| return ui::AX_EVENT_SELECTED_CHILDREN_CHANGED; |
| case blink::WebAXEventSelectedTextChanged: |
| return ui::AX_EVENT_TEXT_SELECTION_CHANGED; |
| case blink::WebAXEventTextChanged: |
| return ui::AX_EVENT_TEXT_CHANGED; |
| case blink::WebAXEventValueChanged: |
| return ui::AX_EVENT_VALUE_CHANGED; |
| default: |
| // We can't add an assertion here, that prevents us |
| // from adding new event enums in Blink. |
| return ui::AX_EVENT_NONE; |
| } |
| } |
| |
| ui::AXTextDirection AXTextDirectionFromBlink( |
| blink::WebAXTextDirection text_direction) { |
| switch (text_direction) { |
| case blink::WebAXTextDirectionLR: |
| return ui::AX_TEXT_DIRECTION_LR; |
| case blink::WebAXTextDirectionRL: |
| return ui::AX_TEXT_DIRECTION_RL; |
| case blink::WebAXTextDirectionTB: |
| return ui::AX_TEXT_DIRECTION_TB; |
| case blink::WebAXTextDirectionBT: |
| return ui::AX_TEXT_DIRECTION_BT; |
| default: |
| NOTREACHED(); |
| } |
| |
| return ui::AX_TEXT_DIRECTION_NONE; |
| } |
| |
| ui::AXInvalidState AXInvalidStateFromBlink( |
| blink::WebAXInvalidState invalid_state) { |
| switch (invalid_state) { |
| case blink::WebAXInvalidStateUndefined: |
| return ui::AX_INVALID_STATE_NONE; |
| case blink::WebAXInvalidStateFalse: |
| return ui::AX_INVALID_STATE_FALSE; |
| case blink::WebAXInvalidStateTrue: |
| return ui::AX_INVALID_STATE_TRUE; |
| case blink::WebAXInvalidStateSpelling: |
| return ui::AX_INVALID_STATE_SPELLING; |
| case blink::WebAXInvalidStateGrammar: |
| return ui::AX_INVALID_STATE_GRAMMAR; |
| case blink::WebAXInvalidStateOther: |
| return ui::AX_INVALID_STATE_OTHER; |
| default: |
| NOTREACHED(); |
| } |
| |
| return ui::AX_INVALID_STATE_NONE; |
| } |
| |
| ui::AXSortDirection AXSortDirectionFromBlink( |
| blink::WebAXSortDirection sort_direction) { |
| switch (sort_direction) { |
| case blink::WebAXSortDirectionUndefined: |
| return ui::AX_SORT_DIRECTION_NONE; |
| case blink::WebAXSortDirectionNone: |
| return ui::AX_SORT_DIRECTION_UNSORTED; |
| case blink::WebAXSortDirectionAscending: |
| return ui::AX_SORT_DIRECTION_ASCENDING; |
| case blink::WebAXSortDirectionDescending: |
| return ui::AX_SORT_DIRECTION_DESCENDING; |
| case blink::WebAXSortDirectionOther: |
| return ui::AX_SORT_DIRECTION_OTHER; |
| default: |
| NOTREACHED(); |
| } |
| |
| return ui::AX_SORT_DIRECTION_NONE; |
| } |
| |
| } // Namespace content. |