ENG-1725: Test 1044 False Positives on separator Elements Without tabindex

Bug (ENG-1725): Access Engine test 1044 evaluates elements with the separator role (explicit role="separator" and the implicit role of <hr>). The rule incorrectly required value semantics (aria-valuenow, and typically aria-valuemin/aria-valuemax) on every separator. Plain, non-focusable separators were flagged for "missing aria-valuenow" even though they are purely static dividers — a false positive.

Impact: Practically every <hr> and every decorative role="separator" divider on a page got flagged, drowning real issues in noise.

Test Logic:

Common Scenarios:

Cross-reference (Test 1044):

The canonical/companion engine fixture for Access Engine Test 1044 is aria-values.html ("ARIA Values Examples - Test 1044"). This page provides additional manual scenarios not covered there — plain <hr> dividers, hidden / role="presentation" separators, and real-world splitters and menus. Note: after ENG-1725 a focusable separator (role="separator" with a non-negative tabindex) that has aria-valuenow but is missing aria-valuemin or aria-valuemax is a PASS — the engine no longer flags missing bounds. The aria-values.html cases that still treat missing aria-valuemin/aria-valuemax as a FAIL (ids fail-1044-2, fail-1044-3) document the pre-ENG-1725 behavior and need a separate follow-up to align them with this fix.

Note — different rule: This is a different rule from the monitoring fixture test044.inc, which validates the roles permitted on <hr>, not separator value semantics. Do not conflate the two.

Fix: Two changes. (1) Applicability now requires a real, focusable tabindex — present, non-empty, and non-negative (e.g. tabindex="0"); separators with no tabindex, an empty tabindex, or a negative one fall out of scope. (2) For the in-scope focusable separators, only aria-valuenow is required (per ARIA 1.2/1.3); aria-valuemin/aria-valuemax are no longer required because the engine relies on their spec defaults of 0/100.

applicable = role==="separator" && tabindex !== "" && Number(tabindex) >= 0; fail = applicable && !separator.hasAttribute("aria-valuenow");

Engine selectors: applicability [tabindex]:not([tabindex=""]):not([tabindex^="-"]) applied to two clauses — explicit [data-ae_ar="separator"] (i.e. role="separator") and implicit-role hr[data-ae_ar="null"] (an <hr> with no overriding explicit role); failure adds :not([aria-valuenow]) to each clause. The <hr> clause was added in ENG-1725 so focusable <hr> separators are covered (the engine derives data-ae_ar only from an explicit role attribute, so a bare <hr> has data-ae_ar="null"). Non-focusable <hr> and role="separator" dividers are out of scope and are no longer flagged.
N/A — not in scope of test 1044
PASS — correctly not flagged after fix
FAIL — correctly still flagged (regression guard)
BUG repro — flagged pre-fix, not flagged post-fix

N/A Tests — Out of Scope for Test 1044

Hidden separator (display:none) — id="na-hidden-sep"

A horizontal rule that is not rendered.

Element is not rendered, so it is excluded from evaluation regardless of focusability or value attributes. Should not be flagged.

Element that is not a separator — id="na-not-separator"

A generic region, not a separator. No separator role anywhere.

No separator role (explicit or implicit). Test 1044 does not apply. Should not be flagged.

Separator role overridden away — id="na-role-overridden"

An <hr> whose implicit separator role is removed via role="presentation".

With role="presentation" the element no longer maps to the separator role, so test 1044 does not evaluate it. Should not be flagged.

PASS Tests — Correct Behavior After Fix

Note on outcomes: "PASS" here means correctly not flagged after the fix. Two distinct engine outcomes land in this bucket: the focusable splitters that expose aria-valuenow are genuine pass results (applicable and satisfy the rule), while the non-focusable separators (plain <hr>, role="separator" dividers, menu separators) fall outside applicability and the engine returns na for them — they are grouped here because they are the core false-positive targets of ENG-1725.

Plain <hr> divider — id="pass-plain-hr"

Section one of the content.


Section two of the content.

Implicit separator role, no tabindex → non-focusable static divider. Value semantics NOT required. Should not be flagged (post-fix).

<div role="separator"> with NO tabindex and no value attrs — id="pass-div-sep"

Above the divider.

Below the divider.

Explicit separator, non-focusable (no tabindex), no value attributes. As a static divider it needs none. Should not be flagged (post-fix).

Menu separator <li role="separator"> without tabindex — id="pass-menu-sep"

Separator used to divide menu groups, no tabindex → non-focusable. No value semantics required. Should not be flagged (post-fix).

Focusable splitter with full value semantics — id="pass-focusable-splitter"

Left pane
Right pane

Focusable separator (tabindex="0") acting as a splitter, with aria-valuenow, aria-valuemin, aria-valuemax and aria-orientation. Fully satisfies the requirement. Should not be flagged.

Focusable splitter, horizontal orientation, full value semantics — id="pass-horizontal-splitter"

Top pane
Bottom pane

Focusable horizontal splitter with complete value semantics and explicit orientation. Should not be flagged.

Focusable splitter with aria-valuenow only (no min/max) — id="pass-focusable-no-minmax"

Left pane
Right pane

Focusable separator that exposes aria-valuenow but omits aria-valuemin/aria-valuemax. Per ARIA 1.2/1.3 only aria-valuenow is mandatory; the bounds default to 0/100, and post-ENG-1725 the engine relies on those defaults. Should not be flagged. (Regression guard for the simplified aria-valuenow-only failure condition.)

Multiple plain <hr> dividers on one page — id="pass-multi-hr"

Paragraph A.


Paragraph B.


Paragraph C.

Each <hr> is non-focusable. Pre-fix this is exactly the pattern that produced many false positives; post-fix none should be flagged.

FAIL Tests — Correctly Still Flagged (Regression Guard)

Focusable separator MISSING aria-valuenowid="fail-focusable-no-valuenow"

Left pane
Right pane

Focusable separator (tabindex="0") behaves as a slider but has no aria-valuenow. The fix must keep flagging this. Should still be flagged.

Focusable separator with no value attributes at all — id="fail-focusable-bare"

Left pane
Right pane

Focusable separator (tabindex="0") with no value attributes at all — in particular no aria-valuenow. This is the worst case the rule is meant to catch. Should still be flagged.

Focusable <hr> (implicit separator) missing value semantics — id="fail-hr-focusable"

Above the focusable rule.


Below the focusable rule.

An <hr> with tabindex="0" is a focusable separator and therefore subject to the value-semantics requirement. With none present, it should be still flagged. (Confirms the fix keys off focusability, not the tag.)

BUG Reproduction — Flagged Pre-Fix, Not Flagged Post-Fix

Plain <hr> (the original false positive) — id="bug-plain-hr"

Intro paragraph.


Following paragraph.

Pre-fix: flagged ❌ for "missing aria-valuenow" even though it is a non-focusable decorative divider. Post-fix: not flagged ✓ (no tabindex → value check skipped).

Non-focusable role="separator" divider — id="bug-div-sep"

Content before.

Content after.

Pre-fix: flagged ❌ for missing aria-valuenow/value attributes. Post-fix: not flagged ✓ (non-focusable separator requires no value semantics).

Menu separator dividing item groups — id="bug-menu-sep"

Pre-fix: flagged ❌ for missing value semantics. Post-fix: not flagged ✓ (non-focusable menu separator is a static divider).

Real-World Scenarios

Resizable two-pane layout with a draggable/focusable splitter — id="rw-resizable-panes"

File tree
  • src/
  • tests/
  • README.md
Editor

Drag the purple handle (or focus it and use arrow keys) to resize.

Real splitter: focusable, with aria-valuenow/valuemin/valuemax and aria-orientation. Correctly satisfies test 1044. Should not be flagged.

Article with decorative <hr> dividers between sections — id="rw-article-dividers"

Release notes

Overview of the release.


New features

Details about new features.


Bug fixes

Details about bug fixes.

Decorative section dividers, none focusable. This is the most common real-world false-positive pattern. Post-fix none should be flagged.

Application menu with role="separator" between groups — id="rw-menu-groups"

Two non-focusable menu separators dividing item groups. No value semantics required. Should not be flagged.

Real splitter that forgot value semantics — id="rw-broken-splitter"

Navigation
Main content

A genuinely buggy draggable splitter: focusable but exposes no aria-valuenow (and no aria-orientation), so screen reader users get no position feedback. The engine flags it specifically for the missing aria-valuenow. Correctly still flagged after the fix.


End of manual test cases for ENG-1725. Summary: non-focusable separators (no tabindex) are out of scope and must not be flagged by test 1044; focusable separators (splitters with a non-negative tabindex) behave as sliders and must expose aria-valuenow — the only attribute the engine requires post-ENG-1725 (aria-valuemin/aria-valuemax default to 0/100 and are not required).