Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
691f04a
fix tests
ealmloff May 11, 2026
3a576f4
more macos fixes
ealmloff May 11, 2026
895713d
remove non-skylight version
ealmloff May 11, 2026
a89f29a
fix ci
ealmloff May 12, 2026
1c0af45
fix clippy setup
ealmloff May 12, 2026
aa62951
fix calc foreground assertions
ealmloff May 12, 2026
d26dd3a
Fix CI clippy and screenshot test failures
ealmloff May 12, 2026
f12ad14
fix linux clippy
ealmloff May 12, 2026
ddbd7a1
fix chrome support
ealmloff May 12, 2026
af2d60a
Stop release workflow on PRs
ealmloff May 12, 2026
905b7c1
fix chrome visibility
ealmloff May 12, 2026
21996c9
pull out sys crate
ealmloff May 12, 2026
d84399b
pull out more sys libraries
ealmloff May 12, 2026
99ebb22
fix tests
ealmloff May 13, 2026
1dac7f8
split up large files, fix clippy
ealmloff May 13, 2026
de8a62a
Fix iOS sys Linux clippy build
ealmloff May 13, 2026
f2c90d8
Stop caching cargo binaries in CI
ealmloff May 13, 2026
c074695
fix android tests
ealmloff May 13, 2026
62eea13
fix webview apps
ealmloff May 13, 2026
0c10feb
more robust formatting
ealmloff May 13, 2026
98ad516
remove max_elements limit
ealmloff May 13, 2026
6138496
fix recursion limit
ealmloff May 13, 2026
e43e094
fix performance
ealmloff May 13, 2026
f7512ed
more minimal query formatter
ealmloff May 13, 2026
ba1f48f
optimize minimal selector
ealmloff May 13, 2026
cc7fade
batch ipc
ealmloff May 13, 2026
cc777f7
much much faster
ealmloff May 13, 2026
0388a76
faster webview materialization
ealmloff May 18, 2026
1402951
pull out materialziation step
ealmloff May 18, 2026
397e55c
always require a pid on desktop
ealmloff May 18, 2026
4c2ec74
always require pid
ealmloff May 18, 2026
b4aec58
fix clippy
ealmloff May 18, 2026
bc62cdd
Make Android Settings E2E launch check robust
ealmloff May 18, 2026
a3d8fc3
Retry Android UI dumps
ealmloff May 18, 2026
f354eaa
Relaunch Settings while waiting for Android UI
ealmloff May 18, 2026
bcae808
fix hit test with stale windows cache
ealmloff May 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 66 additions & 3 deletions .github/workflows/pr-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ jobs:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
cache-bin: false
- name: Install Linux dependencies
run: |
sudo apt-get update
Expand All @@ -32,15 +34,45 @@ jobs:
- run: cargo test --workspace --lib --bins
- run: cargo test -p accessibility-cli --test cli_smoke

deny:
miri:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- uses: dtolnay/rust-toolchain@nightly
with:
components: miri
- uses: Swatinem/rust-cache@v2
with:
cache-bin: false
- name: Setup Miri sysroot
run: cargo miri setup
- name: Run Miri smoke tests
run: cargo miri test -p accessibility-android-sys --lib

sanitizers:
name: sanitizer (${{ matrix.sanitizer }})
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
sanitizer: [address, thread]
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- uses: EmbarkStudios/cargo-deny-action@v2
- uses: dtolnay/rust-toolchain@nightly
with:
components: rust-src
- uses: Swatinem/rust-cache@v2
with:
command: check advisories bans licenses sources
cache-bin: false
- name: Run sanitizer tests
env:
RUSTFLAGS: -Zsanitizer=${{ matrix.sanitizer }}
ASAN_OPTIONS: detect_leaks=0
run: cargo test -Zbuild-std --target x86_64-unknown-linux-gnu -p accessibility-android-sys --lib

build:
name: build (${{ matrix.target }})
Expand Down Expand Up @@ -69,6 +101,8 @@ jobs:
with:
targets: ${{ matrix.target }}
- uses: Swatinem/rust-cache@v2
with:
cache-bin: false
- name: Install musl-tools
if: contains(matrix.target, 'linux-musl')
run: |
Expand Down Expand Up @@ -119,6 +153,8 @@ jobs:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
cache-bin: false
- name: Install Linux E2E dependencies
if: runner.os == 'Linux'
run: |
Expand Down Expand Up @@ -167,3 +203,30 @@ jobs:
- name: Run Desktop E2E
if: runner.os != 'Linux'
run: cargo test -p accessibility-core --test ${{ matrix.test }} -- --nocapture --test-threads=1

android-e2e:
runs-on: ubuntu-24.04
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
cache-bin: false
- name: Install Linux dependencies
run: |
sudo apt-get update
sudo apt-get install -y libdbus-1-dev libatspi2.0-dev libx11-xcb-dev
- name: Build Android Settings E2E
run: cargo test -p accessibility-core --test settings_android_e2e --no-run
- name: Run Android Settings E2E
uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 35
target: google_apis
arch: x86_64
profile: pixel_6
emulator-options: -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim -no-metrics
script: cargo test -p accessibility-core --test settings_android_e2e -- --ignored --nocapture --test-threads=1
1 change: 0 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ permissions:
# If there's a prerelease-style suffix to the version, then the release(s)
# will be marked as a prerelease.
on:
pull_request:
push:
tags:
- '**[0-9]+.[0-9]+.[0-9]+*'
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@
*.swp
*.swo
*.tmp
/.claude
9 changes: 7 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@ Thanks for your interest in contributing.
cargo build --workspace
```

The workspace contains two crates:
The workspace contains these main crates:

- `accessibility-core` — the cross-platform library (`packages/accessibility-core`).
- `accessibility-cli` — the binary (`packages/accessibility-cli`).
- `accessibility-*-sys` — platform-specific low-level bindings (`packages/accessibility-*-sys`).

## System dependencies

Expand Down Expand Up @@ -81,11 +82,15 @@ cargo test -p accessibility-core --test calculator_windows_e2e -- --nocapture --
cargo test -p accessibility-core --test gnome_calculator_e2e -- --nocapture --test-threads=1

# Android (with `adb` available)
cargo test -p accessibility-core --test settings_android_e2e -- --nocapture --test-threads=1
cargo test -p accessibility-core --test settings_android_e2e -- --ignored --nocapture --test-threads=1
```

CI runs the matching e2e on each platform — see `.github/workflows/pr-build.yml`.

## Hardening checks

CI also runs Miri smoke tests and ASan/TSan smoke tests.

## Style

```sh
Expand Down
97 changes: 83 additions & 14 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 11 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
[workspace]
resolver = "2"
members = [
"packages/accessibility-android-sys",
"packages/accessibility-linux-sys",
"packages/accessibility-macos-sys",
"packages/accessibility-windows-sys",
"packages/accessibility-ios-sys",
"packages/accessibility-core",
"packages/accessibility-cli",
]
Expand All @@ -15,6 +20,11 @@ homepage = "https://github.com/DioxusLabs/accessibility-cli"
[workspace.dependencies]
accessibility-core = { path = "packages/accessibility-core", version = "0.1.0" }
accessibility-cli = { path = "packages/accessibility-cli", version = "0.1.0" }
accessibility-android-sys = { path = "packages/accessibility-android-sys", version = "0.1.0" }
accessibility-linux-sys = { path = "packages/accessibility-linux-sys", version = "0.1.0" }
accessibility-macos-sys = { path = "packages/accessibility-macos-sys", version = "0.1.0" }
accessibility-windows-sys = { path = "packages/accessibility-windows-sys", version = "0.1.0" }
accessibility-ios-sys = { path = "packages/accessibility-ios-sys", version = "0.1.0" }
ab_glyph = "0.2"
accesskit = { version = "0.22", features = ["enumn", "schemars", "serde"] }
anyhow = "1.0.100"
Expand All @@ -33,7 +43,7 @@ quick-xml = "0.37"
selectors = "0.25"
serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1"
serial_test = "3"
serial_test = { version = "3", features = ["file_locks"] }
slotmap = { version = "1.1", features = ["serde"] }
tokio = { version = "1.49.0", features = ["full"] }
viuer = "0.9"
Expand Down
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ Cross-platform accessibility tree reading, querying, screenshots, and input
automation for **macOS**, **Windows**, **Linux**, **iOS Simulator**, and
**Android**.

The repository contains two crates:
The repository contains:

- [`accessibility-core`](packages/accessibility-core) — reusable Rust library
exposing a high-level `App` / `Locator` API and platform accessibility
adapters.
- [`accessibility-cli`](packages/accessibility-cli) — the `accessibility-cli`
command-line interface.
- `packages/accessibility-*-sys` — platform-specific low-level bindings used by
the core adapter.

## Platform support

Expand Down
Loading
Loading