Skip to content

Input: focused frame handle has no accessibility node — Tab/click focus resolves to nothing (Role::TextInput not bound to frame_focus_handle) #3183

Description

@noosxe

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions