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; |
} |