OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 /** | 5 /** |
6 * @fileoverview A bunch of predicates that take as input an array of | 6 * @fileoverview A bunch of predicates that take as input an array of |
7 * nodes with the unique ancestors of a node. They output true if a | 7 * nodes with the unique ancestors of a node. They output true if a |
8 * certain category of node has been found. | 8 * certain category of node has been found. |
9 * | 9 * |
10 */ | 10 */ |
11 | 11 |
12 goog.provide('cvox.DomPredicates'); | 12 goog.provide('cvox.DomPredicates'); |
13 | 13 |
14 | 14 |
15 /** | 15 /** |
16 * Checkbox. | 16 * Checkbox. |
17 * @param {Array.<Node>} nodes An array of nodes to check. | 17 * @param {Array<Node>} nodes An array of nodes to check. |
18 * @return {?Node} Node in the array that is a checkbox. | 18 * @return {?Node} Node in the array that is a checkbox. |
19 */ | 19 */ |
20 cvox.DomPredicates.checkboxPredicate = function(nodes) { | 20 cvox.DomPredicates.checkboxPredicate = function(nodes) { |
21 for (var i = 0; i < nodes.length; i++) { | 21 for (var i = 0; i < nodes.length; i++) { |
22 if ((nodes[i].getAttribute && | 22 if ((nodes[i].getAttribute && |
23 nodes[i].getAttribute('role') == 'checkbox') || | 23 nodes[i].getAttribute('role') == 'checkbox') || |
24 (nodes[i].tagName == 'INPUT' && nodes[i].type == 'checkbox')) { | 24 (nodes[i].tagName == 'INPUT' && nodes[i].type == 'checkbox')) { |
25 return nodes[i]; | 25 return nodes[i]; |
26 } | 26 } |
27 } | 27 } |
28 return null; | 28 return null; |
29 }; | 29 }; |
30 | 30 |
31 | 31 |
32 /** | 32 /** |
33 * Radio button. | 33 * Radio button. |
34 * @param {Array.<Node>} nodes An array of nodes to check. | 34 * @param {Array<Node>} nodes An array of nodes to check. |
35 * @return {?Node} Node in the array that is a radio button. | 35 * @return {?Node} Node in the array that is a radio button. |
36 */ | 36 */ |
37 cvox.DomPredicates.radioPredicate = function(nodes) { | 37 cvox.DomPredicates.radioPredicate = function(nodes) { |
38 for (var i = 0; i < nodes.length; i++) { | 38 for (var i = 0; i < nodes.length; i++) { |
39 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'radio') || | 39 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'radio') || |
40 (nodes[i].tagName == 'INPUT' && nodes[i].type == 'radio')) { | 40 (nodes[i].tagName == 'INPUT' && nodes[i].type == 'radio')) { |
41 return nodes[i]; | 41 return nodes[i]; |
42 } | 42 } |
43 } | 43 } |
44 return null; | 44 return null; |
45 }; | 45 }; |
46 | 46 |
47 | 47 |
48 /** | 48 /** |
49 * Slider. | 49 * Slider. |
50 * @param {Array.<Node>} nodes An array of nodes to check. | 50 * @param {Array<Node>} nodes An array of nodes to check. |
51 * @return {?Node} Node in the array that is a slider. | 51 * @return {?Node} Node in the array that is a slider. |
52 */ | 52 */ |
53 cvox.DomPredicates.sliderPredicate = function(nodes) { | 53 cvox.DomPredicates.sliderPredicate = function(nodes) { |
54 for (var i = 0; i < nodes.length; i++) { | 54 for (var i = 0; i < nodes.length; i++) { |
55 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'slider') || | 55 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'slider') || |
56 (nodes[i].tagName == 'INPUT' && nodes[i].type == 'range')) { | 56 (nodes[i].tagName == 'INPUT' && nodes[i].type == 'range')) { |
57 return nodes[i]; | 57 return nodes[i]; |
58 } | 58 } |
59 } | 59 } |
60 return null; | 60 return null; |
61 }; | 61 }; |
62 | 62 |
63 | 63 |
64 /** | 64 /** |
65 * Graphic. | 65 * Graphic. |
66 * @param {Array.<Node>} nodes An array of nodes to check. | 66 * @param {Array<Node>} nodes An array of nodes to check. |
67 * @return {?Node} Node in the array that is a graphic. | 67 * @return {?Node} Node in the array that is a graphic. |
68 */ | 68 */ |
69 cvox.DomPredicates.graphicPredicate = function(nodes) { | 69 cvox.DomPredicates.graphicPredicate = function(nodes) { |
70 for (var i = 0; i < nodes.length; i++) { | 70 for (var i = 0; i < nodes.length; i++) { |
71 if (nodes[i].tagName == 'IMG' || | 71 if (nodes[i].tagName == 'IMG' || |
72 (nodes[i].tagName == 'INPUT' && nodes[i].type == 'img')) { | 72 (nodes[i].tagName == 'INPUT' && nodes[i].type == 'img')) { |
73 return nodes[i]; | 73 return nodes[i]; |
74 } | 74 } |
75 } | 75 } |
76 return null; | 76 return null; |
77 }; | 77 }; |
78 | 78 |
79 | 79 |
80 /** | 80 /** |
81 * Button. | 81 * Button. |
82 * @param {Array.<Node>} nodes An array of nodes to check. | 82 * @param {Array<Node>} nodes An array of nodes to check. |
83 * @return {?Node} Node in the array that is a button. | 83 * @return {?Node} Node in the array that is a button. |
84 */ | 84 */ |
85 cvox.DomPredicates.buttonPredicate = function(nodes) { | 85 cvox.DomPredicates.buttonPredicate = function(nodes) { |
86 for (var i = 0; i < nodes.length; i++) { | 86 for (var i = 0; i < nodes.length; i++) { |
87 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'button') || | 87 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'button') || |
88 nodes[i].tagName == 'BUTTON' || | 88 nodes[i].tagName == 'BUTTON' || |
89 (nodes[i].tagName == 'INPUT' && nodes[i].type == 'submit') || | 89 (nodes[i].tagName == 'INPUT' && nodes[i].type == 'submit') || |
90 (nodes[i].tagName == 'INPUT' && nodes[i].type == 'button') || | 90 (nodes[i].tagName == 'INPUT' && nodes[i].type == 'button') || |
91 (nodes[i].tagName == 'INPUT' && nodes[i].type == 'reset')) { | 91 (nodes[i].tagName == 'INPUT' && nodes[i].type == 'reset')) { |
92 return nodes[i]; | 92 return nodes[i]; |
93 } | 93 } |
94 } | 94 } |
95 return null; | 95 return null; |
96 }; | 96 }; |
97 | 97 |
98 | 98 |
99 /** | 99 /** |
100 * Combo box. | 100 * Combo box. |
101 * @param {Array.<Node>} nodes An array of nodes to check. | 101 * @param {Array<Node>} nodes An array of nodes to check. |
102 * @return {?Node} Node in the array that is a combo box. | 102 * @return {?Node} Node in the array that is a combo box. |
103 */ | 103 */ |
104 cvox.DomPredicates.comboBoxPredicate = function(nodes) { | 104 cvox.DomPredicates.comboBoxPredicate = function(nodes) { |
105 for (var i = 0; i < nodes.length; i++) { | 105 for (var i = 0; i < nodes.length; i++) { |
106 if ((nodes[i].getAttribute && | 106 if ((nodes[i].getAttribute && |
107 nodes[i].getAttribute('role') == 'combobox') || | 107 nodes[i].getAttribute('role') == 'combobox') || |
108 nodes[i].tagName == 'SELECT') { | 108 nodes[i].tagName == 'SELECT') { |
109 return nodes[i]; | 109 return nodes[i]; |
110 } | 110 } |
111 } | 111 } |
112 return null; | 112 return null; |
113 }; | 113 }; |
114 | 114 |
115 | 115 |
116 /** | 116 /** |
117 * Editable text field. | 117 * Editable text field. |
118 * @param {Array.<Node>} nodes An array of nodes to check. | 118 * @param {Array<Node>} nodes An array of nodes to check. |
119 * @return {?Node} Node in the array that is an editable text field. | 119 * @return {?Node} Node in the array that is an editable text field. |
120 */ | 120 */ |
121 cvox.DomPredicates.editTextPredicate = function(nodes) { | 121 cvox.DomPredicates.editTextPredicate = function(nodes) { |
122 for (var i = 0; i < nodes.length; i++) { | 122 for (var i = 0; i < nodes.length; i++) { |
123 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'textbox') || | 123 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'textbox') || |
124 nodes[i].tagName == 'TEXTAREA' || | 124 nodes[i].tagName == 'TEXTAREA' || |
125 nodes[i].isContentEditable || | 125 nodes[i].isContentEditable || |
126 (nodes[i].tagName == 'INPUT' && | 126 (nodes[i].tagName == 'INPUT' && |
127 cvox.DomUtil.isInputTypeText(nodes[i]))) { | 127 cvox.DomUtil.isInputTypeText(nodes[i]))) { |
128 return nodes[i]; | 128 return nodes[i]; |
129 } | 129 } |
130 } | 130 } |
131 return null; | 131 return null; |
132 }; | 132 }; |
133 | 133 |
134 | 134 |
135 /** | 135 /** |
136 * Heading. | 136 * Heading. |
137 * @param {Array.<Node>} nodes An array of nodes to check. | 137 * @param {Array<Node>} nodes An array of nodes to check. |
138 * @return {?Node} Node in the array that is a heading. | 138 * @return {?Node} Node in the array that is a heading. |
139 */ | 139 */ |
140 cvox.DomPredicates.headingPredicate = function(nodes) { | 140 cvox.DomPredicates.headingPredicate = function(nodes) { |
141 for (var i = 0; i < nodes.length; i++) { | 141 for (var i = 0; i < nodes.length; i++) { |
142 if (nodes[i].getAttribute && | 142 if (nodes[i].getAttribute && |
143 nodes[i].getAttribute('role') == 'heading') { | 143 nodes[i].getAttribute('role') == 'heading') { |
144 return nodes[i]; | 144 return nodes[i]; |
145 } | 145 } |
146 switch (nodes[i].tagName) { | 146 switch (nodes[i].tagName) { |
147 case 'H1': | 147 case 'H1': |
148 case 'H2': | 148 case 'H2': |
149 case 'H3': | 149 case 'H3': |
150 case 'H4': | 150 case 'H4': |
151 case 'H5': | 151 case 'H5': |
152 case 'H6': | 152 case 'H6': |
153 return nodes[i]; | 153 return nodes[i]; |
154 } | 154 } |
155 } | 155 } |
156 return null; | 156 return null; |
157 }; | 157 }; |
158 | 158 |
159 | 159 |
160 /** | 160 /** |
161 * Heading level 1. | 161 * Heading level 1. |
162 * @param {Array.<Node>} nodes An array of nodes to check. | 162 * @param {Array<Node>} nodes An array of nodes to check. |
163 * @return {?Node} Node in the array that is a heading level 1. | 163 * @return {?Node} Node in the array that is a heading level 1. |
164 * TODO: handle ARIA headings with ARIA heading levels? | 164 * TODO: handle ARIA headings with ARIA heading levels? |
165 */ | 165 */ |
166 cvox.DomPredicates.heading1Predicate = function(nodes) { | 166 cvox.DomPredicates.heading1Predicate = function(nodes) { |
167 return cvox.DomPredicates.containsTagName_(nodes, 'H1'); | 167 return cvox.DomPredicates.containsTagName_(nodes, 'H1'); |
168 }; | 168 }; |
169 | 169 |
170 | 170 |
171 /** | 171 /** |
172 * Heading level 2. | 172 * Heading level 2. |
173 * @param {Array.<Node>} nodes An array of nodes to check. | 173 * @param {Array<Node>} nodes An array of nodes to check. |
174 * @return {?Node} Node in the array that is a heading level 2. | 174 * @return {?Node} Node in the array that is a heading level 2. |
175 */ | 175 */ |
176 cvox.DomPredicates.heading2Predicate = function(nodes) { | 176 cvox.DomPredicates.heading2Predicate = function(nodes) { |
177 return cvox.DomPredicates.containsTagName_(nodes, 'H2'); | 177 return cvox.DomPredicates.containsTagName_(nodes, 'H2'); |
178 }; | 178 }; |
179 | 179 |
180 | 180 |
181 /** | 181 /** |
182 * Heading level 3. | 182 * Heading level 3. |
183 * @param {Array.<Node>} nodes An array of nodes to check. | 183 * @param {Array<Node>} nodes An array of nodes to check. |
184 * @return {?Node} Node in the array that is a heading level 3. | 184 * @return {?Node} Node in the array that is a heading level 3. |
185 */ | 185 */ |
186 cvox.DomPredicates.heading3Predicate = function(nodes) { | 186 cvox.DomPredicates.heading3Predicate = function(nodes) { |
187 return cvox.DomPredicates.containsTagName_(nodes, 'H3'); | 187 return cvox.DomPredicates.containsTagName_(nodes, 'H3'); |
188 }; | 188 }; |
189 | 189 |
190 | 190 |
191 /** | 191 /** |
192 * Heading level 4. | 192 * Heading level 4. |
193 * @param {Array.<Node>} nodes An array of nodes to check. | 193 * @param {Array<Node>} nodes An array of nodes to check. |
194 * @return {?Node} Node in the array that is a heading level 4. | 194 * @return {?Node} Node in the array that is a heading level 4. |
195 */ | 195 */ |
196 cvox.DomPredicates.heading4Predicate = function(nodes) { | 196 cvox.DomPredicates.heading4Predicate = function(nodes) { |
197 return cvox.DomPredicates.containsTagName_(nodes, 'H4'); | 197 return cvox.DomPredicates.containsTagName_(nodes, 'H4'); |
198 }; | 198 }; |
199 | 199 |
200 | 200 |
201 /** | 201 /** |
202 * Heading level 5. | 202 * Heading level 5. |
203 * @param {Array.<Node>} nodes An array of nodes to check. | 203 * @param {Array<Node>} nodes An array of nodes to check. |
204 * @return {?Node} Node in the array that is a heading level 5. | 204 * @return {?Node} Node in the array that is a heading level 5. |
205 */ | 205 */ |
206 cvox.DomPredicates.heading5Predicate = function(nodes) { | 206 cvox.DomPredicates.heading5Predicate = function(nodes) { |
207 return cvox.DomPredicates.containsTagName_(nodes, 'H5'); | 207 return cvox.DomPredicates.containsTagName_(nodes, 'H5'); |
208 }; | 208 }; |
209 | 209 |
210 | 210 |
211 /** | 211 /** |
212 * Heading level 6. | 212 * Heading level 6. |
213 * @param {Array.<Node>} nodes An array of nodes to check. | 213 * @param {Array<Node>} nodes An array of nodes to check. |
214 * @return {?Node} Node in the array that is a heading level 6. | 214 * @return {?Node} Node in the array that is a heading level 6. |
215 */ | 215 */ |
216 cvox.DomPredicates.heading6Predicate = function(nodes) { | 216 cvox.DomPredicates.heading6Predicate = function(nodes) { |
217 return cvox.DomPredicates.containsTagName_(nodes, 'H6'); | 217 return cvox.DomPredicates.containsTagName_(nodes, 'H6'); |
218 }; | 218 }; |
219 | 219 |
220 | 220 |
221 /** | 221 /** |
222 * Link. | 222 * Link. |
223 * @param {Array.<Node>} nodes An array of nodes to check. | 223 * @param {Array<Node>} nodes An array of nodes to check. |
224 * @return {?Node} Node in the array that is a link. | 224 * @return {?Node} Node in the array that is a link. |
225 */ | 225 */ |
226 cvox.DomPredicates.linkPredicate = function(nodes) { | 226 cvox.DomPredicates.linkPredicate = function(nodes) { |
227 for (var i = 0; i < nodes.length; i++) { | 227 for (var i = 0; i < nodes.length; i++) { |
228 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'link') || | 228 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'link') || |
229 (nodes[i].tagName == 'A' && nodes[i].href)) { | 229 (nodes[i].tagName == 'A' && nodes[i].href)) { |
230 return nodes[i]; | 230 return nodes[i]; |
231 } | 231 } |
232 } | 232 } |
233 return null; | 233 return null; |
234 }; | 234 }; |
235 | 235 |
236 | 236 |
237 /** | 237 /** |
238 * Table. | 238 * Table. |
239 * @param {Array.<Node>} nodes An array of nodes to check. | 239 * @param {Array<Node>} nodes An array of nodes to check. |
240 * @return {?Node} Node in the array that is a data table. | 240 * @return {?Node} Node in the array that is a data table. |
241 */ | 241 */ |
242 cvox.DomPredicates.tablePredicate = function(nodes) { | 242 cvox.DomPredicates.tablePredicate = function(nodes) { |
243 // TODO(stoarca): Captions should always be allowed!! | 243 // TODO(stoarca): Captions should always be allowed!! |
244 var node = cvox.DomUtil.findTableNodeInList(nodes, {allowCaptions: true}); | 244 var node = cvox.DomUtil.findTableNodeInList(nodes, {allowCaptions: true}); |
245 if (node && !cvox.DomUtil.isLayoutTable(node)) { | 245 if (node && !cvox.DomUtil.isLayoutTable(node)) { |
246 return node; | 246 return node; |
247 } else { | 247 } else { |
248 return null; | 248 return null; |
249 } | 249 } |
250 }; | 250 }; |
251 | 251 |
252 /** | 252 /** |
253 * Table Cell. | 253 * Table Cell. |
254 * @param {Array.<Node>} nodes An array of nodes to check. | 254 * @param {Array<Node>} nodes An array of nodes to check. |
255 * @return {?Node} Node in the array that is a table cell. | 255 * @return {?Node} Node in the array that is a table cell. |
256 */ | 256 */ |
257 cvox.DomPredicates.cellPredicate = function(nodes) { | 257 cvox.DomPredicates.cellPredicate = function(nodes) { |
258 for (var i = nodes.length - 1; i >= 0; --i) { | 258 for (var i = nodes.length - 1; i >= 0; --i) { |
259 var node = nodes[i]; | 259 var node = nodes[i]; |
260 if (node.tagName == 'TD' || | 260 if (node.tagName == 'TD' || |
261 node.tagName == 'TH' || | 261 node.tagName == 'TH' || |
262 (node.getAttribute && node.getAttribute('role') == 'gridcell')) { | 262 (node.getAttribute && node.getAttribute('role') == 'gridcell')) { |
263 return node; | 263 return node; |
264 } | 264 } |
265 } | 265 } |
266 return null; | 266 return null; |
267 }; | 267 }; |
268 | 268 |
269 | 269 |
270 /** | 270 /** |
271 * Visited link. | 271 * Visited link. |
272 * @param {Array.<Node>} nodes An array of nodes to check. | 272 * @param {Array<Node>} nodes An array of nodes to check. |
273 * @return {?Node} Node in the array that is a visited link. | 273 * @return {?Node} Node in the array that is a visited link. |
274 */ | 274 */ |
275 cvox.DomPredicates.visitedLinkPredicate = function(nodes) { | 275 cvox.DomPredicates.visitedLinkPredicate = function(nodes) { |
276 for (var i = nodes.length - 1; i >= 0; --i) { | 276 for (var i = nodes.length - 1; i >= 0; --i) { |
277 if (cvox.DomPredicates.linkPredicate([nodes[i]]) && | 277 if (cvox.DomPredicates.linkPredicate([nodes[i]]) && |
278 cvox.ChromeVox.visitedUrls[nodes[i].href]) { | 278 cvox.ChromeVox.visitedUrls[nodes[i].href]) { |
279 return nodes[i]; | 279 return nodes[i]; |
280 } | 280 } |
281 } | 281 } |
282 }; | 282 }; |
283 | 283 |
284 | 284 |
285 /** | 285 /** |
286 * List. | 286 * List. |
287 * @param {Array.<Node>} nodes An array of nodes to check. | 287 * @param {Array<Node>} nodes An array of nodes to check. |
288 * @return {?Node} Node in the array that is a list. | 288 * @return {?Node} Node in the array that is a list. |
289 */ | 289 */ |
290 cvox.DomPredicates.listPredicate = function(nodes) { | 290 cvox.DomPredicates.listPredicate = function(nodes) { |
291 for (var i = 0; i < nodes.length; i++) { | 291 for (var i = 0; i < nodes.length; i++) { |
292 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'list') || | 292 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'list') || |
293 nodes[i].tagName == 'UL' || | 293 nodes[i].tagName == 'UL' || |
294 nodes[i].tagName == 'OL') { | 294 nodes[i].tagName == 'OL') { |
295 return nodes[i]; | 295 return nodes[i]; |
296 } | 296 } |
297 } | 297 } |
298 return null; | 298 return null; |
299 }; | 299 }; |
300 | 300 |
301 | 301 |
302 /** | 302 /** |
303 * List item. | 303 * List item. |
304 * @param {Array.<Node>} nodes An array of nodes to check. | 304 * @param {Array<Node>} nodes An array of nodes to check. |
305 * @return {?Node} Node in the array that is a list item. | 305 * @return {?Node} Node in the array that is a list item. |
306 */ | 306 */ |
307 cvox.DomPredicates.listItemPredicate = function(nodes) { | 307 cvox.DomPredicates.listItemPredicate = function(nodes) { |
308 for (var i = 0; i < nodes.length; i++) { | 308 for (var i = 0; i < nodes.length; i++) { |
309 if ((nodes[i].getAttribute && | 309 if ((nodes[i].getAttribute && |
310 nodes[i].getAttribute('role') == 'listitem') || | 310 nodes[i].getAttribute('role') == 'listitem') || |
311 nodes[i].tagName == 'LI') { | 311 nodes[i].tagName == 'LI') { |
312 return nodes[i]; | 312 return nodes[i]; |
313 } | 313 } |
314 } | 314 } |
315 return null; | 315 return null; |
316 }; | 316 }; |
317 | 317 |
318 | 318 |
319 /** | 319 /** |
320 * Blockquote. | 320 * Blockquote. |
321 * @param {Array.<Node>} nodes An array of nodes to check. | 321 * @param {Array<Node>} nodes An array of nodes to check. |
322 * @return {?Node} Node in the array that is a blockquote. | 322 * @return {?Node} Node in the array that is a blockquote. |
323 */ | 323 */ |
324 cvox.DomPredicates.blockquotePredicate = function(nodes) { | 324 cvox.DomPredicates.blockquotePredicate = function(nodes) { |
325 return cvox.DomPredicates.containsTagName_(nodes, 'BLOCKQUOTE'); | 325 return cvox.DomPredicates.containsTagName_(nodes, 'BLOCKQUOTE'); |
326 }; | 326 }; |
327 | 327 |
328 | 328 |
329 /** | 329 /** |
330 * Form field. | 330 * Form field. |
331 * @param {Array.<Node>} nodes An array of nodes to check. | 331 * @param {Array<Node>} nodes An array of nodes to check. |
332 * @return {?Node} Node in the array that is any type of form field. | 332 * @return {?Node} Node in the array that is any type of form field. |
333 */ | 333 */ |
334 cvox.DomPredicates.formFieldPredicate = function(nodes) { | 334 cvox.DomPredicates.formFieldPredicate = function(nodes) { |
335 for (var i = 0; i < nodes.length; i++) { | 335 for (var i = 0; i < nodes.length; i++) { |
336 if (cvox.DomUtil.isControl(nodes[i])) { | 336 if (cvox.DomUtil.isControl(nodes[i])) { |
337 return nodes[i]; | 337 return nodes[i]; |
338 } | 338 } |
339 } | 339 } |
340 return null; | 340 return null; |
341 }; | 341 }; |
342 | 342 |
343 | 343 |
344 /** | 344 /** |
345 * ARIA landmark. | 345 * ARIA landmark. |
346 * @param {Array.<Node>} nodes An array of nodes to check. | 346 * @param {Array<Node>} nodes An array of nodes to check. |
347 * @return {?Node} Node in the array that is an ARIA landmark. | 347 * @return {?Node} Node in the array that is an ARIA landmark. |
348 */ | 348 */ |
349 cvox.DomPredicates.landmarkPredicate = function(nodes) { | 349 cvox.DomPredicates.landmarkPredicate = function(nodes) { |
350 for (var i = 0; i < nodes.length; i++) { | 350 for (var i = 0; i < nodes.length; i++) { |
351 if (cvox.AriaUtil.isLandmark(nodes[i])) { | 351 if (cvox.AriaUtil.isLandmark(nodes[i])) { |
352 return nodes[i]; | 352 return nodes[i]; |
353 } | 353 } |
354 } | 354 } |
355 return null; | 355 return null; |
356 }; | 356 }; |
(...skipping 11 matching lines...) Expand all Loading... |
368 if (arr[i].tagName == tagName) { | 368 if (arr[i].tagName == tagName) { |
369 return arr[i]; | 369 return arr[i]; |
370 } | 370 } |
371 } | 371 } |
372 return null; | 372 return null; |
373 }; | 373 }; |
374 | 374 |
375 | 375 |
376 /** | 376 /** |
377 * MathML expression | 377 * MathML expression |
378 * @param {Array.<Node>} nodes An array of nodes to check. | 378 * @param {Array<Node>} nodes An array of nodes to check. |
379 * @return {?Node} Node in the array that is a math expression. | 379 * @return {?Node} Node in the array that is a math expression. |
380 */ | 380 */ |
381 cvox.DomPredicates.mathPredicate = function(nodes) { | 381 cvox.DomPredicates.mathPredicate = function(nodes) { |
382 return cvox.DomUtil.findMathNodeInList(nodes); | 382 return cvox.DomUtil.findMathNodeInList(nodes); |
383 }; | 383 }; |
384 | 384 |
385 /** | 385 /** |
386 * SECTION: A section is anything that indicates a new section. This includes | 386 * SECTION: A section is anything that indicates a new section. This includes |
387 * headings and landmarks. | 387 * headings and landmarks. |
388 * @param {Array.<Node>} nodes An array of nodes to check. | 388 * @param {Array<Node>} nodes An array of nodes to check. |
389 * @return {?Node} Node in the array that is considered a section marker. | 389 * @return {?Node} Node in the array that is considered a section marker. |
390 */ | 390 */ |
391 cvox.DomPredicates.sectionPredicate = function(nodes) { | 391 cvox.DomPredicates.sectionPredicate = function(nodes) { |
392 for (var i = 0; i < nodes.length; i++) { | 392 for (var i = 0; i < nodes.length; i++) { |
393 if (cvox.DomUtil.isSemanticElt(nodes[i])) { | 393 if (cvox.DomUtil.isSemanticElt(nodes[i])) { |
394 return nodes[i]; | 394 return nodes[i]; |
395 } | 395 } |
396 if (cvox.AriaUtil.isLandmark(nodes[i])) { | 396 if (cvox.AriaUtil.isLandmark(nodes[i])) { |
397 return nodes[i]; | 397 return nodes[i]; |
398 } | 398 } |
(...skipping 10 matching lines...) Expand all Loading... |
409 case 'H6': | 409 case 'H6': |
410 return nodes[i]; | 410 return nodes[i]; |
411 } | 411 } |
412 } | 412 } |
413 return null; | 413 return null; |
414 }; | 414 }; |
415 | 415 |
416 /** | 416 /** |
417 * CONTROL: A control is anything that the user can interact with. This includes | 417 * CONTROL: A control is anything that the user can interact with. This includes |
418 * form fields and links. | 418 * form fields and links. |
419 * @param {Array.<Node>} nodes An array of nodes to check. | 419 * @param {Array<Node>} nodes An array of nodes to check. |
420 * @return {?Node} Node in the array that is considered a control. | 420 * @return {?Node} Node in the array that is considered a control. |
421 */ | 421 */ |
422 cvox.DomPredicates.controlPredicate = function(nodes) { | 422 cvox.DomPredicates.controlPredicate = function(nodes) { |
423 for (var i = 0; i < nodes.length; i++) { | 423 for (var i = 0; i < nodes.length; i++) { |
424 if (cvox.DomUtil.isControl(nodes[i])) { | 424 if (cvox.DomUtil.isControl(nodes[i])) { |
425 return nodes[i]; | 425 return nodes[i]; |
426 } | 426 } |
427 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'link') || | 427 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'link') || |
428 (nodes[i].tagName == 'A' && nodes[i].href)) { | 428 (nodes[i].tagName == 'A' && nodes[i].href)) { |
429 return nodes[i]; | 429 return nodes[i]; |
430 } | 430 } |
431 } | 431 } |
432 return null; | 432 return null; |
433 }; | 433 }; |
434 | 434 |
435 /** | 435 /** |
436 * Caption. | 436 * Caption. |
437 * @param {Array.<Node>} nodes An array of nodes to check. | 437 * @param {Array<Node>} nodes An array of nodes to check. |
438 * @return {?Node} Node in the array that is a caption. | 438 * @return {?Node} Node in the array that is a caption. |
439 */ | 439 */ |
440 cvox.DomPredicates.captionPredicate = function(nodes) { | 440 cvox.DomPredicates.captionPredicate = function(nodes) { |
441 for (var i = 0; i < nodes.length; i++) { | 441 for (var i = 0; i < nodes.length; i++) { |
442 if (nodes[i].tagName == 'CAPTION') { | 442 if (nodes[i].tagName == 'CAPTION') { |
443 return nodes[i]; | 443 return nodes[i]; |
444 } | 444 } |
445 } | 445 } |
446 return null; | 446 return null; |
447 }; | 447 }; |
448 | 448 |
449 /** | 449 /** |
450 * Article. | 450 * Article. |
451 * @param {Array.<Node>} nodes An array of nodes to check. | 451 * @param {Array<Node>} nodes An array of nodes to check. |
452 * @return {?Node} Node in the array that is a article. | 452 * @return {?Node} Node in the array that is a article. |
453 */ | 453 */ |
454 cvox.DomPredicates.articlePredicate = function(nodes) { | 454 cvox.DomPredicates.articlePredicate = function(nodes) { |
455 for (var i = 0; i < nodes.length; i++) { | 455 for (var i = 0; i < nodes.length; i++) { |
456 if ((nodes[i].getAttribute && | 456 if ((nodes[i].getAttribute && |
457 nodes[i].getAttribute('role') == 'article') || | 457 nodes[i].getAttribute('role') == 'article') || |
458 nodes[i].tagName == 'ARTICLE') { | 458 nodes[i].tagName == 'ARTICLE') { |
459 return nodes[i]; | 459 return nodes[i]; |
460 } | 460 } |
461 } | 461 } |
462 return null; | 462 return null; |
463 }; | 463 }; |
464 | 464 |
465 /** | 465 /** |
466 * Media. | 466 * Media. |
467 * @param {Array.<Node>} nodes An array of nodes to check. | 467 * @param {Array<Node>} nodes An array of nodes to check. |
468 * @return {?Node} Node in the array that is a media widget (video or audio). | 468 * @return {?Node} Node in the array that is a media widget (video or audio). |
469 */ | 469 */ |
470 cvox.DomPredicates.mediaPredicate = function(nodes) { | 470 cvox.DomPredicates.mediaPredicate = function(nodes) { |
471 for (var i = 0; i < nodes.length; i++) { | 471 for (var i = 0; i < nodes.length; i++) { |
472 if (nodes[i].tagName == 'AUDIO' || | 472 if (nodes[i].tagName == 'AUDIO' || |
473 nodes[i].tagName == 'VIDEO') { | 473 nodes[i].tagName == 'VIDEO') { |
474 return nodes[i]; | 474 return nodes[i]; |
475 } | 475 } |
476 } | 476 } |
477 return null; | 477 return null; |
478 }; | 478 }; |
479 | 479 |
480 | 480 |
481 /** | 481 /** |
482 * Ordered List. | 482 * Ordered List. |
483 * @param {Array.<Node>} nodes An array of nodes to check. | 483 * @param {Array<Node>} nodes An array of nodes to check. |
484 * @return {?Node} Node in the array that is a ordered list. | 484 * @return {?Node} Node in the array that is a ordered list. |
485 */ | 485 */ |
486 cvox.DomPredicates.orderedListPredicate = function(nodes) { | 486 cvox.DomPredicates.orderedListPredicate = function(nodes) { |
487 for (var i = 0; i < nodes.length; i++) { | 487 for (var i = 0; i < nodes.length; i++) { |
488 if (nodes[i].tagName == 'OL') { | 488 if (nodes[i].tagName == 'OL') { |
489 return nodes[i]; | 489 return nodes[i]; |
490 } | 490 } |
491 } | 491 } |
492 return null; | 492 return null; |
493 }; | 493 }; |
OLD | NEW |