Chromium Code Reviews| Index: ui/accessibility/platform/ax_platform_node_win.cc |
| diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc |
| index 1a54321c6be5f0da90ad87a42d0cd914aba2d524..7d385a64000d2dd73606a11ab87adad52ae3073d 100644 |
| --- a/ui/accessibility/platform/ax_platform_node_win.cc |
| +++ b/ui/accessibility/platform/ax_platform_node_win.cc |
| @@ -1438,8 +1438,7 @@ int AXPlatformNodeWin::MSAAState() { |
| msaa_state |= STATE_SYSTEM_FOCUSABLE; |
| if (state & (1 << ui::AX_STATE_HASPOPUP)) |
| msaa_state |= STATE_SYSTEM_HASPOPUP; |
| - if (state & (1 << ui::AX_STATE_HOVERED)) |
| - msaa_state |= STATE_SYSTEM_HOTTRACKED; |
| + |
| if (state & (1 << ui::AX_STATE_INVISIBLE) || |
| GetData().role == ui::AX_ROLE_IGNORED) { |
| msaa_state |= STATE_SYSTEM_INVISIBLE; |
| @@ -1458,6 +1457,23 @@ int AXPlatformNodeWin::MSAAState() { |
| msaa_state |= STATE_SYSTEM_SELECTED; |
| if (state & (1 << ui::AX_STATE_DISABLED)) |
| msaa_state |= STATE_SYSTEM_UNAVAILABLE; |
| + if (state & (1 << ui::AX_STATE_BUSY)) |
| + msaa_state |= STATE_SYSTEM_BUSY; |
| + if (state & (1 << ui::AX_STATE_VISITED)) |
| + msaa_state |= STATE_SYSTEM_TRAVERSED; |
| + |
| + if (state & (1 << ui::AX_STATE_MULTISELECTABLE)) { |
| + msaa_state |= STATE_SYSTEM_EXTSELECTABLE; |
| + msaa_state |= STATE_SYSTEM_MULTISELECTABLE; |
| + } |
| + |
| + // Expose whether or not the mouse is over an element, but suppress |
| + // this for tests because it can make the test results flaky depending |
| + // on the position of the mouse. |
| + if (delegate_->ShouldIgnoreHoveredStateForTesting()) { |
| + if (state & (1 << ui::AX_STATE_HOVERED)) |
| + msaa_state |= STATE_SYSTEM_HOTTRACKED; |
| + } |
| // Checked state |
| const auto checked_state = static_cast<ui::AXCheckedState>( |
| @@ -1490,6 +1506,89 @@ int AXPlatformNodeWin::MSAAState() { |
| msaa_state |= STATE_SYSTEM_FOCUSED; |
| } |
| + switch (GetData().role) { |
| + case ui::AX_ROLE_ARTICLE: |
| + case ui::AX_ROLE_BUSY_INDICATOR: |
| + case ui::AX_ROLE_DEFINITION: |
| + case ui::AX_ROLE_DESCRIPTION_LIST: |
| + case ui::AX_ROLE_DESCRIPTION_LIST_TERM: |
| + case ui::AX_ROLE_IFRAME: |
| + case ui::AX_ROLE_IMAGE: |
| + case ui::AX_ROLE_IMAGE_MAP: |
| + case ui::AX_ROLE_LIST: |
| + case ui::AX_ROLE_LIST_ITEM: |
| + case ui::AX_ROLE_PROGRESS_INDICATOR: |
| + case ui::AX_ROLE_RULER: |
| + case ui::AX_ROLE_SCROLL_AREA: |
| + case ui::AX_ROLE_TABLE_HEADER_CONTAINER: |
| + case ui::AX_ROLE_TERM: |
| + case ui::AX_ROLE_TIMER: |
| + case ui::AX_ROLE_TOOLBAR: |
| + case ui::AX_ROLE_TOOLTIP: |
| + msaa_state |= STATE_SYSTEM_READONLY; |
| + break; |
| + |
| + case ui::AX_ROLE_DOCUMENT: |
| + case ui::AX_ROLE_ROOT_WEB_AREA: |
| + case ui::AX_ROLE_WEB_AREA: |
| + msaa_state |= STATE_SYSTEM_READONLY; |
| + msaa_state |= STATE_SYSTEM_FOCUSABLE; |
| + break; |
| + |
| + case ui::AX_ROLE_GRID: |
| + // TODO(aleventhal) this changed between ARIA 1.0 and 1.1, |
| + // need to determine whether grids/treegrids should really be readonly |
| + // or editable by default |
| + // msaa_state |= STATE_SYSTEM_READONLY; |
| + break; |
| + |
| + case ui::AX_ROLE_IMAGE_MAP_LINK: |
| + msaa_state |= STATE_SYSTEM_LINKED; |
| + msaa_state |= STATE_SYSTEM_READONLY; |
| + break; |
| + |
| + case ui::AX_ROLE_LINK: |
| + msaa_state |= STATE_SYSTEM_LINKED; |
| + break; |
| + |
| + case ui::AX_ROLE_LIST_BOX_OPTION: |
| + if (msaa_state & STATE_SYSTEM_SELECTABLE) { |
| + msaa_state |= STATE_SYSTEM_FOCUSABLE; |
| + } |
| + break; |
| + |
| + case ui::AX_ROLE_MENU_LIST_OPTION: |
| + if (msaa_state & STATE_SYSTEM_SELECTABLE) { |
| + msaa_state |= STATE_SYSTEM_FOCUSABLE; |
| + } |
| + break; |
| + |
| + case ui::AX_ROLE_TEXT_FIELD: |
| + case ui::AX_ROLE_SEARCH_BOX: |
| + if (state & (1 << ui::AX_STATE_READ_ONLY)) |
| + msaa_state |= STATE_SYSTEM_READONLY; |
| + break; |
| + default: |
| + break; |
| + } |
| + |
| + // Compute the final value of READONLY for MSAA. |
| + // |
| + // We always set the READONLY state for elements that have the |
| + // aria-readonly attribute and for a few roles (in the switch above), |
| + // including read-only text fields. |
| + // The majority of focusable controls should not have the read-only state set. |
| + if (state & (1 << ui::AX_STATE_FOCUSABLE) && |
| + GetData().role != ROLE_SYSTEM_DOCUMENT && |
|
dmazzoni
2017/06/14 17:13:16
This is the bug.
GetData().role is a ui::AXRole
R
|
| + GetData().role != ROLE_SYSTEM_TEXT) { |
| + msaa_state &= ~(STATE_SYSTEM_READONLY); |
| + } |
| + if (!(state & (1 << ui::AX_STATE_READ_ONLY))) |
| + msaa_state &= ~(STATE_SYSTEM_READONLY); |
| + |
| + if (GetData().GetBoolAttribute(ui::AX_ATTR_ARIA_READONLY)) |
| + msaa_state |= STATE_SYSTEM_READONLY; |
| + |
| return msaa_state; |
| } |