Skip to content

fix(canvas): 修复线上视频节点截首尾帧画布污染报错#102

Merged
Handanhhhy merged 1 commit into
mainfrom
fix/video-frame-capture-tainted-canvas
Jul 10, 2026
Merged

fix(canvas): 修复线上视频节点截首尾帧画布污染报错#102
Handanhhhy merged 1 commit into
mainfrom
fix/video-frame-capture-tainted-canvas

Conversation

@n7s4

@n7s4 n7s4 commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

问题

线上画布视频节点「截首帧/尾帧」卡住,Console 报:

Uncaught SecurityError: Failed to execute 'toBlob' on 'HTMLCanvasElement': Tainted canvases may not be exported.

本地环境正常。

根因

  1. 线上开启 STATIC_VIA_OSS,后端 _serve_or_redirect_to_oss/projects/.../media/*302 到跨域的 OSS 预签名 URL;本地走同源 FileResponse,所以本地无此问题。
  2. 截帧离屏 <video>mediaNeedsCrossOrigin 只对绝对 http(s):// URL 设 crossOrigin="anonymous",相对路径不设。
  3. 线上:相对路径 → 跟随 302 → 以 no-cors 模式加载跨域 OSS 视频 → drawImage 污染画布 → toBlobSecurityError

修复

mediaNeedsCrossOrigin 改为:除 data: / blob:(永不污染画布)外一律返回 true。同源响应不需要 ACAO,CORS 模式无副作用;302 到 OSS 后浏览器带 Origin 走 CORS 拿到 ACAO,画布不再污染。一处 helper 覆盖全部 5 个画布导出路径(VideoNode 截帧、VideoClipPanel、filmstrip、CoverEditor、loadImageElement)。

验证

  • 实测线上 bucket novelvideo-assets-chengdu:对站点 origin https://dramaclaw.cdnfg.com 的 preflight(OPTIONS)与实际 GET 均返回 Access-Control-Allow-Origin,且带 Vary: Origin(浏览器缓存不会串用 no-cors 响应)
  • tsc -bpnpm build、canvas 相关 vitest 全部通过

注意

dramaclaw.ai 不在 bucket CORS 白名单(实测 403)。目前它 301 到 cdnfg.com 无影响;若未来该域名直接跑应用,需在 OSS bucket CORS 规则里补充该 origin。

🤖 Generated with Claude Code

线上 STATIC_VIA_OSS 开启后,/projects/.../media/* 会 302 到跨域的 OSS
预签名 URL。截帧离屏 <video> 的 mediaNeedsCrossOrigin 只对绝对
http(s) URL 设 crossOrigin,相对路径跟随 302 后以 no-cors 模式加载
跨域视频,drawImage 污染画布,toBlob 抛 SecurityError(本地走同源
FileResponse 所以无此问题)。

改为除 data:/blob:(永不污染画布)外一律 crossOrigin="anonymous":
同源响应不需要 ACAO,CORS 模式无副作用;302 到 OSS 后浏览器带
Origin 走 CORS。已实测线上 bucket novelvideo-assets-chengdu 对站点
origin(https://dramaclaw.cdnfg.com)的 preflight 与 GET 均返回
Access-Control-Allow-Origin 且带 Vary: Origin。

注意:dramaclaw.ai 不在 bucket CORS 白名单(目前 301 到 cdnfg.com
无影响);若未来该域名直接跑应用,需在 OSS CORS 规则补充。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Signed-off-by: wen xin <1464521427@qq.com>
@Handanhhhy
Handanhhhy merged commit f95559b into main Jul 10, 2026
17 checks passed
@Handanhhhy
Handanhhhy deleted the fix/video-frame-capture-tainted-canvas branch July 10, 2026 09:47
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.

2 participants