Refresh browser tests and recover Firefox tab announcements

Bring the fragmented-line browser fixture into agreement with current browse
navigation. Rich editors are read through their text descendants, so Down from
the preceding heading must read "Review the code." directly. Remove the stale
empty editor-control stop while retaining forward and reverse line navigation,
character and word movement, Read All, and inline Braille-routing assertions.

Fix Firefox's missing announcement when creating a second tab. Firefox can emit
selection events before the new tab enters its accessible child list, causing
the native selected-child lookup to return nothing. Use the subsequent
child-added event only when its target is a live, freshly selected browser-chrome
tab with the emitting tab list as its direct parent. Keep document-authored tabs
and unselected background additions excluded, retain foreground filtering and
tab-identity deduplication, and release native references on the GLib owner.

Normalize child-added origin suffixes such as :system before event dispatch,
preserving the original native type in diagnostics. Rename the shared mutation
normalizer to reflect its expanded scope and update its callers, including the
Pidgin insertion check. Extend the normalization regression to cover child
additions and reject unrelated event names. Firefox keeps its normal animations
and all existing tab-announcement and address-editing assertions.

Make private-session teardown tolerate the document portal's asynchronous FUSE
unmount after D-Bus exits. Retry only ENOTCONN and EBUSY cleanup failures for at
most five seconds. Keep unrelated errors and persistent mount failures visible.
Add regressions for transient teardown, preservation of a failing child's exit
status, unrelated cleanup errors, and the cleanup deadline. Runtime directories
and accessibility buses remain private, with no init-system dependency.

Update browser verification notes and the parity ledger with the fixes, evidence,
regression risks, and concrete live acceptance procedures.

Validation:
- All 33 Chromium browser proofs passed in the final combined run.
- Firefox baseline and tab checks passed repeatedly with normal animations.
- All eight private-session isolation and cleanup regressions passed.
- AT-SPI, app, and review package race suites passed during development; focused
  race regressions passed again after the final event-normalization change.
- Go vet passed for internal/atspi, internal/app, and internal/review.
- A separate reader binary built successfully.
- Parity-ledger validation passed for 75 rows; git diff --check passed.
This commit is contained in:
Storm Dragon committed 2026-11-03 02:38:59 -05:00
1 parent 7ec6e4ccaf
commit 89686fa029
11 files changed
+199 -24

No files matched your search

+51 -3
View File
@@ -58,11 +58,12 @@ The final `live-atomic` run also verifies that busy completion requires no new t
insertion. It covers atomic text updates, atomic child additions, non-atomic
updates, suppression while busy, and release after busy becomes false.
Firefox baseline reading passed. Its tab regression timed out on the second
At the original review, Firefox baseline reading passed. Its tab regression timed
out on the second
“New Tab” announcement in both the modified checkout and an untouched `bf4b9d7`
snapshot. The recorded events include a selected-state event for the previous
unselected tab. This is an unresolved existing/provider case, not a verified
regression introduced by these changes.
unselected tab. That failure predated the changes reviewed here. The browser-test
maintenance below addresses it without relaxing the announcement assertions.
The affected `go vet` checks, normal reader build, BrlAPI helper build, Python
syntax check, parity-ledger validation and whitespace check passed. No installed
@@ -90,6 +91,53 @@ go vet ./internal/atspi ./internal/review ./internal/app
go run ./cmd/parityledger validate testdata/parity-ledger.csv
```
## Browser-test maintenance (2026-11-03)
The fragmented-line fixture expected an empty editor-control stop before its
first text line. Current browse navigation and its unit regression deliberately
descend directly into rich-editor text. The native fixture now requires that same
sequence, retaining forward/backward reading, character/word movement, Read All
and inline Braille-routing checks.
Firefox can emit tab selection before the new tab enters its accessible child
list. Its later child-added event exposes the selected tab. The native adapter
now recognizes that event only for a live, freshly selected browser-chrome tab
whose parent matches the emitting tab list. Document-authored tabs and unselected
background additions do not qualify. Existing foreground checks and tab-identity
deduplication still apply. Child-added origin suffixes such as `:system` are
normalized before dispatch, with the original native type retained in diagnostics.
The browser profile keeps its normal animations; the tab test still requires an
announcement for each creation, switch and close, without duplicate announcements
or automatic address-rewrite speech.
Private-session cleanup now waits up to five seconds for a document portal's
FUSE mount to disappear after D-Bus exits. Only disconnected/busy cleanup errors
are retried; unrelated errors and a persistent mount still fail the run. The
isolation regressions also verify that retries preserve a failing child test's
exit status.
All 33 Chromium proofs passed in the final combined run, and Firefox baseline
and tab checks passed in repeated runs with normal animations. Eight private-
session regressions, focused package race tests, affected-package vet checks and
a separate reader build passed. An earlier Chromium run failed generated-link
Read All with “accessible children require recapture”; its isolated and final
combined reruns passed. That intermittent failure's cause is not established.
```sh
python3 -B tests/test_native_test_session.py
CTHULHU_NATIVE_BROWSER_TESTS=fragments,tabs,linkedheadings,selection,modes,live,live-atomic python3 tests/native_browser.py
python3 tests/native_firefox.py
```
For live acceptance, create two Firefox tabs in quick succession, switch between
them, then close them. Each action should announce the newly selected tab once;
editing and deleting text in the address bar must still speak. Open a link in a
background tab and check that its creation does not announce a tab switch. Check
page-authored ARIA tabs and an ordinary GTK notebook retain their own behavior.
In `tests/browser-fragments.html`, navigate to “Embedded suggestion”: Down should
read “Review the code.” immediately, followed by “Report actionable issues.” and
“After the suggestion.” Check reverse navigation, Read All and Braille routing.
## Human acceptance before submission
Review the generated diff under the project's AI-assisted contribution policy.