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 cb94df0acdc23b5035f45d103f881004b352bf9d..8f5bd2aa37616a879808a86a3093f92ffdc51a18 100644 |
| --- a/ui/accessibility/platform/ax_platform_node_win.cc |
| +++ b/ui/accessibility/platform/ax_platform_node_win.cc |
| @@ -747,15 +747,7 @@ STDMETHODIMP AXPlatformNodeWin::role(LONG* role) { |
| STDMETHODIMP AXPlatformNodeWin::get_states(AccessibleStates* states) { |
| COM_OBJECT_VALIDATE_1_ARG(states); |
| - // There are only a couple of states we need to support |
| - // in IAccessible2. If any more are added, we may want to |
| - // add a helper function like MSAAState. |
| - *states = IA2_STATE_OPAQUE; |
| - if (GetData().state & (1 << ui::AX_STATE_EDITABLE)) |
| - *states |= IA2_STATE_EDITABLE; |
| - if (GetData().state & (1 << ui::AX_STATE_VERTICAL)) |
| - *states |= IA2_STATE_VERTICAL; |
| - |
| + *states = MSAA_IA2State(); |
| return S_OK; |
| } |
| @@ -1605,6 +1597,60 @@ bool AXPlatformNodeWin::IsWebAreaForPresentationalIframe() { |
| return parent->GetData().role == ui::AX_ROLE_IFRAME_PRESENTATIONAL; |
| } |
| +int32_t AXPlatformNodeWin::MSAA_IA2State() { |
| + const AXNodeData& data = GetData(); |
|
dmazzoni
2017/07/06 22:54:57
Not sure how significant this is, but we're callin
dougt
2017/07/11 20:59:27
Acknowledged. Do you think we should measure the
|
| + |
| + int32_t ia2_state = IA2_STATE_OPAQUE; |
| + |
| + const auto checked_state = static_cast<ui::AXCheckedState>( |
| + GetIntAttribute(ui::AX_ATTR_CHECKED_STATE)); |
| + if (checked_state) { |
| + ia2_state |= IA2_STATE_CHECKABLE; |
| + } |
| + |
| + if (HasIntAttribute(ui::AX_ATTR_INVALID_STATE) && |
| + GetIntAttribute(ui::AX_ATTR_INVALID_STATE) != ui::AX_INVALID_STATE_FALSE) |
| + ia2_state |= IA2_STATE_INVALID_ENTRY; |
| + if (data.HasState(ui::AX_STATE_REQUIRED)) |
| + ia2_state |= IA2_STATE_REQUIRED; |
| + if (data.HasState(ui::AX_STATE_VERTICAL)) |
| + ia2_state |= IA2_STATE_VERTICAL; |
| + if (data.HasState(ui::AX_STATE_HORIZONTAL)) |
| + ia2_state |= IA2_STATE_HORIZONTAL; |
| + if (data.HasState(ui::AX_STATE_EDITABLE)) |
| + ia2_state |= IA2_STATE_EDITABLE; |
| + |
| + if (!GetStringAttribute(ui::AX_ATTR_AUTO_COMPLETE).empty()) |
| + ia2_state |= IA2_STATE_SUPPORTS_AUTOCOMPLETION; |
| + |
| + if (GetBoolAttribute(ui::AX_ATTR_MODAL)) |
| + ia2_state |= IA2_STATE_MODAL; |
| + |
| + switch (data.role) { |
| + case ui::AX_ROLE_MENU_LIST_POPUP: |
| + ia2_state &= ~(IA2_STATE_EDITABLE); |
| + break; |
| + case ui::AX_ROLE_MENU_LIST_OPTION: |
| + ia2_state &= ~(IA2_STATE_EDITABLE); |
| + break; |
| + case ui::AX_ROLE_SCROLL_AREA: |
| + ia2_state &= ~(IA2_STATE_EDITABLE); |
| + break; |
| + case ui::AX_ROLE_TEXT_FIELD: |
| + case ui::AX_ROLE_SEARCH_BOX: |
| + if (data.HasState(ui::AX_STATE_MULTILINE)) { |
| + ia2_state |= IA2_STATE_MULTI_LINE; |
| + } else { |
| + ia2_state |= IA2_STATE_SINGLE_LINE; |
| + } |
| + ia2_state |= IA2_STATE_SELECTABLE_TEXT; |
| + break; |
| + default: |
| + break; |
| + } |
| + return ia2_state; |
| +} |
| + |
| bool AXPlatformNodeWin::ShouldNodeHaveReadonlyState( |
| const AXNodeData& data) const { |
| if (data.GetBoolAttribute(ui::AX_ATTR_ARIA_READONLY)) |