| 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 "content/renderer/accessibility/accessibility_node_serializer.h" | 5 #include "content/renderer/accessibility/accessibility_node_serializer.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
| 10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| 11 #include "base/strings/utf_string_conversions.h" | 11 #include "base/strings/utf_string_conversions.h" |
| 12 #include "third_party/WebKit/public/platform/WebRect.h" | 12 #include "third_party/WebKit/public/platform/WebRect.h" |
| 13 #include "third_party/WebKit/public/platform/WebSize.h" | 13 #include "third_party/WebKit/public/platform/WebSize.h" |
| 14 #include "third_party/WebKit/public/platform/WebString.h" | 14 #include "third_party/WebKit/public/platform/WebString.h" |
| 15 #include "third_party/WebKit/public/platform/WebVector.h" | 15 #include "third_party/WebKit/public/platform/WebVector.h" |
| 16 #include "third_party/WebKit/public/web/WebAccessibilityObject.h" | 16 #include "third_party/WebKit/public/web/WebAXEnums.h" |
| 17 #include "third_party/WebKit/public/web/WebAccessibilityRole.h" | 17 #include "third_party/WebKit/public/web/WebAXObject.h" |
| 18 #include "third_party/WebKit/public/web/WebDocument.h" | 18 #include "third_party/WebKit/public/web/WebDocument.h" |
| 19 #include "third_party/WebKit/public/web/WebDocumentType.h" | 19 #include "third_party/WebKit/public/web/WebDocumentType.h" |
| 20 #include "third_party/WebKit/public/web/WebElement.h" | 20 #include "third_party/WebKit/public/web/WebElement.h" |
| 21 #include "third_party/WebKit/public/web/WebFormControlElement.h" | 21 #include "third_party/WebKit/public/web/WebFormControlElement.h" |
| 22 #include "third_party/WebKit/public/web/WebFrame.h" | 22 #include "third_party/WebKit/public/web/WebFrame.h" |
| 23 #include "third_party/WebKit/public/web/WebInputElement.h" | 23 #include "third_party/WebKit/public/web/WebInputElement.h" |
| 24 #include "third_party/WebKit/public/web/WebNode.h" | 24 #include "third_party/WebKit/public/web/WebNode.h" |
| 25 | 25 |
| 26 using WebKit::WebAccessibilityRole; | 26 using WebKit::WebAXObject; |
| 27 using WebKit::WebAccessibilityObject; | |
| 28 using WebKit::WebDocument; | 27 using WebKit::WebDocument; |
| 29 using WebKit::WebDocumentType; | 28 using WebKit::WebDocumentType; |
| 30 using WebKit::WebElement; | 29 using WebKit::WebElement; |
| 31 using WebKit::WebNode; | 30 using WebKit::WebNode; |
| 32 using WebKit::WebVector; | 31 using WebKit::WebVector; |
| 33 | 32 |
| 34 namespace content { | 33 namespace content { |
| 35 namespace { | 34 namespace { |
| 36 | 35 |
| 37 // Returns true if |ancestor| is the first unignored parent of |child|, | 36 // Returns true if |ancestor| is the first unignored parent of |child|, |
| 38 // which means that when walking up the parent chain from |child|, | 37 // which means that when walking up the parent chain from |child|, |
| 39 // |ancestor| is the *first* ancestor that isn't marked as | 38 // |ancestor| is the *first* ancestor that isn't marked as |
| 40 // accessibilityIsIgnored(). | 39 // accessibilityIsIgnored(). |
| 41 bool IsParentUnignoredOf(const WebAccessibilityObject& ancestor, | 40 bool IsParentUnignoredOf(const WebAXObject& ancestor, |
| 42 const WebAccessibilityObject& child) { | 41 const WebAXObject& child) { |
| 43 WebAccessibilityObject parent = child.parentObject(); | 42 WebAXObject parent = child.parentObject(); |
| 44 while (!parent.isDetached() && parent.accessibilityIsIgnored()) | 43 while (!parent.isDetached() && parent.accessibilityIsIgnored()) |
| 45 parent = parent.parentObject(); | 44 parent = parent.parentObject(); |
| 46 return parent.equals(ancestor); | 45 return parent.equals(ancestor); |
| 47 } | 46 } |
| 48 | 47 |
| 49 bool IsTrue(std::string html_value) { | 48 bool IsTrue(std::string html_value) { |
| 50 return LowerCaseEqualsASCII(html_value, "true"); | 49 return LowerCaseEqualsASCII(html_value, "true"); |
| 51 } | 50 } |
| 52 | 51 |
| 53 // Provides a conversion between the WebKit::WebAccessibilityRole and a role | 52 // Provides a conversion between the WebAXObject state |
| 54 // supported on the Browser side. Listed alphabetically by the | |
| 55 // WebKit::WebAccessibilityRole (except for default role). | |
| 56 AccessibilityNodeData::Role ConvertRole(WebKit::WebAccessibilityRole role) { | |
| 57 switch (role) { | |
| 58 case WebKit::WebAccessibilityRoleAnnotation: | |
| 59 return AccessibilityNodeData::ROLE_ANNOTATION; | |
| 60 case WebKit::WebAccessibilityRoleApplication: | |
| 61 return AccessibilityNodeData::ROLE_APPLICATION; | |
| 62 case WebKit::WebAccessibilityRoleApplicationAlert: | |
| 63 return AccessibilityNodeData::ROLE_ALERT; | |
| 64 case WebKit::WebAccessibilityRoleApplicationAlertDialog: | |
| 65 return AccessibilityNodeData::ROLE_ALERT_DIALOG; | |
| 66 case WebKit::WebAccessibilityRoleApplicationDialog: | |
| 67 return AccessibilityNodeData::ROLE_DIALOG; | |
| 68 case WebKit::WebAccessibilityRoleApplicationLog: | |
| 69 return AccessibilityNodeData::ROLE_LOG; | |
| 70 case WebKit::WebAccessibilityRoleApplicationMarquee: | |
| 71 return AccessibilityNodeData::ROLE_MARQUEE; | |
| 72 case WebKit::WebAccessibilityRoleApplicationStatus: | |
| 73 return AccessibilityNodeData::ROLE_STATUS; | |
| 74 case WebKit::WebAccessibilityRoleApplicationTimer: | |
| 75 return AccessibilityNodeData::ROLE_TIMER; | |
| 76 case WebKit::WebAccessibilityRoleBrowser: | |
| 77 return AccessibilityNodeData::ROLE_BROWSER; | |
| 78 case WebKit::WebAccessibilityRoleBusyIndicator: | |
| 79 return AccessibilityNodeData::ROLE_BUSY_INDICATOR; | |
| 80 case WebKit::WebAccessibilityRoleButton: | |
| 81 return AccessibilityNodeData::ROLE_BUTTON; | |
| 82 case WebKit::WebAccessibilityRoleCanvas: | |
| 83 return AccessibilityNodeData::ROLE_CANVAS; | |
| 84 case WebKit::WebAccessibilityRoleCell: | |
| 85 return AccessibilityNodeData::ROLE_CELL; | |
| 86 case WebKit::WebAccessibilityRoleCheckBox: | |
| 87 return AccessibilityNodeData::ROLE_CHECKBOX; | |
| 88 case WebKit::WebAccessibilityRoleColorWell: | |
| 89 return AccessibilityNodeData::ROLE_COLOR_WELL; | |
| 90 case WebKit::WebAccessibilityRoleColumn: | |
| 91 return AccessibilityNodeData::ROLE_COLUMN; | |
| 92 case WebKit::WebAccessibilityRoleColumnHeader: | |
| 93 return AccessibilityNodeData::ROLE_COLUMN_HEADER; | |
| 94 case WebKit::WebAccessibilityRoleComboBox: | |
| 95 return AccessibilityNodeData::ROLE_COMBO_BOX; | |
| 96 case WebKit::WebAccessibilityRoleDefinition: | |
| 97 return AccessibilityNodeData::ROLE_DEFINITION; | |
| 98 case WebKit::WebAccessibilityRoleDescriptionListTerm: | |
| 99 return AccessibilityNodeData::ROLE_DESCRIPTION_LIST_TERM; | |
| 100 case WebKit::WebAccessibilityRoleDescriptionListDetail: | |
| 101 return AccessibilityNodeData::ROLE_DESCRIPTION_LIST_DETAIL; | |
| 102 case WebKit::WebAccessibilityRoleDirectory: | |
| 103 return AccessibilityNodeData::ROLE_DIRECTORY; | |
| 104 case WebKit::WebAccessibilityRoleDisclosureTriangle: | |
| 105 return AccessibilityNodeData::ROLE_DISCLOSURE_TRIANGLE; | |
| 106 case WebKit::WebAccessibilityRoleDiv: | |
| 107 return AccessibilityNodeData::ROLE_DIV; | |
| 108 case WebKit::WebAccessibilityRoleDocument: | |
| 109 return AccessibilityNodeData::ROLE_DOCUMENT; | |
| 110 case WebKit::WebAccessibilityRoleDocumentArticle: | |
| 111 return AccessibilityNodeData::ROLE_ARTICLE; | |
| 112 case WebKit::WebAccessibilityRoleDocumentMath: | |
| 113 return AccessibilityNodeData::ROLE_MATH; | |
| 114 case WebKit::WebAccessibilityRoleDocumentNote: | |
| 115 return AccessibilityNodeData::ROLE_NOTE; | |
| 116 case WebKit::WebAccessibilityRoleDocumentRegion: | |
| 117 return AccessibilityNodeData::ROLE_REGION; | |
| 118 case WebKit::WebAccessibilityRoleDrawer: | |
| 119 return AccessibilityNodeData::ROLE_DRAWER; | |
| 120 case WebKit::WebAccessibilityRoleEditableText: | |
| 121 return AccessibilityNodeData::ROLE_EDITABLE_TEXT; | |
| 122 case WebKit::WebAccessibilityRoleFooter: | |
| 123 return AccessibilityNodeData::ROLE_FOOTER; | |
| 124 case WebKit::WebAccessibilityRoleForm: | |
| 125 return AccessibilityNodeData::ROLE_FORM; | |
| 126 case WebKit::WebAccessibilityRoleGrid: | |
| 127 return AccessibilityNodeData::ROLE_GRID; | |
| 128 case WebKit::WebAccessibilityRoleGroup: | |
| 129 return AccessibilityNodeData::ROLE_GROUP; | |
| 130 case WebKit::WebAccessibilityRoleGrowArea: | |
| 131 return AccessibilityNodeData::ROLE_GROW_AREA; | |
| 132 case WebKit::WebAccessibilityRoleHeading: | |
| 133 return AccessibilityNodeData::ROLE_HEADING; | |
| 134 case WebKit::WebAccessibilityRoleHelpTag: | |
| 135 return AccessibilityNodeData::ROLE_HELP_TAG; | |
| 136 case WebKit::WebAccessibilityRoleHorizontalRule: | |
| 137 return AccessibilityNodeData::ROLE_HORIZONTAL_RULE; | |
| 138 case WebKit::WebAccessibilityRoleIgnored: | |
| 139 return AccessibilityNodeData::ROLE_IGNORED; | |
| 140 case WebKit::WebAccessibilityRoleImage: | |
| 141 return AccessibilityNodeData::ROLE_IMAGE; | |
| 142 case WebKit::WebAccessibilityRoleImageMap: | |
| 143 return AccessibilityNodeData::ROLE_IMAGE_MAP; | |
| 144 case WebKit::WebAccessibilityRoleImageMapLink: | |
| 145 return AccessibilityNodeData::ROLE_IMAGE_MAP_LINK; | |
| 146 case WebKit::WebAccessibilityRoleIncrementor: | |
| 147 return AccessibilityNodeData::ROLE_INCREMENTOR; | |
| 148 case WebKit::WebAccessibilityRoleLabel: | |
| 149 return AccessibilityNodeData::ROLE_LABEL; | |
| 150 case WebKit::WebAccessibilityRoleLandmarkApplication: | |
| 151 return AccessibilityNodeData::ROLE_LANDMARK_APPLICATION; | |
| 152 case WebKit::WebAccessibilityRoleLandmarkBanner: | |
| 153 return AccessibilityNodeData::ROLE_LANDMARK_BANNER; | |
| 154 case WebKit::WebAccessibilityRoleLandmarkComplementary: | |
| 155 return AccessibilityNodeData::ROLE_LANDMARK_COMPLEMENTARY; | |
| 156 case WebKit::WebAccessibilityRoleLandmarkContentInfo: | |
| 157 return AccessibilityNodeData::ROLE_LANDMARK_CONTENTINFO; | |
| 158 case WebKit::WebAccessibilityRoleLandmarkMain: | |
| 159 return AccessibilityNodeData::ROLE_LANDMARK_MAIN; | |
| 160 case WebKit::WebAccessibilityRoleLandmarkNavigation: | |
| 161 return AccessibilityNodeData::ROLE_LANDMARK_NAVIGATION; | |
| 162 case WebKit::WebAccessibilityRoleLandmarkSearch: | |
| 163 return AccessibilityNodeData::ROLE_LANDMARK_SEARCH; | |
| 164 case WebKit::WebAccessibilityRoleLink: | |
| 165 return AccessibilityNodeData::ROLE_LINK; | |
| 166 case WebKit::WebAccessibilityRoleList: | |
| 167 return AccessibilityNodeData::ROLE_LIST; | |
| 168 case WebKit::WebAccessibilityRoleListBox: | |
| 169 return AccessibilityNodeData::ROLE_LISTBOX; | |
| 170 case WebKit::WebAccessibilityRoleListBoxOption: | |
| 171 return AccessibilityNodeData::ROLE_LISTBOX_OPTION; | |
| 172 case WebKit::WebAccessibilityRoleListItem: | |
| 173 return AccessibilityNodeData::ROLE_LIST_ITEM; | |
| 174 case WebKit::WebAccessibilityRoleListMarker: | |
| 175 return AccessibilityNodeData::ROLE_LIST_MARKER; | |
| 176 case WebKit::WebAccessibilityRoleMatte: | |
| 177 return AccessibilityNodeData::ROLE_MATTE; | |
| 178 case WebKit::WebAccessibilityRoleMenu: | |
| 179 return AccessibilityNodeData::ROLE_MENU; | |
| 180 case WebKit::WebAccessibilityRoleMenuBar: | |
| 181 return AccessibilityNodeData::ROLE_MENU_BAR; | |
| 182 case WebKit::WebAccessibilityRoleMenuButton: | |
| 183 return AccessibilityNodeData::ROLE_MENU_BUTTON; | |
| 184 case WebKit::WebAccessibilityRoleMenuItem: | |
| 185 return AccessibilityNodeData::ROLE_MENU_ITEM; | |
| 186 case WebKit::WebAccessibilityRoleMenuListOption: | |
| 187 return AccessibilityNodeData::ROLE_MENU_LIST_OPTION; | |
| 188 case WebKit::WebAccessibilityRoleMenuListPopup: | |
| 189 return AccessibilityNodeData::ROLE_MENU_LIST_POPUP; | |
| 190 case WebKit::WebAccessibilityRoleOutline: | |
| 191 return AccessibilityNodeData::ROLE_OUTLINE; | |
| 192 case WebKit::WebAccessibilityRoleParagraph: | |
| 193 return AccessibilityNodeData::ROLE_PARAGRAPH; | |
| 194 case WebKit::WebAccessibilityRolePopUpButton: | |
| 195 return AccessibilityNodeData::ROLE_POPUP_BUTTON; | |
| 196 case WebKit::WebAccessibilityRolePresentational: | |
| 197 return AccessibilityNodeData::ROLE_PRESENTATIONAL; | |
| 198 case WebKit::WebAccessibilityRoleProgressIndicator: | |
| 199 return AccessibilityNodeData::ROLE_PROGRESS_INDICATOR; | |
| 200 case WebKit::WebAccessibilityRoleRadioButton: | |
| 201 return AccessibilityNodeData::ROLE_RADIO_BUTTON; | |
| 202 case WebKit::WebAccessibilityRoleRadioGroup: | |
| 203 return AccessibilityNodeData::ROLE_RADIO_GROUP; | |
| 204 case WebKit::WebAccessibilityRoleRow: | |
| 205 return AccessibilityNodeData::ROLE_ROW; | |
| 206 case WebKit::WebAccessibilityRoleRowHeader: | |
| 207 return AccessibilityNodeData::ROLE_ROW_HEADER; | |
| 208 case WebKit::WebAccessibilityRoleRuler: | |
| 209 return AccessibilityNodeData::ROLE_RULER; | |
| 210 case WebKit::WebAccessibilityRoleRulerMarker: | |
| 211 return AccessibilityNodeData::ROLE_RULER_MARKER; | |
| 212 case WebKit::WebAccessibilityRoleScrollArea: | |
| 213 return AccessibilityNodeData::ROLE_SCROLLAREA; | |
| 214 case WebKit::WebAccessibilityRoleScrollBar: | |
| 215 return AccessibilityNodeData::ROLE_SCROLLBAR; | |
| 216 case WebKit::WebAccessibilityRoleSheet: | |
| 217 return AccessibilityNodeData::ROLE_SHEET; | |
| 218 case WebKit::WebAccessibilityRoleSlider: | |
| 219 return AccessibilityNodeData::ROLE_SLIDER; | |
| 220 case WebKit::WebAccessibilityRoleSliderThumb: | |
| 221 return AccessibilityNodeData::ROLE_SLIDER_THUMB; | |
| 222 case WebKit::WebAccessibilityRoleSpinButton: | |
| 223 return AccessibilityNodeData::ROLE_SPIN_BUTTON; | |
| 224 case WebKit::WebAccessibilityRoleSpinButtonPart: | |
| 225 return AccessibilityNodeData::ROLE_SPIN_BUTTON_PART; | |
| 226 case WebKit::WebAccessibilityRoleSplitGroup: | |
| 227 return AccessibilityNodeData::ROLE_SPLIT_GROUP; | |
| 228 case WebKit::WebAccessibilityRoleSplitter: | |
| 229 return AccessibilityNodeData::ROLE_SPLITTER; | |
| 230 case WebKit::WebAccessibilityRoleStaticText: | |
| 231 return AccessibilityNodeData::ROLE_STATIC_TEXT; | |
| 232 case WebKit::WebAccessibilityRoleSVGRoot: | |
| 233 return AccessibilityNodeData::ROLE_SVG_ROOT; | |
| 234 case WebKit::WebAccessibilityRoleSystemWide: | |
| 235 return AccessibilityNodeData::ROLE_SYSTEM_WIDE; | |
| 236 case WebKit::WebAccessibilityRoleTab: | |
| 237 return AccessibilityNodeData::ROLE_TAB; | |
| 238 case WebKit::WebAccessibilityRoleTabGroup: | |
| 239 return AccessibilityNodeData::ROLE_TAB_GROUP_UNUSED; | |
| 240 case WebKit::WebAccessibilityRoleTabList: | |
| 241 return AccessibilityNodeData::ROLE_TAB_LIST; | |
| 242 case WebKit::WebAccessibilityRoleTabPanel: | |
| 243 return AccessibilityNodeData::ROLE_TAB_PANEL; | |
| 244 case WebKit::WebAccessibilityRoleTable: | |
| 245 return AccessibilityNodeData::ROLE_TABLE; | |
| 246 case WebKit::WebAccessibilityRoleTableHeaderContainer: | |
| 247 return AccessibilityNodeData::ROLE_TABLE_HEADER_CONTAINER; | |
| 248 case WebKit::WebAccessibilityRoleTextArea: | |
| 249 return AccessibilityNodeData::ROLE_TEXTAREA; | |
| 250 case WebKit::WebAccessibilityRoleTextField: | |
| 251 return AccessibilityNodeData::ROLE_TEXT_FIELD; | |
| 252 case WebKit::WebAccessibilityRoleToggleButton: | |
| 253 return AccessibilityNodeData::ROLE_TOGGLE_BUTTON; | |
| 254 case WebKit::WebAccessibilityRoleToolbar: | |
| 255 return AccessibilityNodeData::ROLE_TOOLBAR; | |
| 256 case WebKit::WebAccessibilityRoleTreeGrid: | |
| 257 return AccessibilityNodeData::ROLE_TREE_GRID; | |
| 258 case WebKit::WebAccessibilityRoleTreeItemRole: | |
| 259 return AccessibilityNodeData::ROLE_TREE_ITEM; | |
| 260 case WebKit::WebAccessibilityRoleTreeRole: | |
| 261 return AccessibilityNodeData::ROLE_TREE; | |
| 262 case WebKit::WebAccessibilityRoleUserInterfaceTooltip: | |
| 263 return AccessibilityNodeData::ROLE_TOOLTIP; | |
| 264 case WebKit::WebAccessibilityRoleValueIndicator: | |
| 265 return AccessibilityNodeData::ROLE_VALUE_INDICATOR; | |
| 266 case WebKit::WebAccessibilityRoleWebArea: | |
| 267 return AccessibilityNodeData::ROLE_WEB_AREA; | |
| 268 case WebKit::WebAccessibilityRoleWebCoreLink: | |
| 269 return AccessibilityNodeData::ROLE_WEBCORE_LINK; | |
| 270 case WebKit::WebAccessibilityRoleWindow: | |
| 271 return AccessibilityNodeData::ROLE_WINDOW; | |
| 272 | |
| 273 default: | |
| 274 return AccessibilityNodeData::ROLE_UNKNOWN; | |
| 275 } | |
| 276 } | |
| 277 | |
| 278 // Provides a conversion between the WebAccessibilityObject state | |
| 279 // accessors and a state bitmask that can be serialized and sent to the | 53 // accessors and a state bitmask that can be serialized and sent to the |
| 280 // Browser process. Rare state are sent as boolean attributes instead. | 54 // Browser process. Rare state are sent as boolean attributes instead. |
| 281 uint32 ConvertState(const WebAccessibilityObject& o) { | 55 uint32 ConvertState(const WebAXObject& o) { |
| 282 uint32 state = 0; | 56 uint32 state = 0; |
| 283 if (o.isChecked()) | 57 if (o.isChecked()) |
| 284 state |= (1 << AccessibilityNodeData::STATE_CHECKED); | 58 state |= (1 << WebKit::WebAXStateChecked); |
| 285 | 59 |
| 286 if (o.isCollapsed()) | 60 if (o.isCollapsed()) |
| 287 state |= (1 << AccessibilityNodeData::STATE_COLLAPSED); | 61 state |= (1 << WebKit::WebAXStateCollapsed); |
| 288 | 62 |
| 289 if (o.canSetFocusAttribute()) | 63 if (o.canSetFocusAttribute()) |
| 290 state |= (1 << AccessibilityNodeData::STATE_FOCUSABLE); | 64 state |= (1 << WebKit::WebAXStateFocusable); |
| 291 | 65 |
| 292 if (o.isFocused()) | 66 if (o.isFocused()) |
| 293 state |= (1 << AccessibilityNodeData::STATE_FOCUSED); | 67 state |= (1 << WebKit::WebAXStateFocused); |
| 294 | 68 |
| 295 if (o.roleValue() == WebKit::WebAccessibilityRolePopUpButton || | 69 if (o.role() == WebKit::WebAXRolePopUpButton || |
| 296 o.ariaHasPopup()) { | 70 o.ariaHasPopup()) { |
| 297 state |= (1 << AccessibilityNodeData::STATE_HASPOPUP); | 71 state |= (1 << WebKit::WebAXStateHaspopup); |
| 298 if (!o.isCollapsed()) | 72 if (!o.isCollapsed()) |
| 299 state |= (1 << AccessibilityNodeData::STATE_EXPANDED); | 73 state |= (1 << WebKit::WebAXStateExpanded); |
| 300 } | 74 } |
| 301 | 75 |
| 302 if (o.isHovered()) | 76 if (o.isHovered()) |
| 303 state |= (1 << AccessibilityNodeData::STATE_HOTTRACKED); | 77 state |= (1 << WebKit::WebAXStateHovered); |
| 304 | 78 |
| 305 if (o.isIndeterminate()) | 79 if (o.isIndeterminate()) |
| 306 state |= (1 << AccessibilityNodeData::STATE_INDETERMINATE); | 80 state |= (1 << WebKit::WebAXStateIndeterminate); |
| 307 | 81 |
| 308 if (!o.isVisible()) | 82 if (!o.isVisible()) |
| 309 state |= (1 << AccessibilityNodeData::STATE_INVISIBLE); | 83 state |= (1 << WebKit::WebAXStateInvisible); |
| 310 | 84 |
| 311 if (o.isLinked()) | 85 if (o.isLinked()) |
| 312 state |= (1 << AccessibilityNodeData::STATE_LINKED); | 86 state |= (1 << WebKit::WebAXStateLinked); |
| 313 | 87 |
| 314 if (o.isMultiSelectable()) | 88 if (o.isMultiSelectable()) |
| 315 state |= (1 << AccessibilityNodeData::STATE_MULTISELECTABLE); | 89 state |= (1 << WebKit::WebAXStateMultiselectable); |
| 316 | 90 |
| 317 if (o.isOffScreen()) | 91 if (o.isOffScreen()) |
| 318 state |= (1 << AccessibilityNodeData::STATE_OFFSCREEN); | 92 state |= (1 << WebKit::WebAXStateOffscreen); |
| 319 | 93 |
| 320 if (o.isPressed()) | 94 if (o.isPressed()) |
| 321 state |= (1 << AccessibilityNodeData::STATE_PRESSED); | 95 state |= (1 << WebKit::WebAXStatePressed); |
| 322 | 96 |
| 323 if (o.isPasswordField()) | 97 if (o.isPasswordField()) |
| 324 state |= (1 << AccessibilityNodeData::STATE_PROTECTED); | 98 state |= (1 << WebKit::WebAXStateProtected); |
| 325 | 99 |
| 326 if (o.isReadOnly()) | 100 if (o.isReadOnly()) |
| 327 state |= (1 << AccessibilityNodeData::STATE_READONLY); | 101 state |= (1 << WebKit::WebAXStateReadonly); |
| 328 | 102 |
| 329 if (o.isRequired()) | 103 if (o.isRequired()) |
| 330 state |= (1 << AccessibilityNodeData::STATE_REQUIRED); | 104 state |= (1 << WebKit::WebAXStateRequired); |
| 331 | 105 |
| 332 if (o.canSetSelectedAttribute()) | 106 if (o.canSetSelectedAttribute()) |
| 333 state |= (1 << AccessibilityNodeData::STATE_SELECTABLE); | 107 state |= (1 << WebKit::WebAXStateSelectable); |
| 334 | 108 |
| 335 if (o.isSelected()) | 109 if (o.isSelected()) |
| 336 state |= (1 << AccessibilityNodeData::STATE_SELECTED); | 110 state |= (1 << WebKit::WebAXStateSelected); |
| 337 | 111 |
| 338 if (o.isVisited()) | 112 if (o.isVisited()) |
| 339 state |= (1 << AccessibilityNodeData::STATE_TRAVERSED); | 113 state |= (1 << WebKit::WebAXStateVisited); |
| 340 | 114 |
| 341 if (!o.isEnabled()) | 115 if (o.isEnabled()) |
| 342 state |= (1 << AccessibilityNodeData::STATE_UNAVAILABLE); | 116 state |= (1 << WebKit::WebAXStateEnabled); |
| 343 | 117 |
| 344 if (o.isVertical()) | 118 if (o.isVertical()) |
| 345 state |= (1 << AccessibilityNodeData::STATE_VERTICAL); | 119 state |= (1 << WebKit::WebAXStateVertical); |
| 346 | 120 |
| 347 if (o.isVisited()) | 121 if (o.isVisited()) |
| 348 state |= (1 << AccessibilityNodeData::STATE_VISITED); | 122 state |= (1 << WebKit::WebAXStateVisited); |
| 349 | 123 |
| 350 return state; | 124 return state; |
| 351 } | 125 } |
| 352 | 126 |
| 353 } // Anonymous namespace | 127 } // Anonymous namespace |
| 354 | 128 |
| 355 void SerializeAccessibilityNode( | 129 void SerializeAccessibilityNode( |
| 356 const WebAccessibilityObject& src, | 130 const WebAXObject& src, |
| 357 AccessibilityNodeData* dst) { | 131 AccessibilityNodeData* dst) { |
| 358 dst->role = ConvertRole(src.roleValue()); | 132 dst->role = src.role(); |
| 359 dst->state = ConvertState(src); | 133 dst->state = ConvertState(src); |
| 360 dst->location = src.boundingBoxRect(); | 134 dst->location = src.boundingBoxRect(); |
| 361 dst->id = src.axID(); | 135 dst->id = src.axID(); |
| 362 std::string name = UTF16ToUTF8(src.title()); | 136 std::string name = UTF16ToUTF8(src.title()); |
| 363 | 137 |
| 364 std::string value; | 138 std::string value; |
| 365 if (src.valueDescription().length()) { | 139 if (src.valueDescription().length()) { |
| 366 dst->AddStringAttribute(dst->ATTR_VALUE, | 140 dst->AddStringAttribute(dst->ATTR_VALUE, |
| 367 UTF16ToUTF8(src.valueDescription())); | 141 UTF16ToUTF8(src.valueDescription())); |
| 368 } else { | 142 } else { |
| 369 dst->AddStringAttribute(dst->ATTR_VALUE, UTF16ToUTF8(src.stringValue())); | 143 dst->AddStringAttribute(dst->ATTR_VALUE, UTF16ToUTF8(src.stringValue())); |
| 370 } | 144 } |
| 371 | 145 |
| 372 if (dst->role == AccessibilityNodeData::ROLE_COLOR_WELL) { | 146 if (dst->role == WebKit::WebAXRoleColorWell) { |
| 373 int r, g, b; | 147 int r, g, b; |
| 374 src.colorValue(r, g, b); | 148 src.colorValue(r, g, b); |
| 375 dst->AddIntAttribute(dst->ATTR_COLOR_VALUE_RED, r); | 149 dst->AddIntAttribute(dst->ATTR_COLOR_VALUE_RED, r); |
| 376 dst->AddIntAttribute(dst->ATTR_COLOR_VALUE_GREEN, g); | 150 dst->AddIntAttribute(dst->ATTR_COLOR_VALUE_GREEN, g); |
| 377 dst->AddIntAttribute(dst->ATTR_COLOR_VALUE_BLUE, b); | 151 dst->AddIntAttribute(dst->ATTR_COLOR_VALUE_BLUE, b); |
| 378 } | 152 } |
| 379 | 153 |
| 380 if (src.accessKey().length()) | 154 if (src.accessKey().length()) |
| 381 dst->AddStringAttribute(dst->ATTR_ACCESS_KEY, UTF16ToUTF8(src.accessKey())); | 155 dst->AddStringAttribute(dst->ATTR_ACCESS_KEY, UTF16ToUTF8(src.accessKey())); |
| 382 if (src.actionVerb().length()) | 156 if (src.actionVerb().length()) |
| (...skipping 18 matching lines...) Expand all Loading... |
| 401 dst->AddStringAttribute(dst->ATTR_SHORTCUT, | 175 dst->AddStringAttribute(dst->ATTR_SHORTCUT, |
| 402 UTF16ToUTF8(src.keyboardShortcut())); | 176 UTF16ToUTF8(src.keyboardShortcut())); |
| 403 } | 177 } |
| 404 if (!src.titleUIElement().isDetached()) { | 178 if (!src.titleUIElement().isDetached()) { |
| 405 dst->AddIntAttribute(dst->ATTR_TITLE_UI_ELEMENT, | 179 dst->AddIntAttribute(dst->ATTR_TITLE_UI_ELEMENT, |
| 406 src.titleUIElement().axID()); | 180 src.titleUIElement().axID()); |
| 407 } | 181 } |
| 408 if (!src.url().isEmpty()) | 182 if (!src.url().isEmpty()) |
| 409 dst->AddStringAttribute(dst->ATTR_URL, src.url().spec()); | 183 dst->AddStringAttribute(dst->ATTR_URL, src.url().spec()); |
| 410 | 184 |
| 411 if (dst->role == dst->ROLE_HEADING) | 185 if (dst->role == WebKit::WebAXRoleHeading) |
| 412 dst->AddIntAttribute(dst->ATTR_HIERARCHICAL_LEVEL, src.headingLevel()); | 186 dst->AddIntAttribute(dst->ATTR_HIERARCHICAL_LEVEL, src.headingLevel()); |
| 413 else if ((dst->role == dst->ROLE_TREE_ITEM || dst->role == dst->ROLE_ROW) && | 187 else if ((dst->role == WebKit::WebAXRoleTreeItem || |
| 188 dst->role == WebKit::WebAXRoleRow) && |
| 414 src.hierarchicalLevel() > 0) { | 189 src.hierarchicalLevel() > 0) { |
| 415 dst->AddIntAttribute(dst->ATTR_HIERARCHICAL_LEVEL, src.hierarchicalLevel()); | 190 dst->AddIntAttribute(dst->ATTR_HIERARCHICAL_LEVEL, src.hierarchicalLevel()); |
| 416 } | 191 } |
| 417 | 192 |
| 418 // Treat the active list box item as focused. | 193 // Treat the active list box item as focused. |
| 419 if (dst->role == dst->ROLE_LISTBOX_OPTION && src.isSelectedOptionActive()) | 194 if (dst->role == WebKit::WebAXRoleListBoxOption && |
| 420 dst->state |= (1 << AccessibilityNodeData::STATE_FOCUSED); | 195 src.isSelectedOptionActive()) { |
| 196 dst->state |= (1 << WebKit::WebAXStateFocused); |
| 197 } |
| 421 | 198 |
| 422 if (src.canvasHasFallbackContent()) | 199 if (src.canvasHasFallbackContent()) |
| 423 dst->role = AccessibilityNodeData::ROLE_CANVAS_WITH_FALLBACK_CONTENT; | 200 dst->role = WebKit::WebAXRoleCanvas; |
| 424 | 201 |
| 425 WebNode node = src.node(); | 202 WebNode node = src.node(); |
| 426 bool is_iframe = false; | 203 bool is_iframe = false; |
| 427 std::string live_atomic; | 204 std::string live_atomic; |
| 428 std::string live_busy; | 205 std::string live_busy; |
| 429 std::string live_status; | 206 std::string live_status; |
| 430 std::string live_relevant; | 207 std::string live_relevant; |
| 431 | 208 |
| 432 if (!node.isNull() && node.isElementNode()) { | 209 if (!node.isNull() && node.isElementNode()) { |
| 433 WebElement element = node.to<WebElement>(); | 210 WebElement element = node.to<WebElement>(); |
| 434 is_iframe = (element.tagName() == ASCIIToUTF16("IFRAME")); | 211 is_iframe = (element.tagName() == ASCIIToUTF16("IFRAME")); |
| 435 | 212 |
| 436 if (LowerCaseEqualsASCII(element.getAttribute("aria-expanded"), "true")) | 213 if (LowerCaseEqualsASCII(element.getAttribute("aria-expanded"), "true")) |
| 437 dst->state |= (1 << AccessibilityNodeData::STATE_EXPANDED); | 214 dst->state |= (1 << WebKit::WebAXStateExpanded); |
| 438 | 215 |
| 439 // TODO(ctguil): The tagName in WebKit is lower cased but | 216 // TODO(ctguil): The tagName in WebKit is lower cased but |
| 440 // HTMLElement::nodeName calls localNameUpper. Consider adding | 217 // HTMLElement::nodeName calls localNameUpper. Consider adding |
| 441 // a WebElement method that returns the original lower cased tagName. | 218 // a WebElement method that returns the original lower cased tagName. |
| 442 dst->AddStringAttribute( | 219 dst->AddStringAttribute( |
| 443 dst->ATTR_HTML_TAG, | 220 dst->ATTR_HTML_TAG, |
| 444 StringToLowerASCII(UTF16ToUTF8(element.tagName()))); | 221 StringToLowerASCII(UTF16ToUTF8(element.tagName()))); |
| 445 for (unsigned i = 0; i < element.attributeCount(); ++i) { | 222 for (unsigned i = 0; i < element.attributeCount(); ++i) { |
| 446 std::string name = StringToLowerASCII(UTF16ToUTF8( | 223 std::string name = StringToLowerASCII(UTF16ToUTF8( |
| 447 element.attributeLocalName(i))); | 224 element.attributeLocalName(i))); |
| 448 std::string value = UTF16ToUTF8(element.attributeValue(i)); | 225 std::string value = UTF16ToUTF8(element.attributeValue(i)); |
| 449 dst->html_attributes.push_back(std::make_pair(name, value)); | 226 dst->html_attributes.push_back(std::make_pair(name, value)); |
| 450 } | 227 } |
| 451 | 228 |
| 452 if (dst->role == dst->ROLE_EDITABLE_TEXT || | 229 if (dst->role == WebKit::WebAXRoleEditableText || |
| 453 dst->role == dst->ROLE_TEXTAREA || | 230 dst->role == WebKit::WebAXRoleTextArea || |
| 454 dst->role == dst->ROLE_TEXT_FIELD) { | 231 dst->role == WebKit::WebAXRoleTextField) { |
| 455 dst->AddIntAttribute(dst->ATTR_TEXT_SEL_START, src.selectionStart()); | 232 dst->AddIntAttribute(dst->ATTR_TEXT_SEL_START, src.selectionStart()); |
| 456 dst->AddIntAttribute(dst->ATTR_TEXT_SEL_END, src.selectionEnd()); | 233 dst->AddIntAttribute(dst->ATTR_TEXT_SEL_END, src.selectionEnd()); |
| 457 | 234 |
| 458 WebVector<int> src_line_breaks; | 235 WebVector<int> src_line_breaks; |
| 459 src.lineBreaks(src_line_breaks); | 236 src.lineBreaks(src_line_breaks); |
| 460 if (src_line_breaks.size() > 0) { | 237 if (src_line_breaks.size() > 0) { |
| 461 std::vector<int32> line_breaks; | 238 std::vector<int32> line_breaks; |
| 462 line_breaks.reserve(src_line_breaks.size()); | 239 line_breaks.reserve(src_line_breaks.size()); |
| 463 for (size_t i = 0; i < src_line_breaks.size(); ++i) | 240 for (size_t i = 0; i < src_line_breaks.size(); ++i) |
| 464 line_breaks.push_back(src_line_breaks[i]); | 241 line_breaks.push_back(src_line_breaks[i]); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 477 live_busy = UTF16ToUTF8(element.getAttribute("aria-busy")); | 254 live_busy = UTF16ToUTF8(element.getAttribute("aria-busy")); |
| 478 live_status = UTF16ToUTF8(element.getAttribute("aria-live")); | 255 live_status = UTF16ToUTF8(element.getAttribute("aria-live")); |
| 479 live_relevant = UTF16ToUTF8(element.getAttribute("aria-relevant")); | 256 live_relevant = UTF16ToUTF8(element.getAttribute("aria-relevant")); |
| 480 } | 257 } |
| 481 | 258 |
| 482 // Walk up the parent chain to set live region attributes of containers | 259 // Walk up the parent chain to set live region attributes of containers |
| 483 std::string container_live_atomic; | 260 std::string container_live_atomic; |
| 484 std::string container_live_busy; | 261 std::string container_live_busy; |
| 485 std::string container_live_status; | 262 std::string container_live_status; |
| 486 std::string container_live_relevant; | 263 std::string container_live_relevant; |
| 487 WebAccessibilityObject container_accessible = src; | 264 WebAXObject container_accessible = src; |
| 488 while (!container_accessible.isDetached()) { | 265 while (!container_accessible.isDetached()) { |
| 489 WebNode container_node = container_accessible.node(); | 266 WebNode container_node = container_accessible.node(); |
| 490 if (!container_node.isNull() && container_node.isElementNode()) { | 267 if (!container_node.isNull() && container_node.isElementNode()) { |
| 491 WebElement container_elem = container_node.to<WebElement>(); | 268 WebElement container_elem = container_node.to<WebElement>(); |
| 492 if (container_elem.hasAttribute("aria-atomic") && | 269 if (container_elem.hasAttribute("aria-atomic") && |
| 493 container_live_atomic.empty()) { | 270 container_live_atomic.empty()) { |
| 494 container_live_atomic = | 271 container_live_atomic = |
| 495 UTF16ToUTF8(container_elem.getAttribute("aria-atomic")); | 272 UTF16ToUTF8(container_elem.getAttribute("aria-atomic")); |
| 496 } | 273 } |
| 497 if (container_elem.hasAttribute("aria-busy") && | 274 if (container_elem.hasAttribute("aria-busy") && |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 532 } | 309 } |
| 533 if (!container_live_status.empty()) { | 310 if (!container_live_status.empty()) { |
| 534 dst->AddStringAttribute(dst->ATTR_CONTAINER_LIVE_STATUS, | 311 dst->AddStringAttribute(dst->ATTR_CONTAINER_LIVE_STATUS, |
| 535 container_live_status); | 312 container_live_status); |
| 536 } | 313 } |
| 537 if (!container_live_relevant.empty()) { | 314 if (!container_live_relevant.empty()) { |
| 538 dst->AddStringAttribute(dst->ATTR_CONTAINER_LIVE_RELEVANT, | 315 dst->AddStringAttribute(dst->ATTR_CONTAINER_LIVE_RELEVANT, |
| 539 container_live_relevant); | 316 container_live_relevant); |
| 540 } | 317 } |
| 541 | 318 |
| 542 if (dst->role == dst->ROLE_PROGRESS_INDICATOR || | 319 if (dst->role == WebKit::WebAXRoleProgressIndicator || |
| 543 dst->role == dst->ROLE_SCROLLBAR || | 320 dst->role == WebKit::WebAXRoleScrollBar || |
| 544 dst->role == dst->ROLE_SLIDER || | 321 dst->role == WebKit::WebAXRoleSlider || |
| 545 dst->role == dst->ROLE_SPIN_BUTTON) { | 322 dst->role == WebKit::WebAXRoleSpinButton) { |
| 546 dst->AddFloatAttribute(dst->ATTR_VALUE_FOR_RANGE, src.valueForRange()); | 323 dst->AddFloatAttribute(dst->ATTR_VALUE_FOR_RANGE, src.valueForRange()); |
| 547 dst->AddFloatAttribute(dst->ATTR_MAX_VALUE_FOR_RANGE, | 324 dst->AddFloatAttribute(dst->ATTR_MAX_VALUE_FOR_RANGE, |
| 548 src.maxValueForRange()); | 325 src.maxValueForRange()); |
| 549 dst->AddFloatAttribute(dst->ATTR_MIN_VALUE_FOR_RANGE, | 326 dst->AddFloatAttribute(dst->ATTR_MIN_VALUE_FOR_RANGE, |
| 550 src.minValueForRange()); | 327 src.minValueForRange()); |
| 551 } | 328 } |
| 552 | 329 |
| 553 if (dst->role == dst->ROLE_DOCUMENT || | 330 if (dst->role == WebKit::WebAXRoleDocument || |
| 554 dst->role == dst->ROLE_WEB_AREA) { | 331 dst->role == WebKit::WebAXRoleWebArea) { |
| 555 dst->AddStringAttribute(dst->ATTR_HTML_TAG, "#document"); | 332 dst->AddStringAttribute(dst->ATTR_HTML_TAG, "#document"); |
| 556 const WebDocument& document = src.document(); | 333 const WebDocument& document = src.document(); |
| 557 if (name.empty()) | 334 if (name.empty()) |
| 558 name = UTF16ToUTF8(document.title()); | 335 name = UTF16ToUTF8(document.title()); |
| 559 dst->AddStringAttribute(dst->ATTR_DOC_TITLE, UTF16ToUTF8(document.title())); | 336 dst->AddStringAttribute(dst->ATTR_DOC_TITLE, UTF16ToUTF8(document.title())); |
| 560 dst->AddStringAttribute(dst->ATTR_DOC_URL, document.url().spec()); | 337 dst->AddStringAttribute(dst->ATTR_DOC_URL, document.url().spec()); |
| 561 dst->AddStringAttribute( | 338 dst->AddStringAttribute( |
| 562 dst->ATTR_DOC_MIMETYPE, | 339 dst->ATTR_DOC_MIMETYPE, |
| 563 document.isXHTMLDocument() ? "text/xhtml" : "text/html"); | 340 document.isXHTMLDocument() ? "text/xhtml" : "text/html"); |
| 564 dst->AddBoolAttribute(dst->ATTR_DOC_LOADED, src.isLoaded()); | 341 dst->AddBoolAttribute(dst->ATTR_DOC_LOADED, src.isLoaded()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 577 | 354 |
| 578 const gfx::Size& min_offset = document.frame()->minimumScrollOffset(); | 355 const gfx::Size& min_offset = document.frame()->minimumScrollOffset(); |
| 579 dst->AddIntAttribute(dst->ATTR_SCROLL_X_MIN, min_offset.width()); | 356 dst->AddIntAttribute(dst->ATTR_SCROLL_X_MIN, min_offset.width()); |
| 580 dst->AddIntAttribute(dst->ATTR_SCROLL_Y_MIN, min_offset.height()); | 357 dst->AddIntAttribute(dst->ATTR_SCROLL_Y_MIN, min_offset.height()); |
| 581 | 358 |
| 582 const gfx::Size& max_offset = document.frame()->maximumScrollOffset(); | 359 const gfx::Size& max_offset = document.frame()->maximumScrollOffset(); |
| 583 dst->AddIntAttribute(dst->ATTR_SCROLL_X_MAX, max_offset.width()); | 360 dst->AddIntAttribute(dst->ATTR_SCROLL_X_MAX, max_offset.width()); |
| 584 dst->AddIntAttribute(dst->ATTR_SCROLL_Y_MAX, max_offset.height()); | 361 dst->AddIntAttribute(dst->ATTR_SCROLL_Y_MAX, max_offset.height()); |
| 585 } | 362 } |
| 586 | 363 |
| 587 if (dst->role == dst->ROLE_TABLE) { | 364 if (dst->role == WebKit::WebAXRoleTable) { |
| 588 int column_count = src.columnCount(); | 365 int column_count = src.columnCount(); |
| 589 int row_count = src.rowCount(); | 366 int row_count = src.rowCount(); |
| 590 if (column_count > 0 && row_count > 0) { | 367 if (column_count > 0 && row_count > 0) { |
| 591 std::set<int32> unique_cell_id_set; | 368 std::set<int32> unique_cell_id_set; |
| 592 std::vector<int32> cell_ids; | 369 std::vector<int32> cell_ids; |
| 593 std::vector<int32> unique_cell_ids; | 370 std::vector<int32> unique_cell_ids; |
| 594 dst->AddIntAttribute(dst->ATTR_TABLE_COLUMN_COUNT, column_count); | 371 dst->AddIntAttribute(dst->ATTR_TABLE_COLUMN_COUNT, column_count); |
| 595 dst->AddIntAttribute(dst->ATTR_TABLE_ROW_COUNT, row_count); | 372 dst->AddIntAttribute(dst->ATTR_TABLE_ROW_COUNT, row_count); |
| 596 WebAccessibilityObject header = src.headerContainerObject(); | 373 WebAXObject header = src.headerContainerObject(); |
| 597 if (!header.isDetached()) | 374 if (!header.isDetached()) |
| 598 dst->AddIntAttribute(dst->ATTR_TABLE_HEADER_ID, header.axID()); | 375 dst->AddIntAttribute(dst->ATTR_TABLE_HEADER_ID, header.axID()); |
| 599 for (int i = 0; i < column_count * row_count; ++i) { | 376 for (int i = 0; i < column_count * row_count; ++i) { |
| 600 WebAccessibilityObject cell = src.cellForColumnAndRow( | 377 WebAXObject cell = src.cellForColumnAndRow( |
| 601 i % column_count, i / column_count); | 378 i % column_count, i / column_count); |
| 602 int cell_id = -1; | 379 int cell_id = -1; |
| 603 if (!cell.isDetached()) { | 380 if (!cell.isDetached()) { |
| 604 cell_id = cell.axID(); | 381 cell_id = cell.axID(); |
| 605 if (unique_cell_id_set.find(cell_id) == unique_cell_id_set.end()) { | 382 if (unique_cell_id_set.find(cell_id) == unique_cell_id_set.end()) { |
| 606 unique_cell_id_set.insert(cell_id); | 383 unique_cell_id_set.insert(cell_id); |
| 607 unique_cell_ids.push_back(cell_id); | 384 unique_cell_ids.push_back(cell_id); |
| 608 } | 385 } |
| 609 } | 386 } |
| 610 cell_ids.push_back(cell_id); | 387 cell_ids.push_back(cell_id); |
| 611 } | 388 } |
| 612 dst->AddIntListAttribute(dst->ATTR_CELL_IDS, cell_ids); | 389 dst->AddIntListAttribute(dst->ATTR_CELL_IDS, cell_ids); |
| 613 dst->AddIntListAttribute(dst->ATTR_UNIQUE_CELL_IDS, unique_cell_ids); | 390 dst->AddIntListAttribute(dst->ATTR_UNIQUE_CELL_IDS, unique_cell_ids); |
| 614 } | 391 } |
| 615 } | 392 } |
| 616 | 393 |
| 617 if (dst->role == dst->ROLE_ROW) { | 394 if (dst->role == WebKit::WebAXRoleRow) { |
| 618 dst->AddIntAttribute(dst->ATTR_TABLE_ROW_INDEX, src.rowIndex()); | 395 dst->AddIntAttribute(dst->ATTR_TABLE_ROW_INDEX, src.rowIndex()); |
| 619 WebAccessibilityObject header = src.rowHeader(); | 396 WebAXObject header = src.rowHeader(); |
| 620 if (!header.isDetached()) | 397 if (!header.isDetached()) |
| 621 dst->AddIntAttribute(dst->ATTR_TABLE_ROW_HEADER_ID, header.axID()); | 398 dst->AddIntAttribute(dst->ATTR_TABLE_ROW_HEADER_ID, header.axID()); |
| 622 } | 399 } |
| 623 | 400 |
| 624 if (dst->role == dst->ROLE_COLUMN) { | 401 if (dst->role == WebKit::WebAXRoleColumn) { |
| 625 dst->AddIntAttribute(dst->ATTR_TABLE_COLUMN_INDEX, src.columnIndex()); | 402 dst->AddIntAttribute(dst->ATTR_TABLE_COLUMN_INDEX, src.columnIndex()); |
| 626 WebAccessibilityObject header = src.columnHeader(); | 403 WebAXObject header = src.columnHeader(); |
| 627 if (!header.isDetached()) | 404 if (!header.isDetached()) |
| 628 dst->AddIntAttribute(dst->ATTR_TABLE_COLUMN_HEADER_ID, header.axID()); | 405 dst->AddIntAttribute(dst->ATTR_TABLE_COLUMN_HEADER_ID, header.axID()); |
| 629 } | 406 } |
| 630 | 407 |
| 631 if (dst->role == dst->ROLE_CELL || | 408 if (dst->role == WebKit::WebAXRoleCell || |
| 632 dst->role == dst->ROLE_ROW_HEADER || | 409 dst->role == WebKit::WebAXRoleRowHeader || |
| 633 dst->role == dst->ROLE_COLUMN_HEADER) { | 410 dst->role == WebKit::WebAXRoleColumnHeader) { |
| 634 dst->AddIntAttribute(dst->ATTR_TABLE_CELL_COLUMN_INDEX, | 411 dst->AddIntAttribute(dst->ATTR_TABLE_CELL_COLUMN_INDEX, |
| 635 src.cellColumnIndex()); | 412 src.cellColumnIndex()); |
| 636 dst->AddIntAttribute(dst->ATTR_TABLE_CELL_COLUMN_SPAN, | 413 dst->AddIntAttribute(dst->ATTR_TABLE_CELL_COLUMN_SPAN, |
| 637 src.cellColumnSpan()); | 414 src.cellColumnSpan()); |
| 638 dst->AddIntAttribute(dst->ATTR_TABLE_CELL_ROW_INDEX, src.cellRowIndex()); | 415 dst->AddIntAttribute(dst->ATTR_TABLE_CELL_ROW_INDEX, src.cellRowIndex()); |
| 639 dst->AddIntAttribute(dst->ATTR_TABLE_CELL_ROW_SPAN, src.cellRowSpan()); | 416 dst->AddIntAttribute(dst->ATTR_TABLE_CELL_ROW_SPAN, src.cellRowSpan()); |
| 640 } | 417 } |
| 641 | 418 |
| 642 dst->AddStringAttribute(dst->ATTR_NAME, name); | 419 dst->AddStringAttribute(dst->ATTR_NAME, name); |
| 643 | 420 |
| 644 // Add the ids of *indirect* children - those who are children of this node, | 421 // Add the ids of *indirect* children - those who are children of this node, |
| 645 // but whose parent is *not* this node. One example is a table | 422 // but whose parent is *not* this node. One example is a table |
| 646 // cell, which is a child of both a row and a column. Because the cell's | 423 // cell, which is a child of both a row and a column. Because the cell's |
| 647 // parent is the row, the row adds it as a child, and the column adds it | 424 // parent is the row, the row adds it as a child, and the column adds it |
| 648 // as an indirect child. | 425 // as an indirect child. |
| 649 int child_count = src.childCount(); | 426 int child_count = src.childCount(); |
| 650 for (int i = 0; i < child_count; ++i) { | 427 for (int i = 0; i < child_count; ++i) { |
| 651 WebAccessibilityObject child = src.childAt(i); | 428 WebAXObject child = src.childAt(i); |
| 652 std::vector<int32> indirect_child_ids; | 429 std::vector<int32> indirect_child_ids; |
| 653 if (!is_iframe && !child.isDetached() && !IsParentUnignoredOf(src, child)) | 430 if (!is_iframe && !child.isDetached() && !IsParentUnignoredOf(src, child)) |
| 654 indirect_child_ids.push_back(child.axID()); | 431 indirect_child_ids.push_back(child.axID()); |
| 655 if (indirect_child_ids.size() > 0) { | 432 if (indirect_child_ids.size() > 0) { |
| 656 dst->AddIntListAttribute( | 433 dst->AddIntListAttribute( |
| 657 dst->ATTR_INDIRECT_CHILD_IDS, indirect_child_ids); | 434 dst->ATTR_INDIRECT_CHILD_IDS, indirect_child_ids); |
| 658 } | 435 } |
| 659 } | 436 } |
| 660 } | 437 } |
| 661 | 438 |
| 662 bool ShouldIncludeChildNode( | 439 bool ShouldIncludeChildNode( |
| 663 const WebAccessibilityObject& parent, | 440 const WebAXObject& parent, |
| 664 const WebAccessibilityObject& child) { | 441 const WebAXObject& child) { |
| 665 switch(parent.roleValue()) { | 442 switch(parent.role()) { |
| 666 case WebKit::WebAccessibilityRoleSlider: | 443 case WebKit::WebAXRoleSlider: |
| 667 case WebKit::WebAccessibilityRoleEditableText: | 444 case WebKit::WebAXRoleEditableText: |
| 668 case WebKit::WebAccessibilityRoleTextArea: | 445 case WebKit::WebAXRoleTextArea: |
| 669 case WebKit::WebAccessibilityRoleTextField: | 446 case WebKit::WebAXRoleTextField: |
| 670 return false; | 447 return false; |
| 671 default: | 448 default: |
| 672 break; | 449 break; |
| 673 } | 450 } |
| 674 | 451 |
| 675 // The child may be invalid due to issues in webkit accessibility code. | 452 // The child may be invalid due to issues in webkit accessibility code. |
| 676 // Don't add children that are invalid thus preventing a crash. | 453 // Don't add children that are invalid thus preventing a crash. |
| 677 // https://bugs.webkit.org/show_bug.cgi?id=44149 | 454 // https://bugs.webkit.org/show_bug.cgi?id=44149 |
| 678 // TODO(ctguil): We may want to remove this check as webkit stabilizes. | 455 // TODO(ctguil): We may want to remove this check as webkit stabilizes. |
| 679 if (child.isDetached()) | 456 if (child.isDetached()) |
| 680 return false; | 457 return false; |
| 681 | 458 |
| 682 // Skip children whose parent isn't this - see indirect_child_ids, above. | 459 // Skip children whose parent isn't this - see indirect_child_ids, above. |
| 683 // As an exception, include children of an iframe element. | 460 // As an exception, include children of an iframe element. |
| 684 bool is_iframe = false; | 461 bool is_iframe = false; |
| 685 WebNode node = parent.node(); | 462 WebNode node = parent.node(); |
| 686 if (!node.isNull() && node.isElementNode()) { | 463 if (!node.isNull() && node.isElementNode()) { |
| 687 WebElement element = node.to<WebElement>(); | 464 WebElement element = node.to<WebElement>(); |
| 688 is_iframe = (element.tagName() == ASCIIToUTF16("IFRAME")); | 465 is_iframe = (element.tagName() == ASCIIToUTF16("IFRAME")); |
| 689 } | 466 } |
| 690 | 467 |
| 691 return (is_iframe || IsParentUnignoredOf(parent, child)); | 468 return (is_iframe || IsParentUnignoredOf(parent, child)); |
| 692 } | 469 } |
| 693 | 470 |
| 694 } // namespace content | 471 } // namespace content |
| OLD | NEW |