aria-required-parent false positive for native <option role="option"> inside <select>
Product
axe-core
Product Version
4.12.1
Latest Version
- I have tested the issue with the latest version of the product
Issue Description
Expectation
Native <option> elements inside a native <select> should not fail aria-required-parent, even when they include an explicit role="option".
Browsers already expose options through the native control’s accessibility tree (combobox with internal/slotted listbox ownership). The required parent context for option is provided by the UA, not by a DOM ancestor with role="listbox" or role="group".
Actual
axe reports aria-required-parent (critical) on each <option role="option"> inside a single-select <select>.
Axe maps single-select <select> to implicit role combobox, then treats explicit role="option" as requiring a DOM parent of listbox or group. Walking the DOM parent chain finds combobox, so the rule fails.
Removing the redundant role="option" attributes makes the violation disappear, which shows the failure is driven by the explicit role + DOM walk, not by a real missing listbox relationship in the accessibility tree.
How to Reproduce
Fails:
<!DOCTYPE html>
<html lang="en">
<body>
<select aria-label="Select a timeframe">
<option value="current" role="option" selected>Current</option>
<option value="previous" role="option">Previous</option>
</select>
</body>
</html>Result with axe-core 4.12.1: 2 × aria-required-parent on the
Passes (same markup without explicit roles):
<!DOCTYPE html>
<html lang="en">
<body>
<select aria-label="Select a timeframe">
<option value="current" selected>Current</option>
<option value="previous">Previous</option>
</select>
</body>
</html>Result: no aria-required-parent violations.
Additional context
- Explicit
role="option"on native<option>is redundant / generally invalid authoring (allowedRoles: false), but classifying it as a missing required parent is still a false positive for native<select>. - Suggested fix: skip aria-required-parent for
<option>/<option role="option">when owned by a native<select>, or treat native<select>as providing the required listbox context for its options. - The rule should continue to catch orphan custom
role="option"widgets that are not inside a real listbox / group.
Source: dequelabs/axe-core