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 8ec9e981b9f157a48844fd71d957dab25cbeaf93..e331a6f20f6196193ac80350ea5703947cc00b5f 100644 |
--- a/content/browser/accessibility/browser_accessibility_com_win.cc |
+++ b/content/browser/accessibility/browser_accessibility_com_win.cc |
@@ -631,23 +631,7 @@ STDMETHODIMP BrowserAccessibilityComWin::get_accState(VARIANT var_id, |
if (!owner()) |
return E_FAIL; |
- auto* manager = Manager(); |
- if (!manager) |
- return E_FAIL; |
- |
- if (!state) |
- return E_INVALIDARG; |
- |
- BrowserAccessibilityComWin* target = GetTargetFromChildID(var_id); |
- if (!target) |
- return E_INVALIDARG; |
- |
- state->vt = VT_I4; |
- state->lVal = target->ia_state(); |
- if (manager->GetFocus() == owner()) |
- state->lVal |= STATE_SYSTEM_FOCUSED; |
- |
- return S_OK; |
+ return AXPlatformNodeWin::get_accState(var_id, state); |
} |
bool BrowserAccessibilityComWin::IsRangeValueSupported() { |
@@ -2551,7 +2535,7 @@ STDMETHODIMP BrowserAccessibilityComWin::get_anchorTarget( |
return E_INVALIDARG; |
BSTR target; |
- if (!(ia_state() & STATE_SYSTEM_LINKED) || |
+ if (!(MSAAState() & STATE_SYSTEM_LINKED) || |
FAILED(GetStringAttributeAsBstr(ui::AX_ATTR_URL, &target))) { |
target = SysAllocString(L""); |
} |
@@ -3784,7 +3768,7 @@ void BrowserAccessibilityComWin::UpdateStep1ComputeWinAttributes() { |
// If this doesn't have a value and is linked then set its value to the url |
// attribute. This allows screen readers to read an empty link's |
// destination. |
- if (value.empty() && (ia_state() & STATE_SYSTEM_LINKED)) |
+ if (value.empty() && (MSAAState() & STATE_SYSTEM_LINKED)) |
value = owner()->GetString16Attribute(ui::AX_ATTR_URL); |
} |
@@ -3881,11 +3865,15 @@ void BrowserAccessibilityComWin::UpdateStep3FireEvents( |
FireNativeEvent(EVENT_OBJECT_DESCRIPTIONCHANGE); |
if (value() != old_win_attributes_->value) |
FireNativeEvent(EVENT_OBJECT_VALUECHANGE); |
- if (ia_state() != old_win_attributes_->ia_state) |
+ |
+ // Do not fire EVENT_OBJECT_STATECHANGE if the change was due to a focus |
+ // change. |
+ if ((MSAAState() & ~STATE_SYSTEM_FOCUSED) != |
+ (old_win_attributes_->ia_state & ~STATE_SYSTEM_FOCUSED)) |
FireNativeEvent(EVENT_OBJECT_STATECHANGE); |
// Handle selection being added or removed. |
- bool is_selected_now = (ia_state() & STATE_SYSTEM_SELECTED) != 0; |
+ bool is_selected_now = (MSAAState() & STATE_SYSTEM_SELECTED) != 0; |
bool was_selected_before = |
(old_win_attributes_->ia_state & STATE_SYSTEM_SELECTED) != 0; |
if (is_selected_now || was_selected_before) { |
@@ -5000,83 +4988,26 @@ void BrowserAccessibilityComWin::FireNativeEvent(LONG win_event_type) const { |
void BrowserAccessibilityComWin::InitRoleAndState() { |
int32_t ia_role = 0; |
- int32_t ia_state = 0; |
base::string16 role_name; |
int32_t ia2_role = 0; |
int32_t ia2_state = IA2_STATE_OPAQUE; |
- if (owner()->HasState(ui::AX_STATE_BUSY)) |
- ia_state |= STATE_SYSTEM_BUSY; |
- |
const auto checked_state = static_cast<ui::AXCheckedState>( |
owner()->GetIntAttribute(ui::AX_ATTR_CHECKED_STATE)); |
if (checked_state) { |
ia2_state |= IA2_STATE_CHECKABLE; |
- switch (checked_state) { |
- case ui::AX_CHECKED_STATE_TRUE: |
- ia_state |= owner()->GetRole() == ui::AX_ROLE_TOGGLE_BUTTON |
- ? STATE_SYSTEM_PRESSED |
- : STATE_SYSTEM_CHECKED; |
- break; |
- case ui::AX_CHECKED_STATE_MIXED: |
- ia_state |= STATE_SYSTEM_MIXED; |
- break; |
- default: |
- break; |
- } |
} |
- if (owner()->HasState(ui::AX_STATE_COLLAPSED)) |
- ia_state |= STATE_SYSTEM_COLLAPSED; |
- if (owner()->HasState(ui::AX_STATE_EXPANDED)) |
- ia_state |= STATE_SYSTEM_EXPANDED; |
- if (owner()->HasState(ui::AX_STATE_FOCUSABLE)) |
- ia_state |= STATE_SYSTEM_FOCUSABLE; |
- if (owner()->HasState(ui::AX_STATE_HASPOPUP)) |
- ia_state |= STATE_SYSTEM_HASPOPUP; |
if (owner()->HasIntAttribute(ui::AX_ATTR_INVALID_STATE) && |
owner()->GetIntAttribute(ui::AX_ATTR_INVALID_STATE) != |
ui::AX_INVALID_STATE_FALSE) |
ia2_state |= IA2_STATE_INVALID_ENTRY; |
- if (owner()->HasState(ui::AX_STATE_INVISIBLE)) |
- ia_state |= STATE_SYSTEM_INVISIBLE; |
- if (owner()->HasState(ui::AX_STATE_LINKED)) |
- ia_state |= STATE_SYSTEM_LINKED; |
- if (owner()->HasState(ui::AX_STATE_MULTISELECTABLE)) { |
- ia_state |= STATE_SYSTEM_EXTSELECTABLE; |
- ia_state |= STATE_SYSTEM_MULTISELECTABLE; |
- } |
- // TODO(ctguil): Support STATE_SYSTEM_EXTSELECTABLE/accSelect. |
- if (owner()->HasState(ui::AX_STATE_OFFSCREEN)) |
- ia_state |= STATE_SYSTEM_OFFSCREEN; |
- if (owner()->HasState(ui::AX_STATE_PROTECTED)) |
- ia_state |= STATE_SYSTEM_PROTECTED; |
if (owner()->HasState(ui::AX_STATE_REQUIRED)) |
ia2_state |= IA2_STATE_REQUIRED; |
- if (owner()->HasState(ui::AX_STATE_SELECTABLE)) |
- ia_state |= STATE_SYSTEM_SELECTABLE; |
- if (owner()->HasState(ui::AX_STATE_SELECTED)) |
- ia_state |= STATE_SYSTEM_SELECTED; |
- if (owner()->HasState(ui::AX_STATE_VISITED)) |
- ia_state |= STATE_SYSTEM_TRAVERSED; |
- if (owner()->HasState(ui::AX_STATE_DISABLED)) |
- ia_state |= STATE_SYSTEM_UNAVAILABLE; |
if (owner()->HasState(ui::AX_STATE_VERTICAL)) |
ia2_state |= IA2_STATE_VERTICAL; |
if (owner()->HasState(ui::AX_STATE_HORIZONTAL)) |
ia2_state |= IA2_STATE_HORIZONTAL; |
- if (owner()->HasState(ui::AX_STATE_VISITED)) |
- ia_state |= STATE_SYSTEM_TRAVERSED; |
- |
- // 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. |
- BrowserAccessibilityStateImpl* accessibility_state = |
- BrowserAccessibilityStateImpl::GetInstance(); |
- if (!accessibility_state->disable_hot_tracking_for_testing()) { |
- if (owner()->HasState(ui::AX_STATE_HOVERED)) |
- ia_state |= STATE_SYSTEM_HOTTRACKED; |
- } |
if (owner()->HasState(ui::AX_STATE_EDITABLE)) |
ia2_state |= IA2_STATE_EDITABLE; |
@@ -5103,7 +5034,6 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
break; |
case ui::AX_ROLE_ARTICLE: |
ia_role = ROLE_SYSTEM_DOCUMENT; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_AUDIO: |
ia_role = ROLE_SYSTEM_GROUPING; |
@@ -5118,7 +5048,6 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
break; |
case ui::AX_ROLE_BUSY_INDICATOR: |
ia_role = ROLE_SYSTEM_ANIMATION; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_BUTTON: |
ia_role = ROLE_SYSTEM_PUSHBUTTON; |
@@ -5170,7 +5099,6 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
case ui::AX_ROLE_DEFINITION: |
role_name = html_tag; |
ia2_role = IA2_ROLE_PARAGRAPH; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_DESCRIPTION_LIST_DETAIL: |
role_name = html_tag; |
@@ -5180,11 +5108,9 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
case ui::AX_ROLE_DESCRIPTION_LIST: |
role_name = html_tag; |
ia_role = ROLE_SYSTEM_LIST; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_DESCRIPTION_LIST_TERM: |
ia_role = ROLE_SYSTEM_LISTITEM; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_DETAILS: |
role_name = html_tag; |
@@ -5200,8 +5126,6 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
case ui::AX_ROLE_ROOT_WEB_AREA: |
case ui::AX_ROLE_WEB_AREA: |
ia_role = ROLE_SYSTEM_DOCUMENT; |
- ia_state |= STATE_SYSTEM_READONLY; |
- ia_state |= STATE_SYSTEM_FOCUSABLE; |
break; |
case ui::AX_ROLE_EMBEDDED_OBJECT: |
if (owner()->PlatformChildCount()) { |
@@ -5239,10 +5163,6 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
break; |
case ui::AX_ROLE_GRID: |
ia_role = ROLE_SYSTEM_TABLE; |
- // 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 |
- // ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_GROUP: |
ia_role = ROLE_SYSTEM_GROUPING; |
@@ -5256,24 +5176,19 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
case ui::AX_ROLE_IFRAME: |
ia_role = ROLE_SYSTEM_DOCUMENT; |
ia2_role = IA2_ROLE_INTERNAL_FRAME; |
- ia_state = STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_IFRAME_PRESENTATIONAL: |
ia_role = ROLE_SYSTEM_GROUPING; |
break; |
case ui::AX_ROLE_IMAGE: |
ia_role = ROLE_SYSTEM_GRAPHIC; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_IMAGE_MAP: |
role_name = html_tag; |
ia2_role = IA2_ROLE_IMAGE_MAP; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_IMAGE_MAP_LINK: |
ia_role = ROLE_SYSTEM_LINK; |
- ia_state |= STATE_SYSTEM_LINKED; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_INPUT_TIME: |
ia_role = ROLE_SYSTEM_GROUPING; |
@@ -5285,11 +5200,9 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
break; |
case ui::AX_ROLE_LINK: |
ia_role = ROLE_SYSTEM_LINK; |
- ia_state |= STATE_SYSTEM_LINKED; |
break; |
case ui::AX_ROLE_LIST: |
ia_role = ROLE_SYSTEM_LIST; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_LIST_BOX: |
ia_role = ROLE_SYSTEM_LIST; |
@@ -5299,7 +5212,6 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
break; |
case ui::AX_ROLE_LIST_ITEM: |
ia_role = ROLE_SYSTEM_LISTITEM; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_MAIN: |
ia_role = ROLE_SYSTEM_GROUPING; |
@@ -5374,7 +5286,6 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
break; |
case ui::AX_ROLE_PROGRESS_INDICATOR: |
ia_role = ROLE_SYSTEM_PROGRESSBAR; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_RADIO_BUTTON: |
ia_role = ROLE_SYSTEM_RADIOBUTTON; |
@@ -5407,12 +5318,10 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
case ui::AX_ROLE_RULER: |
ia_role = ROLE_SYSTEM_CLIENT; |
ia2_role = IA2_ROLE_RULER; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_SCROLL_AREA: |
ia_role = ROLE_SYSTEM_CLIENT; |
ia2_role = IA2_ROLE_SCROLL_PANE; |
- ia_state |= STATE_SYSTEM_READONLY; |
ia2_state &= ~(IA2_STATE_EDITABLE); |
break; |
case ui::AX_ROLE_SCROLL_BAR: |
@@ -5458,7 +5367,6 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
case ui::AX_ROLE_TABLE_HEADER_CONTAINER: |
ia_role = ROLE_SYSTEM_GROUPING; |
ia2_role = IA2_ROLE_SECTION; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_TAB_LIST: |
ia_role = ROLE_SYSTEM_PAGETABLIST; |
@@ -5468,7 +5376,6 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
break; |
case ui::AX_ROLE_TERM: |
ia_role = ROLE_SYSTEM_LISTITEM; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_TOGGLE_BUTTON: |
ia_role = ROLE_SYSTEM_PUSHBUTTON; |
@@ -5482,8 +5389,6 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
} else { |
ia2_state |= IA2_STATE_SINGLE_LINE; |
} |
- if (owner()->HasState(ui::AX_STATE_READ_ONLY)) |
- ia_state |= STATE_SYSTEM_READONLY; |
ia2_state |= IA2_STATE_SELECTABLE_TEXT; |
break; |
case ui::AX_ROLE_ABBR: |
@@ -5494,15 +5399,12 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
break; |
case ui::AX_ROLE_TIMER: |
ia_role = ROLE_SYSTEM_CLOCK; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_TOOLBAR: |
ia_role = ROLE_SYSTEM_TOOLBAR; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_TOOLTIP: |
ia_role = ROLE_SYSTEM_TOOLTIP; |
- ia_state |= STATE_SYSTEM_READONLY; |
break; |
case ui::AX_ROLE_TREE: |
ia_role = ROLE_SYSTEM_OUTLINE; |
@@ -5535,22 +5437,6 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
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 (owner()->HasState(ui::AX_STATE_FOCUSABLE) && |
- ia_role != ROLE_SYSTEM_DOCUMENT && ia_role != ROLE_SYSTEM_TEXT) { |
- ia_state &= ~(STATE_SYSTEM_READONLY); |
- } |
- if (!owner()->HasState(ui::AX_STATE_READ_ONLY)) |
- ia_state &= ~(STATE_SYSTEM_READONLY); |
- if (owner()->GetBoolAttribute(ui::AX_ATTR_ARIA_READONLY)) |
- ia_state |= STATE_SYSTEM_READONLY; |
- |
// The role should always be set. |
DCHECK(!role_name.empty() || ia_role); |
@@ -5560,7 +5446,7 @@ void BrowserAccessibilityComWin::InitRoleAndState() { |
ia2_role = ia_role; |
win_attributes_->ia_role = ia_role; |
- win_attributes_->ia_state = ia_state; |
+ win_attributes_->ia_state = MSAAState(); |
win_attributes_->role_name = role_name; |
win_attributes_->ia2_role = ia2_role; |
win_attributes_->ia2_state = ia2_state; |