Skip to content

🐛 点击扩展更新通知时激活已自动打开的更新日志页 (#1769) - #1782

Open
Pililink wants to merge 1 commit into
scriptscat:mainfrom
Pililink:fix/1769-activate-changelog-tab
Open

Pililink wants to merge 1 commit into
scriptscat:mainfrom
Pililink:fix/1769-activate-changelog-tab

Conversation

@Pililink

@Pililink Pililink commented Sep 29, 2026 •

Copy link
Copy Markdown

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

背景

Close #1769。扩展更新(次版本 / beta)时会自动打开更新日志页,同时发一条「点击查看更新日志」的系统通知;点击通知却会再 chrome.tabs.create 一个同样的页面,更新日志被打开两次。按维护者在 issue 中的意见,点击通知时应激活已经自动打开的页面。

本次改动

  • openChangelogAndNotify(service_worker/index.ts):从 onInstalled 里抽出,改为先打开更新日志页、再发通知,并把打开的标签页 id 一并写进通知缓存(NotificationOptionCache.tabId)。原来两者并行,发通知时还拿不到标签页。打开失败时照常发通知(不带 tabId)并记录错误。
  • openNotificationUrl(service_worker/utils.ts):通知点击处理(gm_api.ts 的 handlerNotification)改用它。若 tabId 对应的标签页仍存在且仍停留在该页面(比较 hash 之前的部分,加载中时看 pendingUrl),就激活该标签页并聚焦其窗口;否则(未自动打开、已关闭、已跳到其他页面)照旧新开。
  • 修复版本(如 1.5.1)本来就不自动打开页面,行为不变:点击通知仍新开页面。

实现考虑

  • 只比较 hash 之前的 URL:更新日志的链接带 #版本号,用户在页面内点锚点只会改 hash,不应视为离开。标签页已被用户跳走时不抢占它,避免把用户正在看的其他页面切到前台。
  • 已确认 https://docs.scriptcat.org/docs/change/、/en/docs/change/、/docs/change/beta-changelog/ 均直接返回 200、无重定向,所以按 URL 比较不会因重定向误判而多开。
  • tabId 只由更新日志这一处写入,其他 InfoNotification 调用方不受影响。

已知限制

  • chrome.tabs.get 与 chrome.tabs.update 之间标签页恰好被关闭时,update 会失败,此时只记录错误、不再补开页面。
  • 系统通知的点击无法用 Playwright 驱动,真实浏览器中的行为只有下面「验证」里记录的一次人工测试;「日志页在另一个窗口」的场景未人工测试,仅由单元测试覆盖(断言会调用 chrome.windows.update(windowId, { focused: true }))。

验证

  • 先写测试并确认失败(openNotificationUrl / openChangelogAndNotify 不存在,9 个用例全部失败),实现后:
    pnpm exec vitest run --no-coverage src/app/service/service_worker/index.test.ts src/app/service/service_worker/utils.test.ts → 36 passed。
  • 人工测试(Chrome,Windows):pnpm run build 构建 7c5b9cb1,以解压方式加载 dist/ext;在扩展管理页点「重新加载」触发 onInstalled(reason=update),版本 1.5.0-beta.4 会自动打开 beta 更新日志页并发出系统通知。
    • 保持自动打开的日志页不关、切到其他标签后点击通知:切回该日志页,没有新开页面(修复前会再开一个)。
    • 关闭自动打开的日志页后点击通知:新开一个日志页。
    • 在自动打开的日志页中访问其他网站后点击通知:新开一个日志页,不会切到已跳走的标签。
  • pnpm run typecheck 通过;pre-commit(prettier / typecheck / eslint / issue-templates)通过。
  • pnpm exec vitest run --no-coverage src/app/service/service_worker → 仅 trash_event_partition.test.ts 的 2 个用例失败;在 origin/main(80854540)源码上用同一命令同样失败,与本改动无关。
  • 本机全量 vitest run 在并发负载下有大量随机超时(每次失败的文件都不同,基线 origin/main 同样出现,抽样单独重跑均通过),未能得到干净的全量结果。

🤖 Generated with Claude Code

扩展更新时会自动打开更新日志并同时发送系统通知,点击通知却会再开一个同样的页面。
现在先打开更新日志再发通知,并在通知缓存中记下该标签页;点击通知时若该标签页仍停留在
更新日志页面(忽略 hash),则激活它并聚焦其窗口,否则(已关闭、已跳走或未自动打开)照旧新开。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] 扩展更新弹窗与浏览器通知重叠

1 participant