| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <execinfo.h> | 5 #include <execinfo.h> |
| 6 | 6 |
| 7 #import "content/browser/accessibility/browser_accessibility_cocoa.h" | 7 #import "content/browser/accessibility/browser_accessibility_cocoa.h" |
| 8 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 | 10 |
| 11 #include "base/basictypes.h" |
| 11 #include "base/string16.h" | 12 #include "base/string16.h" |
| 12 #include "base/sys_string_conversions.h" | 13 #include "base/sys_string_conversions.h" |
| 13 #include "base/utf_string_conversions.h" | 14 #include "base/utf_string_conversions.h" |
| 14 #include "content/browser/accessibility/browser_accessibility_manager.h" | 15 #include "content/browser/accessibility/browser_accessibility_manager.h" |
| 15 #include "content/public/common/content_client.h" | 16 #include "content/public/common/content_client.h" |
| 16 #include "grit/webkit_strings.h" | 17 #include "grit/webkit_strings.h" |
| 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h" | 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h" |
| 18 | 19 |
| 19 // See http://openradar.appspot.com/9896491. This SPI has been tested on 10.5, | 20 // See http://openradar.appspot.com/9896491. This SPI has been tested on 10.5, |
| 20 // 10.6, and 10.7. It allows accessibility clients to observe events posted on | 21 // 10.6, and 10.7. It allows accessibility clients to observe events posted on |
| (...skipping 15 matching lines...) Expand all Loading... |
| 36 returnValue = base::SysUTF16ToNSString(iter->second); | 37 returnValue = base::SysUTF16ToNSString(iter->second); |
| 37 } | 38 } |
| 38 return returnValue; | 39 return returnValue; |
| 39 } | 40 } |
| 40 | 41 |
| 41 struct MapEntry { | 42 struct MapEntry { |
| 42 WebAccessibility::Role webKitValue; | 43 WebAccessibility::Role webKitValue; |
| 43 NSString* nativeValue; | 44 NSString* nativeValue; |
| 44 }; | 45 }; |
| 45 | 46 |
| 47 typedef std::map<WebAccessibility::Role, NSString*> RoleMap; |
| 48 |
| 46 struct AttributeToMethodNameEntry { | 49 struct AttributeToMethodNameEntry { |
| 47 NSString* attribute; | 50 NSString* attribute; |
| 48 NSString* methodName; | 51 NSString* methodName; |
| 49 }; | 52 }; |
| 50 | 53 |
| 51 static const MapEntry roles[] = { | 54 const AttributeToMethodNameEntry attributeToMethodNameContainer[] = { |
| 52 { WebAccessibility::ROLE_ALERT, NSAccessibilityGroupRole }, | |
| 53 { WebAccessibility::ROLE_ALERT_DIALOG, NSAccessibilityGroupRole }, | |
| 54 { WebAccessibility::ROLE_ANNOTATION, NSAccessibilityUnknownRole }, | |
| 55 { WebAccessibility::ROLE_APPLICATION, NSAccessibilityGroupRole }, | |
| 56 { WebAccessibility::ROLE_ARTICLE, NSAccessibilityGroupRole }, | |
| 57 { WebAccessibility::ROLE_BROWSER, NSAccessibilityBrowserRole }, | |
| 58 { WebAccessibility::ROLE_BUSY_INDICATOR, NSAccessibilityBusyIndicatorRole }, | |
| 59 { WebAccessibility::ROLE_BUTTON, NSAccessibilityButtonRole }, | |
| 60 { WebAccessibility::ROLE_CELL, @"AXCell" }, | |
| 61 { WebAccessibility::ROLE_CHECKBOX, NSAccessibilityCheckBoxRole }, | |
| 62 { WebAccessibility::ROLE_COLOR_WELL, NSAccessibilityColorWellRole }, | |
| 63 { WebAccessibility::ROLE_COLUMN, NSAccessibilityColumnRole }, | |
| 64 { WebAccessibility::ROLE_COLUMN_HEADER, @"AXCell" }, | |
| 65 { WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION, | |
| 66 NSAccessibilityGroupRole }, | |
| 67 { WebAccessibility::ROLE_DEFINITION_LIST_TERM, NSAccessibilityGroupRole }, | |
| 68 { WebAccessibility::ROLE_DIALOG, NSAccessibilityGroupRole }, | |
| 69 { WebAccessibility::ROLE_DIRECTORY, NSAccessibilityListRole }, | |
| 70 { WebAccessibility::ROLE_DISCLOSURE_TRIANGLE, | |
| 71 NSAccessibilityDisclosureTriangleRole }, | |
| 72 { WebAccessibility::ROLE_DOCUMENT, NSAccessibilityGroupRole }, | |
| 73 { WebAccessibility::ROLE_DRAWER, NSAccessibilityDrawerRole }, | |
| 74 { WebAccessibility::ROLE_EDITABLE_TEXT, NSAccessibilityTextFieldRole }, | |
| 75 { WebAccessibility::ROLE_GRID, NSAccessibilityGridRole }, | |
| 76 { WebAccessibility::ROLE_GROUP, NSAccessibilityGroupRole }, | |
| 77 { WebAccessibility::ROLE_GROW_AREA, NSAccessibilityGrowAreaRole }, | |
| 78 { WebAccessibility::ROLE_HEADING, @"AXHeading" }, | |
| 79 { WebAccessibility::ROLE_HELP_TAG, NSAccessibilityHelpTagRole }, | |
| 80 { WebAccessibility::ROLE_IGNORED, NSAccessibilityUnknownRole }, | |
| 81 { WebAccessibility::ROLE_IMAGE, NSAccessibilityImageRole }, | |
| 82 { WebAccessibility::ROLE_IMAGE_MAP, NSAccessibilityGroupRole }, | |
| 83 { WebAccessibility::ROLE_IMAGE_MAP_LINK, NSAccessibilityLinkRole }, | |
| 84 { WebAccessibility::ROLE_INCREMENTOR, NSAccessibilityIncrementorRole }, | |
| 85 { WebAccessibility::ROLE_LANDMARK_APPLICATION, NSAccessibilityGroupRole }, | |
| 86 { WebAccessibility::ROLE_LANDMARK_BANNER, NSAccessibilityGroupRole }, | |
| 87 { WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY, NSAccessibilityGroupRole }, | |
| 88 { WebAccessibility::ROLE_LANDMARK_CONTENTINFO, NSAccessibilityGroupRole }, | |
| 89 { WebAccessibility::ROLE_LANDMARK_MAIN, NSAccessibilityGroupRole }, | |
| 90 { WebAccessibility::ROLE_LANDMARK_NAVIGATION, NSAccessibilityGroupRole }, | |
| 91 { WebAccessibility::ROLE_LANDMARK_SEARCH, NSAccessibilityGroupRole }, | |
| 92 { WebAccessibility::ROLE_LINK, NSAccessibilityLinkRole }, | |
| 93 { WebAccessibility::ROLE_LIST, NSAccessibilityListRole }, | |
| 94 { WebAccessibility::ROLE_LIST_ITEM, NSAccessibilityGroupRole }, | |
| 95 { WebAccessibility::ROLE_LIST_MARKER, NSAccessibilityGroupRole }, | |
| 96 { WebAccessibility::ROLE_LISTBOX, NSAccessibilityListRole }, | |
| 97 { WebAccessibility::ROLE_LISTBOX_OPTION, NSAccessibilityGroupRole }, | |
| 98 { WebAccessibility::ROLE_LOG, NSAccessibilityGroupRole }, | |
| 99 { WebAccessibility::ROLE_MARQUEE, NSAccessibilityGroupRole }, | |
| 100 { WebAccessibility::ROLE_MATH, NSAccessibilityGroupRole }, | |
| 101 { WebAccessibility::ROLE_MATTE, NSAccessibilityMatteRole }, | |
| 102 { WebAccessibility::ROLE_MENU, NSAccessibilityMenuRole }, | |
| 103 { WebAccessibility::ROLE_MENU_ITEM, NSAccessibilityMenuItemRole }, | |
| 104 { WebAccessibility::ROLE_MENU_BUTTON, NSAccessibilityButtonRole }, | |
| 105 { WebAccessibility::ROLE_MENU_LIST_OPTION, NSAccessibilityMenuItemRole }, | |
| 106 { WebAccessibility::ROLE_MENU_LIST_POPUP, NSAccessibilityUnknownRole }, | |
| 107 { WebAccessibility::ROLE_NOTE, NSAccessibilityGroupRole }, | |
| 108 { WebAccessibility::ROLE_OUTLINE, NSAccessibilityOutlineRole }, | |
| 109 { WebAccessibility::ROLE_POPUP_BUTTON, NSAccessibilityPopUpButtonRole }, | |
| 110 { WebAccessibility::ROLE_PROGRESS_INDICATOR, | |
| 111 NSAccessibilityProgressIndicatorRole }, | |
| 112 { WebAccessibility::ROLE_RADIO_BUTTON, NSAccessibilityRadioButtonRole }, | |
| 113 { WebAccessibility::ROLE_RADIO_GROUP, NSAccessibilityRadioGroupRole }, | |
| 114 { WebAccessibility::ROLE_REGION, NSAccessibilityGroupRole }, | |
| 115 { WebAccessibility::ROLE_ROOT_WEB_AREA, @"AXWebArea" }, | |
| 116 { WebAccessibility::ROLE_ROW, NSAccessibilityRowRole }, | |
| 117 { WebAccessibility::ROLE_ROW_HEADER, @"AXCell" }, | |
| 118 { WebAccessibility::ROLE_RULER, NSAccessibilityRulerRole }, | |
| 119 { WebAccessibility::ROLE_RULER_MARKER, NSAccessibilityRulerMarkerRole }, | |
| 120 // TODO(dtseng): we don't correctly support the attributes for these roles. | |
| 121 // { WebAccessibility::ROLE_SCROLLAREA, NSAccessibilityScrollAreaRole }, | |
| 122 // { WebAccessibility::ROLE_SCROLLBAR, NSAccessibilityScrollBarRole }, | |
| 123 { WebAccessibility::ROLE_SHEET, NSAccessibilitySheetRole }, | |
| 124 { WebAccessibility::ROLE_SLIDER, NSAccessibilitySliderRole }, | |
| 125 { WebAccessibility::ROLE_SLIDER_THUMB, NSAccessibilityGroupRole }, | |
| 126 { WebAccessibility::ROLE_SPLITTER, NSAccessibilitySplitterRole }, | |
| 127 { WebAccessibility::ROLE_SPLIT_GROUP, NSAccessibilitySplitGroupRole }, | |
| 128 { WebAccessibility::ROLE_STATIC_TEXT, NSAccessibilityStaticTextRole }, | |
| 129 { WebAccessibility::ROLE_STATUS, NSAccessibilityGroupRole }, | |
| 130 { WebAccessibility::ROLE_SYSTEM_WIDE, NSAccessibilityUnknownRole }, | |
| 131 { WebAccessibility::ROLE_TAB, NSAccessibilityRadioButtonRole }, | |
| 132 { WebAccessibility::ROLE_TAB_LIST, NSAccessibilityTabGroupRole }, | |
| 133 { WebAccessibility::ROLE_TAB_PANEL, NSAccessibilityGroupRole }, | |
| 134 { WebAccessibility::ROLE_TABLE, NSAccessibilityTableRole }, | |
| 135 { WebAccessibility::ROLE_TABLE_HEADER_CONTAINER, NSAccessibilityGroupRole }, | |
| 136 { WebAccessibility::ROLE_TAB_GROUP, NSAccessibilityTabGroupRole }, | |
| 137 { WebAccessibility::ROLE_TEXTAREA, NSAccessibilityTextAreaRole }, | |
| 138 { WebAccessibility::ROLE_TEXT_FIELD, NSAccessibilityTextFieldRole }, | |
| 139 { WebAccessibility::ROLE_TIMER, NSAccessibilityGroupRole }, | |
| 140 { WebAccessibility::ROLE_TOOLBAR, NSAccessibilityToolbarRole }, | |
| 141 { WebAccessibility::ROLE_TOOLTIP, NSAccessibilityGroupRole }, | |
| 142 { WebAccessibility::ROLE_TREE, NSAccessibilityOutlineRole }, | |
| 143 { WebAccessibility::ROLE_TREE_GRID, NSAccessibilityTableRole }, | |
| 144 { WebAccessibility::ROLE_TREE_ITEM, NSAccessibilityRowRole }, | |
| 145 { WebAccessibility::ROLE_VALUE_INDICATOR, NSAccessibilityValueIndicatorRole }, | |
| 146 { WebAccessibility::ROLE_WEBCORE_LINK, NSAccessibilityLinkRole }, | |
| 147 { WebAccessibility::ROLE_WEB_AREA, @"AXWebArea" }, | |
| 148 { WebAccessibility::ROLE_WINDOW, NSAccessibilityUnknownRole }, | |
| 149 }; | |
| 150 | |
| 151 static const MapEntry subroles[] = { | |
| 152 { WebAccessibility::ROLE_ALERT, @"AXApplicationAlert" }, | |
| 153 { WebAccessibility::ROLE_ALERT_DIALOG, @"AXApplicationAlertDialog" }, | |
| 154 { WebAccessibility::ROLE_ARTICLE, @"AXDocumentArticle" }, | |
| 155 { WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION, @"AXDefinition" }, | |
| 156 { WebAccessibility::ROLE_DEFINITION_LIST_TERM, @"AXTerm" }, | |
| 157 { WebAccessibility::ROLE_DIALOG, @"AXApplicationDialog" }, | |
| 158 { WebAccessibility::ROLE_DOCUMENT, @"AXDocument" }, | |
| 159 { WebAccessibility::ROLE_LANDMARK_APPLICATION, @"AXLandmarkApplication" }, | |
| 160 { WebAccessibility::ROLE_LANDMARK_BANNER, @"AXLandmarkBanner" }, | |
| 161 { WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY, @"AXLandmarkComplementary" }, | |
| 162 { WebAccessibility::ROLE_LANDMARK_CONTENTINFO, @"AXLandmarkContentInfo" }, | |
| 163 { WebAccessibility::ROLE_LANDMARK_MAIN, @"AXLandmarkMain" }, | |
| 164 { WebAccessibility::ROLE_LANDMARK_NAVIGATION, @"AXLandmarkNavigation" }, | |
| 165 { WebAccessibility::ROLE_LANDMARK_SEARCH, @"AXLandmarkSearch" }, | |
| 166 { WebAccessibility::ROLE_LOG, @"AXApplicationLog" }, | |
| 167 { WebAccessibility::ROLE_MARQUEE, @"AXApplicationMarquee" }, | |
| 168 { WebAccessibility::ROLE_MATH, @"AXDocumentMath" }, | |
| 169 { WebAccessibility::ROLE_NOTE, @"AXDocumentNote" }, | |
| 170 { WebAccessibility::ROLE_REGION, @"AXDocumentRegion" }, | |
| 171 { WebAccessibility::ROLE_STATUS, @"AXApplicationStatus" }, | |
| 172 { WebAccessibility::ROLE_TAB_PANEL, @"AXTabPanel" }, | |
| 173 { WebAccessibility::ROLE_TIMER, @"AXApplicationTimer" }, | |
| 174 { WebAccessibility::ROLE_TOOLTIP, @"AXUserInterfaceTooltip" }, | |
| 175 { WebAccessibility::ROLE_TREE_ITEM, NSAccessibilityOutlineRowSubrole }, | |
| 176 }; | |
| 177 | |
| 178 static const AttributeToMethodNameEntry attributeToMethodNameContainer[] = { | |
| 179 { NSAccessibilityChildrenAttribute, @"children" }, | 55 { NSAccessibilityChildrenAttribute, @"children" }, |
| 180 { NSAccessibilityColumnsAttribute, @"columns" }, | 56 { NSAccessibilityColumnsAttribute, @"columns" }, |
| 181 { NSAccessibilityDescriptionAttribute, @"description" }, | 57 { NSAccessibilityDescriptionAttribute, @"description" }, |
| 182 { NSAccessibilityEnabledAttribute, @"enabled" }, | 58 { NSAccessibilityEnabledAttribute, @"enabled" }, |
| 183 { NSAccessibilityFocusedAttribute, @"focused" }, | 59 { NSAccessibilityFocusedAttribute, @"focused" }, |
| 184 { NSAccessibilityHelpAttribute, @"help" }, | 60 { NSAccessibilityHelpAttribute, @"help" }, |
| 185 { NSAccessibilityMaxValueAttribute, @"maxValue" }, | 61 { NSAccessibilityMaxValueAttribute, @"maxValue" }, |
| 186 { NSAccessibilityMinValueAttribute, @"minValue" }, | 62 { NSAccessibilityMinValueAttribute, @"minValue" }, |
| 187 { NSAccessibilityNumberOfCharactersAttribute, @"numberOfCharacters" }, | 63 { NSAccessibilityNumberOfCharactersAttribute, @"numberOfCharacters" }, |
| 188 { NSAccessibilityParentAttribute, @"parent" }, | 64 { NSAccessibilityParentAttribute, @"parent" }, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 210 { @"AXRequired", @"required" }, | 86 { @"AXRequired", @"required" }, |
| 211 { @"AXVisited", @"visited" }, | 87 { @"AXVisited", @"visited" }, |
| 212 }; | 88 }; |
| 213 | 89 |
| 214 // GetState checks the bitmask used in webaccessibility.h to check | 90 // GetState checks the bitmask used in webaccessibility.h to check |
| 215 // if the given state was set on the accessibility object. | 91 // if the given state was set on the accessibility object. |
| 216 bool GetState(BrowserAccessibility* accessibility, int state) { | 92 bool GetState(BrowserAccessibility* accessibility, int state) { |
| 217 return ((accessibility->state() >> state) & 1); | 93 return ((accessibility->state() >> state) & 1); |
| 218 } | 94 } |
| 219 | 95 |
| 96 RoleMap BuildRoleMap() { |
| 97 const MapEntry roles[] = { |
| 98 { WebAccessibility::ROLE_ALERT, NSAccessibilityGroupRole }, |
| 99 { WebAccessibility::ROLE_ALERT_DIALOG, NSAccessibilityGroupRole }, |
| 100 { WebAccessibility::ROLE_ANNOTATION, NSAccessibilityUnknownRole }, |
| 101 { WebAccessibility::ROLE_APPLICATION, NSAccessibilityGroupRole }, |
| 102 { WebAccessibility::ROLE_ARTICLE, NSAccessibilityGroupRole }, |
| 103 { WebAccessibility::ROLE_BROWSER, NSAccessibilityBrowserRole }, |
| 104 { WebAccessibility::ROLE_BUSY_INDICATOR, NSAccessibilityBusyIndicatorRole }, |
| 105 { WebAccessibility::ROLE_BUTTON, NSAccessibilityButtonRole }, |
| 106 { WebAccessibility::ROLE_CELL, @"AXCell" }, |
| 107 { WebAccessibility::ROLE_CHECKBOX, NSAccessibilityCheckBoxRole }, |
| 108 { WebAccessibility::ROLE_COLOR_WELL, NSAccessibilityColorWellRole }, |
| 109 { WebAccessibility::ROLE_COLUMN, NSAccessibilityColumnRole }, |
| 110 { WebAccessibility::ROLE_COLUMN_HEADER, @"AXCell" }, |
| 111 { WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION, |
| 112 NSAccessibilityGroupRole }, |
| 113 { WebAccessibility::ROLE_DEFINITION_LIST_TERM, NSAccessibilityGroupRole }, |
| 114 { WebAccessibility::ROLE_DIALOG, NSAccessibilityGroupRole }, |
| 115 { WebAccessibility::ROLE_DIRECTORY, NSAccessibilityListRole }, |
| 116 { WebAccessibility::ROLE_DISCLOSURE_TRIANGLE, |
| 117 NSAccessibilityDisclosureTriangleRole }, |
| 118 { WebAccessibility::ROLE_DOCUMENT, NSAccessibilityGroupRole }, |
| 119 { WebAccessibility::ROLE_DRAWER, NSAccessibilityDrawerRole }, |
| 120 { WebAccessibility::ROLE_EDITABLE_TEXT, NSAccessibilityTextFieldRole }, |
| 121 { WebAccessibility::ROLE_GRID, NSAccessibilityGridRole }, |
| 122 { WebAccessibility::ROLE_GROUP, NSAccessibilityGroupRole }, |
| 123 { WebAccessibility::ROLE_GROW_AREA, NSAccessibilityGrowAreaRole }, |
| 124 { WebAccessibility::ROLE_HEADING, @"AXHeading" }, |
| 125 { WebAccessibility::ROLE_HELP_TAG, NSAccessibilityHelpTagRole }, |
| 126 { WebAccessibility::ROLE_IGNORED, NSAccessibilityUnknownRole }, |
| 127 { WebAccessibility::ROLE_IMAGE, NSAccessibilityImageRole }, |
| 128 { WebAccessibility::ROLE_IMAGE_MAP, NSAccessibilityGroupRole }, |
| 129 { WebAccessibility::ROLE_IMAGE_MAP_LINK, NSAccessibilityLinkRole }, |
| 130 { WebAccessibility::ROLE_INCREMENTOR, NSAccessibilityIncrementorRole }, |
| 131 { WebAccessibility::ROLE_LANDMARK_APPLICATION, NSAccessibilityGroupRole }, |
| 132 { WebAccessibility::ROLE_LANDMARK_BANNER, NSAccessibilityGroupRole }, |
| 133 { WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY, NSAccessibilityGroupRole }, |
| 134 { WebAccessibility::ROLE_LANDMARK_CONTENTINFO, NSAccessibilityGroupRole }, |
| 135 { WebAccessibility::ROLE_LANDMARK_MAIN, NSAccessibilityGroupRole }, |
| 136 { WebAccessibility::ROLE_LANDMARK_NAVIGATION, NSAccessibilityGroupRole }, |
| 137 { WebAccessibility::ROLE_LANDMARK_SEARCH, NSAccessibilityGroupRole }, |
| 138 { WebAccessibility::ROLE_LINK, NSAccessibilityLinkRole }, |
| 139 { WebAccessibility::ROLE_LIST, NSAccessibilityListRole }, |
| 140 { WebAccessibility::ROLE_LIST_ITEM, NSAccessibilityGroupRole }, |
| 141 { WebAccessibility::ROLE_LIST_MARKER, NSAccessibilityGroupRole }, |
| 142 { WebAccessibility::ROLE_LISTBOX, NSAccessibilityListRole }, |
| 143 { WebAccessibility::ROLE_LISTBOX_OPTION, NSAccessibilityGroupRole }, |
| 144 { WebAccessibility::ROLE_LOG, NSAccessibilityGroupRole }, |
| 145 { WebAccessibility::ROLE_MARQUEE, NSAccessibilityGroupRole }, |
| 146 { WebAccessibility::ROLE_MATH, NSAccessibilityGroupRole }, |
| 147 { WebAccessibility::ROLE_MATTE, NSAccessibilityMatteRole }, |
| 148 { WebAccessibility::ROLE_MENU, NSAccessibilityMenuRole }, |
| 149 { WebAccessibility::ROLE_MENU_ITEM, NSAccessibilityMenuItemRole }, |
| 150 { WebAccessibility::ROLE_MENU_BUTTON, NSAccessibilityButtonRole }, |
| 151 { WebAccessibility::ROLE_MENU_LIST_OPTION, NSAccessibilityMenuItemRole }, |
| 152 { WebAccessibility::ROLE_MENU_LIST_POPUP, NSAccessibilityUnknownRole }, |
| 153 { WebAccessibility::ROLE_NOTE, NSAccessibilityGroupRole }, |
| 154 { WebAccessibility::ROLE_OUTLINE, NSAccessibilityOutlineRole }, |
| 155 { WebAccessibility::ROLE_POPUP_BUTTON, NSAccessibilityPopUpButtonRole }, |
| 156 { WebAccessibility::ROLE_PROGRESS_INDICATOR, |
| 157 NSAccessibilityProgressIndicatorRole }, |
| 158 { WebAccessibility::ROLE_RADIO_BUTTON, NSAccessibilityRadioButtonRole }, |
| 159 { WebAccessibility::ROLE_RADIO_GROUP, NSAccessibilityRadioGroupRole }, |
| 160 { WebAccessibility::ROLE_REGION, NSAccessibilityGroupRole }, |
| 161 { WebAccessibility::ROLE_ROOT_WEB_AREA, @"AXWebArea" }, |
| 162 { WebAccessibility::ROLE_ROW, NSAccessibilityRowRole }, |
| 163 { WebAccessibility::ROLE_ROW_HEADER, @"AXCell" }, |
| 164 { WebAccessibility::ROLE_RULER, NSAccessibilityRulerRole }, |
| 165 { WebAccessibility::ROLE_RULER_MARKER, NSAccessibilityRulerMarkerRole }, |
| 166 // TODO(dtseng): we don't correctly support the attributes for these roles. |
| 167 // { WebAccessibility::ROLE_SCROLLAREA, NSAccessibilityScrollAreaRole }, |
| 168 // { WebAccessibility::ROLE_SCROLLBAR, NSAccessibilityScrollBarRole }, |
| 169 { WebAccessibility::ROLE_SHEET, NSAccessibilitySheetRole }, |
| 170 { WebAccessibility::ROLE_SLIDER, NSAccessibilitySliderRole }, |
| 171 { WebAccessibility::ROLE_SLIDER_THUMB, NSAccessibilityGroupRole }, |
| 172 { WebAccessibility::ROLE_SPLITTER, NSAccessibilitySplitterRole }, |
| 173 { WebAccessibility::ROLE_SPLIT_GROUP, NSAccessibilitySplitGroupRole }, |
| 174 { WebAccessibility::ROLE_STATIC_TEXT, NSAccessibilityStaticTextRole }, |
| 175 { WebAccessibility::ROLE_STATUS, NSAccessibilityGroupRole }, |
| 176 { WebAccessibility::ROLE_SYSTEM_WIDE, NSAccessibilityUnknownRole }, |
| 177 { WebAccessibility::ROLE_TAB, NSAccessibilityRadioButtonRole }, |
| 178 { WebAccessibility::ROLE_TAB_LIST, NSAccessibilityTabGroupRole }, |
| 179 { WebAccessibility::ROLE_TAB_PANEL, NSAccessibilityGroupRole }, |
| 180 { WebAccessibility::ROLE_TABLE, NSAccessibilityTableRole }, |
| 181 { WebAccessibility::ROLE_TABLE_HEADER_CONTAINER, NSAccessibilityGroupRole }, |
| 182 { WebAccessibility::ROLE_TAB_GROUP, NSAccessibilityTabGroupRole }, |
| 183 { WebAccessibility::ROLE_TEXTAREA, NSAccessibilityTextAreaRole }, |
| 184 { WebAccessibility::ROLE_TEXT_FIELD, NSAccessibilityTextFieldRole }, |
| 185 { WebAccessibility::ROLE_TIMER, NSAccessibilityGroupRole }, |
| 186 { WebAccessibility::ROLE_TOOLBAR, NSAccessibilityToolbarRole }, |
| 187 { WebAccessibility::ROLE_TOOLTIP, NSAccessibilityGroupRole }, |
| 188 { WebAccessibility::ROLE_TREE, NSAccessibilityOutlineRole }, |
| 189 { WebAccessibility::ROLE_TREE_GRID, NSAccessibilityTableRole }, |
| 190 { WebAccessibility::ROLE_TREE_ITEM, NSAccessibilityRowRole }, |
| 191 { WebAccessibility::ROLE_VALUE_INDICATOR, |
| 192 NSAccessibilityValueIndicatorRole }, |
| 193 { WebAccessibility::ROLE_WEBCORE_LINK, NSAccessibilityLinkRole }, |
| 194 { WebAccessibility::ROLE_WEB_AREA, @"AXWebArea" }, |
| 195 { WebAccessibility::ROLE_WINDOW, NSAccessibilityUnknownRole }, |
| 196 }; |
| 197 |
| 198 RoleMap role_map; |
| 199 for (size_t i = 0; i < arraysize(roles); ++i) |
| 200 role_map[roles[i].webKitValue] = roles[i].nativeValue; |
| 201 return role_map; |
| 202 } |
| 203 |
| 220 // A mapping of webkit roles to native roles. | 204 // A mapping of webkit roles to native roles. |
| 221 std::map<WebAccessibility::Role, NSString*> webAccessibilityToNativeRole; | 205 NSString* NativeRoleFromWebAccessibilityRole( |
| 206 const WebAccessibility::Role& role) { |
| 207 CR_DEFINE_STATIC_LOCAL(RoleMap, web_accessibility_to_native_role, |
| 208 (BuildRoleMap())); |
| 209 RoleMap::iterator it = web_accessibility_to_native_role.find(role); |
| 210 if (it != web_accessibility_to_native_role.end()) |
| 211 return it->second; |
| 212 else |
| 213 return NSAccessibilityUnknownRole; |
| 214 } |
| 215 |
| 216 RoleMap BuildSubroleMap() { |
| 217 const MapEntry subroles[] = { |
| 218 { WebAccessibility::ROLE_ALERT, @"AXApplicationAlert" }, |
| 219 { WebAccessibility::ROLE_ALERT_DIALOG, @"AXApplicationAlertDialog" }, |
| 220 { WebAccessibility::ROLE_ARTICLE, @"AXDocumentArticle" }, |
| 221 { WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION, @"AXDefinition" }, |
| 222 { WebAccessibility::ROLE_DEFINITION_LIST_TERM, @"AXTerm" }, |
| 223 { WebAccessibility::ROLE_DIALOG, @"AXApplicationDialog" }, |
| 224 { WebAccessibility::ROLE_DOCUMENT, @"AXDocument" }, |
| 225 { WebAccessibility::ROLE_LANDMARK_APPLICATION, @"AXLandmarkApplication" }, |
| 226 { WebAccessibility::ROLE_LANDMARK_BANNER, @"AXLandmarkBanner" }, |
| 227 { WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY, |
| 228 @"AXLandmarkComplementary" }, |
| 229 { WebAccessibility::ROLE_LANDMARK_CONTENTINFO, @"AXLandmarkContentInfo" }, |
| 230 { WebAccessibility::ROLE_LANDMARK_MAIN, @"AXLandmarkMain" }, |
| 231 { WebAccessibility::ROLE_LANDMARK_NAVIGATION, @"AXLandmarkNavigation" }, |
| 232 { WebAccessibility::ROLE_LANDMARK_SEARCH, @"AXLandmarkSearch" }, |
| 233 { WebAccessibility::ROLE_LOG, @"AXApplicationLog" }, |
| 234 { WebAccessibility::ROLE_MARQUEE, @"AXApplicationMarquee" }, |
| 235 { WebAccessibility::ROLE_MATH, @"AXDocumentMath" }, |
| 236 { WebAccessibility::ROLE_NOTE, @"AXDocumentNote" }, |
| 237 { WebAccessibility::ROLE_REGION, @"AXDocumentRegion" }, |
| 238 { WebAccessibility::ROLE_STATUS, @"AXApplicationStatus" }, |
| 239 { WebAccessibility::ROLE_TAB_PANEL, @"AXTabPanel" }, |
| 240 { WebAccessibility::ROLE_TIMER, @"AXApplicationTimer" }, |
| 241 { WebAccessibility::ROLE_TOOLTIP, @"AXUserInterfaceTooltip" }, |
| 242 { WebAccessibility::ROLE_TREE_ITEM, NSAccessibilityOutlineRowSubrole }, |
| 243 }; |
| 244 |
| 245 RoleMap subrole_map; |
| 246 for (size_t i = 0; i < arraysize(subroles); ++i) |
| 247 subrole_map[subroles[i].webKitValue] = subroles[i].nativeValue; |
| 248 return subrole_map; |
| 249 } |
| 250 |
| 222 // A mapping of webkit roles to native subroles. | 251 // A mapping of webkit roles to native subroles. |
| 223 std::map<WebAccessibility::Role, NSString*> webAccessibilityToNativeSubrole; | 252 NSString* NativeSubroleFromWebAccessibilityRole( |
| 253 const WebAccessibility::Role& role) { |
| 254 CR_DEFINE_STATIC_LOCAL(RoleMap, web_accessibility_to_native_subrole, |
| 255 (BuildSubroleMap())); |
| 256 RoleMap::iterator it = web_accessibility_to_native_subrole.find(role); |
| 257 if (it != web_accessibility_to_native_subrole.end()) |
| 258 return it->second; |
| 259 else |
| 260 return nil; |
| 261 } |
| 262 |
| 224 // A mapping from an accessibility attribute to its method name. | 263 // A mapping from an accessibility attribute to its method name. |
| 225 NSDictionary* attributeToMethodNameMap = nil; | 264 NSDictionary* attributeToMethodNameMap = nil; |
| 226 | 265 |
| 227 } // namespace | 266 } // namespace |
| 228 | 267 |
| 229 @implementation BrowserAccessibilityCocoa | 268 @implementation BrowserAccessibilityCocoa |
| 230 | 269 |
| 231 + (void)initialize { | 270 + (void)initialize { |
| 232 const size_t numRoles = sizeof(roles) / sizeof(roles[0]); | |
| 233 for (size_t i = 0; i < numRoles; ++i) { | |
| 234 webAccessibilityToNativeRole[roles[i].webKitValue] = roles[i].nativeValue; | |
| 235 } | |
| 236 | |
| 237 const size_t numSubroles = sizeof(subroles) / sizeof(subroles[0]); | |
| 238 for (size_t i = 0; i < numSubroles; ++i) { | |
| 239 webAccessibilityToNativeSubrole[subroles[i].webKitValue] = | |
| 240 subroles[i].nativeValue; | |
| 241 } | |
| 242 | |
| 243 NSMutableDictionary* dict = [[NSMutableDictionary alloc] init]; | 271 NSMutableDictionary* dict = [[NSMutableDictionary alloc] init]; |
| 244 const size_t numAttributes = sizeof(attributeToMethodNameContainer) / | 272 const size_t numAttributes = sizeof(attributeToMethodNameContainer) / |
| 245 sizeof(attributeToMethodNameContainer[0]); | 273 sizeof(attributeToMethodNameContainer[0]); |
| 246 for (size_t i = 0; i < numAttributes; ++i) { | 274 for (size_t i = 0; i < numAttributes; ++i) { |
| 247 [dict setObject:attributeToMethodNameContainer[i].methodName | 275 [dict setObject:attributeToMethodNameContainer[i].methodName |
| 248 forKey:attributeToMethodNameContainer[i].attribute]; | 276 forKey:attributeToMethodNameContainer[i].attribute]; |
| 249 } | 277 } |
| 250 attributeToMethodNameMap = dict; | 278 attributeToMethodNameMap = dict; |
| 251 dict = nil; | 279 dict = nil; |
| 252 } | 280 } |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 return [NSNumber numberWithBool: | 471 return [NSNumber numberWithBool: |
| 444 GetState(browserAccessibility_, WebAccessibility::STATE_REQUIRED)]; | 472 GetState(browserAccessibility_, WebAccessibility::STATE_REQUIRED)]; |
| 445 } | 473 } |
| 446 | 474 |
| 447 // Returns a string indicating the role of this object. | 475 // Returns a string indicating the role of this object. |
| 448 - (NSString*)role { | 476 - (NSString*)role { |
| 449 WebAccessibility::Role browserAccessibilityRole = | 477 WebAccessibility::Role browserAccessibilityRole = |
| 450 static_cast<WebAccessibility::Role>( browserAccessibility_->role()); | 478 static_cast<WebAccessibility::Role>( browserAccessibility_->role()); |
| 451 | 479 |
| 452 // Roles that we only determine at runtime. | 480 // Roles that we only determine at runtime. |
| 453 std::map<WebAccessibility::Role, NSString*>::iterator it = | 481 return NativeRoleFromWebAccessibilityRole(browserAccessibilityRole); |
| 454 webAccessibilityToNativeRole.find(browserAccessibilityRole); | |
| 455 | |
| 456 if (it != webAccessibilityToNativeRole.end()) | |
| 457 return it->second; | |
| 458 else | |
| 459 return NSAccessibilityUnknownRole; | |
| 460 } | 482 } |
| 461 | 483 |
| 462 // Returns a string indicating the role description of this object. | 484 // Returns a string indicating the role description of this object. |
| 463 - (NSString*)roleDescription { | 485 - (NSString*)roleDescription { |
| 464 NSString* role = [self role]; | 486 NSString* role = [self role]; |
| 465 | 487 |
| 466 content::ContentClient* content_client = content::GetContentClient(); | 488 content::ContentClient* content_client = content::GetContentClient(); |
| 467 | 489 |
| 468 // The following descriptions are specific to webkit. | 490 // The following descriptions are specific to webkit. |
| 469 if ([role isEqualToString:@"AXWebArea"]) { | 491 if ([role isEqualToString:@"AXWebArea"]) { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 | 558 |
| 537 if (browserAccessibilityRole == WebAccessibility::ROLE_LIST) { | 559 if (browserAccessibilityRole == WebAccessibility::ROLE_LIST) { |
| 538 if ([htmlTag isEqualToString:@"ul"] || | 560 if ([htmlTag isEqualToString:@"ul"] || |
| 539 [htmlTag isEqualToString:@"ol"]) { | 561 [htmlTag isEqualToString:@"ol"]) { |
| 540 return @"AXContentList"; | 562 return @"AXContentList"; |
| 541 } else if ([htmlTag isEqualToString:@"dl"]) { | 563 } else if ([htmlTag isEqualToString:@"dl"]) { |
| 542 return @"AXDefinitionList"; | 564 return @"AXDefinitionList"; |
| 543 } | 565 } |
| 544 } | 566 } |
| 545 | 567 |
| 546 std::map<WebAccessibility::Role, NSString*>::iterator it = | 568 return NativeSubroleFromWebAccessibilityRole(browserAccessibilityRole); |
| 547 webAccessibilityToNativeSubrole.find(browserAccessibilityRole); | |
| 548 if (it != webAccessibilityToNativeSubrole.end()) | |
| 549 return it->second; | |
| 550 else | |
| 551 return nil; | |
| 552 } | 569 } |
| 553 | 570 |
| 554 // Returns all tabs in this subtree. | 571 // Returns all tabs in this subtree. |
| 555 - (NSArray*)tabs { | 572 - (NSArray*)tabs { |
| 556 NSMutableArray* tabSubtree = [[[NSMutableArray alloc] init] autorelease]; | 573 NSMutableArray* tabSubtree = [[[NSMutableArray alloc] init] autorelease]; |
| 557 | 574 |
| 558 if (browserAccessibility_->role() == WebAccessibility::ROLE_TAB) | 575 if (browserAccessibility_->role() == WebAccessibility::ROLE_TAB) |
| 559 [tabSubtree addObject:self]; | 576 [tabSubtree addObject:self]; |
| 560 | 577 |
| 561 for (uint i=0; i < [[self children] count]; ++i) { | 578 for (uint i=0; i < [[self children] count]; ++i) { |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 989 return [super hash]; | 1006 return [super hash]; |
| 990 return browserAccessibility_->renderer_id(); | 1007 return browserAccessibility_->renderer_id(); |
| 991 } | 1008 } |
| 992 | 1009 |
| 993 - (BOOL)accessibilityShouldUseUniqueId { | 1010 - (BOOL)accessibilityShouldUseUniqueId { |
| 994 return YES; | 1011 return YES; |
| 995 } | 1012 } |
| 996 | 1013 |
| 997 @end | 1014 @end |
| 998 | 1015 |
| OLD | NEW |