UNPKG

axe-core

Version:

Accessibility engine for automated Web UI testing

56 lines (45 loc) 1.53 kB
/* global table, dom */ /** * Determine if a `HTMLTableCellElement` is a column header, if so get the scope of the header * @method getScope * @memberof axe.commons.table * @instance * @param {HTMLTableCellElement} cell The table cell to test * @return {Boolean|String} Returns `false` if not a column header, or the scope of the column header element */ table.getScope = function (cell) { var scope = cell.getAttribute('scope'); var role = cell.getAttribute('role'); if (cell instanceof Element === false || ['TD', 'TH'].indexOf(cell.nodeName.toUpperCase()) === -1 ) { throw new TypeError('Expected TD or TH element'); } if (role === 'columnheader') { return 'col'; } else if (role === 'rowheader') { return 'row'; } else if (scope === 'col' || scope === 'row') { return scope; } else if (cell.nodeName.toUpperCase() !== 'TH') { return false; } var tableGrid = table.toGrid(dom.findUp(cell, 'table')); var pos = table.getCellPosition(cell); // The element is in a row with all th elements, that makes it a column header var headerRow = tableGrid[pos.y].reduce((headerRow, cell) => { return headerRow && cell.nodeName.toUpperCase() === 'TH'; }, true); if (headerRow) { return 'col'; } // The element is in a column with all th elements, that makes it a row header var headerCol = tableGrid.map((col) => col[pos.x]) .reduce((headerCol, cell) => { return headerCol && cell.nodeName.toUpperCase() === 'TH'; }, true); if (headerCol) { return 'row'; } return 'auto'; };