🐛 更新页不再倒计时自动关闭,记录失效改为自动重查续做 - #1720
Open
CodFrm wants to merge 1 commit into
Open
Conversation
自动弹出的批量更新页带 autoclose=30,30 秒后 window.close(),用户还没读完 更新说明页面就自己没了(#1715)。倒计时是在补偿「抢焦点弹出一个没人要求的标签 页」,方向反了:整套机制连同 URL 参数、药丸组件与三个 i18n key 一并移除。 页面因此会长时间开着,这暴露了原本被 30 秒关窗掩盖的问题:批量更新记录只存在 Service Worker 内存里,SW 被回收后点更新只会拿到 record_expired。现在首次失效 自动重新检查一次并接着做完剩余条目,重查后已是最新的条目静默出队、不计为失败, 二次失效才提示用户重新检查。 close #1715
Collaborator
|
「 更新页不再倒计时自动关闭」暂时没意见。之后有需要再处理 Agent好像也发现这个设计是预设会关掉的 或者你只改参数把 auto_close 设为 -1 会简单一点 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 无关的文件。所有涉及文件单独跑均通过(见上一条)。