[v1.3] 修复 87c0a19dea9cad2e9ebdce13bb4d998ea386ad74 重构代码时不正确的修改#1217
[v1.3] 修复 87c0a19dea9cad2e9ebdce13bb4d998ea386ad74 重构代码时不正确的修改#1217CodFrm merged 4 commits intoscriptscat:release/v1.3from
Conversation
|
哎呀,尴尬了 |
There was a problem hiding this comment.
Pull request overview
该 PR 主要用于修复此前通讯机制重构过程中,对“页面侧 external 注入接口(Scriptcat/Tampermonkey isInstalled)”相关逻辑的不正确改动,并将注入逻辑独立成模块,便于后续维护。
Changes:
- 将
window.external注入与 TM 兼容补丁逻辑从script_runtime.ts抽离到新文件external.ts ScriptRuntime.externalMessage()改为调用抽离后的onInjectPageLoadedisInstalled的消息发送路径调整为走scripting路由(scripting/script/isInstalled)
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| src/app/service/content/script_runtime.ts | 移除内联 external 注入实现,改为委托到 onInjectPageLoaded |
| src/app/service/content/external.ts | 新增 external 注入/白名单判断/TM isInstalled 回退逻辑的独立实现 |
| return false; | ||
| }; | ||
|
|
||
| // inject 环境 pageLoad 后执行:按白名单对页面注入 external 接口 |
There was a problem hiding this comment.
注释“inject 环境 pageLoad 后执行”与实际调用点不一致:inject.ts 里是在初始化后立即调用 runtime.externalMessage(),并不等待 pageLoad。建议更新这段注释,避免误导后续维护者对执行时机的判断。
| // inject 环境 pageLoad 后执行:按白名单对页面注入 external 接口 | |
| // inject 环境初始化时由 inject.ts 直接调用:按白名单对页面注入 external 接口(不依赖 pageLoad) |
| export const onInjectPageLoaded = (msg: Message) => { | ||
| const hostname = window.location.hostname; | ||
|
|
||
| // 不在白名单则不对外暴露接口 | ||
| if (!isExternalWhitelisted(hostname)) return; | ||
|
|
||
| // 确保 external 存在 | ||
| const external: External = (window.external || (window.external = {} as External)) as External; | ||
|
|
||
| // 创建 Scriptcat 暴露对象 | ||
| const scriptExpose = createScriptcatExpose(msg); | ||
|
|
||
| // 尝试设置 external.Scriptcat | ||
| safeSetExternal(external, "Scriptcat", scriptExpose); | ||
|
|
||
| // 如果页面已有 Tampermonkey,则做兼容补丁;否则将 Tampermonkey 也指向 Scriptcat 接口 | ||
| const patched = patchTampermonkeyIsInstalled(external, scriptExpose); | ||
| if (!patched) { | ||
| safeSetExternal(external, "Tampermonkey", scriptExpose); | ||
| } | ||
| }; |
There was a problem hiding this comment.
onInjectPageLoaded 新增了白名单判断、external 注入、以及 Tampermonkey 兼容补丁等关键行为,但当前没有对应单元测试覆盖(例如:命中/未命中白名单时的注入行为、TM 存在时 isInstalled 回退逻辑、以及写入 external 失败时的容错)。建议补充 vitest 用例,避免后续通讯机制/注入时机调整时再次回归。
| const createScriptcatExpose = (msg: Message) => { | ||
| const scriptExpose: App.ExternalScriptCat = { | ||
| isInstalled(name: string, namespace: string, callback: (res: App.IsInstalledResponse | undefined) => unknown) { | ||
| sendMessage<App.IsInstalledResponse>(msg, "scripting/script/isInstalled", { name, namespace }).then(callback); |
There was a problem hiding this comment.
isInstalled 通过 sendMessage(...).then(callback) 触发回调,但当消息通道异常/目标 API 不存在时 sendMessage 会抛错并导致 Promise rejection:页面侧回调永远不会被调用,同时可能产生未处理的拒绝。建议在这里补充 .catch(...),保证失败时也以 callback(undefined)(或明确的失败结果)结束,并避免未处理异常外溢到页面。
| sendMessage<App.IsInstalledResponse>(msg, "scripting/script/isInstalled", { name, namespace }).then(callback); | |
| sendMessage<App.IsInstalledResponse>(msg, "scripting/script/isInstalled", { name, namespace }) | |
| .then(callback) | |
| .catch(() => callback(undefined)); |
@CodFrm 你搞的重构把我写好测试好的东西都忽略掉
87c0a19