Skip to content

🐛 修复 native GM_download 下载 data: URI 时误弹跨域权限确认 (#1635) - #1797

Open
CodFrm wants to merge 1 commit into
mainfrom
fix/1635-gm-download-data-uri
Open

CodFrm wants to merge 1 commit into
mainfrom
fix/1635-gm-download-data-uri

Conversation

@CodFrm

@CodFrm CodFrm commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

Description / 描述

Close #1635

问题:#1506 让 native 模式的 GM_download 走 verifyXhrConnect(@connect / 黑名单 / 站点访问校验)。data: URI 没有主机名,new URL("data:...").hostname 为空,于是落到最后的 cors 确认分支,弹出一个「请求域名」为空的跨域权限框(issue 截图即此情况)。data: URI 内容自带、不发起任何网络请求,没有可校验的对象,这个弹窗没有意义;如果脚本声明了 @connect,按同样的路径还会落到软确认弹窗。

修复:在 GM_download 的 confirm 中,与非 native 模式一样,对 data: scheme 直接放行(src/app/service/service_worker/gm_api/gm_api.ts)。按 issue 讨论中的结论,不额外引入 @connect 特殊规则。

实现考虑

  • 只放行 data:。file: 等其他非 http(s) scheme 仍走原校验(读本地文件属于敏感访问);blob: 在内容侧本来就走 browser 模式,不经过此校验。
  • 用 /^\s*data:/i 判断,没有用 URL.parse:URL.parse 需要 Chrome/Firefox 126+,仓库里没有用过,也没有声明最低浏览器版本。
  • 范围只限 GM_download;GM_xmlhttpRequest 请求 data: 的行为不在本 issue 内,没有改动。

验证

基于 origin/main 58309d5,head 079feda。

  • 复现:新增用例 native 下载 data: URI 不发起网络请求,无需 @connect 也直接放行 (#1635),修复前失败,返回 permission: "cors", permissionValue: "",与截图一致;修复后通过。
  • pnpm exec vitest run --no-coverage src/app/service/service_worker/gm_api/ src/app/service/content/gm_api/:11 个文件、151 个用例全部通过。
  • pnpm run typecheck、prettier --check、改动文件的 eslint:通过。
  • 真实扩展(同一脚本,改为 saveAs: false 方便无头运行,用 e2e/session.mjs 加载 dist/ext,打开本地 http 页面):
    • 修复前(gm_api.ts 换回 origin/main 版本后重新 build):打开 confirm.html,标题「脚本正在试图访问跨域资源」,「请求域名」为空,「请求地址」为 data: URI,和 issue 截图一致;chrome.downloads.search 为空,没有发起下载。
    • 修复后(恢复 HEAD 079feda 后重新 build):[V1635] onload fired,下载状态为 complete,全程没有打开确认页。前一轮验证中还检查过落盘内容为 a,b,c\n1,2,3。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] datauri 被错误地要求权限存取

1 participant