Remove timing assumptions from browser tests
The browser lane failed twice in a row on tests that were correct and only assumed an idle runner: #546 counted animation frames under a 1500 ms wall-clock deadline, and #544 pressed Enter before an asynchronous load had landed. Both fixes were test-only, and the same shapes were still in the tree, so this removes the class instead of the next instance.
tests/browser/wait.js adds until() and animationsFinished(), which wait for the observable state and keep a 30 s timeout only as the backstop that names what hung. floor-capture, token-requests, the drawer test and the restore-starter colour wait now use them. A new portable gate, scripts/check-test-timing.mjs, rejects a wall-clock bound held in a deadline-like variable and a fixed sleep with no comment saying what it outwaits, so a new one cannot land unannounced. The four sleeps that remain are commented: absence proofs, a real-time throttle, and frame pacing. scripts/browser-stress.sh repeats test files under busy loops, keeps a failing run's output, and refuses counts that would run nothing and still report a pass. Both tools have unit tests.
tests/web/pool.rs and tests/web/recording.rs only widen limits on the path where the test would otherwise fail; every wait still returns as soon as its condition holds, and the assertion that the production body deadline does not fire early is unchanged.
Verified at the rebased head: ./scripts/test.sh portable and ./scripts/test.sh browser exit 0 (2259 browser tests pass), the touched suites pass 15 runs under 48 busy loops, and breaking the lint's bound rule or the stress script's count check fails its tests. The Rust change was not built here because this machine has no clang for webrtc-sys, so the rust lane is the first build of it.
Summary by cubic
Removes timing assumptions from browser tests that failed on loaded CI runners, so tests now wait on observable state instead of assuming an idle machine. The Rust test changes were not built here, so the rust lane is their first build.
New Features
tests/browser/wait.jsaddsuntil()andanimationsFinished(), both raced against a 30 s backstop that names what hung.scripts/check-test-timing.mjsrejects any new wall-clock bound in a deadline-like variable and any sleep over 50 ms without a comment saying what it outwaits.scripts/browser-stress.shrepeats test files under busy CPU loops, keeps a failing run's output, and refuses counts that would run nothing.
Bug Fixes
floor-capture,token-requests, the drawer test, and the restore-starter colour wait now use the new helpers.- The four remaining sleeps are commented as absence proofs, a real-time throttle, or frame pacing.
tests/web/pool.rsandtests/web/recording.rswiden limits only on failure paths; the assertion that the production body deadline does not fire early is unchanged.