Skip to content

🐛 修复 Firefox 用户脚本 DOM realm 不一致 - #1697

Open
CodFrm wants to merge 1 commit into
mainfrom
fix/firefox-userscript-dom-realm
Open

🐛 修复 Firefox 用户脚本 DOM realm 不一致#1697
CodFrm wants to merge 1 commit into
mainfrom
fix/firefox-userscript-dom-realm

Conversation

@CodFrm

@CodFrm CodFrm commented Aug 28, 2026

Copy link
Copy Markdown
Member

背景

Firefox 的 USER_SCRIPT world 与页面 Window 属于不同的 JavaScript realm。ScriptCat 创建用户脚本上下文时,存在两处兼容性问题:

  1. 将 Firefox WebExtension API 的懒加载 getter 直接复制并绑定到沙箱后,原属性完成一次性初始化、getter 闭包被清空时,沙箱仍会再次调用已经失效的 getter,触发 getter is null
  2. 页面 DOM 节点来自页面 Window realm,但用户脚本拿到的 NodeElementHTMLElement 等构造器来自 USER_SCRIPT realm,导致 instanceof 判断失败。沉浸式翻译因此无法遍历正文节点,只能处理标题。

修改

  • 通过原始对象上的 Reflect.get / Reflect.set 转发属性访问,使 Firefox 懒加载属性始终读取已经物化后的原属性。
  • 仅将 DOM 类型、DOM 遍历相关对象以及 getComputedStyle 对齐到页面 Window realm。
  • 保持 PromiseErrorJSONMathNumber 等 JavaScript intrinsic 来自 USER_SCRIPT realm。
  • 添加回归测试,覆盖懒加载 getter 物化和 DOM realm 对齐。

本 PR 只修改 Content 用户脚本上下文,不修改 Popup、GM XHR,也不新增或特殊处理 GM_fetch

验证

  • pnpm run lint:通过
  • pnpm test:343 个测试文件、4296 个测试通过
  • pnpm run build:通过
  • 聚焦测试:create_context.test.tsexec_script.test.ts,共 55 个测试通过
  • git diff --check:通过
  • Firefox 154.0.1 + geckodriver 0.37.1 + 沉浸式翻译用户脚本 1.32.7,在 https://example.com/ 实测:标题、正文段落和链接均成功生成双语节点,共检测到 8 个沉浸式翻译正文节点

构建仍会输出已有的 bundle/entrypoint 体积警告,以及 Monaco editorSimpleWorker.js 动态 require 警告;这些警告未导致构建失败,且不属于本次改动范围。

Checklist / 检查清单

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

未关联 GitHub Issue,因此第一项不适用。

@cyfung1031
cyfung1031 self-requested a review August 28, 2026 11:00
@cyfung1031

cyfung1031 commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

#1692 一样,需要实际可以重现问题的 userscript 进行确认 ( 沉浸式翻译 以外的独立脚本)
不然就违反了TDD

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