关于 Chromium 浏览器多行文本框末尾空行朗读异常的现状及临时解决方案
大家好,我是 Eureka。
近期在 Chrome、Edge 等基于 Chromium 内核的浏览器中,出现了一个影响屏幕阅读器用户日常输入体验的问题:在多行文本框末尾换行时,屏幕阅读器可能会出现朗读异常。
目前该问题已成功定位,向上游提交的修复CL也已正式合入。简单分享一下排查过程、当前情况及临时缓解方案。
问题现象与影响范围
- 现象:在 Windows 下使用 NVDA 等屏幕阅读器编辑网页多行文本框(
<textarea>)时,如果末尾留有换行(例如敲回车产生空行),当按方向下键移动到该空行时,屏幕阅读器无法正常朗读“空白”,而是会错误地朗读上一行的第一个字符。 - 影响版本:该异常最早出现在 Chromium 快照版本
151.0.7890.0。此前 NVDA 社区 Issue #20758 中已有用户在 Edge 152.0.4191.53 下遇到了该情况。我创建的 Chromium 追踪 Issue:Chromium Issue 554925229。 - 补充说明:此问题主要源自底层 IAccessible2 接口行为变更。部分读屏软件若未受影响,是因为在行边界(Line Boundary)的查询实现上有所不同。
技术根源
溯源后发现,问题出在 Chromium 上游的一项提交(CL 7875830: textarea: Always add a placeholder break to empty elements)。
该改动的初衷是避免空文本框向无障碍树(a11y tree)暴露多余的占位符,因此给空占位符打上了 aria-hidden="true"。但由于 Chromium 内部同样使用“占位符机制”来处理文本框末尾的最后一个换行,导致末尾的换行符也被误加了 aria-hidden,最终引发了读屏软件在获取行内容时的错乱。
顺带聊一句:Chromium 的自动化测试其实很全面,从代码来看,原有的单元测试完全足以拦下这个 Bug……
排查过程
由于引入问题的提交已经合入主分支一段时间,要在海量提交中准确定位,我用 Chromium Snapshot 做了二分排查。
排查时顺手让 AI 帮写了个自动化的二分测试脚本,跑了几十个 snapshot,大大提升了效率:
- 自动拉取对应版本的 Windows 构建产物并解压;
- 隔离独立 profile,带上指定参数拉起浏览器;
- 自动打开测试 demo,根据我的测试反馈决定下一步的二分走向。
最终,脚本把范围收敛在 151.0.7889.0(正常)到 151.0.7890.0(异常)之间。仔细查看这几个版本间的 Diff 与提交日志后,不难定位源头 CL。
修复进展与临时方案
我提交的修复补丁 CL 8314231 已于 9 月 11 日正式合入 Chromium,首个包含该修复的 Canary 版本为 155.0.8053.0。之后会随着各浏览器的常规版本迭代逐步推送。
在包含修复的版本推送到稳定版之前,如果该问题比较影响日常使用,可以通过修改浏览器快捷方式属性,在“目标”路径末尾追加以下启动参数来临时规避:
--disable-blink-features=TextAreaEmptyPlaceholderBreak
大家如果在日常使用中还遇到了 Chromium 的相关问题,欢迎通过各种方式告诉我!