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 */ |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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' || nodes[i].isContentEditable || |
125 nodes[i].isContentEditable || | |
126 (nodes[i].tagName == 'INPUT' && | 125 (nodes[i].tagName == 'INPUT' && |
127 cvox.DomUtil.isInputTypeText(nodes[i]))) { | 126 cvox.DomUtil.isInputTypeText(nodes[i]))) { |
128 return nodes[i]; | 127 return nodes[i]; |
129 } | 128 } |
130 } | 129 } |
131 return null; | 130 return null; |
132 }; | 131 }; |
133 | 132 |
134 | 133 |
135 /** | 134 /** |
136 * Heading. | 135 * Heading. |
137 * @param {Array<Node>} nodes An array of nodes to check. | 136 * @param {Array<Node>} nodes An array of nodes to check. |
138 * @return {?Node} Node in the array that is a heading. | 137 * @return {?Node} Node in the array that is a heading. |
139 */ | 138 */ |
140 cvox.DomPredicates.headingPredicate = function(nodes) { | 139 cvox.DomPredicates.headingPredicate = function(nodes) { |
141 for (var i = 0; i < nodes.length; i++) { | 140 for (var i = 0; i < nodes.length; i++) { |
142 if (nodes[i].getAttribute && | 141 if (nodes[i].getAttribute && nodes[i].getAttribute('role') == 'heading') { |
143 nodes[i].getAttribute('role') == 'heading') { | |
144 return nodes[i]; | 142 return nodes[i]; |
145 } | 143 } |
146 switch (nodes[i].tagName) { | 144 switch (nodes[i].tagName) { |
147 case 'H1': | 145 case 'H1': |
148 case 'H2': | 146 case 'H2': |
149 case 'H3': | 147 case 'H3': |
150 case 'H4': | 148 case 'H4': |
151 case 'H5': | 149 case 'H5': |
152 case 'H6': | 150 case 'H6': |
153 return nodes[i]; | 151 return nodes[i]; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 }; | 248 }; |
251 | 249 |
252 /** | 250 /** |
253 * Table Cell. | 251 * Table Cell. |
254 * @param {Array<Node>} nodes An array of nodes to check. | 252 * @param {Array<Node>} nodes An array of nodes to check. |
255 * @return {?Node} Node in the array that is a table cell. | 253 * @return {?Node} Node in the array that is a table cell. |
256 */ | 254 */ |
257 cvox.DomPredicates.cellPredicate = function(nodes) { | 255 cvox.DomPredicates.cellPredicate = function(nodes) { |
258 for (var i = nodes.length - 1; i >= 0; --i) { | 256 for (var i = nodes.length - 1; i >= 0; --i) { |
259 var node = nodes[i]; | 257 var node = nodes[i]; |
260 if (node.tagName == 'TD' || | 258 if (node.tagName == 'TD' || node.tagName == 'TH' || |
261 node.tagName == 'TH' || | |
262 (node.getAttribute && node.getAttribute('role') == 'gridcell')) { | 259 (node.getAttribute && node.getAttribute('role') == 'gridcell')) { |
263 return node; | 260 return node; |
264 } | 261 } |
265 } | 262 } |
266 return null; | 263 return null; |
267 }; | 264 }; |
268 | 265 |
269 | 266 |
270 /** | 267 /** |
271 * Visited link. | 268 * Visited link. |
(...skipping 12 matching lines...) Expand all Loading... |
284 | 281 |
285 | 282 |
286 /** | 283 /** |
287 * List. | 284 * List. |
288 * @param {Array<Node>} nodes An array of nodes to check. | 285 * @param {Array<Node>} nodes An array of nodes to check. |
289 * @return {?Node} Node in the array that is a list. | 286 * @return {?Node} Node in the array that is a list. |
290 */ | 287 */ |
291 cvox.DomPredicates.listPredicate = function(nodes) { | 288 cvox.DomPredicates.listPredicate = function(nodes) { |
292 for (var i = 0; i < nodes.length; i++) { | 289 for (var i = 0; i < nodes.length; i++) { |
293 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'list') || | 290 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'list') || |
294 nodes[i].tagName == 'UL' || | 291 nodes[i].tagName == 'UL' || nodes[i].tagName == 'OL') { |
295 nodes[i].tagName == 'OL') { | |
296 return nodes[i]; | 292 return nodes[i]; |
297 } | 293 } |
298 } | 294 } |
299 return null; | 295 return null; |
300 }; | 296 }; |
301 | 297 |
302 | 298 |
303 /** | 299 /** |
304 * List item. | 300 * List item. |
305 * @param {Array<Node>} nodes An array of nodes to check. | 301 * @param {Array<Node>} nodes An array of nodes to check. |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 * @return {?Node} Node in the array that is considered a section marker. | 386 * @return {?Node} Node in the array that is considered a section marker. |
391 */ | 387 */ |
392 cvox.DomPredicates.sectionPredicate = function(nodes) { | 388 cvox.DomPredicates.sectionPredicate = function(nodes) { |
393 for (var i = 0; i < nodes.length; i++) { | 389 for (var i = 0; i < nodes.length; i++) { |
394 if (cvox.DomUtil.isSemanticElt(nodes[i])) { | 390 if (cvox.DomUtil.isSemanticElt(nodes[i])) { |
395 return nodes[i]; | 391 return nodes[i]; |
396 } | 392 } |
397 if (cvox.AriaUtil.isLandmark(nodes[i])) { | 393 if (cvox.AriaUtil.isLandmark(nodes[i])) { |
398 return nodes[i]; | 394 return nodes[i]; |
399 } | 395 } |
400 if (nodes[i].getAttribute && | 396 if (nodes[i].getAttribute && nodes[i].getAttribute('role') == 'heading') { |
401 nodes[i].getAttribute('role') == 'heading') { | |
402 return nodes[i]; | 397 return nodes[i]; |
403 } | 398 } |
404 switch (nodes[i].tagName) { | 399 switch (nodes[i].tagName) { |
405 case 'H1': | 400 case 'H1': |
406 case 'H2': | 401 case 'H2': |
407 case 'H3': | 402 case 'H3': |
408 case 'H4': | 403 case 'H4': |
409 case 'H5': | 404 case 'H5': |
410 case 'H6': | 405 case 'H6': |
411 return nodes[i]; | 406 return nodes[i]; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 return null; | 442 return null; |
448 }; | 443 }; |
449 | 444 |
450 /** | 445 /** |
451 * Article. | 446 * Article. |
452 * @param {Array<Node>} nodes An array of nodes to check. | 447 * @param {Array<Node>} nodes An array of nodes to check. |
453 * @return {?Node} Node in the array that is a article. | 448 * @return {?Node} Node in the array that is a article. |
454 */ | 449 */ |
455 cvox.DomPredicates.articlePredicate = function(nodes) { | 450 cvox.DomPredicates.articlePredicate = function(nodes) { |
456 for (var i = 0; i < nodes.length; i++) { | 451 for (var i = 0; i < nodes.length; i++) { |
457 if ((nodes[i].getAttribute && | 452 if ((nodes[i].getAttribute && nodes[i].getAttribute('role') == 'article') || |
458 nodes[i].getAttribute('role') == 'article') || | |
459 nodes[i].tagName == 'ARTICLE') { | 453 nodes[i].tagName == 'ARTICLE') { |
460 return nodes[i]; | 454 return nodes[i]; |
461 } | 455 } |
462 } | 456 } |
463 return null; | 457 return null; |
464 }; | 458 }; |
465 | 459 |
466 /** | 460 /** |
467 * Media. | 461 * Media. |
468 * @param {Array<Node>} nodes An array of nodes to check. | 462 * @param {Array<Node>} nodes An array of nodes to check. |
469 * @return {?Node} Node in the array that is a media widget (video or audio). | 463 * @return {?Node} Node in the array that is a media widget (video or audio). |
470 */ | 464 */ |
471 cvox.DomPredicates.mediaPredicate = function(nodes) { | 465 cvox.DomPredicates.mediaPredicate = function(nodes) { |
472 for (var i = 0; i < nodes.length; i++) { | 466 for (var i = 0; i < nodes.length; i++) { |
473 if (nodes[i].tagName == 'AUDIO' || | 467 if (nodes[i].tagName == 'AUDIO' || nodes[i].tagName == 'VIDEO') { |
474 nodes[i].tagName == 'VIDEO') { | |
475 return nodes[i]; | 468 return nodes[i]; |
476 } | 469 } |
477 } | 470 } |
478 return null; | 471 return null; |
479 }; | 472 }; |
480 | 473 |
481 | 474 |
482 /** | 475 /** |
483 * Ordered List. | 476 * Ordered List. |
484 * @param {Array<Node>} nodes An array of nodes to check. | 477 * @param {Array<Node>} nodes An array of nodes to check. |
485 * @return {?Node} Node in the array that is a ordered list. | 478 * @return {?Node} Node in the array that is a ordered list. |
486 */ | 479 */ |
487 cvox.DomPredicates.orderedListPredicate = function(nodes) { | 480 cvox.DomPredicates.orderedListPredicate = function(nodes) { |
488 for (var i = 0; i < nodes.length; i++) { | 481 for (var i = 0; i < nodes.length; i++) { |
489 if (nodes[i].tagName == 'OL') { | 482 if (nodes[i].tagName == 'OL') { |
490 return nodes[i]; | 483 return nodes[i]; |
491 } | 484 } |
492 } | 485 } |
493 return null; | 486 return null; |
494 }; | 487 }; |
OLD | NEW |