This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
# GPUI accessibility and input probe
|
||||
|
||||
This independent workspace answers one narrow question: can the GPUI version
|
||||
currently used by Zed expose the minimum semantic tree Lumbridge needs for a
|
||||
workspace and terminal pane, while accepting real platform IME input?
|
||||
|
||||
## Reproducibility
|
||||
|
||||
- Upstream: `https://github.com/zed-industries/zed`
|
||||
- Commit: `ce48461eaadd16c65c31f835511ab96bd3b6e746`
|
||||
- GPUI license at this commit: Apache-2.0
|
||||
- Rust: 1.97.1, matching the upstream `rust-toolchain.toml`
|
||||
|
||||
Both `gpui` and `gpui_platform` are pinned to the full commit. This directory is
|
||||
an independent Cargo workspace, so its toolchain and dependency graph do not
|
||||
change Lumbridge's root MSRV or release graph.
|
||||
|
||||
## Semantics under test
|
||||
|
||||
The rendered tree contains:
|
||||
|
||||
- an application named `Lumbridge accessibility probe`;
|
||||
- a stable, externally identifiable `Region` named `Lumbridge workspace`;
|
||||
- a stable, focusable `Pane` named `Local terminal pane`;
|
||||
- `selected = true` on the pane;
|
||||
- real GPUI keyboard focus tracked on the pane;
|
||||
- the description `Needs input: choose whether to run the proposed command`;
|
||||
- a `Terminal` child named `Terminal output` for the pane's content.
|
||||
|
||||
Current GPUI exposes these through its AccessKit integration using `role`,
|
||||
`accessibility_id`, `aria_label`, `aria_description`, `aria_selected`,
|
||||
`focusable`, and `track_focus`. The deterministic unit test checks the exact
|
||||
AccessKit role and properties. The binary compile-checks GPUI's element wiring;
|
||||
a platform screen reader remains necessary for end-to-end AT-SPI/VoiceOver
|
||||
validation.
|
||||
|
||||
## Input and IME proof
|
||||
|
||||
The focused pane also installs a real `ElementInputHandler<ImeTextReceiver>`
|
||||
during element paint. `ImeTextReceiver` implements GPUI's
|
||||
`EntityInputHandler`, including text queries, UTF-16 selection, marked-text
|
||||
composition, replacement, unmarking, selection updates, editable length, and
|
||||
IME candidate bounds. This is the code path GPUI's platform adapters call for
|
||||
composed operating-system text input.
|
||||
|
||||
The backing buffer stores UTF-8 only at valid scalar boundaries and translates
|
||||
the platform's UTF-16 ranges before mutation. Deterministic tests cover:
|
||||
|
||||
- replacing a selected decomposed `e` plus combining acute accent with `é`;
|
||||
- a marked decomposed-accent IME composition and commit;
|
||||
- inserting, selecting, and replacing the multi-codepoint grapheme `👩🏽💻`;
|
||||
- collapsed selection placement after every replacement.
|
||||
|
||||
These tests prove range conversion and composed-text preservation without
|
||||
splitting UTF-8. An actual keyboard IME on X11/Wayland and macOS remains an
|
||||
end-to-end platform test, not a unit-test claim.
|
||||
|
||||
## Commands
|
||||
|
||||
```bash
|
||||
cargo check --locked
|
||||
cargo test --locked
|
||||
cargo clippy --locked --all-targets -- -D warnings
|
||||
```
|
||||
|
||||
The first command installs the pinned Rust toolchain if rustup does not already
|
||||
have it and downloads Zed's GPUI dependency closure.
|
||||
|
||||
On Ubuntu hosts that have only the runtime libraries, checks work with
|
||||
`RUST_FONTCONFIG_DLOPEN=1`. Linking a test or binary additionally needs the
|
||||
unversioned linker names normally installed by `libxcb1-dev`,
|
||||
`libxkbcommon-dev`, and `libxkbcommon-x11-dev`. The amd-server validation used
|
||||
temporary symlinks under the ignored `target/native-libs` directory and set
|
||||
`LIBRARY_PATH` to that directory; no system packages or root files changed.
|
||||
|
||||
## Observed local cost
|
||||
|
||||
On amd-server, the first successful check required roughly 90 seconds after
|
||||
installing/fetching, with some Cargo-cache contention from concurrent work. The
|
||||
lockfile contains 691 packages. After check, test, Clippy, and a debug build,
|
||||
the isolated target directory was 4.4 GiB and the debug binary was 535 MiB. The
|
||||
minimal Rust 1.97.1 toolchain occupies 624 MiB. These are development costs, not
|
||||
optimized release measurements.
|
||||
Reference in New Issue
Block a user