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->AddBoolAttribute(dst->ATTR_CANVAS_HAS_FALLBACK, true); |
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 |