Repository navigation
v2.1.21 — 点「证书下载」不再卡在「正在打开…」
v2.1.21 — 点「证书下载」不再卡在「正在打开…」
你看到的
沧州市教师继续教育网 →「证书下载」→ 标签页停在一句 正在打开… 和一大串 png 地址上,
永远不动。文件其实下载成功了(~/.ai-browser/downloads/<tab>/),但界面上零回执,
所以只能判断成"卡住了"。
为什么会这样
那个地址回的是 Content-Type: image/png + Content-Disposition: attachment,
站点又用新标签打开它。浏览器把"attachment"理解成"存下来",于是这次导航
永远不会提交 —— 标签页停在加载占位页上,占位页尽职地把目标地址显示了出来。
再加上整条下载路径只有落盘、没有任何界面表达,两个问题叠在一起就是"别扭"。
现在的行为(按浏览器的既有语义,只认 Content-Type)
| 点了什么 | 会发生什么 |
|---|---|
| 图片 / 视频 / 音频 / PDF(哪怕服务端要求下载) | 直接显示。工具条右侧出现「↓」,点一下存进下载目录 |
| zip / dmg / exe / docx … | 正常下载;那个"为它而开的"标签页变成下载结果页:文件名、大小、类型、图片缩略图、进度条,「打开」「在 Finder 中显示」「复制路径」 |
| 页面里点"导出 CSV"之类 | 页面不动,工具条给一条「↓ 已下载 xxx」回执(8 秒),点一下在 Finder 中显示 |
判据只有一条:Content-Type 是不是人能直接看的东西(image/*、video/*、
audio/*、application/pdf)。不看后缀、不针对任何站点。
- 刻意不含
text/plain/text/csv/application/json—— 点"导出"的语义
就是要文件,把 CSV 铺满一屏是帮倒忙。 - 刻意不改 Content-Type —— 站点把 png 说成
application/octet-stream时,
硬改类型去渲染,坏了就是一片碎图;那种情况让它下载才可靠。 - 下载时用的是同一个会话(Cookie / Referer / 临时签名照旧),所以不会出现
"浏览器里能看、存下来是 403 页面"。
顺手补上的两个洞
ui.download:显示出来的图片/视频/PDF 也要能留下文件,否则等于把"下载"
从这类页面上拿掉了。工具条那个「↓」走的就是它。dl:*通道的门:结果页要「打开 / 在 Finder 中显示」,但 preload 挂在每个
标签页上(含任意站点)。主进程校验 sender 必须是我们自己的界面页,且路径必须落在
下载目录之内 —— 否则任意网站都能让浏览器打开、高亮你下载过的文件。
验证
npm run download(新增,23 断言):图片带 attachment 必须显示且不产生下载记录、
zip 必须下载且标签页变结果页、就地下载不许顶掉页面、本来就 inline 的图片照旧显示、
ui.download能把正在显示的图片存成文件。- 负向验证:
AI_BROWSER_MEDIA_INLINE=0跑同一套件,前四条全红
(cert.png变成下载、导航不提交)。不做负向验证的回归只是心理安慰。 - 全量:
npm test988/988;npm run e2e:all20 套件 / 659 断言全绿。
关掉这条钩子的开关是 AI_BROWSER_MEDIA_INLINE=0(回到"图片也当文件下载"的旧行为),
用于二分"某个站点的显示问题是不是它造成的"。