/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict" ;
/* import-globals-from ../../mochitest/attributes.js */
loadScripts({ name:
"attributes.js" , dir: MOCHITESTS_DIR });
addAccessibleTask(
`<table role=
"grid" id=
"grid" >
<tr role=
"row" id=
"grid_row1" >
<td role=
"gridcell" id=
"grid_cell1" >cell1</td>
<td role=
"gridcell" id=
"grid_cell2" >cell2</td>
</tr>
<tr role=
"row" id=
"grid_row2" >
<td role=
"gridcell" id=
"grid_cell3" >cell3</td>
<td role=
"gridcell" id=
"grid_cell4" >cell4</td>
</tr>
</table>`,
async
function (browser, accDoc) {
let getAcc = id => findAccessibleChildByID(accDoc, id);
// ////////////////////////////////////////////////////////////////////////
// ARIA grid
testGroupAttrs(getAcc(
"grid_row1" ),
1 ,
2 );
testAbsentAttrs(getAcc(
"grid_cell1" ), { posinset:
"" , setsize:
"" });
testAbsentAttrs(getAcc(
"grid_cell2" ), { posinset:
"" , setsize:
"" });
testGroupAttrs(getAcc(
"grid_row2" ),
2 ,
2 );
testAbsentAttrs(getAcc(
"grid_cell3" ), { posinset:
"" , setsize:
"" });
testAbsentAttrs(getAcc(
"grid_cell4" ), { posinset:
"" , setsize:
"" });
testGroupParentAttrs(getAcc(
"grid" ),
2 ,
false ,
false );
},
{
topLevel:
true ,
iframe:
true ,
remoteIframe:
true ,
chrome:
true ,
}
);
addAccessibleTask(
`<div role=
"treegrid" id=
"treegrid" aria-colcount=
"4" >
<div role=
"row" aria-level=
"1" id=
"treegrid_row1" >
<div role=
"gridcell" id=
"treegrid_cell1" >cell1</div>
<div role=
"gridcell" id=
"treegrid_cell2" >cell2</div>
</div>
<div role=
"row" aria-level=
"2" id=
"treegrid_row2" >
<div role=
"gridcell" id=
"treegrid_cell3" >cell1</div>
<div role=
"gridcell" id=
"treegrid_cell4" >cell2</div>
</div>
<div role=
"row" id=
"treegrid_row3" >
<div role=
"gridcell" id=
"treegrid_cell5" >cell1</div>
<div role=
"gridcell" id=
"treegrid_cell6" >cell2</div>
</div>
</div>`,
async
function (browser, accDoc) {
let getAcc = id => findAccessibleChildByID(accDoc, id);
// ////////////////////////////////////////////////////////////////////////
// ARIA treegrid
testGroupAttrs(getAcc(
"treegrid_row1" ),
1 ,
2 ,
1 );
testAbsentAttrs(getAcc(
"treegrid_cell1" ), { posinset:
"" , setsize:
"" });
testAbsentAttrs(getAcc(
"treegrid_cell2" ), { posinset:
"" , setsize:
"" });
testGroupAttrs(getAcc(
"treegrid_row2" ),
1 ,
1 ,
2 );
testAbsentAttrs(getAcc(
"treegrid_cell3" ), { posinset:
"" , setsize:
"" });
testAbsentAttrs(getAcc(
"treegrid_cell4" ), { posinset:
"" , setsize:
"" });
testGroupAttrs(getAcc(
"treegrid_row3" ),
2 ,
2 ,
1 );
testAbsentAttrs(getAcc(
"treegrid_cell5" ), { posinset:
"" , setsize:
"" });
testAbsentAttrs(getAcc(
"treegrid_cell6" ), { posinset:
"" , setsize:
"" });
testGroupParentAttrs(getAcc(
"treegrid" ),
2 ,
true );
// row child item count provided by parent grid's aria-colcount
testGroupParentAttrs(getAcc(
"treegrid_row1" ),
4 ,
false );
},
{
topLevel:
true ,
iframe:
true ,
remoteIframe:
true ,
chrome:
true ,
}
);
addAccessibleTask(
`<div id=
"headings" >
<h1 id=
"h1" >heading1</h1>
<h2 id=
"h2" >heading2</h2>
<h3 id=
"h3" >heading3</h3>
<h4 id=
"h4" >heading4</h4>
<h5 id=
"h5" >heading5</h5>
<h6 id=
"h6" >heading6</h6>
<div id=
"ariaHeadingNoLevel" role=
"heading" >ariaHeadingNoLevel</div>
</div>`,
async
function (browser, accDoc) {
let getAcc = id => findAccessibleChildByID(accDoc, id);
// ////////////////////////////////////////////////////////////////////////
// HTML headings
testGroupAttrs(getAcc(
"h1" ),
0 ,
0 ,
1 );
testGroupAttrs(getAcc(
"h2" ),
0 ,
0 ,
2 );
testGroupAttrs(getAcc(
"h3" ),
0 ,
0 ,
3 );
testGroupAttrs(getAcc(
"h4" ),
0 ,
0 ,
4 );
testGroupAttrs(getAcc(
"h5" ),
0 ,
0 ,
5 );
testGroupAttrs(getAcc(
"h6" ),
0 ,
0 ,
6 );
testGroupAttrs(getAcc(
"ariaHeadingNoLevel" ),
0 ,
0 ,
2 );
// No child item counts or "tree" flag for parent of headings
testAbsentAttrs(getAcc(
"headings" ), {
"child-item-count" :
"" , tree:
"" });
},
{
topLevel:
true ,
iframe:
true ,
remoteIframe:
true ,
chrome:
true ,
}
);
addAccessibleTask(
`<ul id=
"combo1" role=
"combobox" >Password
<li id=
"combo1_opt1" role=
"option" >Xyzzy</li>
<li id=
"combo1_opt2" role=
"option" >Plughs</li>
<li id=
"combo1_opt3" role=
"option" >Shazaam</li>
<li id=
"combo1_opt4" role=
"option" >JoeSentMe</li>
</ul>`,
async
function (browser, accDoc) {
let getAcc = id => findAccessibleChildByID(accDoc, id);
// ////////////////////////////////////////////////////////////////////////
// ARIA combobox
testGroupAttrs(getAcc(
"combo1_opt1" ),
1 ,
4 );
testGroupAttrs(getAcc(
"combo1_opt2" ),
2 ,
4 );
testGroupAttrs(getAcc(
"combo1_opt3" ),
3 ,
4 );
testGroupAttrs(getAcc(
"combo1_opt4" ),
4 ,
4 );
testGroupParentAttrs(getAcc(
"combo1" ),
4 ,
false );
},
{
topLevel:
true ,
iframe:
true ,
remoteIframe:
true ,
chrome:
true ,
}
);
addAccessibleTask(
`<div role=
"table" aria-colcount=
"4" aria-rowcount=
"2" id=
"table" >
<div role=
"row" id=
"table_row" aria-rowindex=
"2" >
<div role=
"cell" id=
"table_cell" aria-colindex=
"3" >cell</div>
</div>
</div>`,
async
function (browser, accDoc) {
let getAcc = id => findAccessibleChildByID(accDoc, id);
// ////////////////////////////////////////////////////////////////////////
// ARIA table
testGroupAttrs(getAcc(
"table_cell" ),
3 ,
4 );
testGroupAttrs(getAcc(
"table_row" ),
2 ,
2 );
// grid child item count provided by aria-rowcount
testGroupParentAttrs(getAcc(
"table" ),
2 ,
false );
// row child item count provided by parent grid's aria-colcount
testGroupParentAttrs(getAcc(
"table_row" ),
4 ,
false );
},
{
topLevel:
true ,
iframe:
true ,
remoteIframe:
true ,
chrome:
true ,
}
);
addAccessibleTask(
`<div role=
"grid" aria-readonly=
"true" >
<div tabindex=
"-1" >
<div role=
"row" id=
"wrapped_row_1" >
<div role=
"gridcell" >cell content</div>
</div>
</div>
<div tabindex=
"-1" >
<div role=
"row" id=
"wrapped_row_2" >
<div role=
"gridcell" >cell content</div>
</div>
</div>
</div>`,
async
function (browser, accDoc) {
let getAcc = id => findAccessibleChildByID(accDoc, id);
// Attributes calculated even when row is wrapped in a div.
testGroupAttrs(getAcc(
"wrapped_row_1" ),
1 ,
2 ,
null );
testGroupAttrs(getAcc(
"wrapped_row_2" ),
2 ,
2 ,
null );
},
{
topLevel:
true ,
iframe:
true ,
remoteIframe:
true ,
chrome:
true ,
}
);
addAccessibleTask(
`<div role=
"list" aria-owns=
"t1_li1 t1_li2 t1_li3" id=
"aria-list_4" >
<div role=
"listitem" id=
"t1_li2" >Apples</div>
<div role=
"listitem" id=
"t1_li1" >Oranges</div>
</div>
<div role=
"listitem" id=
"t1_li3" >Bananas</div>`,
async
function (browser, accDoc) {
let getAcc = id => findAccessibleChildByID(accDoc, id);
// ////////////////////////////////////////////////////////////////////////
// ARIA list constructed by ARIA owns
testGroupAttrs(getAcc(
"t1_li1" ),
1 ,
3 );
testGroupAttrs(getAcc(
"t1_li2" ),
2 ,
3 );
testGroupAttrs(getAcc(
"t1_li3" ),
3 ,
3 );
testGroupParentAttrs(getAcc(
"aria-list_4" ),
3 ,
false );
},
{
topLevel:
true ,
iframe:
true ,
remoteIframe:
true ,
chrome:
true ,
}
);
addAccessibleTask(
`<!-- ARIA comments,
1 level, group pos and size calculation -->
<article>
<p id=
"comm_single_1" role=
"comment" >Comment
1 </p>
<p id=
"comm_single_2" role=
"comment" >Comment
2 </p>
</article>
<!-- Nested comments -->
<article>
<div id=
"comm_nested_1" role=
"comment" ><p>Comment
1 level
1 </p>
<div id=
"comm_nested_1_1" role=
"comment" ><p>Comment
1 level
2 </p></div>
<div id=
"comm_nested_1_2" role=
"comment" ><p>Comment
2 level
2 </p></div>
</div>
<div id=
"comm_nested_2" role=
"comment" ><p>Comment
2 level
1 </p>
<div id=
"comm_nested_2_1" role=
"comment" ><p>Comment
3 level
2 </p>
<div id=
"comm_nested_2_1_1" role=
"comment" ><p>Comment
1 level
3 </p></div>
</div>
</div>
<div id=
"comm_nested_3" role=
"comment" ><p>Comment
3 level
1 </p></div>
</article>`,
async
function (browser, accDoc) {
let getAcc = id => findAccessibleChildByID(accDoc, id);
// Test group attributes of ARIA comments
testGroupAttrs(getAcc(
"comm_single_1" ),
1 ,
2 ,
1 );
testGroupAttrs(getAcc(
"comm_single_2" ),
2 ,
2 ,
1 );
testGroupAttrs(getAcc(
"comm_nested_1" ),
1 ,
3 ,
1 );
testGroupAttrs(getAcc(
"comm_nested_1_1" ),
1 ,
2 ,
2 );
testGroupAttrs(getAcc(
"comm_nested_1_2" ),
2 ,
2 ,
2 );
testGroupAttrs(getAcc(
"comm_nested_2" ),
2 ,
3 ,
1 );
testGroupAttrs(getAcc(
"comm_nested_2_1" ),
1 ,
1 ,
2 );
testGroupAttrs(getAcc(
"comm_nested_2_1_1" ),
1 ,
1 ,
3 );
testGroupAttrs(getAcc(
"comm_nested_3" ),
3 ,
3 ,
1 );
},
{
topLevel:
true ,
iframe:
true ,
remoteIframe:
true ,
chrome:
true ,
}
);
addAccessibleTask(
`<div role=
"tree" id=
"tree4" ><div role=
"treeitem"
id=
"tree4_ti1" >Item
1 </div><div role=
"treeitem"
id=
"tree4_ti2" >Item
2 </div></div>`,
async
function (browser, accDoc) {
let getAcc = id => findAccessibleChildByID(accDoc, id);
// Test that group position information updates after deleting node.
testGroupAttrs(getAcc(
"tree4_ti1" ),
1 ,
2 ,
1 );
testGroupAttrs(getAcc(
"tree4_ti2" ),
2 ,
2 ,
1 );
testGroupParentAttrs(getAcc(
"tree4" ),
2 ,
true );
let p = waitForEvent(EVENT_REORDER,
"tree4" );
invokeContentTask(browser, [], () => {
content.document.getElementById(
"tree4_ti1" ).remove();
});
await p;
testGroupAttrs(getAcc(
"tree4_ti2" ),
1 ,
1 ,
1 );
testGroupParentAttrs(getAcc(
"tree4" ),
1 ,
true );
},
{
topLevel:
true ,
iframe:
true ,
remoteIframe:
true ,
chrome:
true ,
}
);
// Verify that intervening SECTION accs in ARIA compound widgets do not split
// up the group info for descendant owned elements. Test various types of
// widgets that should all be treated the same.
addAccessibleTask(
`<div role=
"tree" id=
"tree" >
<div tabindex=
"0" >
<div role=
"treeitem" id=
"ti1" >treeitem
1 </div>
</div>
<div tabindex=
"0" >
<div role=
"treeitem" id=
"ti2" >treeitem
2 </div>
</div>
</div>
<div role=
"listbox" id=
"listbox" >
<div tabindex=
"0" >
<div role=
"option" id=
"opt1" >option
1 </div>
</div>
<div tabindex=
"0" >
<div role=
"option" id=
"opt2" >option
2 </div>
</div>
</div>
<div role=
"list" id=
"list" >
<div tabindex=
"0" >
<div role=
"listitem" id=
"li1" >listitem
1 </div>
</div>
<div tabindex=
"0" >
<div role=
"listitem" id=
"li2" >listitem
2 </div>
</div>
</div>
<div role=
"menu" id=
"menu" >
<div tabindex=
"0" >
<div role=
"menuitem" id=
"mi1" >menuitem
1 </div>
</div>
<div tabindex=
"0" >
<div role=
"menuitem" id=
"mi2" >menuitem
2 </div>
</div>
</div>
<div role=
"radiogroup" id=
"radiogroup" >
<div tabindex=
"0" >
<div role=
"radio" id=
"r1" >radio
1 </div>
</div>
<div tabindex=
"0" >
<div role=
"radio" id=
"r2" >radio
2 </div>
</div>
</div>
`,
async
function (browser, accDoc) {
let getAcc = id => findAccessibleChildByID(accDoc, id);
testGroupAttrs(getAcc(
"ti1" ),
1 ,
2 ,
1 );
testGroupAttrs(getAcc(
"ti2" ),
2 ,
2 ,
1 );
testGroupAttrs(getAcc(
"opt1" ),
1 ,
2 ,
0 );
testGroupAttrs(getAcc(
"opt2" ),
2 ,
2 ,
0 );
testGroupAttrs(getAcc(
"li1" ),
1 ,
2 ,
0 );
testGroupAttrs(getAcc(
"li2" ),
2 ,
2 ,
0 );
testGroupAttrs(getAcc(
"mi1" ),
1 ,
2 ,
0 );
testGroupAttrs(getAcc(
"mi2" ),
2 ,
2 ,
0 );
testGroupAttrs(getAcc(
"r1" ),
1 ,
2 ,
0 );
testGroupAttrs(getAcc(
"r2" ),
2 ,
2 ,
0 );
},
{
topLevel:
true ,
iframe:
true ,
remoteIframe:
true ,
chrome:
true ,
}
);
// Verify that non-generic accessibles (like buttons) correctly split the group
// info of descendant owned elements.
addAccessibleTask(
`<div role=
"tree" id=
"tree" >
<div role=
"button" >
<div role=
"treeitem" id=
"ti1" >first</div>
</div>
<div tabindex=
"0" >
<div role=
"treeitem" id=
"ti2" >second</div>
</div>
</div>`,
async
function (browser, accDoc) {
let getAcc = id => findAccessibleChildByID(accDoc, id);
testGroupAttrs(getAcc(
"ti1" ),
1 ,
1 ,
1 );
testGroupAttrs(getAcc(
"ti2" ),
1 ,
1 ,
1 );
},
{
topLevel:
true ,
iframe:
true ,
remoteIframe:
true ,
chrome:
true ,
}
);
Messung V0.5 in Prozent C=96 H=97 G=96
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-05)
¤
*© Formatika GbR, Deutschland