| Index: content/browser/accessibility/browser_accessibility_win.cc
|
| diff --git a/content/browser/accessibility/browser_accessibility_win.cc b/content/browser/accessibility/browser_accessibility_win.cc
|
| index 6040ef8facf90caa002fe36cfb3cdfdb614f911f..4b4af18014a69ff41ceaa97b92047293bb20345b 100644
|
| --- a/content/browser/accessibility/browser_accessibility_win.cc
|
| +++ b/content/browser/accessibility/browser_accessibility_win.cc
|
| @@ -203,6 +203,10 @@ enum {
|
| #define WIN_ACCESSIBILITY_API_HISTOGRAM(enum_value) \
|
| UMA_HISTOGRAM_ENUMERATION("Accessibility.WinAPIs", enum_value, UMA_API_MAX)
|
|
|
| +const WCHAR *const IA2_RELATION_DETAILS = L"details";
|
| +const WCHAR *const IA2_RELATION_DETAILS_FOR = L"detailsFor";
|
| +const WCHAR *const IA2_RELATION_ERROR_MESSAGE = L"errorMessage";
|
| +
|
| } // namespace
|
|
|
| namespace content {
|
| @@ -655,6 +659,11 @@ STDMETHODIMP BrowserAccessibilityWin::get_accKeyboardShortcut(VARIANT var_id,
|
| if (!target)
|
| return E_INVALIDARG;
|
|
|
| + if (target->HasStringAttribute(ui::AX_ATTR_KEY_SHORTCUTS)) {
|
| + return target->GetStringAttributeAsBstr(
|
| + ui::AX_ATTR_KEY_SHORTCUTS, acc_key);
|
| + }
|
| +
|
| return target->GetStringAttributeAsBstr(
|
| ui::AX_ATTR_SHORTCUT, acc_key);
|
| }
|
| @@ -1122,8 +1131,24 @@ STDMETHODIMP BrowserAccessibilityWin::get_groupPosition(
|
| return S_OK;
|
| }
|
|
|
| +STDMETHODIMP
|
| +BrowserAccessibilityWin::get_localizedExtendedRole(
|
| + BSTR* localized_extended_role) {
|
| + WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_LOCALIZED_EXTENDED_ROLE);
|
| + AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER);
|
| +
|
| + if (!instance_active())
|
| + return E_FAIL;
|
| +
|
| + if (!localized_extended_role)
|
| + return E_INVALIDARG;
|
| +
|
| + return GetStringAttributeAsBstr(
|
| + ui::AX_ATTR_ROLE_DESCRIPTION, localized_extended_role);
|
| +}
|
| +
|
| //
|
| -// IAccessibleEx methods not implemented.
|
| +// IAccessible2 methods not implemented.
|
| //
|
|
|
| STDMETHODIMP BrowserAccessibilityWin::get_extendedRole(BSTR* extended_role) {
|
| @@ -1132,13 +1157,6 @@ STDMETHODIMP BrowserAccessibilityWin::get_extendedRole(BSTR* extended_role) {
|
| return E_NOTIMPL;
|
| }
|
| STDMETHODIMP
|
| -BrowserAccessibilityWin::get_localizedExtendedRole(
|
| - BSTR* localized_extended_role) {
|
| - WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_LOCALIZED_EXTENDED_ROLE);
|
| - AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER);
|
| - return E_NOTIMPL;
|
| -}
|
| -STDMETHODIMP
|
| BrowserAccessibilityWin::get_nExtendedStates(LONG* n_extended_states) {
|
| WIN_ACCESSIBILITY_API_HISTOGRAM(UMA_API_GET_N_EXTENDED_STATES);
|
| AddAccessibilityModeFlags(ACCESSIBILITY_MODE_FLAG_SCREEN_READER);
|
| @@ -3872,14 +3890,19 @@ void BrowserAccessibilityWin::UpdateStep1ComputeWinAttributes() {
|
|
|
| win_attributes_->ia2_attributes.clear();
|
|
|
| - // Expose autocomplete attribute for combobox and textbox.
|
| - StringAttributeToIA2(ui::AX_ATTR_AUTO_COMPLETE, "autocomplete");
|
| -
|
| - // Expose the "display" and "tag" attributes.
|
| + // Expose some HTLM and ARIA attributes in the IAccessible2 attributes string.
|
| + // "display", "tag", and "xml-roles" have somewhat unusual names for
|
| + // historical reasons. Aside from that virtually every ARIA attribute
|
| + // is exposed in a really straightforward way, i.e. "aria-foo" is exposed
|
| + // as "foo".
|
| StringAttributeToIA2(ui::AX_ATTR_DISPLAY, "display");
|
| StringAttributeToIA2(ui::AX_ATTR_HTML_TAG, "tag");
|
| StringAttributeToIA2(ui::AX_ATTR_ROLE, "xml-roles");
|
|
|
| + StringAttributeToIA2(ui::AX_ATTR_AUTO_COMPLETE, "autocomplete");
|
| + StringAttributeToIA2(ui::AX_ATTR_ROLE_DESCRIPTION, "roledescription");
|
| + StringAttributeToIA2(ui::AX_ATTR_KEY_SHORTCUTS, "keyshortcuts");
|
| +
|
| IntAttributeToIA2(ui::AX_ATTR_HIERARCHICAL_LEVEL, "level");
|
| IntAttributeToIA2(ui::AX_ATTR_SET_SIZE, "setsize");
|
| IntAttributeToIA2(ui::AX_ATTR_POS_IN_SET, "posinset");
|
| @@ -4025,11 +4048,17 @@ void BrowserAccessibilityWin::UpdateStep1ComputeWinAttributes() {
|
| ui::AX_ATTR_FLOWTO_IDS);
|
| AddBidirectionalRelations(IA2_RELATION_LABELLED_BY, IA2_RELATION_LABEL_FOR,
|
| ui::AX_ATTR_LABELLEDBY_IDS);
|
| + AddBidirectionalRelations(IA2_RELATION_DETAILS, IA2_RELATION_DETAILS_FOR,
|
| + ui::AX_ATTR_DETAILS_IDS);
|
|
|
| int member_of_id;
|
| if (GetIntAttribute(ui::AX_ATTR_MEMBER_OF_ID, &member_of_id))
|
| AddRelation(IA2_RELATION_MEMBER_OF, member_of_id);
|
|
|
| + int error_message_id;
|
| + if (GetIntAttribute(ui::AX_ATTR_ERRORMESSAGE_ID, &error_message_id))
|
| + AddRelation(IA2_RELATION_ERROR_MESSAGE, error_message_id);
|
| +
|
| // Expose slider value.
|
| if (ia_role() == ROLE_SYSTEM_PROGRESSBAR ||
|
| ia_role() == ROLE_SYSTEM_SCROLLBAR ||
|
| @@ -5205,6 +5234,9 @@ void BrowserAccessibilityWin::InitRoleAndState() {
|
| 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;
|
| +
|
| base::string16 html_tag = GetString16Attribute(
|
| ui::AX_ATTR_HTML_TAG);
|
| switch (GetRole()) {
|
|
|