main ab6686c

README.md RawHistoryFolder

HTML browser harness

This development-only Playwright harness verifies the embedded HTML frontend. It loads html/terminal.css and html/browser/terminal.js directly; no production server or transport is involved.

Locked environment

package-lock.json pins Playwright 1.62.1 and these browser builds:

Engine Browser version Playwright revision
Chromium 151.0.7922.34 1234
Firefox 153.0 1538
WebKit 26.5 2336

Run locally when the host supports all browser builds:

npm ci
npm run test:browser:install
npm run test:browser

Use the matching official container on unsupported Linux distributions:

npm run test:browser:docker

CI installs the same locked browsers and runs the full matrix on Ubuntu.

Evidence

The three-engine container matrix passes typed snapshot and row application, hostile-text safety, complete validation before mutation, IME composition, non-text keys, synchronous default-prevention decisions, pointer, wheel, resize, focus, typed themes, lifecycle cleanup, and a self-only script-src/style-src CSP. The CSP fixture uses external static assets and reports no policy violation.

The Chromium reference performance gate applies ten sustained 120×40 snapshots, fifty complete-row updates, and one 240×80 snapshot. The recorded implementation run produced:

Workload Recorded Gate
120×40 snapshot p95 28.2 ms < 100 ms
120-column row replacement p95 0.5 ms < 33 ms
240×80 snapshot 68.3 ms < 500 ms
Final visible cells/rows 19,200 / 80 exactly bounded by the frame

Performance numbers are reference evidence, not universal device guarantees. The functional matrix and serial Chromium performance run write separate JSON reports under test-results/. They are local/CI artifacts rather than committed files.

Accessibility scope

Automated checks cover a named group, a labeled keyboard-focusable text input, visible focus styling, synchronized plain-text output, and reduced-motion CSS. The visual grid is aria-hidden to avoid exposing thousands of fragmented cell nodes; assistive technology receives the bounded plain-text representation. role="application" is not used, browser zoom remains available, and browser or system shortcuts are not prevented unless the synchronous consumer decision requests it.

No claim of full screen-reader equivalence is made. A product consumer should run its own assistive-technology acceptance pass with the surrounding labels, shortcut policy, announcements, and session behavior before presenting the frontend as a complete terminal replacement.

Inherited output limits

The current core model drops combining marks and does not coalesce ZWJ sequences. The harness verifies composed browser input but does not claim that the renderer can recover combining or ZWJ output absent from core.Frame.

source
1# HTML browser harness
2
3This development-only Playwright harness verifies the embedded HTML frontend. It
4loads `html/terminal.css` and `html/browser/terminal.js` directly; no production
5server or transport is involved.
6
7## Locked environment
8
9`package-lock.json` pins Playwright 1.62.1 and these browser builds:
10
11| Engine | Browser version | Playwright revision |
12|---|---:|---:|
13| Chromium | 151.0.7922.34 | 1234 |
14| Firefox | 153.0 | 1538 |
15| WebKit | 26.5 | 2336 |
16
17Run locally when the host supports all browser builds:
18
19```sh
20npm ci
21npm run test:browser:install
22npm run test:browser
23```
24
25Use the matching official container on unsupported Linux distributions:
26
27```sh
28npm run test:browser:docker
29```
30
31CI installs the same locked browsers and runs the full matrix on Ubuntu.
32
33## Evidence
34
35The three-engine container matrix passes typed snapshot and row application,
36hostile-text safety, complete validation before mutation, IME composition,
37non-text keys, synchronous default-prevention decisions, pointer, wheel, resize,
38focus, typed themes, lifecycle cleanup, and a self-only `script-src`/`style-src`
39CSP. The CSP fixture uses external static assets and reports no policy violation.
40
41The Chromium reference performance gate applies ten sustained 120×40 snapshots,
42fifty complete-row updates, and one 240×80 snapshot. The recorded implementation
43run produced:
44
45| Workload | Recorded | Gate |
46|---|---:|---:|
47| 120×40 snapshot p95 | 28.2 ms | < 100 ms |
48| 120-column row replacement p95 | 0.5 ms | < 33 ms |
49| 240×80 snapshot | 68.3 ms | < 500 ms |
50| Final visible cells/rows | 19,200 / 80 | exactly bounded by the frame |
51
52Performance numbers are reference evidence, not universal device guarantees.
53The functional matrix and serial Chromium performance run write separate JSON
54reports under `test-results/`. They are local/CI artifacts rather than committed
55files.
56
57## Accessibility scope
58
59Automated checks cover a named group, a labeled keyboard-focusable text input,
60visible focus styling, synchronized plain-text output, and reduced-motion CSS.
61The visual grid is `aria-hidden` to avoid exposing thousands of fragmented cell
62nodes; assistive technology receives the bounded plain-text representation.
63`role="application"` is not used, browser zoom remains available, and browser or
64system shortcuts are not prevented unless the synchronous consumer decision
65requests it.
66
67No claim of full screen-reader equivalence is made. A product consumer should
68run its own assistive-technology acceptance pass with the surrounding labels,
69shortcut policy, announcements, and session behavior before presenting the
70frontend as a complete terminal replacement.
71
72## Inherited output limits
73
74The current core model drops combining marks and does not coalesce ZWJ
75sequences. The harness verifies composed browser input but does not claim that
76the renderer can recover combining or ZWJ output absent from `core.Frame`.

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 2

Tags 13

↑↓ moveenter openesc close