稳定复现,看我几行代码搞崩 Chrome

2022-03-10 10:26:49 +08:00
 xiangyuecn

搞崩 chrome 测试页面: https://xiangyuecn.gitee.io/recorder/assets/ztest_chrome_bug_AudioWorkletNode.html (打开后可能需要右键刷新一下页面)

过程分析记录: https://www.cnblogs.com/xiangyuecn/p/15988061.html

最新的 chrome 97 打开测试页面测试后每次都会崩溃,最开始发现的 chrome80 也会崩溃(不过测试页面反而不会崩了),古董版本 66 70 不会崩溃,更老的不支持 AudioWorklet 不用测试

这个崩溃现象也就是在特定时机才会出现,FireFox 测试的完全没有这个问题

[×]提交 bug

[√]v2ex 发帖

测试页面截图:

崩溃截图:

19224 次点击
所在节点    程序员
158 条回复
gadfly3173
2022-03-10 19:49:59 +08:00
@ie88 各大视频网站还有一堆默认自动播放视频的操作呢,浏览器也不是直接允许的,也没看有哪家浏览器针对这种行为做提示啊?浏览器只需要做规范里提到的内容就可以了,不应该画蛇添足自以为是
ie88
2022-03-10 20:01:43 +08:00
@gadfly3173 你说的这些目前是这样的,可是如果 AudioContext 这个 API 没经过用户操作就能进行音频播放的话,是不是很容易出现类似网页被挂马这种情况,自动播放一些不和谐的音频,可能让审查机构误认为是网站开发人员故意操作的。
ie88
2022-03-10 20:06:23 +08:00
@gadfly3173 你说的自动播放视频通常视频流是被加密了的,应该不会被恶意篡改。而 AudioContext 这个 API 播放音频流应该没有做到加密处理,应该被恶意篡改的风险很高吧
gadfly3173
2022-03-10 20:08:18 +08:00
@ie88 。。。所以浏览器只要阻止操作就可以了。。你要区分有关用户的安全问题和流氓行为。安全问题浏览器应当阻止并提示,流氓行为最多阻止就好了。什么网站挂马之类的不在浏览器应该考虑的范围。包括还有 xss 之类的操作,防范这些无法被机器判断的安全问题应该是网站自身做好的,而不是让浏览器解决。
ie88
2022-03-10 20:11:12 +08:00
@gadfly3173 哦,我大致明白了,多谢指点。
q1angch0u
2022-03-10 20:13:51 +08:00
幸好 iOS 的 chrome 用 webkit [狗头]
iajr
2022-03-10 20:21:07 +08:00
Google Chrome
版本 99.0.4844.51 (正式版本) (x86_64)
macOS 12.2 ( Intel )
成功复现
iajr
2022-03-10 20:24:20 +08:00
又试了一下,发现并不是每次都会复现,有一定概率崩溃
ie88
2022-03-10 20:30:04 +08:00
@gadfly3173 https://developer.chrome.com/blog/autoplay/#webaudio
我刚看了下 Autoplay policy in Chrome ,有以下描述

The Autoplay Policy launched in Chrome 66 for audio and video elements and is effectively blocking roughly half of unwanted media autoplays in Chrome. For the Web Audio API, the autoplay policy launched in Chrome 71. This affects web games, some WebRTC applications, and other web pages using audio features. More details can be found in the Web Audio API section below.

As you may have noticed, web browsers are moving towards stricter autoplay policies in order to improve the user experience, minimize incentives to install ad blockers, and reduce data consumption on expensive and/or constrained networks. These changes are intended to give greater control of playback to users and to benefit publishers with legitimate use cases.

Chrome's autoplay policies are simple:

Muted autoplay is always allowed.
Autoplay with sound is allowed if:
The user has interacted with the domain (click, tap, etc.).
On desktop, the user's Media Engagement Index threshold has been crossed, meaning the user has previously played video with sound.
The user has added the site to their home screen on mobile or installed the PWA on desktop.
Top frames can delegate autoplay permission to their iframes to allow autoplay with sound.

我觉得这个 policy 已经说得很明确了,所以页面直接崩溃( effectively blocking roughly half of unwanted media autoplays in Chrome )是 Chrome 现在正在用的做法,不属于 bug 不是吗?
ie88
2022-03-10 20:34:10 +08:00
effectively blocking roughly half of unwanted media autoplays in Chrome ,是 half 而不是 all ,不也正好解释大家半天测试的时候,有的时候出现崩溃,有的时候没崩溃的情况吗
ie88
2022-03-10 20:38:06 +08:00
@ie88 更正一下,是 roughly half 而不是 all
Routeros
2022-03-10 20:43:26 +08:00
版本 99.0.4844.51 (正式版本) ( 64 位) 复现
ie88
2022-03-10 20:47:22 +08:00
"web browsers are moving towards stricter autoplay policies in order to improve the user experience",就提升用户体验来讲,chrome 团队认为 "block unwanted media autoplays" 要比 allow unmuted media autoplays 好,所以他们进行了 block 处理,如何实现 block ,这个 policy 没提到,我个人认为就是直接让页面崩溃,他们找不到比这更合适的做法了
ie88
2022-03-10 20:49:27 +08:00
@xiangyuecn @Huelse @gadfly3173 请各位看看这个 policy ,是不是我说的这个意思
ie88
2022-03-10 20:52:20 +08:00
而且就 block 这个做法来讲,开发者在开发测试上线各个环节都会遇到崩溃的情况,能够及时修复这个问题,基本没有机会让用户操作导致页面崩溃的情况发生,这样既保护了用户又约束了开发者,这种做法不合适嘛?
Mac
2022-03-10 20:52:38 +08:00
@shakoon #15 感人啊,到现在还有百分的用户坚持着。我春节期间彻底弃用换 EDGE 了,因为 NAS 的菜单已经不兼容了。
gadfly3173
2022-03-10 20:55:06 +08:00
@ie88 。。。你的理解有大问题。。。阻止自动播放真的只是字面意义上的不能自动播放,也就是视频暂停 /音频暂停之类的。。。页面崩溃可不是什么正确的阻止播放的做法。。。你要站在一般用户的立场上来思考。。。不如你用隐身模式打开个视频网站试试。。。
ie88
2022-03-10 21:06:07 +08:00
@gadfly3173 不是,页面崩溃是在开发者开发测试上线环节都会遇到的问题,开发者遇到这样严重的 bug 怎么会把这样的代码放到生产环境去跑,用户层面无法感知这样的页面崩溃,这个过程是在开发测试上线环节已经约束了开发者,是不影响用户的,因为你正经做开发怎么会带着这样的 bug 上线。你想实现自动播放,直接 mute 就可以呀,unmute 就是不让你的代码成功跑起来,应该没问题吧
ie88
2022-03-10 21:13:21 +08:00
@gadfly3173 我是觉得咱们这样的技术论坛就是应该有人去发现问题,讨论问题,定位问题,甚至解决问题。希望这个帖子能够吸引一些 V8 引擎开发团队的成员,来讲解一下目前这个问题故意不 catch 这样的 exception 来约束开发者,还是说确实属于 bug 需要修复,或者 browser policy 的制定团队有人解释一下这个 block 操作是不是包含页面崩溃这种做法。
SimonOne
2022-03-10 21:15:05 +08:00
Vivaldi 5.1.2567.57 (Stable channel) (x86_64) 复现

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/839328

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX