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 a5907b3bf2dc6cf745bab8337c229b34eae3cc35..552c4edc011288af4213ad2fe8f17ff1e4c9e551 100644 |
--- a/ui/accessibility/platform/ax_platform_node_win.cc |
+++ b/ui/accessibility/platform/ax_platform_node_win.cc |
@@ -742,7 +742,12 @@ STDMETHODIMP AXPlatformNodeWin::put_accName( |
STDMETHODIMP AXPlatformNodeWin::role(LONG* role) { |
COM_OBJECT_VALIDATE_1_ARG(role); |
- *role = MSAARole(); |
+ |
+ *role = IA2Role(); |
+ // If we didn't explicitly set the IAccessible2 role, make it the same |
+ // as the MSAA role. |
+ if (!*role) |
+ *role = MSAARole(); |
return S_OK; |
} |
@@ -1666,6 +1671,144 @@ int32_t AXPlatformNodeWin::IA2State() { |
return ia2_state; |
} |
+// IA2Role() only returns a role if the MSAA role doesn't suffice, |
+// otherwise this method returns 0. See AXPlatformNodeWin::role(). |
+int32_t AXPlatformNodeWin::IA2Role() { |
+ // If this is a web area for a presentational iframe, give it a role of |
+ // something other than DOCUMENT so that the fact that it's a separate doc |
+ // is not exposed to AT. |
+ if (IsWebAreaForPresentationalIframe()) { |
+ return ROLE_SYSTEM_GROUPING; |
+ } |
+ |
+ int32_t ia2_role = 0; |
+ |
+ switch (GetData().role) { |
+ case ui::AX_ROLE_BANNER: |
+ ia2_role = IA2_ROLE_HEADER; |
+ break; |
+ case ui::AX_ROLE_BLOCKQUOTE: |
+ ia2_role = IA2_ROLE_SECTION; |
+ break; |
+ case ui::AX_ROLE_CANVAS: |
+ if (GetBoolAttribute(ui::AX_ATTR_CANVAS_HAS_FALLBACK)) { |
+ ia2_role = IA2_ROLE_CANVAS; |
+ } |
+ break; |
+ case ui::AX_ROLE_CAPTION: |
+ ia2_role = IA2_ROLE_CAPTION; |
+ break; |
+ case ui::AX_ROLE_COLOR_WELL: |
+ ia2_role = IA2_ROLE_COLOR_CHOOSER; |
+ break; |
+ case ui::AX_ROLE_COMPLEMENTARY: |
+ ia2_role = IA2_ROLE_NOTE; |
+ break; |
+ case ui::AX_ROLE_CONTENT_INFO: |
+ ia2_role = IA2_ROLE_PARAGRAPH; |
+ break; |
+ case ui::AX_ROLE_DATE: |
+ case ui::AX_ROLE_DATE_TIME: |
+ ia2_role = IA2_ROLE_DATE_EDITOR; |
+ break; |
+ case ui::AX_ROLE_DEFINITION: |
+ ia2_role = IA2_ROLE_PARAGRAPH; |
+ break; |
+ case ui::AX_ROLE_DESCRIPTION_LIST_DETAIL: |
+ ia2_role = IA2_ROLE_PARAGRAPH; |
+ break; |
+ case ui::AX_ROLE_EMBEDDED_OBJECT: |
+ if (!delegate_->GetChildCount()) { |
+ ia2_role = IA2_ROLE_EMBEDDED_OBJECT; |
+ } |
+ break; |
+ case ui::AX_ROLE_FIGCAPTION: |
+ ia2_role = IA2_ROLE_CAPTION; |
+ break; |
+ case ui::AX_ROLE_FORM: |
+ ia2_role = IA2_ROLE_FORM; |
+ break; |
+ case ui::AX_ROLE_FOOTER: |
+ ia2_role = IA2_ROLE_FOOTER; |
+ break; |
+ case ui::AX_ROLE_GENERIC_CONTAINER: |
+ ia2_role = IA2_ROLE_SECTION; |
+ break; |
+ case ui::AX_ROLE_HEADING: |
+ ia2_role = IA2_ROLE_HEADING; |
+ break; |
+ case ui::AX_ROLE_IFRAME: |
+ ia2_role = IA2_ROLE_INTERNAL_FRAME; |
+ break; |
+ case ui::AX_ROLE_IMAGE_MAP: |
+ ia2_role = IA2_ROLE_IMAGE_MAP; |
+ break; |
+ case ui::AX_ROLE_LABEL_TEXT: |
+ case ui::AX_ROLE_LEGEND: |
+ ia2_role = IA2_ROLE_LABEL; |
+ break; |
+ case ui::AX_ROLE_MAIN: |
+ ia2_role = IA2_ROLE_PARAGRAPH; |
+ break; |
+ case ui::AX_ROLE_MARK: |
+ ia2_role = IA2_ROLE_TEXT_FRAME; |
+ break; |
+ case ui::AX_ROLE_MENU_ITEM_CHECK_BOX: |
+ ia2_role = IA2_ROLE_CHECK_MENU_ITEM; |
+ break; |
+ case ui::AX_ROLE_MENU_ITEM_RADIO: |
+ ia2_role = IA2_ROLE_RADIO_MENU_ITEM; |
+ break; |
+ case ui::AX_ROLE_NAVIGATION: |
+ ia2_role = IA2_ROLE_SECTION; |
+ break; |
+ case ui::AX_ROLE_NOTE: |
+ ia2_role = IA2_ROLE_NOTE; |
+ break; |
+ case ui::AX_ROLE_PARAGRAPH: |
+ ia2_role = IA2_ROLE_PARAGRAPH; |
+ break; |
+ case ui::AX_ROLE_PRE: |
+ ia2_role = IA2_ROLE_PARAGRAPH; |
+ break; |
+ case ui::AX_ROLE_REGION: { |
+ base::string16 html_tag = GetString16Attribute(ui::AX_ATTR_HTML_TAG); |
+ |
+ if (html_tag == L"section") { |
+ ia2_role = IA2_ROLE_SECTION; |
+ } |
+ } break; |
+ case ui::AX_ROLE_RUBY: |
+ ia2_role = IA2_ROLE_TEXT_FRAME; |
+ break; |
+ case ui::AX_ROLE_RULER: |
+ ia2_role = IA2_ROLE_RULER; |
+ break; |
+ case ui::AX_ROLE_SCROLL_AREA: |
+ ia2_role = IA2_ROLE_SCROLL_PANE; |
+ break; |
+ case ui::AX_ROLE_SEARCH: |
+ ia2_role = IA2_ROLE_SECTION; |
+ break; |
+ case ui::AX_ROLE_SWITCH: |
+ ia2_role = IA2_ROLE_TOGGLE_BUTTON; |
+ break; |
+ case ui::AX_ROLE_TABLE_HEADER_CONTAINER: |
+ ia2_role = IA2_ROLE_SECTION; |
+ break; |
+ case ui::AX_ROLE_TOGGLE_BUTTON: |
+ ia2_role = IA2_ROLE_TOGGLE_BUTTON; |
+ break; |
+ case ui::AX_ROLE_ABBR: |
+ case ui::AX_ROLE_TIME: |
+ ia2_role = IA2_ROLE_TEXT_FRAME; |
+ break; |
+ default: |
+ break; |
+ } |
+ return ia2_role; |
+} |
+ |
bool AXPlatformNodeWin::ShouldNodeHaveReadonlyState( |
const AXNodeData& data) const { |
if (data.GetBoolAttribute(ui::AX_ATTR_ARIA_READONLY)) |