🐛 更新页不再倒计时自动关闭,记录失效改为自动重查续做 - #1720
Conversation
自动弹出的批量更新页带 autoclose=30,30 秒后 window.close(),用户还没读完 更新说明页面就自己没了(#1715)。倒计时是在补偿「抢焦点弹出一个没人要求的标签 页」,方向反了:整套机制连同 URL 参数、药丸组件与三个 i18n key 一并移除。 页面因此会长时间开着,这暴露了原本被 30 秒关窗掩盖的问题:批量更新记录只存在 Service Worker 内存里,SW 被回收后点更新只会拿到 record_expired。现在首次失效 自动重新检查一次并接着做完剩余条目,重查后已是最新的条目静默出队、不计为失败, 二次失效才提示用户重新检查。 close #1715
|
「 更新页不再倒计时自动关闭」暂时没意见。之后有需要再处理 Agent好像也发现这个设计是预设会关掉的 或者你只改参数把 auto_close 设为 -1 会简单一点 |
|
最初只是一个小功能。不想搞太多。所以只存在于 Service Worker 内存里。
我的机器基本上没有系统通知功能。(个人问题不使用) |
或者考虑全局只会自动的打开一个batchupdate窗口,之前的脚本更新加自动关闭主要是考虑到用户可能长时间不用/在后台,会打开非常多的更新窗口,导致混乱 |
我觉得还好,这个检查更新是每次都要去检查更新的,如果是一个过期的数据就有点失去意义了
这个点再考虑吧,系统通知很容易被忽略,如果不想更新就设置不检查更新/延长时间好了 |
Checklist / 检查清单
背景
定时检查发现有更新后,用户导航到命中站点的域名时,SW 会抢焦点弹出批量更新页,并在 URL 上带
autoclose=30;页面倒计时归零直接window.close()。#1715 报的就是"认真读页面上每个字,没看完页面就没了",而 #1087 报过同一件事——当时的处理是把 8 秒延长到 30 秒,service_worker/index.ts里也留了"关于 autoclose,日后再检讨 UI/UX 设计"的注释。倒计时是在补偿"我们擅自弹出了一个你没要求的标签页",方向反了:更新页同时是打扰源和决策界面,给决策界面装秒表只会把打扰变成焦虑。而且页面上唯一不刹车的交互恰好是"点脚本名看差异"——该链路要先联网 fetch 脚本源码才开出安装页,这几秒里倒计时照走,列表页可能在用户读差异时于后台自行关闭。
本次改动
去掉自动关闭机制(不是调参、不是加开关):URL 参数两处产地、
hooks.ts的倒计时状态与两个 effect、AutoCloseChip组件与两个 props、移动端的分支渲染、10 个语言包的 3 个 key,以及 e2e 冒烟用例里残留的&autoclose=30一并移除。更新页从此只在用户点关闭时才关。记录失效改为自动重查续做:删掉倒计时后页面会长时间开着,这暴露了原本被 30 秒关窗掩盖的问题——批量更新记录(
ScriptUpdateCheck.cacheFull)只存在 Service Worker 内存里,页面通过chrome.runtime.sendMessage广播订阅、不持有长连接,因此不给 SW 保活;SW 闲置回收后再点更新只会拿到record_expired,用户面对的是"按钮点了没用,请重新检查"。现在首次失效自动重新检查一次并接着做完剩余条目,重查后已经是最新的条目静默出队(不计为失败、不弹汇总),二次失效才落回原来的RecordExpiredNotice。实现考虑
runUpdates从固定for改成可变队列 + 下标:失效时下标停在原地、队列换成重查后的剩余项,rechecked保证每次调用只自动重查一次,避免死循环。批量进度的total随队列长度重算;整批都已是最新时不留汇总条也不弹 toast。checkScriptUpdate({ checkType: "user" }),不传noUpdateCheck,因此不会命中canSkipScriptUpdateCheck的节流;SW 侧该调用会 await 完整检查后才返回,页面可以直接串行等待。重查期间 SW 广播CHECKING_UPDATE,页面顶部进度条即为反馈,未新增 UI 或文案。checkUpdate字段,而不是categorize().updates——后者会排除已忽略项,会让"全部恢复并更新"路径把待办条目误判成已完成。userCheckPendingRef,因此不会像手动"检查更新"那样弹"发现 N 个更新"的 toast。已知限制
chrome.tabs.create默认active: true抢焦点弹出的,只是不再自己关。是否改成后台标签打开属于弹出策略,本 PR 不动。record_expired自动重查是在 hook 边界用打桩的 SW 响应验证的,真实 SW 被回收那一刻的行为没有实机观察。src/pages/confirm/App.tsx的 30 秒倒计时会自动按"忽略"并关窗,且不因document.hidden暂停、没有任何交互刹车。它有正当理由(脚本调用阻塞中,必须有结论),但那两条缺陷值得单独修。建议审查重点
total的一致性(runUpdates的 while 循环)。RecordExpiredNotice,没有把用户困在无限重试里。关联
close #1715 —— 同一诉求此前在 #1087 出现过,当时只延长了倒计时。
验证
范围绑定:base
61164f69→ head80c7dd26,git diff 61164f69...80c7dd26 --stat= 18 文件 +159/−256,全部落在 batchupdate 页面、其两处 URL 产地、10 个语言包与一条 e2e 冒烟用例内,无其它清理。pnpm run lint→ exit 0(prettier + tsc --noEmit + check:i18n + check:issue-templates + eslint 全过)npx vitest run src/pages/batchupdate src/pages/install/useInstallData.test.ts src/app/service/service_worker/script.test.ts src/locales/i18n-usage.test.ts→ 6 文件 195/195 通过URL 仍带 autoclose 参数时也不会自行关闭在实现前失败于expected "bound close" to not be called at all, but actually been called 1 times;4 个改写的"更新数据过期"用例实现前全部超时失败。pnpm test全量在本机因并发超时(testTimeout850ms)大面积假失败,与本改动无关:同一份 main 代码两次跑分别是 3 failed 和 443 failed / 129 文件,本分支两次是 38 failed 和 170 failed,失败集中在scripts/check-i18n.test.mjs、src/pkg/utils/match.test.ts、popconfirm.test.tsx等与 diff 无关的文件。所有涉及文件单独跑均通过(见上一条)。