Skip to content

fix(inject): 图片覆盖层避让媒体并修复滚动抖动 - #2387

Closed
Yuimi-chaya wants to merge 3 commits into
BigPizzaV3:mainfrom
Yuimi-chaya:codex/image-overlay-background-rebuild-20261003
Closed

Yuimi-chaya wants to merge 3 commits into
BigPizzaV3:mainfrom
Yuimi-chaya:codex/image-overlay-background-rebuild-20261003

Conversation

@Yuimi-chaya

Copy link
Copy Markdown
Contributor

问题

启用图片覆盖层后,覆盖层会同时影响普通界面和媒体内容。线程内的图片、GIF、透明图片、Canvas、视频,以及点击打开的图片预览都会被背景覆盖层染色,透明图片的显示尤其明显。

这个 PR 保留完整图片覆盖层及其配置的透明度,让实际媒体内容通过独立前景层显示。输入框、App 外框、左侧任务栏、设置、Markdown 和审查等普通界面继续使用原来的覆盖层效果。

实现

  • 对实际图片、GIF、Canvas 和普通视频创建不拦截输入的媒体前景副本,保留原媒体的 DOM 归属和交互入口。透明图片使用媒体自身或原生表面的背景色,不透出装饰图片。
  • 前景层遵循原容器的滚动边界和线程 footer 边界。通过原滚动容器的 ScrollTimeline 同步横向、纵向和嵌套滚动,避免固定副本依赖 scroll → RAF 更新而落后正文。固定、吸顶媒体及不支持该 API 的环境保留几何更新回退。
  • 只在菜单、列表、提示或弹窗真实可见且与媒体相交时避让,不再把常驻隐藏菜单当成已打开的遮挡。
  • 对可确认的独立原生视频容器保留原 video 节点及其控件、播放状态和全屏行为;不重新挂载原媒体节点。
  • 使用共享布局调度、几何缓存和可见媒体集合,减少无关流式文本更新造成的扫描。禁用、重新配置或移除媒体时释放副本、监听器、观察器、滚动动画及自有捕获流,不停止源视频持有的流。
  • 不裁切、缩放或挖空整个图片覆盖层,不全局重写主题色或普通界面的透明度。

验证

已在 Windows Codex App 安装实测通过:媒体显示正常,线程内图片、GIF、透明图片、Canvas 和普通视频在鼠标连续滚动时不再上下抖动,其他已验收的覆盖层效果保持正常。

针对本 PR 提交完成的本地验证:

  • 前端测试:343 passed / 0 failed / 1 skipped;TypeScript 和 Vite 构建通过。
  • 定向 Rust cdp_bridge 测试、注入脚本组装与语法检查、git diff --check 通过。
  • 使用实际 App 样式的离线 Edge 回归:480 / 1088 / 1727 三种宽度与 0.8 / 1 / 1.25 三种缩放,共 9 组通过。
  • 覆盖真实滚轮输入、延迟注入布局回调、嵌套双轴与 RTL 滚动、内容高度变化、裁剪模式切换、固定定位回退、菜单显隐、图片预览、原生视频控件和全屏、资源清理。滚动对齐最大误差低于 0.03 CSS px。
  • 合成性能用例含 200 张离屏图片:30 次无关文本更新不触发媒体几何读取;相关布局更新保持共享缓存。此结果不等同于真实 App 的长期性能结论。
  • Windows Release 编译、NSIS Setup 和 ZIP 打包通过;四个 ZIP 条目及三个 PE 文件头已校验。

新增的 scripts/test-image-overlay.cjs 为可选浏览器回归,使用已有的 Playwright、sharp、pngjs 和本地 Edge。可通过 NODE_PATH 提供依赖,通过 CODEX_OVERLAY_NATIVE_CSS_DIR 加载本地 App 样式;未将 App 样式、媒体文件或测试安装包加入仓库。

兼容边界

  • 本次实机验证范围为 Windows,未宣称 macOS 或 Linux 已实测。
  • 无法确认结构的复杂带控件播放器保留原生渲染,可能仍受覆盖层影响;优先保证控件可用。
  • GIF 副本复用原资源,不承诺与原 GIF 的动画时间轴严格同步。

本 PR 仅涉及注入源码、对应生成产物和两份测试文件。

@Yuimi-chaya
Yuimi-chaya marked this pull request as draft October 4, 2026 11:32
@Yuimi-chaya

Copy link
Copy Markdown
Contributor Author

经过多轮实现与真人验证,图片/媒体保持原生不透明这一点已基本成立,但全局透明覆盖层仍存在明显的黑色过渡、图层覆盖、页面适配和性能/交互问题。继续修复的成本已经不值得,因此先关闭此 PR,保留代码与实验记录,未来有更合适的实现路径时再重新评估。

@Yuimi-chaya Yuimi-chaya closed this Oct 6, 2026
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.

1 participant