angular / angular/components

bug(a11y): FocusTrap doesn't match browser/spec tab order in relation to Shadow DOM

未关闭
#32,265 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
area: cdk/a11y P3
主要语言
TypeScript
星标
25k
派生
6.8k
平均合并
1 天 8 小时
30 天内合并 PR
91

描述

_EDIT: Removed the regression questions, it's not a regression_

### Description

A project I work with uses a component library based on https://lit.dev with `CUSTOM_ELEMENTS_SCHEMA`. They sometimes have regular, tabbable elements (``, ``) in their Shadow DOM and participate in the browser tab order as expected.

However, the CDK `FocusTrap` machinery and the `_getFirstTabbableElement` / `_getLastTabbableElement` don't quite consider enough of the [sequential focus navigation]. That means that focus trapping in a dialog only works it there's at least one *focusable area* not in a Shadow DOM.

For performance reason, I don't think it's necessary to build up the full [sequential focus navigation order]. It'd probably be sufficient to use the [`"DOM"` selection mechanism](https://html.spec.whatwg.org/multipage/interaction.html#selection-mechanism-dom) i.e. find the first/last [suitable sequentially focusable area] element in [shadow including tree order] (host - shadow dom - light dom).

[shadow including tree order]: https://dom.spec.whatwg.org/#concept-shadow-including-tree-order
[suitable sequentially focusable area]: https://html.spec.whatwg.org/multipage/interaction.html#suitable-sequentially-focusable-area
[sequential navigation search algorithm]: https://html.spec.whatwg.org/multipage/interaction.html#sequential-navigation-search-algorithm
[sequential focus navigation]: https://html.spec.whatwg.org/multipage/interaction.html#sequential-focus-navigation
[sequential focus navigation order]: https://html.spec.whatwg.org/multipage/interaction.html#sequential-focus-navigation-order

### Reproduction

StackBlitz link: https://stackblitz.com/edit/components-issue-starter-2e9thbl6?file=src%2Fmain.ts
Steps to reproduce:
1. Click in the preview window, preferably somewhere in the top part of the red area.
2. Tab to see the focus (outline) on the button in the red area
3. Tab to see the focus on the hidden trap element
4. Tab to see the focus (outline) on the button in the blue area
5. Keep Tabbing to see the focus actually get trapped

### Expected Behavior

The focus should remain trapped in the red area

### Actual Behavior

The focus moves past the red area, to an invisible item and then only gets trapped in the blue area.

### Environment

- Angular: 19, 20
- CDK/Material: 19, 20
- Browser(s): Edge, Firefox
- Operating System (e.g. Windows, macOS, Ubuntu): Windows 11 Enterprise

贡献指南

打开贡献指南

调研方向

先从 CDK FocusTrap 机制及其 _getFirstTabbableElement/_getLastTabbableElement 方法入手,然后使用链接的 StackBlitz 示例重现该行为。将遍历过程与 shadow-including tree order 进行比较,并验证焦点保持在红色的 trap 区域内,而不是穿过隐藏的 trap 元素移动。

由索引模型根据 Issue 内容生成。

评估

技术栈
angular, typescript
领域
accessibility, frontend
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
45/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。