Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(149)

Unified Diff: content/browser/accessibility/browser_accessibility_com_win.cc

Issue 2967493005: Use MSAA_Role directly from BrowserAccessibility. (Closed)
Patch Set: Change tests to match internal ax tree. Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/accessibility/browser_accessibility_com_win.cc
diff --git a/content/browser/accessibility/browser_accessibility_com_win.cc b/content/browser/accessibility/browser_accessibility_com_win.cc
index 57ff9025055e2d8197325b35ee3124ff52c63c12..6bee5797dc68801985a15abb9e60d69f35161fd0 100644
--- a/content/browser/accessibility/browser_accessibility_com_win.cc
+++ b/content/browser/accessibility/browser_accessibility_com_win.cc
@@ -613,7 +613,7 @@ STDMETHODIMP BrowserAccessibilityComWin::get_accState(VARIANT var_id,
}
bool BrowserAccessibilityComWin::IsRangeValueSupported() {
- switch (ia_role()) {
+ switch (MSAARole()) {
case ROLE_SYSTEM_PROGRESSBAR:
case ROLE_SYSTEM_SLIDER:
case ROLE_SYSTEM_SPINBUTTON:
@@ -3401,7 +3401,7 @@ HRESULT WINAPI BrowserAccessibilityComWin::InternalQueryInterface(
void** object) {
BrowserAccessibilityComWin* accessibility =
reinterpret_cast<BrowserAccessibilityComWin*>(this_ptr);
- int32_t ia_role = accessibility->ia_role();
+ int32_t ia_role = accessibility->MSAARole();
if (iid == IID_IAccessibleImage) {
if (ia_role != ROLE_SYSTEM_GRAPHIC) {
*object = NULL;
@@ -3660,8 +3660,8 @@ void BrowserAccessibilityComWin::UpdateStep1ComputeWinAttributes() {
// Expose row or column header sort direction.
int32_t sort_direction;
- if ((ia_role() == ROLE_SYSTEM_COLUMNHEADER ||
- ia_role() == ROLE_SYSTEM_ROWHEADER) &&
+ if ((MSAARole() == ROLE_SYSTEM_COLUMNHEADER ||
+ MSAARole() == ROLE_SYSTEM_ROWHEADER) &&
owner()->GetIntAttribute(ui::AX_ATTR_SORT_DIRECTION, &sort_direction)) {
switch (static_cast<ui::AXSortDirection>(sort_direction)) {
case ui::AX_SORT_DIRECTION_NONE:
@@ -3740,7 +3740,6 @@ void BrowserAccessibilityComWin::UpdateStep1ComputeWinAttributes() {
// something other than DOCUMENT so that the fact that it's a separate doc
// is not exposed to AT.
if (owner()->IsWebAreaForPresentationalIframe()) {
- win_attributes_->ia_role = ROLE_SYSTEM_GROUPING;
win_attributes_->ia2_role = ROLE_SYSTEM_GROUPING;
}
}
@@ -4920,8 +4919,6 @@ void BrowserAccessibilityComWin::FireNativeEvent(LONG win_event_type) const {
}
void BrowserAccessibilityComWin::InitRoleAndState() {
- int32_t ia_role = 0;
- base::string16 role_name;
int32_t ia2_role = 0;
int32_t ia2_state = IA2_STATE_OPAQUE;
@@ -4966,448 +4963,151 @@ void BrowserAccessibilityComWin::InitRoleAndState() {
base::string16 html_tag = owner()->GetString16Attribute(ui::AX_ATTR_HTML_TAG);
switch (owner()->GetRole()) {
- case ui::AX_ROLE_ALERT:
- ia_role = ROLE_SYSTEM_ALERT;
- break;
- case ui::AX_ROLE_ALERT_DIALOG:
- ia_role = ROLE_SYSTEM_DIALOG;
- break;
- case ui::AX_ROLE_ANCHOR:
- ia_role = ROLE_SYSTEM_LINK;
- break;
- case ui::AX_ROLE_APPLICATION:
- ia_role = ROLE_SYSTEM_APPLICATION;
- break;
- case ui::AX_ROLE_ARTICLE:
- ia_role = ROLE_SYSTEM_DOCUMENT;
- break;
- case ui::AX_ROLE_AUDIO:
- ia_role = ROLE_SYSTEM_GROUPING;
- break;
case ui::AX_ROLE_BANNER:
- ia_role = ROLE_SYSTEM_GROUPING;
ia2_role = IA2_ROLE_HEADER;
break;
case ui::AX_ROLE_BLOCKQUOTE:
- role_name = html_tag;
ia2_role = IA2_ROLE_SECTION;
break;
- case ui::AX_ROLE_BUSY_INDICATOR:
- ia_role = ROLE_SYSTEM_ANIMATION;
- break;
- case ui::AX_ROLE_BUTTON:
- ia_role = ROLE_SYSTEM_PUSHBUTTON;
- break;
case ui::AX_ROLE_CANVAS:
if (owner()->GetBoolAttribute(ui::AX_ATTR_CANVAS_HAS_FALLBACK)) {
- role_name = L"canvas";
ia2_role = IA2_ROLE_CANVAS;
- } else {
- ia_role = ROLE_SYSTEM_GRAPHIC;
}
break;
case ui::AX_ROLE_CAPTION:
- ia_role = ROLE_SYSTEM_TEXT;
ia2_role = IA2_ROLE_CAPTION;
break;
- case ui::AX_ROLE_CELL:
- ia_role = ROLE_SYSTEM_CELL;
- break;
- case ui::AX_ROLE_CHECK_BOX:
- ia_role = ROLE_SYSTEM_CHECKBUTTON;
- break;
case ui::AX_ROLE_COLOR_WELL:
- ia_role = ROLE_SYSTEM_TEXT;
ia2_role = IA2_ROLE_COLOR_CHOOSER;
break;
- case ui::AX_ROLE_COLUMN:
- ia_role = ROLE_SYSTEM_COLUMN;
- break;
- case ui::AX_ROLE_COLUMN_HEADER:
- ia_role = ROLE_SYSTEM_COLUMNHEADER;
- break;
- case ui::AX_ROLE_COMBO_BOX:
- ia_role = ROLE_SYSTEM_COMBOBOX;
- break;
case ui::AX_ROLE_COMPLEMENTARY:
- ia_role = ROLE_SYSTEM_GROUPING;
ia2_role = IA2_ROLE_NOTE;
break;
case ui::AX_ROLE_CONTENT_INFO:
- ia_role = ROLE_SYSTEM_TEXT;
ia2_role = IA2_ROLE_PARAGRAPH;
break;
case ui::AX_ROLE_DATE:
case ui::AX_ROLE_DATE_TIME:
- ia_role = ROLE_SYSTEM_DROPLIST;
ia2_role = IA2_ROLE_DATE_EDITOR;
break;
case ui::AX_ROLE_DEFINITION:
- role_name = html_tag;
ia2_role = IA2_ROLE_PARAGRAPH;
break;
case ui::AX_ROLE_DESCRIPTION_LIST_DETAIL:
- role_name = html_tag;
- ia_role = ROLE_SYSTEM_TEXT;
ia2_role = IA2_ROLE_PARAGRAPH;
break;
- case ui::AX_ROLE_DESCRIPTION_LIST:
- role_name = html_tag;
- ia_role = ROLE_SYSTEM_LIST;
- break;
- case ui::AX_ROLE_DESCRIPTION_LIST_TERM:
- ia_role = ROLE_SYSTEM_LISTITEM;
- break;
- case ui::AX_ROLE_DETAILS:
- role_name = html_tag;
- ia_role = ROLE_SYSTEM_GROUPING;
- break;
- case ui::AX_ROLE_DIALOG:
- ia_role = ROLE_SYSTEM_DIALOG;
- break;
- case ui::AX_ROLE_DISCLOSURE_TRIANGLE:
- ia_role = ROLE_SYSTEM_PUSHBUTTON;
- break;
- case ui::AX_ROLE_DOCUMENT:
- case ui::AX_ROLE_ROOT_WEB_AREA:
- case ui::AX_ROLE_WEB_AREA:
- ia_role = ROLE_SYSTEM_DOCUMENT;
- break;
case ui::AX_ROLE_EMBEDDED_OBJECT:
- if (owner()->PlatformChildCount()) {
- // Windows screen readers assume that IA2_ROLE_EMBEDDED_OBJECT
- // doesn't have any children, but it may be something like a
- // browser plugin that has a document inside.
- ia_role = ROLE_SYSTEM_GROUPING;
- } else {
- ia_role = ROLE_SYSTEM_CLIENT;
+ if (!owner()->PlatformChildCount()) {
ia2_role = IA2_ROLE_EMBEDDED_OBJECT;
}
break;
case ui::AX_ROLE_FIGCAPTION:
- role_name = html_tag;
ia2_role = IA2_ROLE_CAPTION;
break;
- case ui::AX_ROLE_FIGURE:
- ia_role = ROLE_SYSTEM_GROUPING;
- break;
- case ui::AX_ROLE_FEED:
- ia_role = ROLE_SYSTEM_GROUPING;
- break;
case ui::AX_ROLE_FORM:
- role_name = L"form";
ia2_role = IA2_ROLE_FORM;
break;
case ui::AX_ROLE_FOOTER:
- ia_role = ROLE_SYSTEM_GROUPING;
ia2_role = IA2_ROLE_FOOTER;
break;
case ui::AX_ROLE_GENERIC_CONTAINER:
- ia_role = ROLE_SYSTEM_GROUPING;
ia2_role = IA2_ROLE_SECTION;
- role_name = html_tag.empty() ? L"div" : html_tag;
- break;
- case ui::AX_ROLE_GRID:
- ia_role = ROLE_SYSTEM_TABLE;
- break;
- case ui::AX_ROLE_GROUP:
- ia_role = ROLE_SYSTEM_GROUPING;
break;
case ui::AX_ROLE_HEADING:
- role_name = html_tag;
- if (html_tag.empty())
- ia_role = ROLE_SYSTEM_GROUPING;
ia2_role = IA2_ROLE_HEADING;
break;
case ui::AX_ROLE_IFRAME:
- ia_role = ROLE_SYSTEM_DOCUMENT;
ia2_role = IA2_ROLE_INTERNAL_FRAME;
break;
- case ui::AX_ROLE_IFRAME_PRESENTATIONAL:
- ia_role = ROLE_SYSTEM_GROUPING;
- break;
- case ui::AX_ROLE_IMAGE:
- ia_role = ROLE_SYSTEM_GRAPHIC;
- break;
case ui::AX_ROLE_IMAGE_MAP:
- role_name = html_tag;
ia2_role = IA2_ROLE_IMAGE_MAP;
break;
- case ui::AX_ROLE_IMAGE_MAP_LINK:
- ia_role = ROLE_SYSTEM_LINK;
- break;
- case ui::AX_ROLE_INPUT_TIME:
- ia_role = ROLE_SYSTEM_GROUPING;
- break;
case ui::AX_ROLE_LABEL_TEXT:
case ui::AX_ROLE_LEGEND:
- ia_role = ROLE_SYSTEM_TEXT;
ia2_role = IA2_ROLE_LABEL;
break;
- case ui::AX_ROLE_LINK:
- ia_role = ROLE_SYSTEM_LINK;
- break;
- case ui::AX_ROLE_LIST:
- ia_role = ROLE_SYSTEM_LIST;
- break;
- case ui::AX_ROLE_LIST_BOX:
- ia_role = ROLE_SYSTEM_LIST;
- break;
- case ui::AX_ROLE_LIST_BOX_OPTION:
- ia_role = ROLE_SYSTEM_LISTITEM;
- break;
- case ui::AX_ROLE_LIST_ITEM:
- ia_role = ROLE_SYSTEM_LISTITEM;
- break;
case ui::AX_ROLE_MAIN:
- ia_role = ROLE_SYSTEM_GROUPING;
ia2_role = IA2_ROLE_PARAGRAPH;
break;
case ui::AX_ROLE_MARK:
- ia_role = ROLE_SYSTEM_TEXT;
ia2_role = IA2_ROLE_TEXT_FRAME;
break;
- case ui::AX_ROLE_MARQUEE:
- ia_role = ROLE_SYSTEM_ANIMATION;
- break;
- case ui::AX_ROLE_MATH:
- ia_role = ROLE_SYSTEM_EQUATION;
- break;
- case ui::AX_ROLE_MENU:
- case ui::AX_ROLE_MENU_BUTTON:
- ia_role = ROLE_SYSTEM_MENUPOPUP;
- break;
- case ui::AX_ROLE_MENU_BAR:
- ia_role = ROLE_SYSTEM_MENUBAR;
- break;
- case ui::AX_ROLE_MENU_ITEM:
- ia_role = ROLE_SYSTEM_MENUITEM;
- break;
case ui::AX_ROLE_MENU_ITEM_CHECK_BOX:
- ia_role = ROLE_SYSTEM_MENUITEM;
ia2_role = IA2_ROLE_CHECK_MENU_ITEM;
break;
case ui::AX_ROLE_MENU_ITEM_RADIO:
- ia_role = ROLE_SYSTEM_MENUITEM;
ia2_role = IA2_ROLE_RADIO_MENU_ITEM;
break;
case ui::AX_ROLE_MENU_LIST_POPUP:
- ia_role = ROLE_SYSTEM_LIST;
ia2_state &= ~(IA2_STATE_EDITABLE);
break;
case ui::AX_ROLE_MENU_LIST_OPTION:
- ia_role = ROLE_SYSTEM_LISTITEM;
ia2_state &= ~(IA2_STATE_EDITABLE);
break;
- case ui::AX_ROLE_METER:
- role_name = html_tag;
- ia_role = ROLE_SYSTEM_PROGRESSBAR;
- break;
case ui::AX_ROLE_NAVIGATION:
- ia_role = ROLE_SYSTEM_GROUPING;
ia2_role = IA2_ROLE_SECTION;
break;
case ui::AX_ROLE_NOTE:
- ia_role = ROLE_SYSTEM_GROUPING;
ia2_role = IA2_ROLE_NOTE;
break;
- case ui::AX_ROLE_OUTLINE:
- ia_role = ROLE_SYSTEM_OUTLINE;
- break;
case ui::AX_ROLE_PARAGRAPH:
- role_name = L"P";
ia2_role = IA2_ROLE_PARAGRAPH;
break;
- case ui::AX_ROLE_POP_UP_BUTTON:
- if (html_tag == L"select") {
- ia_role = ROLE_SYSTEM_COMBOBOX;
- } else {
- ia_role = ROLE_SYSTEM_BUTTONMENU;
- }
- break;
case ui::AX_ROLE_PRE:
- role_name = html_tag;
- ia_role = ROLE_SYSTEM_TEXT;
ia2_role = IA2_ROLE_PARAGRAPH;
break;
- case ui::AX_ROLE_PROGRESS_INDICATOR:
- ia_role = ROLE_SYSTEM_PROGRESSBAR;
- break;
- case ui::AX_ROLE_RADIO_BUTTON:
- ia_role = ROLE_SYSTEM_RADIOBUTTON;
- break;
- case ui::AX_ROLE_RADIO_GROUP:
- ia_role = ROLE_SYSTEM_GROUPING;
- break;
case ui::AX_ROLE_REGION:
if (html_tag == L"section") {
- ia_role = ROLE_SYSTEM_GROUPING;
ia2_role = IA2_ROLE_SECTION;
- } else {
- ia_role = ROLE_SYSTEM_PANE;
}
break;
- case ui::AX_ROLE_ROW: {
- // Role changes depending on whether row is inside a treegrid
- // https://www.w3.org/TR/core-aam-1.1/#role-map-row
- ia_role =
- IsInTreeGrid(owner()) ? ROLE_SYSTEM_OUTLINEITEM : ROLE_SYSTEM_ROW;
- break;
- }
- case ui::AX_ROLE_ROW_HEADER:
- ia_role = ROLE_SYSTEM_ROWHEADER;
- break;
case ui::AX_ROLE_RUBY:
- ia_role = ROLE_SYSTEM_TEXT;
ia2_role = IA2_ROLE_TEXT_FRAME;
break;
case ui::AX_ROLE_RULER:
- ia_role = ROLE_SYSTEM_CLIENT;
ia2_role = IA2_ROLE_RULER;
break;
case ui::AX_ROLE_SCROLL_AREA:
- ia_role = ROLE_SYSTEM_CLIENT;
ia2_role = IA2_ROLE_SCROLL_PANE;
ia2_state &= ~(IA2_STATE_EDITABLE);
break;
- case ui::AX_ROLE_SCROLL_BAR:
- ia_role = ROLE_SYSTEM_SCROLLBAR;
- break;
case ui::AX_ROLE_SEARCH:
- ia_role = ROLE_SYSTEM_GROUPING;
ia2_role = IA2_ROLE_SECTION;
break;
- case ui::AX_ROLE_SLIDER:
- ia_role = ROLE_SYSTEM_SLIDER;
- break;
- case ui::AX_ROLE_SPIN_BUTTON:
- ia_role = ROLE_SYSTEM_SPINBUTTON;
- break;
- case ui::AX_ROLE_SPIN_BUTTON_PART:
- ia_role = ROLE_SYSTEM_PUSHBUTTON;
- break;
- case ui::AX_ROLE_ANNOTATION:
- case ui::AX_ROLE_LIST_MARKER:
- case ui::AX_ROLE_STATIC_TEXT:
- ia_role = ROLE_SYSTEM_STATICTEXT;
- break;
- case ui::AX_ROLE_STATUS:
- ia_role = ROLE_SYSTEM_STATUSBAR;
- break;
- case ui::AX_ROLE_SPLITTER:
- ia_role = ROLE_SYSTEM_SEPARATOR;
- break;
- case ui::AX_ROLE_SVG_ROOT:
- ia_role = ROLE_SYSTEM_GRAPHIC;
- break;
case ui::AX_ROLE_SWITCH:
- role_name = L"switch";
ia2_role = IA2_ROLE_TOGGLE_BUTTON;
break;
- case ui::AX_ROLE_TAB:
- ia_role = ROLE_SYSTEM_PAGETAB;
- break;
- case ui::AX_ROLE_TABLE:
- ia_role = ROLE_SYSTEM_TABLE;
- break;
case ui::AX_ROLE_TABLE_HEADER_CONTAINER:
- ia_role = ROLE_SYSTEM_GROUPING;
ia2_role = IA2_ROLE_SECTION;
break;
- case ui::AX_ROLE_TAB_LIST:
- ia_role = ROLE_SYSTEM_PAGETABLIST;
- break;
- case ui::AX_ROLE_TAB_PANEL:
- ia_role = ROLE_SYSTEM_PROPERTYPAGE;
- break;
- case ui::AX_ROLE_TERM:
- ia_role = ROLE_SYSTEM_LISTITEM;
- break;
case ui::AX_ROLE_TOGGLE_BUTTON:
- ia_role = ROLE_SYSTEM_PUSHBUTTON;
ia2_role = IA2_ROLE_TOGGLE_BUTTON;
break;
case ui::AX_ROLE_TEXT_FIELD:
case ui::AX_ROLE_SEARCH_BOX:
- ia_role = ROLE_SYSTEM_TEXT;
ia2_state |= IA2_STATE_SELECTABLE_TEXT;
break;
case ui::AX_ROLE_ABBR:
case ui::AX_ROLE_TIME:
- role_name = html_tag;
- ia_role = ROLE_SYSTEM_TEXT;
ia2_role = IA2_ROLE_TEXT_FRAME;
break;
- case ui::AX_ROLE_TIMER:
- ia_role = ROLE_SYSTEM_CLOCK;
- break;
- case ui::AX_ROLE_TOOLBAR:
- ia_role = ROLE_SYSTEM_TOOLBAR;
- break;
- case ui::AX_ROLE_TOOLTIP:
- ia_role = ROLE_SYSTEM_TOOLTIP;
- break;
- case ui::AX_ROLE_TREE:
- ia_role = ROLE_SYSTEM_OUTLINE;
- break;
- case ui::AX_ROLE_TREE_GRID:
- ia_role = ROLE_SYSTEM_OUTLINE;
- break;
- case ui::AX_ROLE_TREE_ITEM:
- ia_role = ROLE_SYSTEM_OUTLINEITEM;
- break;
- case ui::AX_ROLE_LINE_BREAK:
- ia_role = ROLE_SYSTEM_WHITESPACE;
- break;
- case ui::AX_ROLE_VIDEO:
- ia_role = ROLE_SYSTEM_GROUPING;
- break;
- case ui::AX_ROLE_WINDOW:
- ia_role = ROLE_SYSTEM_WINDOW;
- break;
-
- // TODO(dmazzoni): figure out the proper MSAA role for all of these.
- case ui::AX_ROLE_DIRECTORY:
- case ui::AX_ROLE_IGNORED:
- case ui::AX_ROLE_LOG:
- case ui::AX_ROLE_NONE:
- case ui::AX_ROLE_PRESENTATIONAL:
- case ui::AX_ROLE_SLIDER_THUMB:
default:
- ia_role = ROLE_SYSTEM_CLIENT;
break;
}
- // The role should always be set.
- DCHECK(!role_name.empty() || ia_role);
+ win_attributes_->ia_role = MSAARole();
+ win_attributes_->ia_state = MSAAState();
+ win_attributes_->role_name = base::UTF8ToUTF16(StringOverrideForMSAARole());
// If we didn't explicitly set the IAccessible2 role, make it the same
// as the MSAA role.
if (!ia2_role)
- ia2_role = ia_role;
+ ia2_role = win_attributes_->ia_role;
- win_attributes_->ia_role = ia_role;
- win_attributes_->ia_state = MSAAState();
- win_attributes_->role_name = role_name;
win_attributes_->ia2_role = ia2_role;
win_attributes_->ia2_state = ia2_state;
}
-bool BrowserAccessibilityComWin::IsInTreeGrid(
- const BrowserAccessibility* item) {
- BrowserAccessibility* container = item->PlatformGetParent();
- if (container && container->GetRole() == ui::AX_ROLE_GROUP) {
- // If parent was a rowgroup, we need to look at the grandparent
- container = container->PlatformGetParent();
- }
-
- if (!container) {
- return false;
- }
-
- return container->GetRole() == ui::AX_ROLE_TREE_GRID;
-}
-
BrowserAccessibilityComWin* ToBrowserAccessibilityComWin(
BrowserAccessibility* obj) {
if (!obj || !obj->IsNative())

Powered by Google App Engine
This is Rietveld 408576698