Skip to content

[app-shell] DashboardWidgetInspector 的 Field(id="widget-color") 的 for 悬空 —— ColorVariantPicker 不收 id,颜色 radiogroup 完全无可访问名 #4010

Description

@yinlianghui

发现于 #3997 的实施过程(该单主体是 InspectorComboField,PR 未夹带本条)。未认领,交 PM triage。

机制

DashboardWidgetInspector 用一个本地 Field 包装器给控件命名,约定是「包装器渲染 Label htmlFor={id},被包的控件自己带同一个 id」:

所以 htmlFor="widget-color" 指向一个没有任何元素持有的 id —— 悬空 IDREF。按 #3994 / #3997 的判据这比「没有标签」更糟:工具会报告一个解析不到的关联,静态检查看到 for 存在就以为命名闭合了。

第二层(同一处、更实的一档):ColorVariantPicker 渲染 div role="radiogroup"(color-variant-field.tsx:55),这个 radiogroup 既没有 aria-label 也没有 aria-labelledby。组内每个 radio 各自有 aria-label(颜色名),但组本身完全无名 —— 焦点进组读到的是一个匿名 radiogroup,不知道这组颜色改的是什么;可见的「Color」标签是一段无归属文本。

是不是 dormant

不是。widget-colorField 的无条件分支,打开任一 dashboard widget 检查器即渲染。另外 widgets.tsx:1790PageBlockInspector.tsx:30 也消费 ColorVariantPicker,那两处外层是否也有一个无归属的 Label 没有逐处核过,实施时应一并核。

修法方向(未实施,供分诊)

radiogroup 是容器,不是 labelable 元素,所以 for 指向它本身也不合法(与 #3991 同类:host id 落在不可 label 的元素上不算关联)。两条候选:

  1. ColorVariantPickerariaLabelledBy,Field 把它那个 Label 的 id 传进来,radiogroup 用 aria-labelledby 命名 —— 与 [fields] 只读 / 零选项的 group-labelled 选项 widget 提前 return,groupDomProps 没被展开 —— host label 的 IDREF 没有消费者,标签仍然什么都不命名(#3961 的残留,checkboxes 今天的 main 上就这样) #3990(PR fix(fields): group-labelled widget 的只读/零选项分支也消费 host label 的 IDREF (#3990) #4002)的 group-labelled widget 用 IDREF 命名同构,可见文本即可访问名,单一通道。
  2. ColorVariantPicker 自带 ariaLabel,Field 的可见 Label 不再 for 任何东西 —— 但那把可见文本重新变成无归属文本,只解决了悬空、没解决命名。

倾向 1,但它改的是 Field 包装器的对外形状(目前 Field 的契约是「id 给控件」,IDREF 命名要的是「label 的 id 给控件」),属于 contract-first 该单独定的一步,故只记录不动手。

边界与去重

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