| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/basictypes.h" |
| 12 #include "base/strings/string16.h" | 12 #include "base/strings/string16.h" |
| 13 #include "base/strings/sys_string_conversions.h" | 13 #include "base/strings/sys_string_conversions.h" |
| 14 #include "base/strings/utf_string_conversions.h" | 14 #include "base/strings/utf_string_conversions.h" |
| 15 #include "content/browser/accessibility/browser_accessibility_manager.h" | 15 #include "content/browser/accessibility/browser_accessibility_manager.h" |
| 16 #include "content/browser/accessibility/browser_accessibility_manager_mac.h" | 16 #include "content/browser/accessibility/browser_accessibility_manager_mac.h" |
| 17 #include "content/public/common/content_client.h" | 17 #include "content/public/common/content_client.h" |
| 18 #include "grit/webkit_strings.h" | 18 #include "grit/webkit_strings.h" |
| 19 | 19 |
| 20 // 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, |
| 21 // 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 |
| 22 // this object. | 22 // this object. |
| 23 extern "C" void NSAccessibilityUnregisterUniqueIdForUIElement(id element); | 23 extern "C" void NSAccessibilityUnregisterUniqueIdForUIElement(id element); |
| 24 | 24 |
| 25 using content::AccessibilityNodeData; | 25 using ui::AXNodeData; |
| 26 using content::BrowserAccessibility; | 26 using content::BrowserAccessibility; |
| 27 using content::BrowserAccessibilityManager; | 27 using content::BrowserAccessibilityManager; |
| 28 using content::BrowserAccessibilityManagerMac; | 28 using content::BrowserAccessibilityManagerMac; |
| 29 using content::ContentClient; | 29 using content::ContentClient; |
| 30 typedef AccessibilityNodeData::StringAttribute StringAttribute; | 30 typedef ui::AXStringAttribute StringAttribute; |
| 31 | 31 |
| 32 namespace { | 32 namespace { |
| 33 | 33 |
| 34 // Returns an autoreleased copy of the AccessibilityNodeData's attribute. | 34 // Returns an autoreleased copy of the AXNodeData's attribute. |
| 35 NSString* NSStringForStringAttribute( | 35 NSString* NSStringForStringAttribute( |
| 36 BrowserAccessibility* browserAccessibility, | 36 BrowserAccessibility* browserAccessibility, |
| 37 StringAttribute attribute) { | 37 StringAttribute attribute) { |
| 38 return base::SysUTF8ToNSString( | 38 return base::SysUTF8ToNSString( |
| 39 browserAccessibility->GetStringAttribute(attribute)); | 39 browserAccessibility->GetStringAttribute(attribute)); |
| 40 } | 40 } |
| 41 | 41 |
| 42 struct MapEntry { | 42 struct MapEntry { |
| 43 blink::WebAXRole webKitValue; | 43 ui::AXRole webKitValue; |
| 44 NSString* nativeValue; | 44 NSString* nativeValue; |
| 45 }; | 45 }; |
| 46 | 46 |
| 47 typedef std::map<blink::WebAXRole, NSString*> RoleMap; | 47 typedef std::map<ui::AXRole, NSString*> RoleMap; |
| 48 | 48 |
| 49 // GetState checks the bitmask used in AccessibilityNodeData to check | 49 // GetState checks the bitmask used in AXNodeData to check |
| 50 // if the given state was set on the accessibility object. | 50 // if the given state was set on the accessibility object. |
| 51 bool GetState(BrowserAccessibility* accessibility, blink::WebAXState state) { | 51 bool GetState(BrowserAccessibility* accessibility, ui::AXState state) { |
| 52 return ((accessibility->state() >> state) & 1); | 52 return ((accessibility->state() >> state) & 1); |
| 53 } | 53 } |
| 54 | 54 |
| 55 RoleMap BuildRoleMap() { | 55 RoleMap BuildRoleMap() { |
| 56 const MapEntry roles[] = { | 56 const MapEntry roles[] = { |
| 57 { blink::WebAXRoleAlert, NSAccessibilityGroupRole }, | 57 { ui::AX_ROLE_ALERT, NSAccessibilityGroupRole }, |
| 58 { blink::WebAXRoleAlertDialog, NSAccessibilityGroupRole }, | 58 { ui::AX_ROLE_ALERT_DIALOG, NSAccessibilityGroupRole }, |
| 59 { blink::WebAXRoleAnnotation, NSAccessibilityUnknownRole }, | 59 { ui::AX_ROLE_ANNOTATION, NSAccessibilityUnknownRole }, |
| 60 { blink::WebAXRoleApplication, NSAccessibilityGroupRole }, | 60 { ui::AX_ROLE_APPLICATION, NSAccessibilityGroupRole }, |
| 61 { blink::WebAXRoleArticle, NSAccessibilityGroupRole }, | 61 { ui::AX_ROLE_ARTICLE, NSAccessibilityGroupRole }, |
| 62 { blink::WebAXRoleBrowser, NSAccessibilityBrowserRole }, | 62 { ui::AX_ROLE_BANNER, NSAccessibilityGroupRole }, |
| 63 { blink::WebAXRoleBusyIndicator, NSAccessibilityBusyIndicatorRole }, | 63 { ui::AX_ROLE_BROWSER, NSAccessibilityBrowserRole }, |
| 64 { blink::WebAXRoleButton, NSAccessibilityButtonRole }, | 64 { ui::AX_ROLE_BUSY_INDICATOR, NSAccessibilityBusyIndicatorRole }, |
| 65 { blink::WebAXRoleCanvas, NSAccessibilityImageRole }, | 65 { ui::AX_ROLE_BUTTON, NSAccessibilityButtonRole }, |
| 66 { blink::WebAXRoleCell, @"AXCell" }, | 66 { ui::AX_ROLE_CANVAS, NSAccessibilityImageRole }, |
| 67 { blink::WebAXRoleCheckBox, NSAccessibilityCheckBoxRole }, | 67 { ui::AX_ROLE_CELL, @"AXCell" }, |
| 68 { blink::WebAXRoleColorWell, NSAccessibilityColorWellRole }, | 68 { ui::AX_ROLE_CHECK_BOX, NSAccessibilityCheckBoxRole }, |
| 69 { blink::WebAXRoleComboBox, NSAccessibilityComboBoxRole }, | 69 { ui::AX_ROLE_COLOR_WELL, NSAccessibilityColorWellRole }, |
| 70 { blink::WebAXRoleColumn, NSAccessibilityColumnRole }, | 70 { ui::AX_ROLE_COLUMN, NSAccessibilityColumnRole }, |
| 71 { blink::WebAXRoleColumnHeader, @"AXCell" }, | 71 { ui::AX_ROLE_COLUMN_HEADER, @"AXCell" }, |
| 72 { blink::WebAXRoleDefinition, NSAccessibilityGroupRole }, | 72 { ui::AX_ROLE_COMBO_BOX, NSAccessibilityComboBoxRole }, |
| 73 { blink::WebAXRoleDescriptionListDetail, NSAccessibilityGroupRole }, | 73 { ui::AX_ROLE_COMPLEMENTARY, NSAccessibilityGroupRole }, |
| 74 { blink::WebAXRoleDescriptionListTerm, NSAccessibilityGroupRole }, | 74 { ui::AX_ROLE_CONTENT_INFO, NSAccessibilityGroupRole }, |
| 75 { blink::WebAXRoleDialog, NSAccessibilityGroupRole }, | 75 { ui::AX_ROLE_DEFINITION, NSAccessibilityGroupRole }, |
| 76 { blink::WebAXRoleDirectory, NSAccessibilityListRole }, | 76 { ui::AX_ROLE_DESCRIPTION_LIST_DETAIL, NSAccessibilityGroupRole }, |
| 77 { blink::WebAXRoleDisclosureTriangle, | 77 { ui::AX_ROLE_DESCRIPTION_LIST_TERM, NSAccessibilityGroupRole }, |
| 78 NSAccessibilityDisclosureTriangleRole }, | 78 { ui::AX_ROLE_DIALOG, NSAccessibilityGroupRole }, |
| 79 { blink::WebAXRoleDiv, NSAccessibilityGroupRole }, | 79 { ui::AX_ROLE_DIRECTORY, NSAccessibilityListRole }, |
| 80 { blink::WebAXRoleDocument, NSAccessibilityGroupRole }, | 80 { ui::AX_ROLE_DISCLOSURE_TRIANGLE, NSAccessibilityDisclosureTriangleRole }, |
| 81 { blink::WebAXRoleDrawer, NSAccessibilityDrawerRole }, | 81 { ui::AX_ROLE_DIV, NSAccessibilityGroupRole }, |
| 82 { blink::WebAXRoleEditableText, NSAccessibilityTextFieldRole }, | 82 { ui::AX_ROLE_DOCUMENT, NSAccessibilityGroupRole }, |
| 83 { blink::WebAXRoleFooter, NSAccessibilityGroupRole }, | 83 { ui::AX_ROLE_DRAWER, NSAccessibilityDrawerRole }, |
| 84 { blink::WebAXRoleForm, NSAccessibilityGroupRole }, | 84 { ui::AX_ROLE_EDITABLE_TEXT, NSAccessibilityTextFieldRole }, |
| 85 { blink::WebAXRoleGrid, NSAccessibilityGridRole }, | 85 { ui::AX_ROLE_FOOTER, NSAccessibilityGroupRole }, |
| 86 { blink::WebAXRoleGroup, NSAccessibilityGroupRole }, | 86 { ui::AX_ROLE_FORM, NSAccessibilityGroupRole }, |
| 87 { blink::WebAXRoleGrowArea, NSAccessibilityGrowAreaRole }, | 87 { ui::AX_ROLE_GRID, NSAccessibilityGridRole }, |
| 88 { blink::WebAXRoleHeading, @"AXHeading" }, | 88 { ui::AX_ROLE_GROUP, NSAccessibilityGroupRole }, |
| 89 { blink::WebAXRoleHelpTag, NSAccessibilityHelpTagRole }, | 89 { ui::AX_ROLE_GROW_AREA, NSAccessibilityGrowAreaRole }, |
| 90 { blink::WebAXRoleHorizontalRule, NSAccessibilityGroupRole }, | 90 { ui::AX_ROLE_HEADING, @"AXHeading" }, |
| 91 { blink::WebAXRoleIgnored, NSAccessibilityUnknownRole }, | 91 { ui::AX_ROLE_HELP_TAG, NSAccessibilityHelpTagRole }, |
| 92 { blink::WebAXRoleImage, NSAccessibilityImageRole }, | 92 { ui::AX_ROLE_HORIZONTAL_RULE, NSAccessibilityGroupRole }, |
| 93 { blink::WebAXRoleImageMap, NSAccessibilityGroupRole }, | 93 { ui::AX_ROLE_IGNORED, NSAccessibilityUnknownRole }, |
| 94 { blink::WebAXRoleImageMapLink, NSAccessibilityLinkRole }, | 94 { ui::AX_ROLE_IMAGE, NSAccessibilityImageRole }, |
| 95 { blink::WebAXRoleIncrementor, NSAccessibilityIncrementorRole }, | 95 { ui::AX_ROLE_IMAGE_MAP, NSAccessibilityGroupRole }, |
| 96 { blink::WebAXRoleLabel, NSAccessibilityGroupRole }, | 96 { ui::AX_ROLE_IMAGE_MAP_LINK, NSAccessibilityLinkRole }, |
| 97 { blink::WebAXRoleApplication, NSAccessibilityGroupRole }, | 97 { ui::AX_ROLE_INCREMENTOR, NSAccessibilityIncrementorRole }, |
| 98 { blink::WebAXRoleBanner, NSAccessibilityGroupRole }, | 98 { ui::AX_ROLE_LABEL, NSAccessibilityGroupRole }, |
| 99 { blink::WebAXRoleComplementary, NSAccessibilityGroupRole }, | 99 { ui::AX_ROLE_LINK, NSAccessibilityLinkRole }, |
| 100 { blink::WebAXRoleContentInfo, NSAccessibilityGroupRole }, | 100 { ui::AX_ROLE_LIST, NSAccessibilityListRole }, |
| 101 { blink::WebAXRoleMain, NSAccessibilityGroupRole }, | 101 { ui::AX_ROLE_LIST_BOX, NSAccessibilityListRole }, |
| 102 { blink::WebAXRoleNavigation, NSAccessibilityGroupRole }, | 102 { ui::AX_ROLE_LIST_BOX_OPTION, NSAccessibilityStaticTextRole }, |
| 103 { blink::WebAXRoleSearch, NSAccessibilityGroupRole }, | 103 { ui::AX_ROLE_LIST_ITEM, NSAccessibilityGroupRole }, |
| 104 { blink::WebAXRoleLink, NSAccessibilityLinkRole }, | 104 { ui::AX_ROLE_LIST_MARKER, @"AXListMarker" }, |
| 105 { blink::WebAXRoleList, NSAccessibilityListRole }, | 105 { ui::AX_ROLE_LOG, NSAccessibilityGroupRole }, |
| 106 { blink::WebAXRoleListItem, NSAccessibilityGroupRole }, | 106 { ui::AX_ROLE_MAIN, NSAccessibilityGroupRole }, |
| 107 { blink::WebAXRoleListMarker, @"AXListMarker" }, | 107 { ui::AX_ROLE_MARQUEE, NSAccessibilityGroupRole }, |
| 108 { blink::WebAXRoleListBox, NSAccessibilityListRole }, | 108 { ui::AX_ROLE_MATH, NSAccessibilityGroupRole }, |
| 109 { blink::WebAXRoleListBoxOption, NSAccessibilityStaticTextRole }, | 109 { ui::AX_ROLE_MATTE, NSAccessibilityMatteRole }, |
| 110 { blink::WebAXRoleLog, NSAccessibilityGroupRole }, | 110 { ui::AX_ROLE_MENU, NSAccessibilityMenuRole }, |
| 111 { blink::WebAXRoleMarquee, NSAccessibilityGroupRole }, | 111 { ui::AX_ROLE_MENU_BAR, NSAccessibilityMenuBarRole }, |
| 112 { blink::WebAXRoleMath, NSAccessibilityGroupRole }, | 112 { ui::AX_ROLE_MENU_BUTTON, NSAccessibilityButtonRole }, |
| 113 { blink::WebAXRoleMatte, NSAccessibilityMatteRole }, | 113 { ui::AX_ROLE_MENU_ITEM, NSAccessibilityMenuItemRole }, |
| 114 { blink::WebAXRoleMenu, NSAccessibilityMenuRole }, | 114 { ui::AX_ROLE_MENU_LIST_OPTION, NSAccessibilityMenuItemRole }, |
| 115 { blink::WebAXRoleMenuBar, NSAccessibilityMenuBarRole }, | 115 { ui::AX_ROLE_MENU_LIST_POPUP, NSAccessibilityUnknownRole }, |
| 116 { blink::WebAXRoleMenuItem, NSAccessibilityMenuItemRole }, | 116 { ui::AX_ROLE_NAVIGATION, NSAccessibilityGroupRole }, |
| 117 { blink::WebAXRoleMenuButton, NSAccessibilityButtonRole }, | 117 { ui::AX_ROLE_NOTE, NSAccessibilityGroupRole }, |
| 118 { blink::WebAXRoleMenuListOption, NSAccessibilityMenuItemRole }, | 118 { ui::AX_ROLE_OUTLINE, NSAccessibilityOutlineRole }, |
| 119 { blink::WebAXRoleMenuListPopup, NSAccessibilityUnknownRole }, | 119 { ui::AX_ROLE_PARAGRAPH, NSAccessibilityGroupRole }, |
| 120 { blink::WebAXRoleNote, NSAccessibilityGroupRole }, | 120 { ui::AX_ROLE_POP_UP_BUTTON, NSAccessibilityPopUpButtonRole }, |
| 121 { blink::WebAXRoleOutline, NSAccessibilityOutlineRole }, | 121 { ui::AX_ROLE_PRESENTATIONAL, NSAccessibilityGroupRole }, |
| 122 { blink::WebAXRoleParagraph, NSAccessibilityGroupRole }, | 122 { ui::AX_ROLE_PROGRESS_INDICATOR, NSAccessibilityProgressIndicatorRole }, |
| 123 { blink::WebAXRolePopUpButton, NSAccessibilityPopUpButtonRole }, | 123 { ui::AX_ROLE_RADIO_BUTTON, NSAccessibilityRadioButtonRole }, |
| 124 { blink::WebAXRolePresentational, NSAccessibilityGroupRole }, | 124 { ui::AX_ROLE_RADIO_GROUP, NSAccessibilityRadioGroupRole }, |
| 125 { blink::WebAXRoleProgressIndicator, | 125 { ui::AX_ROLE_REGION, NSAccessibilityGroupRole }, |
| 126 NSAccessibilityProgressIndicatorRole }, | 126 { ui::AX_ROLE_ROOT_WEB_AREA, @"AXWebArea" }, |
| 127 { blink::WebAXRoleRadioButton, NSAccessibilityRadioButtonRole }, | 127 { ui::AX_ROLE_ROW, NSAccessibilityRowRole }, |
| 128 { blink::WebAXRoleRadioGroup, NSAccessibilityRadioGroupRole }, | 128 { ui::AX_ROLE_ROW_HEADER, @"AXCell" }, |
| 129 { blink::WebAXRoleRegion, NSAccessibilityGroupRole }, | 129 { ui::AX_ROLE_RULER, NSAccessibilityRulerRole }, |
| 130 { blink::WebAXRoleRootWebArea, @"AXWebArea" }, | 130 { ui::AX_ROLE_RULER_MARKER, NSAccessibilityRulerMarkerRole }, |
| 131 { blink::WebAXRoleRow, NSAccessibilityRowRole }, | 131 { ui::AX_ROLE_SCROLL_BAR, NSAccessibilityScrollBarRole }, |
| 132 { blink::WebAXRoleRowHeader, @"AXCell" }, | 132 { ui::AX_ROLE_SEARCH, NSAccessibilityGroupRole }, |
| 133 { blink::WebAXRoleRuler, NSAccessibilityRulerRole }, | 133 { ui::AX_ROLE_SHEET, NSAccessibilitySheetRole }, |
| 134 { blink::WebAXRoleRulerMarker, NSAccessibilityRulerMarkerRole }, | 134 { ui::AX_ROLE_SLIDER, NSAccessibilitySliderRole }, |
| 135 { ui::AX_ROLE_SLIDER_THUMB, NSAccessibilityValueIndicatorRole }, |
| 136 { ui::AX_ROLE_SPIN_BUTTON, NSAccessibilitySliderRole }, |
| 137 { ui::AX_ROLE_SPLITTER, NSAccessibilitySplitterRole }, |
| 138 { ui::AX_ROLE_SPLIT_GROUP, NSAccessibilitySplitGroupRole }, |
| 139 { ui::AX_ROLE_STATIC_TEXT, NSAccessibilityStaticTextRole }, |
| 140 { ui::AX_ROLE_STATUS, NSAccessibilityGroupRole }, |
| 141 { ui::AX_ROLE_SVG_ROOT, NSAccessibilityGroupRole }, |
| 142 { ui::AX_ROLE_SYSTEM_WIDE, NSAccessibilityUnknownRole }, |
| 143 { ui::AX_ROLE_TAB, NSAccessibilityRadioButtonRole }, |
| 144 { ui::AX_ROLE_TABLE, NSAccessibilityTableRole }, |
| 145 { ui::AX_ROLE_TABLE_HEADER_CONTAINER, NSAccessibilityGroupRole }, |
| 146 { ui::AX_ROLE_TAB_LIST, NSAccessibilityTabGroupRole }, |
| 147 { ui::AX_ROLE_TAB_PANEL, NSAccessibilityGroupRole }, |
| 148 { ui::AX_ROLE_TEXT_AREA, NSAccessibilityTextAreaRole }, |
| 149 { ui::AX_ROLE_TEXT_FIELD, NSAccessibilityTextFieldRole }, |
| 150 { ui::AX_ROLE_TIMER, NSAccessibilityGroupRole }, |
| 151 { ui::AX_ROLE_TOGGLE_BUTTON, NSAccessibilityButtonRole }, |
| 152 { ui::AX_ROLE_TOOLBAR, NSAccessibilityToolbarRole }, |
| 153 { ui::AX_ROLE_TOOLTIP, NSAccessibilityGroupRole }, |
| 154 { ui::AX_ROLE_TREE, NSAccessibilityOutlineRole }, |
| 155 { ui::AX_ROLE_TREE_GRID, NSAccessibilityTableRole }, |
| 156 { ui::AX_ROLE_TREE_ITEM, NSAccessibilityRowRole }, |
| 157 { ui::AX_ROLE_VALUE_INDICATOR, NSAccessibilityValueIndicatorRole }, |
| 158 { ui::AX_ROLE_WEB_AREA, @"AXWebArea" }, |
| 159 { ui::AX_ROLE_WINDOW, NSAccessibilityWindowRole }, |
| 160 |
| 135 // TODO(dtseng): we don't correctly support the attributes for these roles. | 161 // TODO(dtseng): we don't correctly support the attributes for these roles. |
| 136 // { blink::WebAXRoleScrollArea, NSAccessibilityScrollAreaRole }, | 162 // { ui::AX_ROLE_SCROLL_AREA, NSAccessibilityScrollAreaRole }, |
| 137 { blink::WebAXRoleScrollBar, NSAccessibilityScrollBarRole }, | |
| 138 { blink::WebAXRoleSheet, NSAccessibilitySheetRole }, | |
| 139 { blink::WebAXRoleSlider, NSAccessibilitySliderRole }, | |
| 140 { blink::WebAXRoleSliderThumb, NSAccessibilityValueIndicatorRole }, | |
| 141 { blink::WebAXRoleSpinButton, NSAccessibilitySliderRole }, | |
| 142 { blink::WebAXRoleSplitter, NSAccessibilitySplitterRole }, | |
| 143 { blink::WebAXRoleSplitGroup, NSAccessibilitySplitGroupRole }, | |
| 144 { blink::WebAXRoleStaticText, NSAccessibilityStaticTextRole }, | |
| 145 { blink::WebAXRoleStatus, NSAccessibilityGroupRole }, | |
| 146 { blink::WebAXRoleSVGRoot, NSAccessibilityGroupRole }, | |
| 147 { blink::WebAXRoleSystemWide, NSAccessibilityUnknownRole }, | |
| 148 { blink::WebAXRoleTab, NSAccessibilityRadioButtonRole }, | |
| 149 { blink::WebAXRoleTabList, NSAccessibilityTabGroupRole }, | |
| 150 { blink::WebAXRoleTabPanel, NSAccessibilityGroupRole }, | |
| 151 { blink::WebAXRoleTable, NSAccessibilityTableRole }, | |
| 152 { blink::WebAXRoleTableHeaderContainer, NSAccessibilityGroupRole }, | |
| 153 { blink::WebAXRoleTextArea, NSAccessibilityTextAreaRole }, | |
| 154 { blink::WebAXRoleTextField, NSAccessibilityTextFieldRole }, | |
| 155 { blink::WebAXRoleTimer, NSAccessibilityGroupRole }, | |
| 156 { blink::WebAXRoleToggleButton, NSAccessibilityButtonRole }, | |
| 157 { blink::WebAXRoleToolbar, NSAccessibilityToolbarRole }, | |
| 158 { blink::WebAXRoleUserInterfaceTooltip, NSAccessibilityGroupRole }, | |
| 159 { blink::WebAXRoleTree, NSAccessibilityOutlineRole }, | |
| 160 { blink::WebAXRoleTreeGrid, NSAccessibilityTableRole }, | |
| 161 { blink::WebAXRoleTreeItem, NSAccessibilityRowRole }, | |
| 162 { blink::WebAXRoleValueIndicator, NSAccessibilityValueIndicatorRole }, | |
| 163 { blink::WebAXRoleLink, NSAccessibilityLinkRole }, | |
| 164 { blink::WebAXRoleWebArea, @"AXWebArea" }, | |
| 165 { blink::WebAXRoleWindow, NSAccessibilityWindowRole }, | |
| 166 }; | 163 }; |
| 167 | 164 |
| 168 RoleMap role_map; | 165 RoleMap role_map; |
| 169 for (size_t i = 0; i < arraysize(roles); ++i) | 166 for (size_t i = 0; i < arraysize(roles); ++i) |
| 170 role_map[roles[i].webKitValue] = roles[i].nativeValue; | 167 role_map[roles[i].webKitValue] = roles[i].nativeValue; |
| 171 return role_map; | 168 return role_map; |
| 172 } | 169 } |
| 173 | 170 |
| 174 // A mapping of webkit roles to native roles. | 171 // A mapping of webkit roles to native roles. |
| 175 NSString* NativeRoleFromAccessibilityNodeDataRole( | 172 NSString* NativeRoleFromAXRole( |
| 176 const blink::WebAXRole& role) { | 173 const ui::AXRole& role) { |
| 177 CR_DEFINE_STATIC_LOCAL(RoleMap, web_accessibility_to_native_role, | 174 CR_DEFINE_STATIC_LOCAL(RoleMap, web_accessibility_to_native_role, |
| 178 (BuildRoleMap())); | 175 (BuildRoleMap())); |
| 179 RoleMap::iterator it = web_accessibility_to_native_role.find(role); | 176 RoleMap::iterator it = web_accessibility_to_native_role.find(role); |
| 180 if (it != web_accessibility_to_native_role.end()) | 177 if (it != web_accessibility_to_native_role.end()) |
| 181 return it->second; | 178 return it->second; |
| 182 else | 179 else |
| 183 return NSAccessibilityUnknownRole; | 180 return NSAccessibilityUnknownRole; |
| 184 } | 181 } |
| 185 | 182 |
| 186 RoleMap BuildSubroleMap() { | 183 RoleMap BuildSubroleMap() { |
| 187 const MapEntry subroles[] = { | 184 const MapEntry subroles[] = { |
| 188 { blink::WebAXRoleAlert, @"AXApplicationAlert" }, | 185 { ui::AX_ROLE_ALERT, @"AXApplicationAlert" }, |
| 189 { blink::WebAXRoleAlertDialog, @"AXApplicationAlertDialog" }, | 186 { ui::AX_ROLE_ALERT_DIALOG, @"AXApplicationAlertDialog" }, |
| 190 { blink::WebAXRoleArticle, @"AXDocumentArticle" }, | 187 { ui::AX_ROLE_ARTICLE, @"AXDocumentArticle" }, |
| 191 { blink::WebAXRoleDefinition, @"AXDefinition" }, | 188 { ui::AX_ROLE_DEFINITION, @"AXDefinition" }, |
| 192 { blink::WebAXRoleDescriptionListDetail, @"AXDescription" }, | 189 { ui::AX_ROLE_DESCRIPTION_LIST_DETAIL, @"AXDescription" }, |
| 193 { blink::WebAXRoleDescriptionListTerm, @"AXTerm" }, | 190 { ui::AX_ROLE_DESCRIPTION_LIST_TERM, @"AXTerm" }, |
| 194 { blink::WebAXRoleDialog, @"AXApplicationDialog" }, | 191 { ui::AX_ROLE_DIALOG, @"AXApplicationDialog" }, |
| 195 { blink::WebAXRoleDocument, @"AXDocument" }, | 192 { ui::AX_ROLE_DOCUMENT, @"AXDocument" }, |
| 196 { blink::WebAXRoleFooter, @"AXLandmarkContentInfo" }, | 193 { ui::AX_ROLE_FOOTER, @"AXLandmarkContentInfo" }, |
| 197 { blink::WebAXRoleApplication, @"AXLandmarkApplication" }, | 194 { ui::AX_ROLE_APPLICATION, @"AXLandmarkApplication" }, |
| 198 { blink::WebAXRoleBanner, @"AXLandmarkBanner" }, | 195 { ui::AX_ROLE_BANNER, @"AXLandmarkBanner" }, |
| 199 { blink::WebAXRoleComplementary, @"AXLandmarkComplementary" }, | 196 { ui::AX_ROLE_COMPLEMENTARY, @"AXLandmarkComplementary" }, |
| 200 { blink::WebAXRoleContentInfo, @"AXLandmarkContentInfo" }, | 197 { ui::AX_ROLE_CONTENT_INFO, @"AXLandmarkContentInfo" }, |
| 201 { blink::WebAXRoleMain, @"AXLandmarkMain" }, | 198 { ui::AX_ROLE_MAIN, @"AXLandmarkMain" }, |
| 202 { blink::WebAXRoleNavigation, @"AXLandmarkNavigation" }, | 199 { ui::AX_ROLE_NAVIGATION, @"AXLandmarkNavigation" }, |
| 203 { blink::WebAXRoleSearch, @"AXLandmarkSearch" }, | 200 { ui::AX_ROLE_SEARCH, @"AXLandmarkSearch" }, |
| 204 { blink::WebAXRoleLog, @"AXApplicationLog" }, | 201 { ui::AX_ROLE_LOG, @"AXApplicationLog" }, |
| 205 { blink::WebAXRoleMarquee, @"AXApplicationMarquee" }, | 202 { ui::AX_ROLE_MARQUEE, @"AXApplicationMarquee" }, |
| 206 { blink::WebAXRoleMath, @"AXDocumentMath" }, | 203 { ui::AX_ROLE_MATH, @"AXDocumentMath" }, |
| 207 { blink::WebAXRoleNote, @"AXDocumentNote" }, | 204 { ui::AX_ROLE_NOTE, @"AXDocumentNote" }, |
| 208 { blink::WebAXRoleRegion, @"AXDocumentRegion" }, | 205 { ui::AX_ROLE_REGION, @"AXDocumentRegion" }, |
| 209 { blink::WebAXRoleStatus, @"AXApplicationStatus" }, | 206 { ui::AX_ROLE_STATUS, @"AXApplicationStatus" }, |
| 210 { blink::WebAXRoleTabPanel, @"AXTabPanel" }, | 207 { ui::AX_ROLE_TAB_PANEL, @"AXTabPanel" }, |
| 211 { blink::WebAXRoleTimer, @"AXApplicationTimer" }, | 208 { ui::AX_ROLE_TIMER, @"AXApplicationTimer" }, |
| 212 { blink::WebAXRoleUserInterfaceTooltip, @"AXUserInterfaceTooltip" }, | 209 { ui::AX_ROLE_TOOLTIP, @"AXUserInterfaceTooltip" }, |
| 213 { blink::WebAXRoleTreeItem, NSAccessibilityOutlineRowSubrole }, | 210 { ui::AX_ROLE_TREE_ITEM, NSAccessibilityOutlineRowSubrole }, |
| 214 }; | 211 }; |
| 215 | 212 |
| 216 RoleMap subrole_map; | 213 RoleMap subrole_map; |
| 217 for (size_t i = 0; i < arraysize(subroles); ++i) | 214 for (size_t i = 0; i < arraysize(subroles); ++i) |
| 218 subrole_map[subroles[i].webKitValue] = subroles[i].nativeValue; | 215 subrole_map[subroles[i].webKitValue] = subroles[i].nativeValue; |
| 219 return subrole_map; | 216 return subrole_map; |
| 220 } | 217 } |
| 221 | 218 |
| 222 // A mapping of webkit roles to native subroles. | 219 // A mapping of webkit roles to native subroles. |
| 223 NSString* NativeSubroleFromAccessibilityNodeDataRole( | 220 NSString* NativeSubroleFromAXRole( |
| 224 const blink::WebAXRole& role) { | 221 const ui::AXRole& role) { |
| 225 CR_DEFINE_STATIC_LOCAL(RoleMap, web_accessibility_to_native_subrole, | 222 CR_DEFINE_STATIC_LOCAL(RoleMap, web_accessibility_to_native_subrole, |
| 226 (BuildSubroleMap())); | 223 (BuildSubroleMap())); |
| 227 RoleMap::iterator it = web_accessibility_to_native_subrole.find(role); | 224 RoleMap::iterator it = web_accessibility_to_native_subrole.find(role); |
| 228 if (it != web_accessibility_to_native_subrole.end()) | 225 if (it != web_accessibility_to_native_subrole.end()) |
| 229 return it->second; | 226 return it->second; |
| 230 else | 227 else |
| 231 return nil; | 228 return nil; |
| 232 } | 229 } |
| 233 | 230 |
| 234 // A mapping from an accessibility attribute to its method name. | 231 // A mapping from an accessibility attribute to its method name. |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 | 314 |
| 318 - (void)detach { | 315 - (void)detach { |
| 319 if (browserAccessibility_) { | 316 if (browserAccessibility_) { |
| 320 NSAccessibilityUnregisterUniqueIdForUIElement(self); | 317 NSAccessibilityUnregisterUniqueIdForUIElement(self); |
| 321 browserAccessibility_ = NULL; | 318 browserAccessibility_ = NULL; |
| 322 } | 319 } |
| 323 } | 320 } |
| 324 | 321 |
| 325 - (NSString*)accessKey { | 322 - (NSString*)accessKey { |
| 326 return NSStringForStringAttribute( | 323 return NSStringForStringAttribute( |
| 327 browserAccessibility_, AccessibilityNodeData::ATTR_ACCESS_KEY); | 324 browserAccessibility_, ui::AX_ATTR_ACCESS_KEY); |
| 328 } | 325 } |
| 329 | 326 |
| 330 - (NSNumber*)ariaAtomic { | 327 - (NSNumber*)ariaAtomic { |
| 331 bool boolValue = browserAccessibility_->GetBoolAttribute( | 328 bool boolValue = browserAccessibility_->GetBoolAttribute( |
| 332 AccessibilityNodeData::ATTR_LIVE_ATOMIC); | 329 ui::AX_ATTR_LIVE_ATOMIC); |
| 333 return [NSNumber numberWithBool:boolValue]; | 330 return [NSNumber numberWithBool:boolValue]; |
| 334 } | 331 } |
| 335 | 332 |
| 336 - (NSNumber*)ariaBusy { | 333 - (NSNumber*)ariaBusy { |
| 337 bool boolValue = browserAccessibility_->GetBoolAttribute( | 334 bool boolValue = browserAccessibility_->GetBoolAttribute( |
| 338 AccessibilityNodeData::ATTR_LIVE_BUSY); | 335 ui::AX_ATTR_LIVE_BUSY); |
| 339 return [NSNumber numberWithBool:boolValue]; | 336 return [NSNumber numberWithBool:boolValue]; |
| 340 } | 337 } |
| 341 | 338 |
| 342 - (NSString*)ariaLive { | 339 - (NSString*)ariaLive { |
| 343 return NSStringForStringAttribute( | 340 return NSStringForStringAttribute( |
| 344 browserAccessibility_, AccessibilityNodeData::ATTR_LIVE_STATUS); | 341 browserAccessibility_, ui::AX_ATTR_LIVE_STATUS); |
| 345 } | 342 } |
| 346 | 343 |
| 347 - (NSString*)ariaRelevant { | 344 - (NSString*)ariaRelevant { |
| 348 return NSStringForStringAttribute( | 345 return NSStringForStringAttribute( |
| 349 browserAccessibility_, AccessibilityNodeData::ATTR_LIVE_RELEVANT); | 346 browserAccessibility_, ui::AX_ATTR_LIVE_RELEVANT); |
| 350 } | 347 } |
| 351 | 348 |
| 352 // Returns an array of BrowserAccessibilityCocoa objects, representing the | 349 // Returns an array of BrowserAccessibilityCocoa objects, representing the |
| 353 // accessibility children of this object. | 350 // accessibility children of this object. |
| 354 - (NSArray*)children { | 351 - (NSArray*)children { |
| 355 if (!children_) { | 352 if (!children_) { |
| 356 uint32 childCount = browserAccessibility_->PlatformChildCount(); | 353 uint32 childCount = browserAccessibility_->PlatformChildCount(); |
| 357 children_.reset([[NSMutableArray alloc] initWithCapacity:childCount]); | 354 children_.reset([[NSMutableArray alloc] initWithCapacity:childCount]); |
| 358 for (uint32 index = 0; index < childCount; ++index) { | 355 for (uint32 index = 0; index < childCount; ++index) { |
| 359 BrowserAccessibilityCocoa* child = | 356 BrowserAccessibilityCocoa* child = |
| 360 browserAccessibility_->PlatformGetChild(index)-> | 357 browserAccessibility_->PlatformGetChild(index)-> |
| 361 ToBrowserAccessibilityCocoa(); | 358 ToBrowserAccessibilityCocoa(); |
| 362 if ([child isIgnored]) | 359 if ([child isIgnored]) |
| 363 [children_ addObjectsFromArray:[child children]]; | 360 [children_ addObjectsFromArray:[child children]]; |
| 364 else | 361 else |
| 365 [children_ addObject:child]; | 362 [children_ addObject:child]; |
| 366 } | 363 } |
| 367 | 364 |
| 368 // Also, add indirect children (if any). | 365 // Also, add indirect children (if any). |
| 369 const std::vector<int32>& indirectChildIds = | 366 const std::vector<int32>& indirectChildIds = |
| 370 browserAccessibility_->GetIntListAttribute( | 367 browserAccessibility_->GetIntListAttribute( |
| 371 AccessibilityNodeData::ATTR_INDIRECT_CHILD_IDS); | 368 ui::AX_ATTR_INDIRECT_CHILD_IDS); |
| 372 for (uint32 i = 0; i < indirectChildIds.size(); ++i) { | 369 for (uint32 i = 0; i < indirectChildIds.size(); ++i) { |
| 373 int32 child_id = indirectChildIds[i]; | 370 int32 child_id = indirectChildIds[i]; |
| 374 BrowserAccessibility* child = | 371 BrowserAccessibility* child = |
| 375 browserAccessibility_->manager()->GetFromRendererID(child_id); | 372 browserAccessibility_->manager()->GetFromRendererID(child_id); |
| 376 | 373 |
| 377 // This only became necessary as a result of crbug.com/93095. It should be | 374 // This only became necessary as a result of crbug.com/93095. It should be |
| 378 // a DCHECK in the future. | 375 // a DCHECK in the future. |
| 379 if (child) { | 376 if (child) { |
| 380 BrowserAccessibilityCocoa* child_cocoa = | 377 BrowserAccessibilityCocoa* child_cocoa = |
| 381 child->ToBrowserAccessibilityCocoa(); | 378 child->ToBrowserAccessibilityCocoa(); |
| 382 [children_ addObject:child_cocoa]; | 379 [children_ addObject:child_cocoa]; |
| 383 } | 380 } |
| 384 } | 381 } |
| 385 } | 382 } |
| 386 return children_; | 383 return children_; |
| 387 } | 384 } |
| 388 | 385 |
| 389 - (void)childrenChanged { | 386 - (void)childrenChanged { |
| 390 if (![self isIgnored]) { | 387 if (![self isIgnored]) { |
| 391 children_.reset(); | 388 children_.reset(); |
| 392 } else { | 389 } else { |
| 393 [browserAccessibility_->parent()->ToBrowserAccessibilityCocoa() | 390 [browserAccessibility_->parent()->ToBrowserAccessibilityCocoa() |
| 394 childrenChanged]; | 391 childrenChanged]; |
| 395 } | 392 } |
| 396 } | 393 } |
| 397 | 394 |
| 398 - (NSArray*)columnHeaders { | 395 - (NSArray*)columnHeaders { |
| 399 if ([self internalRole] != blink::WebAXRoleTable && | 396 if ([self internalRole] != ui::AX_ROLE_TABLE && |
| 400 [self internalRole] != blink::WebAXRoleGrid) { | 397 [self internalRole] != ui::AX_ROLE_GRID) { |
| 401 return nil; | 398 return nil; |
| 402 } | 399 } |
| 403 | 400 |
| 404 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; | 401 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; |
| 405 const std::vector<int32>& uniqueCellIds = | 402 const std::vector<int32>& uniqueCellIds = |
| 406 browserAccessibility_->GetIntListAttribute( | 403 browserAccessibility_->GetIntListAttribute( |
| 407 AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS); | 404 ui::AX_ATTR_UNIQUE_CELL_IDS); |
| 408 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { | 405 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { |
| 409 int id = uniqueCellIds[i]; | 406 int id = uniqueCellIds[i]; |
| 410 BrowserAccessibility* cell = | 407 BrowserAccessibility* cell = |
| 411 browserAccessibility_->manager()->GetFromRendererID(id); | 408 browserAccessibility_->manager()->GetFromRendererID(id); |
| 412 if (cell && cell->role() == blink::WebAXRoleColumnHeader) | 409 if (cell && cell->role() == ui::AX_ROLE_COLUMN_HEADER) |
| 413 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; | 410 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; |
| 414 } | 411 } |
| 415 return ret; | 412 return ret; |
| 416 } | 413 } |
| 417 | 414 |
| 418 - (NSValue*)columnIndexRange { | 415 - (NSValue*)columnIndexRange { |
| 419 if ([self internalRole] != blink::WebAXRoleCell) | 416 if ([self internalRole] != ui::AX_ROLE_CELL) |
| 420 return nil; | 417 return nil; |
| 421 | 418 |
| 422 int column = -1; | 419 int column = -1; |
| 423 int colspan = -1; | 420 int colspan = -1; |
| 424 browserAccessibility_->GetIntAttribute( | 421 browserAccessibility_->GetIntAttribute( |
| 425 AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, &column); | 422 ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &column); |
| 426 browserAccessibility_->GetIntAttribute( | 423 browserAccessibility_->GetIntAttribute( |
| 427 AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_SPAN, &colspan); | 424 ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN, &colspan); |
| 428 if (column >= 0 && colspan >= 1) | 425 if (column >= 0 && colspan >= 1) |
| 429 return [NSValue valueWithRange:NSMakeRange(column, colspan)]; | 426 return [NSValue valueWithRange:NSMakeRange(column, colspan)]; |
| 430 return nil; | 427 return nil; |
| 431 } | 428 } |
| 432 | 429 |
| 433 - (NSArray*)columns { | 430 - (NSArray*)columns { |
| 434 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; | 431 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; |
| 435 for (BrowserAccessibilityCocoa* child in [self children]) { | 432 for (BrowserAccessibilityCocoa* child in [self children]) { |
| 436 if ([[child role] isEqualToString:NSAccessibilityColumnRole]) | 433 if ([[child role] isEqualToString:NSAccessibilityColumnRole]) |
| 437 [ret addObject:child]; | 434 [ret addObject:child]; |
| 438 } | 435 } |
| 439 return ret; | 436 return ret; |
| 440 } | 437 } |
| 441 | 438 |
| 442 - (NSString*)description { | 439 - (NSString*)description { |
| 443 std::string description; | 440 std::string description; |
| 444 if (browserAccessibility_->GetStringAttribute( | 441 if (browserAccessibility_->GetStringAttribute( |
| 445 AccessibilityNodeData::ATTR_DESCRIPTION, &description)) { | 442 ui::AX_ATTR_DESCRIPTION, &description)) { |
| 446 return base::SysUTF8ToNSString(description); | 443 return base::SysUTF8ToNSString(description); |
| 447 } | 444 } |
| 448 | 445 |
| 449 // If the role is anything other than an image, or if there's | 446 // If the role is anything other than an image, or if there's |
| 450 // a title or title UI element, just return an empty string. | 447 // a title or title UI element, just return an empty string. |
| 451 if (![[self role] isEqualToString:NSAccessibilityImageRole]) | 448 if (![[self role] isEqualToString:NSAccessibilityImageRole]) |
| 452 return @""; | 449 return @""; |
| 453 if (browserAccessibility_->HasStringAttribute( | 450 if (browserAccessibility_->HasStringAttribute( |
| 454 AccessibilityNodeData::ATTR_NAME)) { | 451 ui::AX_ATTR_NAME)) { |
| 455 return @""; | 452 return @""; |
| 456 } | 453 } |
| 457 if ([self titleUIElement]) | 454 if ([self titleUIElement]) |
| 458 return @""; | 455 return @""; |
| 459 | 456 |
| 460 // The remaining case is an image where there's no other title. | 457 // The remaining case is an image where there's no other title. |
| 461 // Return the base part of the filename as the description. | 458 // Return the base part of the filename as the description. |
| 462 std::string url; | 459 std::string url; |
| 463 if (browserAccessibility_->GetStringAttribute( | 460 if (browserAccessibility_->GetStringAttribute( |
| 464 AccessibilityNodeData::ATTR_URL, &url)) { | 461 ui::AX_ATTR_URL, &url)) { |
| 465 // Given a url like http://foo.com/bar/baz.png, just return the | 462 // Given a url like http://foo.com/bar/baz.png, just return the |
| 466 // base name, e.g., "baz.png". | 463 // base name, e.g., "baz.png". |
| 467 size_t leftIndex = url.rfind('/'); | 464 size_t leftIndex = url.rfind('/'); |
| 468 std::string basename = | 465 std::string basename = |
| 469 leftIndex != std::string::npos ? url.substr(leftIndex) : url; | 466 leftIndex != std::string::npos ? url.substr(leftIndex) : url; |
| 470 return base::SysUTF8ToNSString(basename); | 467 return base::SysUTF8ToNSString(basename); |
| 471 } | 468 } |
| 472 | 469 |
| 473 return @""; | 470 return @""; |
| 474 } | 471 } |
| 475 | 472 |
| 476 - (NSNumber*)disclosing { | 473 - (NSNumber*)disclosing { |
| 477 if ([self internalRole] == blink::WebAXRoleTreeItem) { | 474 if ([self internalRole] == ui::AX_ROLE_TREE_ITEM) { |
| 478 return [NSNumber numberWithBool: | 475 return [NSNumber numberWithBool: |
| 479 GetState(browserAccessibility_, blink::WebAXStateExpanded)]; | 476 GetState(browserAccessibility_, ui::AX_STATE_EXPANDED)]; |
| 480 } else { | 477 } else { |
| 481 return nil; | 478 return nil; |
| 482 } | 479 } |
| 483 } | 480 } |
| 484 | 481 |
| 485 - (id)disclosedByRow { | 482 - (id)disclosedByRow { |
| 486 // The row that contains this row. | 483 // The row that contains this row. |
| 487 // It should be the same as the first parent that is a treeitem. | 484 // It should be the same as the first parent that is a treeitem. |
| 488 return nil; | 485 return nil; |
| 489 } | 486 } |
| 490 | 487 |
| 491 - (NSNumber*)disclosureLevel { | 488 - (NSNumber*)disclosureLevel { |
| 492 blink::WebAXRole role = [self internalRole]; | 489 ui::AXRole role = [self internalRole]; |
| 493 if (role == blink::WebAXRoleRow || | 490 if (role == ui::AX_ROLE_ROW || |
| 494 role == blink::WebAXRoleTreeItem) { | 491 role == ui::AX_ROLE_TREE_ITEM) { |
| 495 int level = browserAccessibility_->GetIntAttribute( | 492 int level = browserAccessibility_->GetIntAttribute( |
| 496 AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL); | 493 ui::AX_ATTR_HIERARCHICAL_LEVEL); |
| 497 // Mac disclosureLevel is 0-based, but web levels are 1-based. | 494 // Mac disclosureLevel is 0-based, but web levels are 1-based. |
| 498 if (level > 0) | 495 if (level > 0) |
| 499 level--; | 496 level--; |
| 500 return [NSNumber numberWithInt:level]; | 497 return [NSNumber numberWithInt:level]; |
| 501 } else { | 498 } else { |
| 502 return nil; | 499 return nil; |
| 503 } | 500 } |
| 504 } | 501 } |
| 505 | 502 |
| 506 - (id)disclosedRows { | 503 - (id)disclosedRows { |
| 507 // The rows that are considered inside this row. | 504 // The rows that are considered inside this row. |
| 508 return nil; | 505 return nil; |
| 509 } | 506 } |
| 510 | 507 |
| 511 - (NSNumber*)enabled { | 508 - (NSNumber*)enabled { |
| 512 return [NSNumber numberWithBool: | 509 return [NSNumber numberWithBool: |
| 513 GetState(browserAccessibility_, blink::WebAXStateEnabled)]; | 510 GetState(browserAccessibility_, ui::AX_STATE_ENABLED)]; |
| 514 } | 511 } |
| 515 | 512 |
| 516 - (NSNumber*)focused { | 513 - (NSNumber*)focused { |
| 517 BrowserAccessibilityManager* manager = browserAccessibility_->manager(); | 514 BrowserAccessibilityManager* manager = browserAccessibility_->manager(); |
| 518 NSNumber* ret = [NSNumber numberWithBool: | 515 NSNumber* ret = [NSNumber numberWithBool: |
| 519 manager->GetFocus(NULL) == browserAccessibility_]; | 516 manager->GetFocus(NULL) == browserAccessibility_]; |
| 520 return ret; | 517 return ret; |
| 521 } | 518 } |
| 522 | 519 |
| 523 - (id)header { | 520 - (id)header { |
| 524 int headerElementId = -1; | 521 int headerElementId = -1; |
| 525 if ([self internalRole] == blink::WebAXRoleTable || | 522 if ([self internalRole] == ui::AX_ROLE_TABLE || |
| 526 [self internalRole] == blink::WebAXRoleGrid) { | 523 [self internalRole] == ui::AX_ROLE_GRID) { |
| 527 browserAccessibility_->GetIntAttribute( | 524 browserAccessibility_->GetIntAttribute( |
| 528 AccessibilityNodeData::ATTR_TABLE_HEADER_ID, &headerElementId); | 525 ui::AX_ATTR_TABLE_HEADER_ID, &headerElementId); |
| 529 } else if ([self internalRole] == blink::WebAXRoleColumn) { | 526 } else if ([self internalRole] == ui::AX_ROLE_COLUMN) { |
| 530 browserAccessibility_->GetIntAttribute( | 527 browserAccessibility_->GetIntAttribute( |
| 531 AccessibilityNodeData::ATTR_TABLE_COLUMN_HEADER_ID, &headerElementId); | 528 ui::AX_ATTR_TABLE_COLUMN_HEADER_ID, &headerElementId); |
| 532 } else if ([self internalRole] == blink::WebAXRoleRow) { | 529 } else if ([self internalRole] == ui::AX_ROLE_ROW) { |
| 533 browserAccessibility_->GetIntAttribute( | 530 browserAccessibility_->GetIntAttribute( |
| 534 AccessibilityNodeData::ATTR_TABLE_ROW_HEADER_ID, &headerElementId); | 531 ui::AX_ATTR_TABLE_ROW_HEADER_ID, &headerElementId); |
| 535 } | 532 } |
| 536 | 533 |
| 537 if (headerElementId > 0) { | 534 if (headerElementId > 0) { |
| 538 BrowserAccessibility* headerObject = | 535 BrowserAccessibility* headerObject = |
| 539 browserAccessibility_->manager()->GetFromRendererID(headerElementId); | 536 browserAccessibility_->manager()->GetFromRendererID(headerElementId); |
| 540 if (headerObject) | 537 if (headerObject) |
| 541 return headerObject->ToBrowserAccessibilityCocoa(); | 538 return headerObject->ToBrowserAccessibilityCocoa(); |
| 542 } | 539 } |
| 543 return nil; | 540 return nil; |
| 544 } | 541 } |
| 545 | 542 |
| 546 - (NSString*)help { | 543 - (NSString*)help { |
| 547 return NSStringForStringAttribute( | 544 return NSStringForStringAttribute( |
| 548 browserAccessibility_, AccessibilityNodeData::ATTR_HELP); | 545 browserAccessibility_, ui::AX_ATTR_HELP); |
| 549 } | 546 } |
| 550 | 547 |
| 551 - (NSNumber*)index { | 548 - (NSNumber*)index { |
| 552 if ([self internalRole] == blink::WebAXRoleColumn) { | 549 if ([self internalRole] == ui::AX_ROLE_COLUMN) { |
| 553 int columnIndex = browserAccessibility_->GetIntAttribute( | 550 int columnIndex = browserAccessibility_->GetIntAttribute( |
| 554 AccessibilityNodeData::ATTR_TABLE_COLUMN_INDEX); | 551 ui::AX_ATTR_TABLE_COLUMN_INDEX); |
| 555 return [NSNumber numberWithInt:columnIndex]; | 552 return [NSNumber numberWithInt:columnIndex]; |
| 556 } else if ([self internalRole] == blink::WebAXRoleRow) { | 553 } else if ([self internalRole] == ui::AX_ROLE_ROW) { |
| 557 int rowIndex = browserAccessibility_->GetIntAttribute( | 554 int rowIndex = browserAccessibility_->GetIntAttribute( |
| 558 AccessibilityNodeData::ATTR_TABLE_ROW_INDEX); | 555 ui::AX_ATTR_TABLE_ROW_INDEX); |
| 559 return [NSNumber numberWithInt:rowIndex]; | 556 return [NSNumber numberWithInt:rowIndex]; |
| 560 } | 557 } |
| 561 | 558 |
| 562 return nil; | 559 return nil; |
| 563 } | 560 } |
| 564 | 561 |
| 565 // Returns whether or not this node should be ignored in the | 562 // Returns whether or not this node should be ignored in the |
| 566 // accessibility tree. | 563 // accessibility tree. |
| 567 - (BOOL)isIgnored { | 564 - (BOOL)isIgnored { |
| 568 return [[self role] isEqualToString:NSAccessibilityUnknownRole]; | 565 return [[self role] isEqualToString:NSAccessibilityUnknownRole]; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 579 } | 576 } |
| 580 return invalid; | 577 return invalid; |
| 581 } | 578 } |
| 582 | 579 |
| 583 - (NSNumber*)loaded { | 580 - (NSNumber*)loaded { |
| 584 return [NSNumber numberWithBool:YES]; | 581 return [NSNumber numberWithBool:YES]; |
| 585 } | 582 } |
| 586 | 583 |
| 587 - (NSNumber*)loadingProgress { | 584 - (NSNumber*)loadingProgress { |
| 588 float floatValue = browserAccessibility_->GetFloatAttribute( | 585 float floatValue = browserAccessibility_->GetFloatAttribute( |
| 589 AccessibilityNodeData::ATTR_DOC_LOADING_PROGRESS); | 586 ui::AX_ATTR_DOC_LOADING_PROGRESS); |
| 590 return [NSNumber numberWithFloat:floatValue]; | 587 return [NSNumber numberWithFloat:floatValue]; |
| 591 } | 588 } |
| 592 | 589 |
| 593 - (NSNumber*)maxValue { | 590 - (NSNumber*)maxValue { |
| 594 float floatValue = browserAccessibility_->GetFloatAttribute( | 591 float floatValue = browserAccessibility_->GetFloatAttribute( |
| 595 AccessibilityNodeData::ATTR_MAX_VALUE_FOR_RANGE); | 592 ui::AX_ATTR_MAX_VALUE_FOR_RANGE); |
| 596 return [NSNumber numberWithFloat:floatValue]; | 593 return [NSNumber numberWithFloat:floatValue]; |
| 597 } | 594 } |
| 598 | 595 |
| 599 - (NSNumber*)minValue { | 596 - (NSNumber*)minValue { |
| 600 float floatValue = browserAccessibility_->GetFloatAttribute( | 597 float floatValue = browserAccessibility_->GetFloatAttribute( |
| 601 AccessibilityNodeData::ATTR_MIN_VALUE_FOR_RANGE); | 598 ui::AX_ATTR_MIN_VALUE_FOR_RANGE); |
| 602 return [NSNumber numberWithFloat:floatValue]; | 599 return [NSNumber numberWithFloat:floatValue]; |
| 603 } | 600 } |
| 604 | 601 |
| 605 - (NSString*)orientation { | 602 - (NSString*)orientation { |
| 606 // We present a spin button as a vertical slider, with a role description | 603 // We present a spin button as a vertical slider, with a role description |
| 607 // of "spin button". | 604 // of "spin button". |
| 608 if ([self internalRole] == blink::WebAXRoleSpinButton) | 605 if ([self internalRole] == ui::AX_ROLE_SPIN_BUTTON) |
| 609 return NSAccessibilityVerticalOrientationValue; | 606 return NSAccessibilityVerticalOrientationValue; |
| 610 | 607 |
| 611 if (GetState(browserAccessibility_, blink::WebAXStateVertical)) | 608 if (GetState(browserAccessibility_, ui::AX_STATE_VERTICAL)) |
| 612 return NSAccessibilityVerticalOrientationValue; | 609 return NSAccessibilityVerticalOrientationValue; |
| 613 else | 610 else |
| 614 return NSAccessibilityHorizontalOrientationValue; | 611 return NSAccessibilityHorizontalOrientationValue; |
| 615 } | 612 } |
| 616 | 613 |
| 617 - (NSNumber*)numberOfCharacters { | 614 - (NSNumber*)numberOfCharacters { |
| 618 return [NSNumber numberWithInt:browserAccessibility_->value().length()]; | 615 return [NSNumber numberWithInt:browserAccessibility_->value().length()]; |
| 619 } | 616 } |
| 620 | 617 |
| 621 // The origin of this accessibility object in the page's document. | 618 // The origin of this accessibility object in the page's document. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 643 - (NSValue*)position { | 640 - (NSValue*)position { |
| 644 NSPoint origin = [self origin]; | 641 NSPoint origin = [self origin]; |
| 645 NSSize size = [[self size] sizeValue]; | 642 NSSize size = [[self size] sizeValue]; |
| 646 NSPoint pointInScreen = | 643 NSPoint pointInScreen = |
| 647 [delegate_ accessibilityPointInScreen:origin size:size]; | 644 [delegate_ accessibilityPointInScreen:origin size:size]; |
| 648 return [NSValue valueWithPoint:pointInScreen]; | 645 return [NSValue valueWithPoint:pointInScreen]; |
| 649 } | 646 } |
| 650 | 647 |
| 651 - (NSNumber*)required { | 648 - (NSNumber*)required { |
| 652 return [NSNumber numberWithBool: | 649 return [NSNumber numberWithBool: |
| 653 GetState(browserAccessibility_, blink::WebAXStateRequired)]; | 650 GetState(browserAccessibility_, ui::AX_STATE_REQUIRED)]; |
| 654 } | 651 } |
| 655 | 652 |
| 656 // Returns an enum indicating the role from browserAccessibility_. | 653 // Returns an enum indicating the role from browserAccessibility_. |
| 657 - (blink::WebAXRole)internalRole { | 654 - (ui::AXRole)internalRole { |
| 658 return static_cast<blink::WebAXRole>(browserAccessibility_->role()); | 655 return static_cast<ui::AXRole>(browserAccessibility_->role()); |
| 659 } | 656 } |
| 660 | 657 |
| 661 // Returns a string indicating the NSAccessibility role of this object. | 658 // Returns a string indicating the NSAccessibility role of this object. |
| 662 - (NSString*)role { | 659 - (NSString*)role { |
| 663 blink::WebAXRole role = [self internalRole]; | 660 ui::AXRole role = [self internalRole]; |
| 664 if (role == blink::WebAXRoleCanvas && | 661 if (role == ui::AX_ROLE_CANVAS && |
| 665 browserAccessibility_->GetBoolAttribute( | 662 browserAccessibility_->GetBoolAttribute( |
| 666 AccessibilityNodeData::ATTR_CANVAS_HAS_FALLBACK)) { | 663 ui::AX_ATTR_CANVAS_HAS_FALLBACK)) { |
| 667 return NSAccessibilityGroupRole; | 664 return NSAccessibilityGroupRole; |
| 668 } | 665 } |
| 669 return NativeRoleFromAccessibilityNodeDataRole(role); | 666 return NativeRoleFromAXRole(role); |
| 670 } | 667 } |
| 671 | 668 |
| 672 // Returns a string indicating the role description of this object. | 669 // Returns a string indicating the role description of this object. |
| 673 - (NSString*)roleDescription { | 670 - (NSString*)roleDescription { |
| 674 NSString* role = [self role]; | 671 NSString* role = [self role]; |
| 675 | 672 |
| 676 ContentClient* content_client = content::GetContentClient(); | 673 ContentClient* content_client = content::GetContentClient(); |
| 677 | 674 |
| 678 // The following descriptions are specific to webkit. | 675 // The following descriptions are specific to webkit. |
| 679 if ([role isEqualToString:@"AXWebArea"]) { | 676 if ([role isEqualToString:@"AXWebArea"]) { |
| 680 return base::SysUTF16ToNSString(content_client->GetLocalizedString( | 677 return base::SysUTF16ToNSString(content_client->GetLocalizedString( |
| 681 IDS_AX_ROLE_WEB_AREA)); | 678 IDS_AX_ROLE_WEB_AREA)); |
| 682 } | 679 } |
| 683 | 680 |
| 684 if ([role isEqualToString:@"NSAccessibilityLinkRole"]) { | 681 if ([role isEqualToString:@"NSAccessibilityLinkRole"]) { |
| 685 return base::SysUTF16ToNSString(content_client->GetLocalizedString( | 682 return base::SysUTF16ToNSString(content_client->GetLocalizedString( |
| 686 IDS_AX_ROLE_LINK)); | 683 IDS_AX_ROLE_LINK)); |
| 687 } | 684 } |
| 688 | 685 |
| 689 if ([role isEqualToString:@"AXHeading"]) { | 686 if ([role isEqualToString:@"AXHeading"]) { |
| 690 return base::SysUTF16ToNSString(content_client->GetLocalizedString( | 687 return base::SysUTF16ToNSString(content_client->GetLocalizedString( |
| 691 IDS_AX_ROLE_HEADING)); | 688 IDS_AX_ROLE_HEADING)); |
| 692 } | 689 } |
| 693 | 690 |
| 694 if ([role isEqualToString:NSAccessibilityGroupRole] || | 691 if ([role isEqualToString:NSAccessibilityGroupRole] || |
| 695 [role isEqualToString:NSAccessibilityRadioButtonRole]) { | 692 [role isEqualToString:NSAccessibilityRadioButtonRole]) { |
| 696 std::string role; | 693 std::string role; |
| 697 if (browserAccessibility_->GetHtmlAttribute("role", &role)) { | 694 if (browserAccessibility_->GetHtmlAttribute("role", &role)) { |
| 698 blink::WebAXRole internalRole = [self internalRole]; | 695 ui::AXRole internalRole = [self internalRole]; |
| 699 if ((internalRole != blink::WebAXRoleGroup && | 696 if ((internalRole != ui::AX_ROLE_GROUP && |
| 700 internalRole != blink::WebAXRoleListItem) || | 697 internalRole != ui::AX_ROLE_LIST_ITEM) || |
| 701 internalRole == blink::WebAXRoleTab) { | 698 internalRole == ui::AX_ROLE_TAB) { |
| 702 // TODO(dtseng): This is not localized; see crbug/84814. | 699 // TODO(dtseng): This is not localized; see crbug/84814. |
| 703 return base::SysUTF8ToNSString(role); | 700 return base::SysUTF8ToNSString(role); |
| 704 } | 701 } |
| 705 } | 702 } |
| 706 } | 703 } |
| 707 | 704 |
| 708 switch([self internalRole]) { | 705 switch([self internalRole]) { |
| 709 case blink::WebAXRoleFooter: | 706 case ui::AX_ROLE_FOOTER: |
| 710 return base::SysUTF16ToNSString(content_client->GetLocalizedString( | 707 return base::SysUTF16ToNSString(content_client->GetLocalizedString( |
| 711 IDS_AX_ROLE_FOOTER)); | 708 IDS_AX_ROLE_FOOTER)); |
| 712 case blink::WebAXRoleSpinButton: | 709 case ui::AX_ROLE_SPIN_BUTTON: |
| 713 // This control is similar to what VoiceOver calls a "stepper". | 710 // This control is similar to what VoiceOver calls a "stepper". |
| 714 return base::SysUTF16ToNSString(content_client->GetLocalizedString( | 711 return base::SysUTF16ToNSString(content_client->GetLocalizedString( |
| 715 IDS_AX_ROLE_STEPPER)); | 712 IDS_AX_ROLE_STEPPER)); |
| 716 default: | 713 default: |
| 717 break; | 714 break; |
| 718 } | 715 } |
| 719 | 716 |
| 720 return NSAccessibilityRoleDescription(role, nil); | 717 return NSAccessibilityRoleDescription(role, nil); |
| 721 } | 718 } |
| 722 | 719 |
| 723 - (NSArray*)rowHeaders { | 720 - (NSArray*)rowHeaders { |
| 724 if ([self internalRole] != blink::WebAXRoleTable && | 721 if ([self internalRole] != ui::AX_ROLE_TABLE && |
| 725 [self internalRole] != blink::WebAXRoleGrid) { | 722 [self internalRole] != ui::AX_ROLE_GRID) { |
| 726 return nil; | 723 return nil; |
| 727 } | 724 } |
| 728 | 725 |
| 729 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; | 726 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; |
| 730 const std::vector<int32>& uniqueCellIds = | 727 const std::vector<int32>& uniqueCellIds = |
| 731 browserAccessibility_->GetIntListAttribute( | 728 browserAccessibility_->GetIntListAttribute( |
| 732 AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS); | 729 ui::AX_ATTR_UNIQUE_CELL_IDS); |
| 733 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { | 730 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { |
| 734 int id = uniqueCellIds[i]; | 731 int id = uniqueCellIds[i]; |
| 735 BrowserAccessibility* cell = | 732 BrowserAccessibility* cell = |
| 736 browserAccessibility_->manager()->GetFromRendererID(id); | 733 browserAccessibility_->manager()->GetFromRendererID(id); |
| 737 if (cell && cell->role() == blink::WebAXRoleRowHeader) | 734 if (cell && cell->role() == ui::AX_ROLE_ROW_HEADER) |
| 738 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; | 735 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; |
| 739 } | 736 } |
| 740 return ret; | 737 return ret; |
| 741 } | 738 } |
| 742 | 739 |
| 743 - (NSValue*)rowIndexRange { | 740 - (NSValue*)rowIndexRange { |
| 744 if ([self internalRole] != blink::WebAXRoleCell) | 741 if ([self internalRole] != ui::AX_ROLE_CELL) |
| 745 return nil; | 742 return nil; |
| 746 | 743 |
| 747 int row = -1; | 744 int row = -1; |
| 748 int rowspan = -1; | 745 int rowspan = -1; |
| 749 browserAccessibility_->GetIntAttribute( | 746 browserAccessibility_->GetIntAttribute( |
| 750 AccessibilityNodeData::ATTR_TABLE_CELL_ROW_INDEX, &row); | 747 ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &row); |
| 751 browserAccessibility_->GetIntAttribute( | 748 browserAccessibility_->GetIntAttribute( |
| 752 AccessibilityNodeData::ATTR_TABLE_CELL_ROW_SPAN, &rowspan); | 749 ui::AX_ATTR_TABLE_CELL_ROW_SPAN, &rowspan); |
| 753 if (row >= 0 && rowspan >= 1) | 750 if (row >= 0 && rowspan >= 1) |
| 754 return [NSValue valueWithRange:NSMakeRange(row, rowspan)]; | 751 return [NSValue valueWithRange:NSMakeRange(row, rowspan)]; |
| 755 return nil; | 752 return nil; |
| 756 } | 753 } |
| 757 | 754 |
| 758 - (NSArray*)rows { | 755 - (NSArray*)rows { |
| 759 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; | 756 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; |
| 760 | 757 |
| 761 if ([self internalRole] == blink::WebAXRoleTable|| | 758 if ([self internalRole] == ui::AX_ROLE_TABLE|| |
| 762 [self internalRole] == blink::WebAXRoleGrid) { | 759 [self internalRole] == ui::AX_ROLE_GRID) { |
| 763 for (BrowserAccessibilityCocoa* child in [self children]) { | 760 for (BrowserAccessibilityCocoa* child in [self children]) { |
| 764 if ([[child role] isEqualToString:NSAccessibilityRowRole]) | 761 if ([[child role] isEqualToString:NSAccessibilityRowRole]) |
| 765 [ret addObject:child]; | 762 [ret addObject:child]; |
| 766 } | 763 } |
| 767 } else if ([self internalRole] == blink::WebAXRoleColumn) { | 764 } else if ([self internalRole] == ui::AX_ROLE_COLUMN) { |
| 768 const std::vector<int32>& indirectChildIds = | 765 const std::vector<int32>& indirectChildIds = |
| 769 browserAccessibility_->GetIntListAttribute( | 766 browserAccessibility_->GetIntListAttribute( |
| 770 AccessibilityNodeData::ATTR_INDIRECT_CHILD_IDS); | 767 ui::AX_ATTR_INDIRECT_CHILD_IDS); |
| 771 for (uint32 i = 0; i < indirectChildIds.size(); ++i) { | 768 for (uint32 i = 0; i < indirectChildIds.size(); ++i) { |
| 772 int id = indirectChildIds[i]; | 769 int id = indirectChildIds[i]; |
| 773 BrowserAccessibility* rowElement = | 770 BrowserAccessibility* rowElement = |
| 774 browserAccessibility_->manager()->GetFromRendererID(id); | 771 browserAccessibility_->manager()->GetFromRendererID(id); |
| 775 if (rowElement) | 772 if (rowElement) |
| 776 [ret addObject:rowElement->ToBrowserAccessibilityCocoa()]; | 773 [ret addObject:rowElement->ToBrowserAccessibilityCocoa()]; |
| 777 } | 774 } |
| 778 } | 775 } |
| 779 | 776 |
| 780 return ret; | 777 return ret; |
| 781 } | 778 } |
| 782 | 779 |
| 783 // Returns the size of this object. | 780 // Returns the size of this object. |
| 784 - (NSValue*)size { | 781 - (NSValue*)size { |
| 785 gfx::Rect bounds = browserAccessibility_->GetLocalBoundsRect(); | 782 gfx::Rect bounds = browserAccessibility_->GetLocalBoundsRect(); |
| 786 return [NSValue valueWithSize:NSMakeSize(bounds.width(), bounds.height())]; | 783 return [NSValue valueWithSize:NSMakeSize(bounds.width(), bounds.height())]; |
| 787 } | 784 } |
| 788 | 785 |
| 789 // Returns a subrole based upon the role. | 786 // Returns a subrole based upon the role. |
| 790 - (NSString*) subrole { | 787 - (NSString*) subrole { |
| 791 blink::WebAXRole browserAccessibilityRole = [self internalRole]; | 788 ui::AXRole browserAccessibilityRole = [self internalRole]; |
| 792 if (browserAccessibilityRole == blink::WebAXRoleTextField && | 789 if (browserAccessibilityRole == ui::AX_ROLE_TEXT_FIELD && |
| 793 GetState(browserAccessibility_, blink::WebAXStateProtected)) { | 790 GetState(browserAccessibility_, ui::AX_STATE_PROTECTED)) { |
| 794 return @"AXSecureTextField"; | 791 return @"AXSecureTextField"; |
| 795 } | 792 } |
| 796 | 793 |
| 797 NSString* htmlTag = NSStringForStringAttribute( | 794 NSString* htmlTag = NSStringForStringAttribute( |
| 798 browserAccessibility_, AccessibilityNodeData::ATTR_HTML_TAG); | 795 browserAccessibility_, ui::AX_ATTR_HTML_TAG); |
| 799 | 796 |
| 800 if (browserAccessibilityRole == blink::WebAXRoleList) { | 797 if (browserAccessibilityRole == ui::AX_ROLE_LIST) { |
| 801 if ([htmlTag isEqualToString:@"ul"] || | 798 if ([htmlTag isEqualToString:@"ul"] || |
| 802 [htmlTag isEqualToString:@"ol"]) { | 799 [htmlTag isEqualToString:@"ol"]) { |
| 803 return @"AXContentList"; | 800 return @"AXContentList"; |
| 804 } else if ([htmlTag isEqualToString:@"dl"]) { | 801 } else if ([htmlTag isEqualToString:@"dl"]) { |
| 805 return @"AXDescriptionList"; | 802 return @"AXDescriptionList"; |
| 806 } | 803 } |
| 807 } | 804 } |
| 808 | 805 |
| 809 return NativeSubroleFromAccessibilityNodeDataRole(browserAccessibilityRole); | 806 return NativeSubroleFromAXRole(browserAccessibilityRole); |
| 810 } | 807 } |
| 811 | 808 |
| 812 // Returns all tabs in this subtree. | 809 // Returns all tabs in this subtree. |
| 813 - (NSArray*)tabs { | 810 - (NSArray*)tabs { |
| 814 NSMutableArray* tabSubtree = [[[NSMutableArray alloc] init] autorelease]; | 811 NSMutableArray* tabSubtree = [[[NSMutableArray alloc] init] autorelease]; |
| 815 | 812 |
| 816 if ([self internalRole] == blink::WebAXRoleTab) | 813 if ([self internalRole] == ui::AX_ROLE_TAB) |
| 817 [tabSubtree addObject:self]; | 814 [tabSubtree addObject:self]; |
| 818 | 815 |
| 819 for (uint i=0; i < [[self children] count]; ++i) { | 816 for (uint i=0; i < [[self children] count]; ++i) { |
| 820 NSArray* tabChildren = [[[self children] objectAtIndex:i] tabs]; | 817 NSArray* tabChildren = [[[self children] objectAtIndex:i] tabs]; |
| 821 if ([tabChildren count] > 0) | 818 if ([tabChildren count] > 0) |
| 822 [tabSubtree addObjectsFromArray:tabChildren]; | 819 [tabSubtree addObjectsFromArray:tabChildren]; |
| 823 } | 820 } |
| 824 | 821 |
| 825 return tabSubtree; | 822 return tabSubtree; |
| 826 } | 823 } |
| 827 | 824 |
| 828 - (NSString*)title { | 825 - (NSString*)title { |
| 829 return NSStringForStringAttribute( | 826 return NSStringForStringAttribute( |
| 830 browserAccessibility_, AccessibilityNodeData::ATTR_NAME); | 827 browserAccessibility_, ui::AX_ATTR_NAME); |
| 831 } | 828 } |
| 832 | 829 |
| 833 - (id)titleUIElement { | 830 - (id)titleUIElement { |
| 834 int titleElementId; | 831 int titleElementId; |
| 835 if (browserAccessibility_->GetIntAttribute( | 832 if (browserAccessibility_->GetIntAttribute( |
| 836 AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT, &titleElementId)) { | 833 ui::AX_ATTR_TITLE_UI_ELEMENT, &titleElementId)) { |
| 837 BrowserAccessibility* titleElement = | 834 BrowserAccessibility* titleElement = |
| 838 browserAccessibility_->manager()->GetFromRendererID(titleElementId); | 835 browserAccessibility_->manager()->GetFromRendererID(titleElementId); |
| 839 if (titleElement) | 836 if (titleElement) |
| 840 return titleElement->ToBrowserAccessibilityCocoa(); | 837 return titleElement->ToBrowserAccessibilityCocoa(); |
| 841 } | 838 } |
| 842 return nil; | 839 return nil; |
| 843 } | 840 } |
| 844 | 841 |
| 845 - (NSString*)url { | 842 - (NSString*)url { |
| 846 StringAttribute urlAttribute = | 843 StringAttribute urlAttribute = |
| 847 [[self role] isEqualToString:@"AXWebArea"] ? | 844 [[self role] isEqualToString:@"AXWebArea"] ? |
| 848 AccessibilityNodeData::ATTR_DOC_URL : | 845 ui::AX_ATTR_DOC_URL : |
| 849 AccessibilityNodeData::ATTR_URL; | 846 ui::AX_ATTR_URL; |
| 850 return NSStringForStringAttribute(browserAccessibility_, urlAttribute); | 847 return NSStringForStringAttribute(browserAccessibility_, urlAttribute); |
| 851 } | 848 } |
| 852 | 849 |
| 853 - (id)value { | 850 - (id)value { |
| 854 // WebCore uses an attachmentView to get the below behavior. | 851 // WebCore uses an attachmentView to get the below behavior. |
| 855 // We do not have any native views backing this object, so need | 852 // We do not have any native views backing this object, so need |
| 856 // to approximate Cocoa ax behavior best as we can. | 853 // to approximate Cocoa ax behavior best as we can. |
| 857 NSString* role = [self role]; | 854 NSString* role = [self role]; |
| 858 if ([role isEqualToString:@"AXHeading"]) { | 855 if ([role isEqualToString:@"AXHeading"]) { |
| 859 int level = 0; | 856 int level = 0; |
| 860 if (browserAccessibility_->GetIntAttribute( | 857 if (browserAccessibility_->GetIntAttribute( |
| 861 AccessibilityNodeData::ATTR_HIERARCHICAL_LEVEL, &level)) { | 858 ui::AX_ATTR_HIERARCHICAL_LEVEL, &level)) { |
| 862 return [NSNumber numberWithInt:level]; | 859 return [NSNumber numberWithInt:level]; |
| 863 } | 860 } |
| 864 } else if ([role isEqualToString:NSAccessibilityButtonRole]) { | 861 } else if ([role isEqualToString:NSAccessibilityButtonRole]) { |
| 865 // AXValue does not make sense for pure buttons. | 862 // AXValue does not make sense for pure buttons. |
| 866 return @""; | 863 return @""; |
| 867 } else if ([role isEqualToString:NSAccessibilityCheckBoxRole] || | 864 } else if ([role isEqualToString:NSAccessibilityCheckBoxRole] || |
| 868 [role isEqualToString:NSAccessibilityRadioButtonRole]) { | 865 [role isEqualToString:NSAccessibilityRadioButtonRole]) { |
| 869 int value = 0; | 866 int value = 0; |
| 870 value = GetState( | 867 value = GetState( |
| 871 browserAccessibility_, blink::WebAXStateChecked) ? 1 : 0; | 868 browserAccessibility_, ui::AX_STATE_CHECKED) ? 1 : 0; |
| 872 value = GetState( | 869 value = GetState( |
| 873 browserAccessibility_, blink::WebAXStateSelected) ? | 870 browserAccessibility_, ui::AX_STATE_SELECTED) ? |
| 874 1 : | 871 1 : |
| 875 value; | 872 value; |
| 876 | 873 |
| 877 if (browserAccessibility_->GetBoolAttribute( | 874 if (browserAccessibility_->GetBoolAttribute( |
| 878 AccessibilityNodeData::ATTR_BUTTON_MIXED)) { | 875 ui::AX_ATTR_BUTTON_MIXED)) { |
| 879 value = 2; | 876 value = 2; |
| 880 } | 877 } |
| 881 return [NSNumber numberWithInt:value]; | 878 return [NSNumber numberWithInt:value]; |
| 882 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] || | 879 } else if ([role isEqualToString:NSAccessibilityProgressIndicatorRole] || |
| 883 [role isEqualToString:NSAccessibilitySliderRole] || | 880 [role isEqualToString:NSAccessibilitySliderRole] || |
| 884 [role isEqualToString:NSAccessibilityScrollBarRole]) { | 881 [role isEqualToString:NSAccessibilityScrollBarRole]) { |
| 885 float floatValue; | 882 float floatValue; |
| 886 if (browserAccessibility_->GetFloatAttribute( | 883 if (browserAccessibility_->GetFloatAttribute( |
| 887 AccessibilityNodeData::ATTR_VALUE_FOR_RANGE, &floatValue)) { | 884 ui::AX_ATTR_VALUE_FOR_RANGE, &floatValue)) { |
| 888 return [NSNumber numberWithFloat:floatValue]; | 885 return [NSNumber numberWithFloat:floatValue]; |
| 889 } | 886 } |
| 890 } else if ([role isEqualToString:NSAccessibilityColorWellRole]) { | 887 } else if ([role isEqualToString:NSAccessibilityColorWellRole]) { |
| 891 int r = browserAccessibility_->GetIntAttribute( | 888 int r = browserAccessibility_->GetIntAttribute( |
| 892 AccessibilityNodeData::ATTR_COLOR_VALUE_RED); | 889 ui::AX_ATTR_COLOR_VALUE_RED); |
| 893 int g = browserAccessibility_->GetIntAttribute( | 890 int g = browserAccessibility_->GetIntAttribute( |
| 894 AccessibilityNodeData::ATTR_COLOR_VALUE_GREEN); | 891 ui::AX_ATTR_COLOR_VALUE_GREEN); |
| 895 int b = browserAccessibility_->GetIntAttribute( | 892 int b = browserAccessibility_->GetIntAttribute( |
| 896 AccessibilityNodeData::ATTR_COLOR_VALUE_BLUE); | 893 ui::AX_ATTR_COLOR_VALUE_BLUE); |
| 897 // This string matches the one returned by a native Mac color well. | 894 // This string matches the one returned by a native Mac color well. |
| 898 return [NSString stringWithFormat:@"rgb %7.5f %7.5f %7.5f 1", | 895 return [NSString stringWithFormat:@"rgb %7.5f %7.5f %7.5f 1", |
| 899 r / 255., g / 255., b / 255.]; | 896 r / 255., g / 255., b / 255.]; |
| 900 } | 897 } |
| 901 | 898 |
| 902 return NSStringForStringAttribute( | 899 return NSStringForStringAttribute( |
| 903 browserAccessibility_, AccessibilityNodeData::ATTR_VALUE); | 900 browserAccessibility_, ui::AX_ATTR_VALUE); |
| 904 } | 901 } |
| 905 | 902 |
| 906 - (NSString*)valueDescription { | 903 - (NSString*)valueDescription { |
| 907 return NSStringForStringAttribute( | 904 return NSStringForStringAttribute( |
| 908 browserAccessibility_, AccessibilityNodeData::ATTR_VALUE); | 905 browserAccessibility_, ui::AX_ATTR_VALUE); |
| 909 } | 906 } |
| 910 | 907 |
| 911 - (NSValue*)visibleCharacterRange { | 908 - (NSValue*)visibleCharacterRange { |
| 912 return [NSValue valueWithRange: | 909 return [NSValue valueWithRange: |
| 913 NSMakeRange(0, browserAccessibility_->value().length())]; | 910 NSMakeRange(0, browserAccessibility_->value().length())]; |
| 914 } | 911 } |
| 915 | 912 |
| 916 - (NSArray*)visibleCells { | 913 - (NSArray*)visibleCells { |
| 917 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; | 914 NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; |
| 918 const std::vector<int32>& uniqueCellIds = | 915 const std::vector<int32>& uniqueCellIds = |
| 919 browserAccessibility_->GetIntListAttribute( | 916 browserAccessibility_->GetIntListAttribute( |
| 920 AccessibilityNodeData::ATTR_UNIQUE_CELL_IDS); | 917 ui::AX_ATTR_UNIQUE_CELL_IDS); |
| 921 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { | 918 for (size_t i = 0; i < uniqueCellIds.size(); ++i) { |
| 922 int id = uniqueCellIds[i]; | 919 int id = uniqueCellIds[i]; |
| 923 BrowserAccessibility* cell = | 920 BrowserAccessibility* cell = |
| 924 browserAccessibility_->manager()->GetFromRendererID(id); | 921 browserAccessibility_->manager()->GetFromRendererID(id); |
| 925 if (cell) | 922 if (cell) |
| 926 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; | 923 [ret addObject:cell->ToBrowserAccessibilityCocoa()]; |
| 927 } | 924 } |
| 928 return ret; | 925 return ret; |
| 929 } | 926 } |
| 930 | 927 |
| 931 - (NSArray*)visibleColumns { | 928 - (NSArray*)visibleColumns { |
| 932 return [self columns]; | 929 return [self columns]; |
| 933 } | 930 } |
| 934 | 931 |
| 935 - (NSArray*)visibleRows { | 932 - (NSArray*)visibleRows { |
| 936 return [self rows]; | 933 return [self rows]; |
| 937 } | 934 } |
| 938 | 935 |
| 939 - (NSNumber*)visited { | 936 - (NSNumber*)visited { |
| 940 return [NSNumber numberWithBool: | 937 return [NSNumber numberWithBool: |
| 941 GetState(browserAccessibility_, blink::WebAXStateVisited)]; | 938 GetState(browserAccessibility_, ui::AX_STATE_VISITED)]; |
| 942 } | 939 } |
| 943 | 940 |
| 944 - (id)window { | 941 - (id)window { |
| 945 return [delegate_ window]; | 942 return [delegate_ window]; |
| 946 } | 943 } |
| 947 | 944 |
| 948 - (NSString*)methodNameForAttribute:(NSString*)attribute { | 945 - (NSString*)methodNameForAttribute:(NSString*)attribute { |
| 949 return [attributeToMethodNameMap objectForKey:attribute]; | 946 return [attributeToMethodNameMap objectForKey:attribute]; |
| 950 } | 947 } |
| 951 | 948 |
| 952 // Returns the accessibility value for the given attribute. If the value isn't | 949 // Returns the accessibility value for the given attribute. If the value isn't |
| 953 // supported this will return nil. | 950 // supported this will return nil. |
| 954 - (id)accessibilityAttributeValue:(NSString*)attribute { | 951 - (id)accessibilityAttributeValue:(NSString*)attribute { |
| 955 if (!browserAccessibility_) | 952 if (!browserAccessibility_) |
| 956 return nil; | 953 return nil; |
| 957 | 954 |
| 958 SEL selector = | 955 SEL selector = |
| 959 NSSelectorFromString([self methodNameForAttribute:attribute]); | 956 NSSelectorFromString([self methodNameForAttribute:attribute]); |
| 960 if (selector) | 957 if (selector) |
| 961 return [self performSelector:selector]; | 958 return [self performSelector:selector]; |
| 962 | 959 |
| 963 // TODO(dtseng): refactor remaining attributes. | 960 // TODO(dtseng): refactor remaining attributes. |
| 964 int selStart, selEnd; | 961 int selStart, selEnd; |
| 965 if (browserAccessibility_->GetIntAttribute( | 962 if (browserAccessibility_->GetIntAttribute( |
| 966 AccessibilityNodeData::ATTR_TEXT_SEL_START, &selStart) && | 963 ui::AX_ATTR_TEXT_SEL_START, &selStart) && |
| 967 browserAccessibility_-> | 964 browserAccessibility_-> |
| 968 GetIntAttribute(AccessibilityNodeData::ATTR_TEXT_SEL_END, &selEnd)) { | 965 GetIntAttribute(ui::AX_ATTR_TEXT_SEL_END, &selEnd)) { |
| 969 if (selStart > selEnd) | 966 if (selStart > selEnd) |
| 970 std::swap(selStart, selEnd); | 967 std::swap(selStart, selEnd); |
| 971 int selLength = selEnd - selStart; | 968 int selLength = selEnd - selStart; |
| 972 if ([attribute isEqualToString: | 969 if ([attribute isEqualToString: |
| 973 NSAccessibilityInsertionPointLineNumberAttribute]) { | 970 NSAccessibilityInsertionPointLineNumberAttribute]) { |
| 974 const std::vector<int32>& line_breaks = | 971 const std::vector<int32>& line_breaks = |
| 975 browserAccessibility_->GetIntListAttribute( | 972 browserAccessibility_->GetIntListAttribute( |
| 976 AccessibilityNodeData::ATTR_LINE_BREAKS); | 973 ui::AX_ATTR_LINE_BREAKS); |
| 977 for (int i = 0; i < static_cast<int>(line_breaks.size()); ++i) { | 974 for (int i = 0; i < static_cast<int>(line_breaks.size()); ++i) { |
| 978 if (line_breaks[i] > selStart) | 975 if (line_breaks[i] > selStart) |
| 979 return [NSNumber numberWithInt:i]; | 976 return [NSNumber numberWithInt:i]; |
| 980 } | 977 } |
| 981 return [NSNumber numberWithInt:static_cast<int>(line_breaks.size())]; | 978 return [NSNumber numberWithInt:static_cast<int>(line_breaks.size())]; |
| 982 } | 979 } |
| 983 if ([attribute isEqualToString:NSAccessibilitySelectedTextAttribute]) { | 980 if ([attribute isEqualToString:NSAccessibilitySelectedTextAttribute]) { |
| 984 std::string value = browserAccessibility_->GetStringAttribute( | 981 std::string value = browserAccessibility_->GetStringAttribute( |
| 985 AccessibilityNodeData::ATTR_VALUE); | 982 ui::AX_ATTR_VALUE); |
| 986 return base::SysUTF8ToNSString(value.substr(selStart, selLength)); | 983 return base::SysUTF8ToNSString(value.substr(selStart, selLength)); |
| 987 } | 984 } |
| 988 if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute]) { | 985 if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute]) { |
| 989 return [NSValue valueWithRange:NSMakeRange(selStart, selLength)]; | 986 return [NSValue valueWithRange:NSMakeRange(selStart, selLength)]; |
| 990 } | 987 } |
| 991 } | 988 } |
| 992 return nil; | 989 return nil; |
| 993 } | 990 } |
| 994 | 991 |
| 995 // Returns the accessibility value for the given attribute and parameter. If the | 992 // Returns the accessibility value for the given attribute and parameter. If the |
| 996 // value isn't supported this will return nil. | 993 // value isn't supported this will return nil. |
| 997 - (id)accessibilityAttributeValue:(NSString*)attribute | 994 - (id)accessibilityAttributeValue:(NSString*)attribute |
| 998 forParameter:(id)parameter { | 995 forParameter:(id)parameter { |
| 999 if (!browserAccessibility_) | 996 if (!browserAccessibility_) |
| 1000 return nil; | 997 return nil; |
| 1001 | 998 |
| 1002 const std::vector<int32>& line_breaks = | 999 const std::vector<int32>& line_breaks = |
| 1003 browserAccessibility_->GetIntListAttribute( | 1000 browserAccessibility_->GetIntListAttribute( |
| 1004 AccessibilityNodeData::ATTR_LINE_BREAKS); | 1001 ui::AX_ATTR_LINE_BREAKS); |
| 1005 int len = static_cast<int>(browserAccessibility_->value().size()); | 1002 int len = static_cast<int>(browserAccessibility_->value().size()); |
| 1006 | 1003 |
| 1007 if ([attribute isEqualToString: | 1004 if ([attribute isEqualToString: |
| 1008 NSAccessibilityStringForRangeParameterizedAttribute]) { | 1005 NSAccessibilityStringForRangeParameterizedAttribute]) { |
| 1009 NSRange range = [(NSValue*)parameter rangeValue]; | 1006 NSRange range = [(NSValue*)parameter rangeValue]; |
| 1010 std::string value = browserAccessibility_->GetStringAttribute( | 1007 std::string value = browserAccessibility_->GetStringAttribute( |
| 1011 AccessibilityNodeData::ATTR_VALUE); | 1008 ui::AX_ATTR_VALUE); |
| 1012 return base::SysUTF8ToNSString(value.substr(range.location, range.length)); | 1009 return base::SysUTF8ToNSString(value.substr(range.location, range.length)); |
| 1013 } | 1010 } |
| 1014 | 1011 |
| 1015 if ([attribute isEqualToString: | 1012 if ([attribute isEqualToString: |
| 1016 NSAccessibilityLineForIndexParameterizedAttribute]) { | 1013 NSAccessibilityLineForIndexParameterizedAttribute]) { |
| 1017 int index = [(NSNumber*)parameter intValue]; | 1014 int index = [(NSNumber*)parameter intValue]; |
| 1018 for (int i = 0; i < static_cast<int>(line_breaks.size()); ++i) { | 1015 for (int i = 0; i < static_cast<int>(line_breaks.size()); ++i) { |
| 1019 if (line_breaks[i] > index) | 1016 if (line_breaks[i] > index) |
| 1020 return [NSNumber numberWithInt:i]; | 1017 return [NSNumber numberWithInt:i]; |
| 1021 } | 1018 } |
| 1022 return [NSNumber numberWithInt:static_cast<int>(line_breaks.size())]; | 1019 return [NSNumber numberWithInt:static_cast<int>(line_breaks.size())]; |
| 1023 } | 1020 } |
| 1024 | 1021 |
| 1025 if ([attribute isEqualToString: | 1022 if ([attribute isEqualToString: |
| 1026 NSAccessibilityRangeForLineParameterizedAttribute]) { | 1023 NSAccessibilityRangeForLineParameterizedAttribute]) { |
| 1027 int line_index = [(NSNumber*)parameter intValue]; | 1024 int line_index = [(NSNumber*)parameter intValue]; |
| 1028 int line_count = static_cast<int>(line_breaks.size()) + 1; | 1025 int line_count = static_cast<int>(line_breaks.size()) + 1; |
| 1029 if (line_index < 0 || line_index >= line_count) | 1026 if (line_index < 0 || line_index >= line_count) |
| 1030 return nil; | 1027 return nil; |
| 1031 int start = line_index > 0 ? line_breaks[line_index - 1] : 0; | 1028 int start = line_index > 0 ? line_breaks[line_index - 1] : 0; |
| 1032 int end = line_index < line_count - 1 ? line_breaks[line_index] : len; | 1029 int end = line_index < line_count - 1 ? line_breaks[line_index] : len; |
| 1033 return [NSValue valueWithRange: | 1030 return [NSValue valueWithRange: |
| 1034 NSMakeRange(start, end - start)]; | 1031 NSMakeRange(start, end - start)]; |
| 1035 } | 1032 } |
| 1036 | 1033 |
| 1037 if ([attribute isEqualToString: | 1034 if ([attribute isEqualToString: |
| 1038 NSAccessibilityCellForColumnAndRowParameterizedAttribute]) { | 1035 NSAccessibilityCellForColumnAndRowParameterizedAttribute]) { |
| 1039 if ([self internalRole] != blink::WebAXRoleTable && | 1036 if ([self internalRole] != ui::AX_ROLE_TABLE && |
| 1040 [self internalRole] != blink::WebAXRoleGrid) { | 1037 [self internalRole] != ui::AX_ROLE_GRID) { |
| 1041 return nil; | 1038 return nil; |
| 1042 } | 1039 } |
| 1043 if (![parameter isKindOfClass:[NSArray self]]) | 1040 if (![parameter isKindOfClass:[NSArray self]]) |
| 1044 return nil; | 1041 return nil; |
| 1045 NSArray* array = parameter; | 1042 NSArray* array = parameter; |
| 1046 int column = [[array objectAtIndex:0] intValue]; | 1043 int column = [[array objectAtIndex:0] intValue]; |
| 1047 int row = [[array objectAtIndex:1] intValue]; | 1044 int row = [[array objectAtIndex:1] intValue]; |
| 1048 int num_columns = browserAccessibility_->GetIntAttribute( | 1045 int num_columns = browserAccessibility_->GetIntAttribute( |
| 1049 AccessibilityNodeData::ATTR_TABLE_COLUMN_COUNT); | 1046 ui::AX_ATTR_TABLE_COLUMN_COUNT); |
| 1050 int num_rows = browserAccessibility_->GetIntAttribute( | 1047 int num_rows = browserAccessibility_->GetIntAttribute( |
| 1051 AccessibilityNodeData::ATTR_TABLE_ROW_COUNT); | 1048 ui::AX_ATTR_TABLE_ROW_COUNT); |
| 1052 if (column < 0 || column >= num_columns || | 1049 if (column < 0 || column >= num_columns || |
| 1053 row < 0 || row >= num_rows) { | 1050 row < 0 || row >= num_rows) { |
| 1054 return nil; | 1051 return nil; |
| 1055 } | 1052 } |
| 1056 for (size_t i = 0; | 1053 for (size_t i = 0; |
| 1057 i < browserAccessibility_->PlatformChildCount(); | 1054 i < browserAccessibility_->PlatformChildCount(); |
| 1058 ++i) { | 1055 ++i) { |
| 1059 BrowserAccessibility* child = browserAccessibility_->PlatformGetChild(i); | 1056 BrowserAccessibility* child = browserAccessibility_->PlatformGetChild(i); |
| 1060 if (child->role() != blink::WebAXRoleRow) | 1057 if (child->role() != ui::AX_ROLE_ROW) |
| 1061 continue; | 1058 continue; |
| 1062 int rowIndex; | 1059 int rowIndex; |
| 1063 if (!child->GetIntAttribute( | 1060 if (!child->GetIntAttribute( |
| 1064 AccessibilityNodeData::ATTR_TABLE_ROW_INDEX, &rowIndex)) { | 1061 ui::AX_ATTR_TABLE_ROW_INDEX, &rowIndex)) { |
| 1065 continue; | 1062 continue; |
| 1066 } | 1063 } |
| 1067 if (rowIndex < row) | 1064 if (rowIndex < row) |
| 1068 continue; | 1065 continue; |
| 1069 if (rowIndex > row) | 1066 if (rowIndex > row) |
| 1070 break; | 1067 break; |
| 1071 for (size_t j = 0; | 1068 for (size_t j = 0; |
| 1072 j < child->PlatformChildCount(); | 1069 j < child->PlatformChildCount(); |
| 1073 ++j) { | 1070 ++j) { |
| 1074 BrowserAccessibility* cell = child->PlatformGetChild(j); | 1071 BrowserAccessibility* cell = child->PlatformGetChild(j); |
| 1075 if (cell->role() != blink::WebAXRoleCell) | 1072 if (cell->role() != ui::AX_ROLE_CELL) |
| 1076 continue; | 1073 continue; |
| 1077 int colIndex; | 1074 int colIndex; |
| 1078 if (!cell->GetIntAttribute( | 1075 if (!cell->GetIntAttribute( |
| 1079 AccessibilityNodeData::ATTR_TABLE_CELL_COLUMN_INDEX, | 1076 ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, |
| 1080 &colIndex)) { | 1077 &colIndex)) { |
| 1081 continue; | 1078 continue; |
| 1082 } | 1079 } |
| 1083 if (colIndex == column) | 1080 if (colIndex == column) |
| 1084 return cell->ToBrowserAccessibilityCocoa(); | 1081 return cell->ToBrowserAccessibilityCocoa(); |
| 1085 if (colIndex > column) | 1082 if (colIndex > column) |
| 1086 break; | 1083 break; |
| 1087 } | 1084 } |
| 1088 } | 1085 } |
| 1089 return nil; | 1086 return nil; |
| 1090 } | 1087 } |
| 1091 | 1088 |
| 1092 if ([attribute isEqualToString: | 1089 if ([attribute isEqualToString: |
| 1093 NSAccessibilityBoundsForRangeParameterizedAttribute]) { | 1090 NSAccessibilityBoundsForRangeParameterizedAttribute]) { |
| 1094 if ([self internalRole] != blink::WebAXRoleStaticText) | 1091 if ([self internalRole] != ui::AX_ROLE_STATIC_TEXT) |
| 1095 return nil; | 1092 return nil; |
| 1096 NSRange range = [(NSValue*)parameter rangeValue]; | 1093 NSRange range = [(NSValue*)parameter rangeValue]; |
| 1097 gfx::Rect rect = browserAccessibility_->GetGlobalBoundsForRange( | 1094 gfx::Rect rect = browserAccessibility_->GetGlobalBoundsForRange( |
| 1098 range.location, range.length); | 1095 range.location, range.length); |
| 1099 NSPoint origin = NSMakePoint(rect.x(), rect.y()); | 1096 NSPoint origin = NSMakePoint(rect.x(), rect.y()); |
| 1100 NSSize size = NSMakeSize(rect.width(), rect.height()); | 1097 NSSize size = NSMakeSize(rect.width(), rect.height()); |
| 1101 NSPoint pointInScreen = | 1098 NSPoint pointInScreen = |
| 1102 [delegate_ accessibilityPointInScreen:origin size:size]; | 1099 [delegate_ accessibilityPointInScreen:origin size:size]; |
| 1103 NSRect nsrect = NSMakeRect( | 1100 NSRect nsrect = NSMakeRect( |
| 1104 pointInScreen.x, pointInScreen.y, rect.width(), rect.height()); | 1101 pointInScreen.x, pointInScreen.y, rect.width(), rect.height()); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1137 NSAccessibilityRangeForLineParameterizedAttribute, | 1134 NSAccessibilityRangeForLineParameterizedAttribute, |
| 1138 NSAccessibilityStringForRangeParameterizedAttribute, | 1135 NSAccessibilityStringForRangeParameterizedAttribute, |
| 1139 NSAccessibilityRangeForPositionParameterizedAttribute, | 1136 NSAccessibilityRangeForPositionParameterizedAttribute, |
| 1140 NSAccessibilityRangeForIndexParameterizedAttribute, | 1137 NSAccessibilityRangeForIndexParameterizedAttribute, |
| 1141 NSAccessibilityBoundsForRangeParameterizedAttribute, | 1138 NSAccessibilityBoundsForRangeParameterizedAttribute, |
| 1142 NSAccessibilityRTFForRangeParameterizedAttribute, | 1139 NSAccessibilityRTFForRangeParameterizedAttribute, |
| 1143 NSAccessibilityAttributedStringForRangeParameterizedAttribute, | 1140 NSAccessibilityAttributedStringForRangeParameterizedAttribute, |
| 1144 NSAccessibilityStyleRangeForIndexParameterizedAttribute, | 1141 NSAccessibilityStyleRangeForIndexParameterizedAttribute, |
| 1145 nil]; | 1142 nil]; |
| 1146 } | 1143 } |
| 1147 if ([self internalRole] == blink::WebAXRoleStaticText) { | 1144 if ([self internalRole] == ui::AX_ROLE_STATIC_TEXT) { |
| 1148 return [NSArray arrayWithObjects: | 1145 return [NSArray arrayWithObjects: |
| 1149 NSAccessibilityBoundsForRangeParameterizedAttribute, | 1146 NSAccessibilityBoundsForRangeParameterizedAttribute, |
| 1150 nil]; | 1147 nil]; |
| 1151 } | 1148 } |
| 1152 return nil; | 1149 return nil; |
| 1153 } | 1150 } |
| 1154 | 1151 |
| 1155 // Returns an array of action names that this object will respond to. | 1152 // Returns an array of action names that this object will respond to. |
| 1156 - (NSArray*)accessibilityActionNames { | 1153 - (NSArray*)accessibilityActionNames { |
| 1157 if (!browserAccessibility_) | 1154 if (!browserAccessibility_) |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1310 } else { | 1307 } else { |
| 1311 [ret addObjectsFromArray:[NSArray arrayWithObjects: | 1308 [ret addObjectsFromArray:[NSArray arrayWithObjects: |
| 1312 NSAccessibilityIndexAttribute, | 1309 NSAccessibilityIndexAttribute, |
| 1313 nil]]; | 1310 nil]]; |
| 1314 } | 1311 } |
| 1315 } | 1312 } |
| 1316 } | 1313 } |
| 1317 | 1314 |
| 1318 // Live regions. | 1315 // Live regions. |
| 1319 if (browserAccessibility_->HasStringAttribute( | 1316 if (browserAccessibility_->HasStringAttribute( |
| 1320 AccessibilityNodeData::ATTR_LIVE_STATUS)) { | 1317 ui::AX_ATTR_LIVE_STATUS)) { |
| 1321 [ret addObjectsFromArray:[NSArray arrayWithObjects: | 1318 [ret addObjectsFromArray:[NSArray arrayWithObjects: |
| 1322 @"AXARIALive", | 1319 @"AXARIALive", |
| 1323 @"AXARIARelevant", | 1320 @"AXARIARelevant", |
| 1324 nil]]; | 1321 nil]]; |
| 1325 } | 1322 } |
| 1326 if (browserAccessibility_->HasStringAttribute( | 1323 if (browserAccessibility_->HasStringAttribute( |
| 1327 AccessibilityNodeData::ATTR_CONTAINER_LIVE_STATUS)) { | 1324 ui::AX_ATTR_CONTAINER_LIVE_STATUS)) { |
| 1328 [ret addObjectsFromArray:[NSArray arrayWithObjects: | 1325 [ret addObjectsFromArray:[NSArray arrayWithObjects: |
| 1329 @"AXARIAAtomic", | 1326 @"AXARIAAtomic", |
| 1330 @"AXARIABusy", | 1327 @"AXARIABusy", |
| 1331 nil]]; | 1328 nil]]; |
| 1332 } | 1329 } |
| 1333 | 1330 |
| 1334 // Title UI Element. | 1331 // Title UI Element. |
| 1335 if (browserAccessibility_->HasIntAttribute( | 1332 if (browserAccessibility_->HasIntAttribute( |
| 1336 AccessibilityNodeData::ATTR_TITLE_UI_ELEMENT)) { | 1333 ui::AX_ATTR_TITLE_UI_ELEMENT)) { |
| 1337 [ret addObjectsFromArray:[NSArray arrayWithObjects: | 1334 [ret addObjectsFromArray:[NSArray arrayWithObjects: |
| 1338 NSAccessibilityTitleUIElementAttribute, | 1335 NSAccessibilityTitleUIElementAttribute, |
| 1339 nil]]; | 1336 nil]]; |
| 1340 } | 1337 } |
| 1341 | 1338 |
| 1342 return ret; | 1339 return ret; |
| 1343 } | 1340 } |
| 1344 | 1341 |
| 1345 // Returns the index of the child in this objects array of children. | 1342 // Returns the index of the child in this objects array of children. |
| 1346 - (NSUInteger)accessibilityGetIndexOf:(id)child { | 1343 - (NSUInteger)accessibilityGetIndexOf:(id)child { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1357 } | 1354 } |
| 1358 | 1355 |
| 1359 // Returns whether or not the specified attribute can be set by the | 1356 // Returns whether or not the specified attribute can be set by the |
| 1360 // accessibility API via |accessibilitySetValue:forAttribute:|. | 1357 // accessibility API via |accessibilitySetValue:forAttribute:|. |
| 1361 - (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute { | 1358 - (BOOL)accessibilityIsAttributeSettable:(NSString*)attribute { |
| 1362 if (!browserAccessibility_) | 1359 if (!browserAccessibility_) |
| 1363 return nil; | 1360 return nil; |
| 1364 | 1361 |
| 1365 if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) | 1362 if ([attribute isEqualToString:NSAccessibilityFocusedAttribute]) |
| 1366 return GetState(browserAccessibility_, | 1363 return GetState(browserAccessibility_, |
| 1367 blink::WebAXStateFocusable); | 1364 ui::AX_STATE_FOCUSABLE); |
| 1368 if ([attribute isEqualToString:NSAccessibilityValueAttribute]) { | 1365 if ([attribute isEqualToString:NSAccessibilityValueAttribute]) { |
| 1369 return browserAccessibility_->GetBoolAttribute( | 1366 return browserAccessibility_->GetBoolAttribute( |
| 1370 AccessibilityNodeData::ATTR_CAN_SET_VALUE); | 1367 ui::AX_ATTR_CAN_SET_VALUE); |
| 1371 } | 1368 } |
| 1372 if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute] && | 1369 if ([attribute isEqualToString:NSAccessibilitySelectedTextRangeAttribute] && |
| 1373 ([[self role] isEqualToString:NSAccessibilityTextFieldRole] || | 1370 ([[self role] isEqualToString:NSAccessibilityTextFieldRole] || |
| 1374 [[self role] isEqualToString:NSAccessibilityTextAreaRole])) | 1371 [[self role] isEqualToString:NSAccessibilityTextAreaRole])) |
| 1375 return YES; | 1372 return YES; |
| 1376 | 1373 |
| 1377 return NO; | 1374 return NO; |
| 1378 } | 1375 } |
| 1379 | 1376 |
| 1380 // Returns whether or not this object should be ignored in the accessibilty | 1377 // Returns whether or not this object should be ignored in the accessibilty |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1475 return [super hash]; | 1472 return [super hash]; |
| 1476 return browserAccessibility_->renderer_id(); | 1473 return browserAccessibility_->renderer_id(); |
| 1477 } | 1474 } |
| 1478 | 1475 |
| 1479 - (BOOL)accessibilityShouldUseUniqueId { | 1476 - (BOOL)accessibilityShouldUseUniqueId { |
| 1480 return YES; | 1477 return YES; |
| 1481 } | 1478 } |
| 1482 | 1479 |
| 1483 @end | 1480 @end |
| 1484 | 1481 |
| OLD | NEW |