Workers P3-Endprüfung W3: Fokus kehrt nach dem Anhalten auf den Knopf der Leiste zurück

Der Dialog schloss im selben Takt, in dem pausing den Knopf der Leiste sperrte; useDialogFocus
konnte den Fokus deshalb nicht zurückgeben, und er blieb für Tastatur- und Screenreader-Nutzer
dauerhaft auf <body>. Das Board setzt ihn jetzt selbst, sobald pausing endet (auch nach einem
Fehler), und nur dann, wenn der Fokus verloren ist. Der Prüfstand-Check (Szenario I) ist grün.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-18 10:42:13 +00:00
1 parent f6099938d8
commit 20f51c6584
2 files changed
+40 -2

No files matched your search

+22
View File
@@ -126,3 +126,25 @@ test('WorkersBoard: „Alles anhalten“ öffnet erst einen Bestätigungsdialog,
assert.equal((s.match(/<Button\b/g) || []).length, (s.match(/<Button\b[^>]*type="button"/g) || []).length)
assert.doesNotMatch(s, /window\.confirm|confirm\(/)
})
// Endprüfung P3 (W3): Nach „Anhalten“ schließt der Dialog im selben Takt, in dem pausing beginnt und den Knopf der Leiste sperrt;
// useDialogFocus kann den Fokus dann nicht zurückgeben (focus() auf einem gesperrten Knopf tut nichts) und er bliebe auf <body>.
// Das Board gibt ihn deshalb selbst zurück, sobald pausing endet. Das echte Verhalten prüft der Prüfstand (shot.cjs, Szenario I).
test('WorkersBoard: der Fokus kehrt nach dem Umschalten auf den Knopf der Leiste zurück, sobald er wieder bedienbar ist (W3)', () => {
const s = read('WorkersBoard.jsx')
assert.match(s, /const toolbarRef = useRef\(null\)/); assert.match(s, /const refocusPauseRef = useRef\(false\)/)
assert.match(s, /<div className="wk-toolbar" ref=\{toolbarRef\}>/)
assert.match(s, /<Button type="button" onClick=\{requestPause\} disabled=\{pausing\} data-wk-pause>/)
// die Markierung wird vor setPausing(true) gesetzt, der Fokus erst im Effekt nach dem Ende von pausing (sonst wäre der Knopf noch gesperrt)
assert.match(s, /if \(pausing\) return\s*refocusPauseRef\.current = true\s*setPausing\(true\)/)
const effect = s.match(/useEffect\(\(\) => \{\s*if \(pausing \|\| !refocusPauseRef\.current\) return([\s\S]*?)\}, \[pausing\]\)/)
assert.ok(effect, 'Effekt mit [pausing]')
assert.match(effect[1], /refocusPauseRef\.current = false/)
// nur wenn der Fokus verloren ist (auf <body> oder nirgends): wer inzwischen woanders ist, wird nicht gestört
assert.match(effect[1], /const active = document\.activeElement\s*if \(active && active !== document\.body\) return/)
assert.match(effect[1], /toolbarRef\.current\?\.querySelector\('\[data-wk-pause\]'\)/); assert.match(effect[1], /button\.focus\(\)/)
// Hook vor der frühen Rückgabe
assert.ok(s.indexOf('[data-wk-pause]') < s.indexOf('if (!loaded || !state)'))
// das Gesperrt-Sein des Knopfes bleibt (kein Doppelklick während der Anfrage)
assert.match(s, /disabled=\{pausing\}/)
})