Skip to content

Clarify (1) whether updates made during aria-busy="true" should be announced once busy clears and (2) queue/coalescing expectations for rapid successive live-region updates #2906

Description

@oooasis

Tracker: w3c/aria (new issue, relates to #2154)
Contract: C-06b (DESIGN_INTENT: descriptive aria-busy text implies exposure after busy clears) / C-10 (UNCLEAR)
Environment: Windows 10 19045; NVDA 2026.1.1 (eSpeak; NVDA's UIA-for-Chromium setting = No); Chrome 149.0.7827.54 (CDP-driven); Firefox 155.0.1 (WebDriver BiDi-driven). Data: probe round-2, 2026-09-06, run ids chrome-20260906T123244Z and firefox-20260906T125205Z, 10 fresh navigations per engine per fixture; a formal rerun under the frozen protocol is scheduled for 2026-09-15/16.

Summary

Two points where implementations diverge and the text is silent. (1) After aria-busy clears, is the deferred update expected to be announced? NVDA on both Chrome and Firefox never announces it. (2) Three updates 50 ms apart to the same polite region: with NVDA, Chrome yields 2 announcements and Firefox 3. Related to #2154 (initial content vs updates).

Related entries (searched 2026-09-07)

#2154 (open); #2331 (ariaNotify interrupt, open) for the notification-API side.

Expected

(1) aria-busy: "assistive technologies may want to wait until the modifications are complete before exposing them" — silent on what happens after. (2) No text on coalescing or queue depth for live regions.

Observed

(1) busy-then-clear: 0/10 announced on both engines. (2) triple update at 50 ms: Chrome mode 2 announcements, Firefox mode 3 (10/10 present on both).

Minimal fixture

Open the page, press the button (#go); the message contains a per-run nonce (?nonce= query, fallback literal).

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>PercA11y probe c2-007-l0v0p0a0r0b0u0c2f0n0k0</title>
<meta name="probe-vector" content='{"lifecycle":"pre_existing_empty","visibility":"none","politeness":"polite","atomic":"default","relevant":"default","busy":"none","update_kind":"text_content","cadence":"triple_50ms","focus":"none","container":"light_dom","channel":"live_region"}'>
<meta name="probe-expectation" content="OBSERVED">
<meta name="probe-allowed" content='{"presence":"OBSERVED","count_min":1,"count_max":3,"text_mode":"any_issued"}'>
</head>
<body data-probe="c2-007-l0v0p0a0r0b0u0c2f0n0k0">
<main>
<h1>Probe program c2-007-l0v0p0a0r0b0u0c2f0n0k0</h1>
<h2 id="editor" tabindex="-1">Editor</h2>
<button id="go">Run</button>
<div id="mount"></div>
<script>
var nonce=new URLSearchParams(location.search).get('nonce')||'NONCE0';
var T=function(i){return 'Item '+nonce+'-'+i;};
var OFF=[0,50,100],doc=document,root=null,reg=null;
function region(t,b){var e=doc.createElement('div');e.id='live';e.setAttribute('aria-live','polite');
var s=doc.createElement('span');s.textContent=t;e.appendChild(s);return e;}
function upd(i){var t=T(i);reg.textContent=t;}
function seq(){OFF.forEach(function(d,i){var f=function(){upd(i+1);if(i===OFF.length-1)done();};if(d){setTimeout(f,d);}else{f();}});}
function done(){}
function trigger(){seq();}
function setup(){root=document.getElementById('mount');reg=region('',false);root.appendChild(reg);document.body.setAttribute('data-probe-ready','1');}
addEventListener('load',setup);
document.getElementById('go').addEventListener('click',trigger);
</script>
</main>
</body>
</html>

Provenance

The generated-program vector is in <meta name="probe-vector">. Raw NVDA speech logs, timestamps and evaluation tooling are available on request.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions