Skip to content

[BUG] 回收站关闭时,配置加载完成前删除脚本仍会误显示可撤销提示 #1621

Description

@cyfung1031

提交前检查

  • 我已经搜索过现有 issues,确认不是重复问题
  • 我已经尽量使用最新 stable 或 beta 版本测试
  • 这不是安全漏洞;安全漏洞会通过 Security Advisory 私密提交

问题类型

脚本管理 / 回收站

问题描述

回收站启用状态(trash_enabled)在选项页通过 useSystemConfig("trash_enabled") 异步加载,加载完成前该 hook 返回 undefined。多处前端代码以 trashEnabled ?? true 兜底判断"回收站是否开启"(例如 src/pages/options/routes/ScriptList/index.tsx:223components.tsx:395BatchActionsBar.tsx:43TrashTable.tsx:92/95/215)。

而 Service Worker 端的真实删除逻辑(src/app/service/service_worker/script.ts:550)读取的是 this.systemConfig.getTrashEnabled() 的权威配置值,不受前端加载时序影响。

当用户实际已关闭回收站(trash_enabled = false),但选项页配置尚未加载完成(trashEnabled === undefined)时打开脚本列表并删除脚本:

  • 前端 !(undefined ?? true) = false,误判为"回收站已开启",走可撤销分支,弹出带"撤销"按钮的删除成功提示。
  • 但 Service Worker 因为读到真实的 trash_enabled = false,已经调用 destroyActiveScripts 彻底销毁脚本,并未写入回收站。
  • 用户点击"撤销"后触发 requestRestoreScriptsrestoreScriptsscript.ts:644-648),因为回收站里根本没有该脚本记录,抛出 trash scripts not found,前端展示 trash_undo_failed 错误提示。

结果是:界面向用户承诺了一个实际不可能成功的"撤销"操作,脚本其实已经被永久删除,用户会以为撤销失败是偶发故障,而不知道脚本已经无法恢复。

最小复现步骤

  1. 打开 ScriptCat 选项页的设置页,关闭"回收站"(trash_enabled 设为 false)。
  2. 立刻切换到"脚本列表"页面(尽量在系统配置尚未从 chrome.storage 异步加载完成前操作,例如清空缓存后首次打开或极快速切换页面)。
  3. 在配置仍处于 undefined 的短暂窗口内,删除一个脚本。
  4. 观察到删除提示中出现"撤销"按钮。
  5. 点击"撤销"。

期望行为 vs 实际行为

期望:回收站关闭时删除脚本应直接提示"删除成功",不应出现"撤销"入口,因为脚本已被彻底销毁、无法恢复。

实际:配置加载完成前的短暂窗口内,前端仍按"回收站已开启"处理并展示可撤销的删除提示;点击撤销后失败,报错 trash scripts not found,脚本实际已无法找回。

ScriptCat 版本

v1.5.0-beta

ScriptCat 渠道

自行构建 / dev

Manifest / 扩展模式

MV3

操作系统

不限

浏览器及版本

不限(任意 Chromium/Firefox)

设备类型

桌面端

浏览器/扩展状态

  • 开启了隐身模式 / InPrivate / Private Window
  • 使用移动端浏览器扩展支持
  • 使用第三方 Chromium 浏览器
  • 使用第三方 Firefox/Gecko 浏览器
  • 已授予 ScriptCat 对目标网站的站点访问权限
  • 开启了开发者模式
  • 安装了其他可能影响页面/请求/脚本的扩展

相关用户脚本 / 配置

不涉及特定用户脚本内容;问题与"回收站启用状态"配置项的前端异步加载时序有关,触发窗口为配置加载完成之前的短暂时间段。

日志 / 错误信息 / 截图

点击撤销按钮后,requestRestoreScripts 抛出 trash scripts not found,前端展示 script:trash_undo_failed 对应的错误文案。未提供截图(复现窗口极短,需在配置加载完成前操作)。

是否有临时解决办法

暂未发现。等待系统配置加载完成后再进行删除操作可规避(但用户无法直接感知"是否已加载完成")。

补充说明(根因与建议修复方向)

根因是把"配置未加载完成"和"回收站已开启"合并成同一个默认值 true,导致这两种状态在关闭态短暂重叠。建议 trashEnabledundefined 时不要用 ?? true 兜底展示可撤销文案,而是在配置未加载完成前禁用删除操作,或改用一个显式的"加载中"状态区分于"已确认开启"。

本 issue 源自对 PR #1585(回收站功能)合并后的复审,对应该 PR 讨论中"设计层面的观察 6"这一项:#1585 (comment) 。复审同时确认了讨论中列出的其余 6 项设计观察(1/2/3/4/7 已在当前代码中修复或本就不构成问题,5 属于既定产品边界),仅此第 6 项在当前主分支代码中仍然存在。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions