Index: content/browser/accessibility/browser_accessibility_cocoa.mm |
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm |
index bdc96d320f3d0702e52699c677440183c3aa2fbc..c016a032f57255071988d45036df3babb6268d7c 100644 |
--- a/content/browser/accessibility/browser_accessibility_cocoa.mm |
+++ b/content/browser/accessibility/browser_accessibility_cocoa.mm |
@@ -16,6 +16,7 @@ |
#include "content/browser/accessibility/browser_accessibility_manager_mac.h" |
#include "content/public/common/content_client.h" |
#include "grit/webkit_strings.h" |
+#import "ui/accessibility/platform/ax_platform_node_mac.h" |
// See http://openradar.appspot.com/9896491. This SPI has been tested on 10.5, |
// 10.6, and 10.7. It allows accessibility clients to observe events posted on |
@@ -39,197 +40,12 @@ NSString* NSStringForStringAttribute( |
browserAccessibility->GetStringAttribute(attribute)); |
} |
-struct MapEntry { |
- ui::AXRole webKitValue; |
- NSString* nativeValue; |
-}; |
- |
-typedef std::map<ui::AXRole, NSString*> RoleMap; |
- |
// GetState checks the bitmask used in AXNodeData to check |
// if the given state was set on the accessibility object. |
bool GetState(BrowserAccessibility* accessibility, ui::AXState state) { |
return ((accessibility->GetState() >> state) & 1); |
} |
-RoleMap BuildRoleMap() { |
- const MapEntry roles[] = { |
- { ui::AX_ROLE_ALERT, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_ALERT_DIALOG, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_ANNOTATION, NSAccessibilityUnknownRole }, |
- { ui::AX_ROLE_APPLICATION, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_ARTICLE, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_BANNER, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_BROWSER, NSAccessibilityBrowserRole }, |
- { ui::AX_ROLE_BUSY_INDICATOR, NSAccessibilityBusyIndicatorRole }, |
- { ui::AX_ROLE_BUTTON, NSAccessibilityButtonRole }, |
- { ui::AX_ROLE_CANVAS, NSAccessibilityImageRole }, |
- { ui::AX_ROLE_CELL, @"AXCell" }, |
- { ui::AX_ROLE_CHECK_BOX, NSAccessibilityCheckBoxRole }, |
- { ui::AX_ROLE_COLOR_WELL, NSAccessibilityColorWellRole }, |
- { ui::AX_ROLE_COLUMN, NSAccessibilityColumnRole }, |
- { ui::AX_ROLE_COLUMN_HEADER, @"AXCell" }, |
- { ui::AX_ROLE_COMBO_BOX, NSAccessibilityComboBoxRole }, |
- { ui::AX_ROLE_COMPLEMENTARY, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_CONTENT_INFO, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_DEFINITION, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_DESCRIPTION_LIST_DETAIL, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_DESCRIPTION_LIST_TERM, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_DIALOG, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_DIRECTORY, NSAccessibilityListRole }, |
- { ui::AX_ROLE_DISCLOSURE_TRIANGLE, NSAccessibilityDisclosureTriangleRole }, |
- { ui::AX_ROLE_DIV, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_DOCUMENT, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_DRAWER, NSAccessibilityDrawerRole }, |
- { ui::AX_ROLE_EDITABLE_TEXT, NSAccessibilityTextFieldRole }, |
- { ui::AX_ROLE_FOOTER, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_FORM, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_GRID, NSAccessibilityGridRole }, |
- { ui::AX_ROLE_GROUP, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_GROW_AREA, NSAccessibilityGrowAreaRole }, |
- { ui::AX_ROLE_HEADING, @"AXHeading" }, |
- { ui::AX_ROLE_HELP_TAG, NSAccessibilityHelpTagRole }, |
- { ui::AX_ROLE_HORIZONTAL_RULE, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_IFRAME, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_IGNORED, NSAccessibilityUnknownRole }, |
- { ui::AX_ROLE_IMAGE, NSAccessibilityImageRole }, |
- { ui::AX_ROLE_IMAGE_MAP, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_IMAGE_MAP_LINK, NSAccessibilityLinkRole }, |
- { ui::AX_ROLE_INCREMENTOR, NSAccessibilityIncrementorRole }, |
- { ui::AX_ROLE_LABEL_TEXT, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_LINK, NSAccessibilityLinkRole }, |
- { ui::AX_ROLE_LIST, NSAccessibilityListRole }, |
- { ui::AX_ROLE_LIST_BOX, NSAccessibilityListRole }, |
- { ui::AX_ROLE_LIST_BOX_OPTION, NSAccessibilityStaticTextRole }, |
- { ui::AX_ROLE_LIST_ITEM, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_LIST_MARKER, @"AXListMarker" }, |
- { ui::AX_ROLE_LOG, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_MAIN, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_MARQUEE, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_MATH, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_MATTE, NSAccessibilityMatteRole }, |
- { ui::AX_ROLE_MENU, NSAccessibilityMenuRole }, |
- { ui::AX_ROLE_MENU_BAR, NSAccessibilityMenuBarRole }, |
- { ui::AX_ROLE_MENU_BUTTON, NSAccessibilityButtonRole }, |
- { ui::AX_ROLE_MENU_ITEM, NSAccessibilityMenuItemRole }, |
- { ui::AX_ROLE_MENU_LIST_OPTION, NSAccessibilityMenuItemRole }, |
- { ui::AX_ROLE_MENU_LIST_POPUP, NSAccessibilityUnknownRole }, |
- { ui::AX_ROLE_NAVIGATION, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_NOTE, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_OUTLINE, NSAccessibilityOutlineRole }, |
- { ui::AX_ROLE_PARAGRAPH, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_POP_UP_BUTTON, NSAccessibilityPopUpButtonRole }, |
- { ui::AX_ROLE_PRESENTATIONAL, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_PROGRESS_INDICATOR, NSAccessibilityProgressIndicatorRole }, |
- { ui::AX_ROLE_RADIO_BUTTON, NSAccessibilityRadioButtonRole }, |
- { ui::AX_ROLE_RADIO_GROUP, NSAccessibilityRadioGroupRole }, |
- { ui::AX_ROLE_REGION, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_ROOT_WEB_AREA, @"AXWebArea" }, |
- { ui::AX_ROLE_ROW, NSAccessibilityRowRole }, |
- { ui::AX_ROLE_ROW_HEADER, @"AXCell" }, |
- { ui::AX_ROLE_RULER, NSAccessibilityRulerRole }, |
- { ui::AX_ROLE_RULER_MARKER, NSAccessibilityRulerMarkerRole }, |
- { ui::AX_ROLE_SCROLL_BAR, NSAccessibilityScrollBarRole }, |
- { ui::AX_ROLE_SEARCH, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_SHEET, NSAccessibilitySheetRole }, |
- { ui::AX_ROLE_SLIDER, NSAccessibilitySliderRole }, |
- { ui::AX_ROLE_SLIDER_THUMB, NSAccessibilityValueIndicatorRole }, |
- { ui::AX_ROLE_SPIN_BUTTON, NSAccessibilitySliderRole }, |
- { ui::AX_ROLE_SPLITTER, NSAccessibilitySplitterRole }, |
- { ui::AX_ROLE_SPLIT_GROUP, NSAccessibilitySplitGroupRole }, |
- { ui::AX_ROLE_STATIC_TEXT, NSAccessibilityStaticTextRole }, |
- { ui::AX_ROLE_STATUS, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_SVG_ROOT, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_SYSTEM_WIDE, NSAccessibilityUnknownRole }, |
- { ui::AX_ROLE_TAB, NSAccessibilityRadioButtonRole }, |
- { ui::AX_ROLE_TABLE, NSAccessibilityTableRole }, |
- { ui::AX_ROLE_TABLE_HEADER_CONTAINER, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_TAB_LIST, NSAccessibilityTabGroupRole }, |
- { ui::AX_ROLE_TAB_PANEL, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_TEXT_AREA, NSAccessibilityTextAreaRole }, |
- { ui::AX_ROLE_TEXT_FIELD, NSAccessibilityTextFieldRole }, |
- { ui::AX_ROLE_TIMER, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_TOGGLE_BUTTON, NSAccessibilityCheckBoxRole }, |
- { ui::AX_ROLE_TOOLBAR, NSAccessibilityToolbarRole }, |
- { ui::AX_ROLE_TOOLTIP, NSAccessibilityGroupRole }, |
- { ui::AX_ROLE_TREE, NSAccessibilityOutlineRole }, |
- { ui::AX_ROLE_TREE_GRID, NSAccessibilityTableRole }, |
- { ui::AX_ROLE_TREE_ITEM, NSAccessibilityRowRole }, |
- { ui::AX_ROLE_VALUE_INDICATOR, NSAccessibilityValueIndicatorRole }, |
- { ui::AX_ROLE_WEB_AREA, @"AXWebArea" }, |
- { ui::AX_ROLE_WINDOW, NSAccessibilityWindowRole }, |
- |
- // TODO(dtseng): we don't correctly support the attributes for these roles. |
- // { ui::AX_ROLE_SCROLL_AREA, NSAccessibilityScrollAreaRole }, |
- }; |
- |
- RoleMap role_map; |
- for (size_t i = 0; i < arraysize(roles); ++i) |
- role_map[roles[i].webKitValue] = roles[i].nativeValue; |
- return role_map; |
-} |
- |
-// A mapping of webkit roles to native roles. |
-NSString* NativeRoleFromAXRole( |
- const ui::AXRole& role) { |
- CR_DEFINE_STATIC_LOCAL(RoleMap, web_accessibility_to_native_role, |
- (BuildRoleMap())); |
- RoleMap::iterator it = web_accessibility_to_native_role.find(role); |
- if (it != web_accessibility_to_native_role.end()) |
- return it->second; |
- else |
- return NSAccessibilityUnknownRole; |
-} |
- |
-RoleMap BuildSubroleMap() { |
- const MapEntry subroles[] = { |
- { ui::AX_ROLE_ALERT, @"AXApplicationAlert" }, |
- { ui::AX_ROLE_ALERT_DIALOG, @"AXApplicationAlertDialog" }, |
- { ui::AX_ROLE_ARTICLE, @"AXDocumentArticle" }, |
- { ui::AX_ROLE_DEFINITION, @"AXDefinition" }, |
- { ui::AX_ROLE_DESCRIPTION_LIST_DETAIL, @"AXDescription" }, |
- { ui::AX_ROLE_DESCRIPTION_LIST_TERM, @"AXTerm" }, |
- { ui::AX_ROLE_DIALOG, @"AXApplicationDialog" }, |
- { ui::AX_ROLE_DOCUMENT, @"AXDocument" }, |
- { ui::AX_ROLE_FOOTER, @"AXLandmarkContentInfo" }, |
- { ui::AX_ROLE_APPLICATION, @"AXLandmarkApplication" }, |
- { ui::AX_ROLE_BANNER, @"AXLandmarkBanner" }, |
- { ui::AX_ROLE_COMPLEMENTARY, @"AXLandmarkComplementary" }, |
- { ui::AX_ROLE_CONTENT_INFO, @"AXLandmarkContentInfo" }, |
- { ui::AX_ROLE_MAIN, @"AXLandmarkMain" }, |
- { ui::AX_ROLE_NAVIGATION, @"AXLandmarkNavigation" }, |
- { ui::AX_ROLE_SEARCH, @"AXLandmarkSearch" }, |
- { ui::AX_ROLE_LOG, @"AXApplicationLog" }, |
- { ui::AX_ROLE_MARQUEE, @"AXApplicationMarquee" }, |
- { ui::AX_ROLE_MATH, @"AXDocumentMath" }, |
- { ui::AX_ROLE_NOTE, @"AXDocumentNote" }, |
- { ui::AX_ROLE_REGION, @"AXDocumentRegion" }, |
- { ui::AX_ROLE_STATUS, @"AXApplicationStatus" }, |
- { ui::AX_ROLE_TAB_PANEL, @"AXTabPanel" }, |
- { ui::AX_ROLE_TIMER, @"AXApplicationTimer" }, |
- { ui::AX_ROLE_TOGGLE_BUTTON, @"AXToggleButton" }, |
- { ui::AX_ROLE_TOOLTIP, @"AXUserInterfaceTooltip" }, |
- { ui::AX_ROLE_TREE_ITEM, NSAccessibilityOutlineRowSubrole }, |
- }; |
- |
- RoleMap subrole_map; |
- for (size_t i = 0; i < arraysize(subroles); ++i) |
- subrole_map[subroles[i].webKitValue] = subroles[i].nativeValue; |
- return subrole_map; |
-} |
- |
-// A mapping of webkit roles to native subroles. |
-NSString* NativeSubroleFromAXRole( |
- const ui::AXRole& role) { |
- CR_DEFINE_STATIC_LOCAL(RoleMap, web_accessibility_to_native_subrole, |
- (BuildSubroleMap())); |
- RoleMap::iterator it = web_accessibility_to_native_subrole.find(role); |
- if (it != web_accessibility_to_native_subrole.end()) |
- return it->second; |
- else |
- return nil; |
-} |
- |
// A mapping from an accessibility attribute to its method name. |
NSDictionary* attributeToMethodNameMap = nil; |
@@ -719,7 +535,7 @@ NSDictionary* attributeToMethodNameMap = nil; |
else |
return NSAccessibilityButtonRole; |
} |
- return NativeRoleFromAXRole(role); |
+ return [AXPlatformNodeCocoa nativeRoleFromAXRole:role]; |
} |
// Returns a string indicating the role description of this object. |
@@ -895,7 +711,7 @@ NSDictionary* attributeToMethodNameMap = nil; |
} |
} |
- return NativeSubroleFromAXRole(browserAccessibilityRole); |
+ return [AXPlatformNodeCocoa nativeSubroleFromAXRole:browserAccessibilityRole]; |
} |
// Returns all tabs in this subtree. |