Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Errors
- This test failed 1 times in the preceding 30 days. quicksearch this test
- Manifest: accessible/tests/mochitest/tree/a11y.toml
<!DOCTYPE html>
<html>
<head>
<title>HTML table tests</title>
<link rel="stylesheet" type="text/css"
<script type="application/javascript"
src="../common.js"></script>
<script type="application/javascript"
src="../role.js"></script>
<script type="application/javascript">
function doTest() {
// ////////////////////////////////////////////////////////////////////////
// tables having captions
// Two captions, first is used, second is ignored.
var accTree =
{ TABLE: [
{ CAPTION: [
{
role: ROLE_TEXT_LEAF,
name: "caption",
},
] },
{ ROW: [
{ COLUMNHEADER: [ { TEXT_LEAF: [ ] } ] },
{ COLUMNHEADER: [ { TEXT_LEAF: [ ] } ] },
] },
{ ROW: [
{ CELL: [ { TEXT_LEAF: [ ] } ] },
{ CELL: [ { TEXT_LEAF: [ ] } ] },
] },
{ ROW: [
{ CELL: [ { TEXT_LEAF: [ ] } ] },
{ CELL: [ { TEXT_LEAF: [ ] } ] },
] },
{ ROW: [
{ CELL: [ { TEXT_LEAF: [ ] } ] },
{ CELL: [ { TEXT_LEAF: [ ] } ] },
] },
] };
testAccessibleTree("table", accTree);
// One caption, empty text, caption is included.
accTree =
{ TABLE: [
{ CAPTION: [ ] },
{ ROW: [
{ CELL: [ { TEXT_LEAF: [ ] } ] },
{ CELL: [ { TEXT_LEAF: [ ] } ] },
] },
] };
testAccessibleTree("table_caption_empty", accTree);
// Two captions, first has empty text, second is ignored.
accTree =
{ TABLE: [
{ CAPTION: [ ] },
{ ROW: [
{ CELL: [ { TEXT_LEAF: [ ] } ] },
{ CELL: [ { TEXT_LEAF: [ ] } ] },
] },
] };
testAccessibleTree("table_caption_firstempty", accTree);
// One caption, placed in the end of table. In use.
accTree =
{ TABLE: [
{ CAPTION: [
{
role: ROLE_TEXT_LEAF,
name: "caption",
},
] },
{ ROW: [
{ CELL: [ { TEXT_LEAF: [ ] } ] },
{ CELL: [ { TEXT_LEAF: [ ] } ] },
] },
] };
testAccessibleTree("table_caption_intheend", accTree);
// One caption, collapsed to zero width and height. In use.
accTree =
{ TABLE: [
{ CAPTION: [
{
role: ROLE_TEXT_LEAF,
name: "caption",
},
] },
{ ROW: [
{ CELL: [ { TEXT_LEAF: [ ] } ] },
{ CELL: [ { TEXT_LEAF: [ ] } ] },
] },
] };
testAccessibleTree("table_caption_collapsed", accTree);
// ////////////////////////////////////////////////////////////////////////
// table2 (consist of one column)
accTree = {
role: ROLE_TABLE,
children: [
{
role: ROLE_ROW,
children: [
{
role: ROLE_COLUMNHEADER,
},
],
},
{
role: ROLE_ROW,
children: [
{
role: ROLE_CELL,
},
],
},
],
};
testAccessibleTree("table2", accTree);
// ////////////////////////////////////////////////////////////////////////
// table3 (consist of one row)
accTree = {
role: ROLE_TABLE,
children: [
{
role: ROLE_ROW,
children: [
{
role: ROLE_ROWHEADER,
},
{
role: ROLE_CELL,
},
],
},
],
};
testAccessibleTree("table3", accTree);
// ///////////////////////////////////////////////////////////////////////
// table4 (display: table-row)
accTree =
{ TABLE: [
{ ROW: [
{ CELL: [
{ TEXT_LEAF: [ ] },
] },
] } ],
};
testAccessibleTree("table4", accTree);
// ///////////////////////////////////////////////////////////////////////
// table5 (tbody with display: block should not get accessible)
accTree =
{ TABLE: [
{ ROW: [
{ CELL: [
{ TEXT_LEAF: [ ] },
] },
] },
] };
testAccessibleTree("table5", accTree);
// ///////////////////////////////////////////////////////////////////////
// log table
accTree =
{ TABLE: [
{ ROW: [
{ CELL: [
{ TEXT_LEAF: [ ] },
] },
] },
] };
testAccessibleTree("logtable", accTree);
// ///////////////////////////////////////////////////////////////////////
// display:block table
accTree =
{ TABLE: [
{ ROW: [
{ CELL: [
{ TEXT_LEAF: [ ] },
] },
] },
] };
testAccessibleTree("block_table", accTree);
// ///////////////////////////////////////////////////////////////////////
// display:inline table
accTree =
{ TABLE: [
{ ROW: [
{ CELL: [
{ TEXT_LEAF: [ ] },
] },
{ CELL: [
{ TEXT_LEAF: [ ] },
] },
] },
] };
testAccessibleTree("inline_table1", accTree);
// ///////////////////////////////////////////////////////////////////////
// display:inline table
accTree =
{ TABLE: [
{ ROW: [
{ CELL: [
{ TABLE: [
{ ROW: [
{ CELL: [
{ TEXT_LEAF: [ ] },
] },
] },
] },
] },
] },
] };
testAccessibleTree("table_containing_inlinetable", accTree);
// ///////////////////////////////////////////////////////////////////////
// table with a cell that has display:block
accTree =
{ TABLE: [
{ ROW: [
{ CELL: [
{ TEXT_LEAF: [ ] },
] },
{ CELL: [
{ TEXT_LEAF: [ ] },
] },
] },
] };
testAccessibleTree("table_containing_block_cell", accTree);
// ///////////////////////////////////////////////////////////////////////
// A table with all elements being display:block, including a row group.
// This makes us fall back to the ARIAGridRowAccessible.
// Strange example from Gmail.
accTree =
{ TABLE: [
{ ROW: [
{ CELL: [
{ TEXT_LEAF: [ ] },
] },
] },
] };
testAccessibleTree("table_all_display_block", accTree);
// ///////////////////////////////////////////////////////////////////////
// A table with a display:block tbody that has an aria role
// The tbody should get an accessible with the desired role.
accTree =
{ TABLE: [
{ DIALOG: [
{ TEXT_CONTAINER: [
{ TEXT_CONTAINER: [
{ TEXT_LEAF: [ ] },
] },
] },
] },
] };
testAccessibleTree("table_with_block_tbody_and_role", accTree);
// ///////////////////////////////////////////////////////////////////////
// A table with a display:block tbody that is focusable
// The tbody should get a grouping accessible.
accTree =
{ TABLE: [
{ ROWGROUP: [
{ ROW: [
{ CELL: [
{ TEXT_LEAF: [ ] },
] },
] },
] },
] };
testAccessibleTree("table_with_focusable_block_tbody", accTree);
// ///////////////////////////////////////////////////////////////////////
// Test that the CSS position property doesn't stop th elements from
// reporting the proper columnheader, rowheader roles.
accTree =
{ TABLE: [
{ ROW: [
{ COLUMNHEADER: [ { TEXT_LEAF: [ ] } ] },
{ COLUMNHEADER: [ { TEXT_LEAF: [ ] } ] },
{ COLUMNHEADER: [ { TEXT_LEAF: [ ] } ] },
{ COLUMNHEADER: [ { TEXT_LEAF: [ ] } ] },
{ COLUMNHEADER: [ { TEXT_LEAF: [ ] } ] },
] },
{ ROW: [
{ ROWHEADER: [ { TEXT_LEAF: [ ] } ] },
{ CELL: [ ] },
{ ROWHEADER: [ { TEXT_LEAF: [ ] } ] },
{ CELL: [ ] },
{ ROWHEADER: [ { TEXT_LEAF: [ ] } ] },
{ CELL: [ ] },
{ ROWHEADER: [ { TEXT_LEAF: [ ] } ] },
{ CELL: [ ] },
{ ROWHEADER: [ { TEXT_LEAF: [ ] } ] },
{ CELL: [ ] },
] },
] };
testAccessibleTree("table_containing_pos_styled_th", accTree);
SimpleTest.finish();
}
SimpleTest.waitForExplicitFinish();
addA11yLoadEvent(doTest);
</script>
</head>
<body>
<a target="_blank"
title="When a table has only one column per row and that column happens to be a column header its role is exposed wrong"
</a>
<a target="_blank"
title="when div has display style table-row"
</a>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test">
</pre>
<table id="table">
<thead>
<tr>
<th>col1</th><th>col2</th>
</tr>
</thead>
<caption>caption</caption>
<tbody>
<tr>
<td>cell1</td><td>cell2</td>
</tr>
</tbody>
<tr>
<td>cell3</td><td>cell4</td>
</tr>
<caption>caption2</caption>
<tfoot>
<tr>
<td>cell5</td><td>cell6</td>
</tr>
</tfoot>
</table>
<table id="table_caption_empty">
<caption></caption>
<tr>
<td>cell1</td><td>cell2</td>
</tr>
</table>
<table id="table_caption_firstempty">
<caption></caption>
<tr>
<td>cell1</td><td>cell2</td>
</tr>
<caption>caption</caption>
</table>
<table id="table_caption_intheend">
<tr>
<td>cell1</td><td>cell2</td>
</tr>
<caption>caption</caption>
</table>
<table id="table_caption_collapsed">
<caption style="width: 0; height: 0">caption</caption>
<tr>
<td>cell1</td><td>cell2</td>
</tr>
</table>
<table id="table2">
<thead>
<tr>
<th>colheader</th>
</tr>
</thead>
<tbody>
<tr>
<td>bla</td>
</tr>
</tbody>
</table>
<table id="table3">
<tr>
<th>rowheader</th>
<td>cell</td>
</tr>
</table>
<table id="table4">
<div style="display: table-row">
<td>cell1</td>
</div>
</table>
<table id="table5">
<tbody style="display:block;">
<tr>
<td>bla</td>
</tr>
</tbody>
</table>
<table id="logtable" role="log"><tr><td>blah</td></tr></table>
<table id="block_table" style="display: block;">
<tr>
<td>bla</td>
</tr>
</table>
<table id="inline_table1" border="1" style="display:inline">
<tr>
<td>table1 cell1</td>
<td>table1 cell2</td>
</tr>
</table>
<table id="table_containing_inlinetable"><tr><td>
<table id="inline_table2" border="1" style="display:inline">
<tr id="tr_in_inline_table2">
<td id="td_in_inline_table2">cell</td>
</tr>
</table>
</td></tr></table>
<table id="table_containing_block_cell">
<tr>
<td>Normal cell</td>
<td style="display: block;">Block cell</td>
</tr>
</table>
<table id="table_all_display_block" style="display:block;">
<tbody style="display:block;">
<tr style="display:block;">
<td style="display:block;">text</td>
</tr>
</tbody>
</table>
<table id="table_with_block_tbody_and_role">
<tbody style="display:block;" role="dialog">
<tr>
<td>text</td>
</tr>
</tbody>
</table>
<table id="table_with_focusable_block_tbody">
<tbody style="display:block;" tabindex="0">
<tr>
<td>text</td>
</tr>
</tbody>
</table>
<table id="table_containing_pos_styled_th">
<tr>
<th style="position: static">static colheader</th>
<th style="position: relative">relative colheader</th>
<th style="position: absolute">absolute colheader</th>
<th style="position: fixed">fixed colheader</th>
<th style="position: sticky">sticky colheader</th>
</tr>
<tr>
<th style="position: static">static rowheader</th>
<td/>
<th style="position: relative">relative rowheader</th>
<td/>
<th style="position: absolute">absolute rowheader</th>
<td/>
<th style="position: fixed">fixed rowheader</th>
<td/>
<th style="position: sticky">sticky rowheader</th>
<td/>
</tr>
</table>
</body>
</html>