Conversation
There was a problem hiding this comment.
Pull request overview
该 PR 旨在修正“本机档案拖拉安装/手动安装”场景下脚本 origin 被错误写成伪 file://... 链结、进而导致后续更新检查出现 fetch error 的问题;改动发生在 Service Worker 的脚本安装/更新主流程中(ScriptService.installScript),属于核心路径修复。
Changes:
- 拖拉安装(本机档案)时将伪
file:///*from-local*/...的origin/originDomain/downloadUrl/checkUpdateUrl清空,以避免被误判为网址连结脚本并触发更新 fetch error。 - 针对旧版本写入的异常
origin前缀(file:///*from-local*/、file://-/)做兼容清理。 - 当脚本被“同一 creationtime 的本地版本”覆盖时,尝试保留最初网络安装的更新来源信息(用于后续更新检查)。
| // 处理 ScriptCat 旧版本进行安装时的 origin 错误 ( 1.0.0-beta.2 ~ 1.4.x - 自 commit d9b0eeede1a8b114f79a43fade99d825323c63f6 @ 2025.07.23 ) | ||
| if (oldScript?.origin?.startsWith("file:///*from-local*/") || oldScript?.origin?.startsWith("file://-/")) { | ||
| oldScript.origin = ""; | ||
| oldScript.originDomain = ""; | ||
| oldScript.downloadUrl = ""; | ||
| oldScript.checkUpdateUrl = ""; | ||
| } |
There was a problem hiding this comment.
这里对 oldScript 的 origin/downloadUrl/checkUpdateUrl 做“旧版本错误”清理是在后面才执行的,但 installScript 前面已经可能把 oldScript.origin 复制到 script(例如 subscribeUrl 分支)。如果 oldScript.origin 已经是错误的 file://-/...,就会被继续保存到新 script,导致本次修复失效。建议在任何读取/复制 oldScript.origin 之前先做统一的 origin 归一化,并且同样对 script.origin 处理 file://-/ 这种旧前缀。
| if (oldScript && script.createtime === oldScript.createtime) { | ||
| // 如果最初是从网络安装,之后拖拉安装本机档案,则保留origin资讯。用于更新检查。 | ||
| // 如果本机安装的版本号较低,则会在下次更新检查时提醒有更新。那个时候,用户可以选择更新至网络上最新版本,或忽略并保留本机版本 | ||
| if (oldScript && oldScript.origin && !script.origin) { |
There was a problem hiding this comment.
在 if (oldScript && script.createtime === oldScript.createtime) 这个块里,内部又重复判断了一次 oldScript(if (oldScript && oldScript.origin && !script.origin))。这里的 oldScript && 可以去掉,减少冗余并提升可读性。
| if (oldScript && oldScript.origin && !script.origin) { | |
| if (oldScript.origin && !script.origin) { |
|
@CodFrm 你这样改不是我的原意。。。 oldScript的错误还一直存在。。 |
哪里存在? oldScript 正常才会进入下一步 |
我指的是 原本以 因为我有 这个写法 跟你改掉后的逻辑是两回事 |
if (oldScript?.origin?.startsWith("file:///*from-local*/") || oldScript?.origin?.startsWith("file://-/")) {
oldScript.origin = "";
oldScript.originDomain = "";
oldScript.downloadUrl = "";
oldScript.checkUpdateUrl = "";
}
if (oldScript && script.createtime === oldScript.createtime) {
if (oldScript && oldScript.origin && !script.origin) {
script.origin = oldScript.origin;
script.originDomain = oldScript.originDomain;
script.downloadUrl = oldScript.downloadUrl;
script.checkUpdateUrl = oldScript.checkUpdateUrl;
}
}和 if (
oldScript &&
script.createtime === oldScript.createtime &&
oldScript.origin &&
!script.origin &&
!oldScript.origin.startsWith("file:///*from-local*/") &&
!oldScript.origin.startsWith("file://-/")
) {
script.origin = oldScript.origin;
script.originDomain = oldScript.originDomain;
script.downloadUrl = oldScript.downloadUrl;
script.checkUpdateUrl = oldScript.checkUpdateUrl;
}是不一样的 |
|
呀。 算了。没事 先这样 |
好像是,我撤回处理一下 |
说实话,这个逻辑我也看了好一会儿才理解,应该是想创建的时候 如果是 file 的就清空掉,但是如果oldScript不是file,那就记录下来,恢复成oldScript的,这样理解的话,我后面改的似乎也没问题,不需要在前面再清空oldScript的(这样似乎反而会产生问题) 感觉依赖AI有点太过了,这些细节内容脑子有点退化 |
改回我之前那个是好理解一点 |
业务逻辑没问题,就先这样 |
Checklist / 检查清单
Description / 描述
自 2025.07.23 的 commit d9b0eee 起,
当进行本机拖拉安装等动作时
安装的脚本会设为假链结并长期储存在
chrome.storage.local这导致每次更新出现 fetch error (误判为网址连结脚本)
如果最初安装是网上安装,然后手动安装了本地版本,origin会被改成假链结然后完全无法取得新更新
Screenshots / 截图
测试方法1
测试方法2