关于 Chromium 系浏览器的数学辅助功能接口被破坏到修复的碎碎念

本文首发在 NVDA 中文站微信公众号,以下内容格式略有调整,省略了部分插图,文内链接相较原文更完整。

作者: Eureka 编辑:猫猫

前段时间收到反馈,NVDA 在 Chromium 系浏览器中的数学内容朗读支持无法正常工作了。

经测试确认这是一个回归错误, Google Chrome 130.0.6723.117 表现正常,但未确定该版本是否是最后一个可以工作的版本。

注:Microsoft Edge 和 Google Chrome 都使用同样的 Chromium 内核,所以该 Bug 同样影响 Microsoft Edge 浏览器。

该 Bug 目前已在 Chrome Canary 版本中得到修复,预计包含该修复的稳定版是 Chrome 132+。

有数学内容阅读/书写需求的用户可以暂时使用 Chrome Canary 或 Firefox,以下附上 Firefox 下载地址:
https://www.mozilla.org/firefox/download/thanks/


这个 Bug 从发现到提交反馈到最终修复,笔者几乎参与了全程,一帧未剪的那种。除了问题被解决的喜悦以外,也有一些感慨,特此流水账似的写在这里。

在问题发现之初,为了收到更多社区反馈,我先提交了 NVDA Issue#17421:https://github.com/nvaccess/nvda/issues/17421

NVDA 国际社区的朋友确认问题存在并提供了一些调试信息,其中一位是 mathCat 的开发者 Neil Soiffer,他几乎全程在跟进这个问题。

随后我打开了 Chromium Bug: https://issues.chromium.org/issues/380161205

并且将 Priority 设置为 P0,将 Severity 设置为 S1,以期引起更多关注。

同时与 Chromium 负责 Accessibility 的工程师 Aaron 取得联系。有 13 个小时的时差,所以我必须早起才能抓到他,那天应该是凌晨五点我就爬起来了,当他意识到我在北京的时候也着实震惊了一把 LOL!

不犹豫,直接拉了个会,我和 Aaron 以及一位 Accessibility analyst 开始设法找出引入问题的 Change 并找到问题发生的原因。
初步判断是换行符导致解析失败,彼时已经临近感恩节假期,Aaron 提交了一个 推测性的 Change 尝试修复问题,然而在第二天的 Canary 中问题并未解决。

哎呀!错过等一周!看来之前的假设被推翻了,从头来过:
Accessibility Tree 里看起来一切正常,然而 NVDA 没有在 virtual document 中呈现数学对象,回到日志:

DEBUGWARNING - NVDAObjects.IAccessible.ia2Web.Math._get_mathMl (23:07:25.721) - MainThread (7880):
Error retrieving math. Not supported in this browser or ISimpleDOM COM proxy not registered.
Traceback (most recent call last):
  File "NVDAObjects\IAccessible\ia2Web.pyc", line 339, in _get_mathMl
  File "comtypes\_memberspec.pyc", line 523, in __call__
_ctypes.COMError: (-2147467263, '尚未实现', (None, None, None, 0, None))

这里抛出了个 -2147467263 E_NOTIMPL 为什么呢? Aaron回来后解惑了:

It seems that the issue is that we return E_NOTIMPL from ISimpleDOMNode::get_attributesForNames() now. If it's changed so that we return S_FALSE or S_OK, then the math is spoken as expected. We don't even have to return the attribute, but we can't return an error.
https://issues.chromium.org/issues/380161205#comment20

NVDA 在 NVDAObjects.IAccessible.ia2Web.Math._get_mathMl 中使用了已弃用的非标准属性 data-mathml,且在调用失败时未捕获这个 COMError。

另外一个发现,在以前(引入此回归之前) IA2Attributes 中不包含 'math' 这个 key。
当然,这里的最关键问题就是 Chromium 之前的 Change 做了调整,导致 NVDA 在调用失败时直接停止检索了,进而导致以上函数的行为不符合预期。
比如,我进行了以下更改,NVDA 按预期工作:

            try:
                attr = node.attributesForNames(1, attrNames, namespaceIds)
            except COMError as e:
                if e.hresult == E_NOTIMPL:
                    attr = None
                else:
                    raise

实际上问题清晰了,无论是从 NVDA 一侧修复还是从 Chromium 一侧修复都是可行的,但长远来看 NVDA 应该对此进行改进,为了尽可能减少对用户的影响,Aaron 已经在 Chromium 中发出了 Fix change,目前已进入 Canary 通道。


这件事不禁让我感叹,已经有这么多视障伙伴在使用屏幕阅读器学习数学了,第一个给我反馈的是一位正在读软件工程的本科生,紧接着是一位勤奋的考研人,他表示前两天还好好的,今天就坏掉了……

其次是 mathCat 的开发者 Neil Soiffer 在 Chromium bug 下的 评论

In case it helps light a fire to find a solution... because MathCAT (which I wrote) is the main solution for math in NVDA, I have received many emails and reports that math is broken. The last one was from someone who was desperate because a big test is coming up in his college course. Thankfully Firefox works, so I told him (and the others who contacted me) to switch browsers. I hope it is clear this is a big problem for those who use screen readers. It is hard to imagine that if visual display of some content broke, it would take this long to fix it...

万一有助于激发我们寻找解决方案的热情…… 我编写的 MathCAT 是 NVDA 中阅读数学内容的主要解决方案,因此我收到了许多邮件反馈,大家都反映数学阅读功能出现了故障。最近一封邮件来自一位大学生,他因为即将到来的一场重要考试而感到非常焦虑。幸运的是,Firefox 浏览器还能够正常工作,所以我建议他(以及其他联系我的人)更换浏览器。我希望这足以说明,对于那些依赖屏幕阅读器的用户来说,这是一个非常严重的问题。如果一些内容的视觉显示出现了问题,很难想象修复它会需要这么长的时间……

回想 8 年前台湾的 NVDA 贡献者 tsengwoody 开发了数学朗读插件 Access8math,彼时我可能是第一个大陆用户,兴奋、感恩,参与贡献并努力介绍给更多人知道。这么多年过去了,这些工具实实在在的让更多人从中受益,属实值得开心。

然而即便有了如此可喜的进步,从这件事依然让我觉得无障碍这件事任重道远,辅助技术被破坏往往是不易察觉的,从辅助功能接口到依赖辅助技术的最终用户,整个流程及其脆弱,任何一个环节出现 Bug 就可能意味着有一群人的正常工作无法进行了,而越是接近顶层的技术(如 Accessibility API)越起主导作用。

我画了以下这张图描述从应用程序/操作系统到用户的无障碍信息传递流程:

从应用程序/操作系统到用户的无障碍信息传递流程

这也是我一直在秉持的观点——无障碍的适配 App-by-App 是很难且不易持续的,如果采用自上而下的方法——UI Framework 层面提供良好的辅助功能规范,即便是开发者不懂 Accessibility 也能有平台的基础支持兜底,最终的 Accessibility 体验总不会太差。

大家一起努力吧!我不是 Chromium 的工程师,我的工作也不与 Accessibility 相关,我知道很多用户像我反馈是源于信任,也源于我的另一个 NVDA 贡献者的身份。
然而我努力做这些本职工作之外的事情,确切说多半是为了自己,我知道我未来一定会用到它们,也许就是明天。
在这个问题的解决过程中,我从未谋面的同事 Aaron 给与了充分的信任和支持,我还记得当我向他说 Thanks 的时候。他是这么回复的:

No problem. Accessibility is my life. I'm lucky to work on something that actually matters and helps people

其实我不怕遇到障碍,对我来说,更重要的是能找到愿意聆听,值得信任的伙伴,遇到问题总有愿意去付诸行动解决的人,那么很多事情就有了希望!


最后,如果你想了解 NVDA 阅读数学内容的相关方法,可以阅读以下文章:https://nvdacn.com/index.php/archives/1322/


欢迎关注 NVDA 中文站公众号,你可以在微信公众号搜索页面搜索 NVDA中文站或"NVDACN"找到我们。

标签: 辅助技术, 实践, 屏幕阅读器

添加新评论