axe-core
Version:
Accessibility engine for automated Web UI testing
68 lines (52 loc) • 1.55 kB
JavaScript
import { tokenList } from '../../core/utils';
function tdHeadersAttrEvaluate(node) {
const cells = [];
const reviewCells = [];
const badCells = [];
for (let rowIndex = 0; rowIndex < node.rows.length; rowIndex++) {
const row = node.rows[rowIndex];
for (let cellIndex = 0; cellIndex < row.cells.length; cellIndex++) {
cells.push(row.cells[cellIndex]);
}
}
const ids = cells.reduce((ids, cell) => {
if (cell.getAttribute('id')) {
ids.push(cell.getAttribute('id'));
}
return ids;
}, []);
cells.forEach(cell => {
let isSelf = false;
let notOfTable = false;
if (!cell.hasAttribute('headers')) {
return;
}
const headersAttr = cell.getAttribute('headers').trim();
if (!headersAttr) {
return reviewCells.push(cell);
}
// Get a list all the values of the headers attribute
const headers = tokenList(headersAttr);
if (headers.length !== 0) {
// Check if the cell's id is in this list
if (cell.getAttribute('id')) {
isSelf = headers.indexOf(cell.getAttribute('id').trim()) !== -1;
}
// Check if the headers are of cells inside the table
notOfTable = headers.some(header => !ids.includes(header));
if (isSelf || notOfTable) {
badCells.push(cell);
}
}
});
if (badCells.length > 0) {
this.relatedNodes(badCells);
return false;
}
if (reviewCells.length) {
this.relatedNodes(reviewCells);
return undefined;
}
return true;
}
export default tdHeadersAttrEvaluate;