aria-required-children
Container roles must own at least one required child role
Checks that container roles with a documented "required owned elements" entry (list, listbox, menu, radiogroup, table, grid, tablist, tree, row, ...) contain at least one descendant or aria-owns-referenced element with an acceptable owned role.
Applies to. Applies to elements with an explicit, valid, non-abstract role that is also one of the container roles with a documented "required owned elements" entry (list, listbox, menu, menubar, radiogroup, rowgroup, table, grid, treegrid, tablist, tree, row). The container needs its explicit role, but an owned element may take its role from a custom element's ElementInternals (this.attachInternals().role), as an owned native element takes its tag's.
Expectation. At least one descendant, or one aria-owns-referenced element, has one of the acceptable owned roles for that container role. A container with none that owns text, directly or through generic wrappers (a <span> or <div> with no role), FAILS: the text sits where its required children belong, as in a list whose items have no role (ACT bc4a75, Failed Example 1). One that owns nothing is asked about (CANTTELL): it conveys nothing false -- an empty role="list" is announced as a list with no items, which is what it is, and a script may fill it. Whether the content a container does own is VALID is aria-prohibited-children's decision, and that rule still fails, so a genuinely misdescribed structure (a role="button" among list items, a tablist of plain buttons) is caught with the same strength as before. The native-HTML equivalents already work this way: nothing in this ruleset fails an empty <ul>, and list-children-valid judges only the children that exist.
What a finding reports.
role: the container's role.requiredOwnedRoles: the roles it needs at least one child with. Each item is a role name.
These data.details fields help to read and reproduce a finding. Apart from reasonCode and the few fields Output schema names as stable, they are not a stable contract: a field may be renamed or dropped in a minor release, so don’t build on them.
Examples
<ul role="list"><li>Item</li></ul>
The list role owns at least one listitem-role child.
<div role="list"></div>
An empty role="list" owns no required child role — announced as a list with no items, which is what it is, but worth a look.
How to check
When this rule can’t decide, it reports cantTell and leaves the question to a person. Each question it can ask is listed here under its reason code, with the steps to answer it. A finding carries the same steps as howToCheck, in the scan’s language. See Output schema.
ARIA_REQUIRED_CHILD_MISSING
- Inspect the container the report names and note its role and the child roles it needs (such as listitem for list, option for listbox).
- Look at what it shows on screen: check whether it is empty or holds images, icons or controls.
- Interact with the page (open menus, load results) and check whether children with the required role are added later.
- Open the Accessibility pane in the browser's developer tools and check the roles of anything it holds.
Pass. The container is empty and conveys nothing, or the items it shows carry the required role.
Fail. It shows items (images, icons, controls) that lack the required child role, so the structure is not conveyed, which fails WCAG 1.3.1 (ACT bc4a75).