Each row container has role row and is either a DOM descendant of or owned by the table element or an element with role rowgroup.
Each cell is either a DOM descendant of or owned by a row element and has one of the following roles:
columnheader if the cell contains a title or header information for the column.
rowheader if the cell contains title or header information for the row.
cell if the cell does not contain column or row header information.
If there is an element in the user interface that serves as a label for the table, aria-labelledby is set on the table element with a value that refers to the labelling element. Otherwise, a label is specified for the table element using aria-label.
If the table has a caption or description, aria-describedby is set on the table element with a value referring to the element containing the description.
If the table contains sortable columns or rows, aria-sort is set to an appropriate value on the header cell element for the sorted column or row..
If there are conditions where some rows or columns are hidden or not present in the DOM (e.g., there are widgets on the page for hiding rows or columns), the following properties are applied:
aria-colcount or aria-rowcount is set to the total number of columns or rows, respectively.
aria-colindex or aria-rowindex is set to the position of a cell within a row or column, respectively.
If the table includes cells that span multiple rows or multiple columns, then aria-rowspan or aria-colspan is applied as described in grid and table properties.