| 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 |