fix(apple): type a text-entry-trait element as a text input in the simulator AX tree
Summary
The Simulator AX snapshot typed a custom-drawn iOS text input as a non-editable Other, while the XCTest snapshot types the same element TextView with editable: true. A Compose Multiplatform 1.12 BasicTextField reports automation type Other, but its traits word (140746078552064) carries text entry (bit 18) and text area (bit 47). XCTest types from those bits, and now the bridge decoder does too, for an Other only: text entry gives TextField, plus secure text field (bit 24) SecureTextField, search field (bit 10) SearchField, or text area (bit 47) TextView. interpretIosNode then marks the input editable.
Clients that check editable (e2e's fill and its agent's view of the screen) treated these fields as non-inputs. That failed the tester-army/e2e Kotlin Multiplatform nightly on iOS.
4 files: tree.ts, tree.test.ts, an amendment to ADR 0004 next to the tab-button trait rule, and a changeset.
Validation
Tested at ce8afdf on base b396bd0.
-
vitest run packages/platform-apple packages/capture-kit: 350 files and 3324 tests pass.pnpm lintpasses. -
pnpm check:affected --run --headfails attypecheckwithCannot find name '__OWNER_FILES__'incommand-registry/src/registry.ts. The same error happens onb396bd0in this checkout. It isn't from this change. -
Live run on an iPhone 18 Pro simulator with iOS 27, using
bin/agent-device.mjsfrom this build. The run used theexamples/with-kotlin-multiplatformapp from tester-army/e2e. Thenamefield on the bridge route (withpid) changed:- base:
type: Other, noeditable - head:
type: TextView,editable: true
The e2e iOS suite passes 5 of 5 against this build.
- base:
-
Not run: device lanes and coverage; CI owns them.