Skip to content

v2.1.21 — 点「证书下载」不再卡在「正在打开…」

Choose a tag to compare

@Glittering Glittering released this 27 Oct 16:21
· 86 commits to main since this release

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 test 988/988;npm run e2e:all 20 套件 / 659 断言全绿。

关掉这条钩子的开关是 AI_BROWSER_MEDIA_INLINE=0(回到"图片也当文件下载"的旧行为),
用于二分"某个站点的显示问题是不是它造成的"。