Observed at gpui-component rev 94a313a (v0.6.0 line). Possibly reworked by v0.6.6 (.role(...) became RoleOverride in input.rs) — see question at the end.
Input renders a focusable frame whose handle is distinct from the text editor's:
let frame_focus_handle = window
.use_keyed_state(("input-frame-focus", state.entity_id()), cx, |_, cx| cx.focus_handle())
.read(cx)
.clone();
...
BaseInput::new(("input", state.entity_id()))
.focused(focused)
.track_focus(&frame_focus_handle) // ← Tab lands here
.role(accessibility_role) // painted on the builder…
Live observations (headless sway, Linux/accesskit-unix):
- Tab moves focus to the frame handle, and gpui logs "focused element (FocusId(..)) has no accessibility node (it has an id but no role)" — i.e. despite
.role(accessibility_role) on the builder, the painted node either isn't produced for the frame or isn't bound to frame_focus_handle, so focus resolves to nothing (nodes.focus unset; the debug dump reports gpui_focus: null; AT announces the whole window).
- Mouse click into the text focuses the editor's presentation handle — which nothing paints
track_focus for — and the same warning fires; the node's focused flag only comes from the contains_focused fallback.
So a text input in the tab chain behaves as a "focus without node" gap: keyboard focus lands, but no accessibility node represents it.
Ask: make the frame's painted node bound to frame_focus_handle carry the input role/name (so focus maps), or otherwise expose a node for whichever handle receives focus. If this is already fixed on main / in v0.6.6 by the RoleOverride rework, a pointer to the commit would be appreciated and we'll pick it up at our next rev bump.
Observed at gpui-component rev
94a313a(v0.6.0 line). Possibly reworked by v0.6.6 (.role(...)becameRoleOverrideininput.rs) — see question at the end.Inputrenders a focusable frame whose handle is distinct from the text editor's:Live observations (headless sway, Linux/accesskit-unix):
.role(accessibility_role)on the builder, the painted node either isn't produced for the frame or isn't bound toframe_focus_handle, so focus resolves to nothing (nodes.focusunset; the debug dump reportsgpui_focus: null; AT announces the whole window).track_focusfor — and the same warning fires; the node'sfocusedflag only comes from thecontains_focusedfallback.So a text input in the tab chain behaves as a "focus without node" gap: keyboard focus lands, but no accessibility node represents it.
Ask: make the frame's painted node bound to
frame_focus_handlecarry the input role/name (so focus maps), or otherwise expose a node for whichever handle receives focus. If this is already fixed on main / in v0.6.6 by theRoleOverriderework, a pointer to the commit would be appreciated and we'll pick it up at our next rev bump.