✨ Popup 站点范围快捷操作常驻,关闭本站执行优先移出匹配 - #1696
Open
CodFrm wants to merge 1 commit into
Open
Conversation
站点范围快捷操作不再需要在设置里开启:删除 popup_site_scope_actions 配置项与随之只在关闭态使用的 excludeUrl 全链路。 「排除在 $0 上执行」改为优先把网域与当前 host 完全相等的 @match 移出匹配 列表,只有移完仍命中当前网址(通配 @match、@include、正则等移不动的 规则)才追加 @exclude。排除会冻结作者 @exclude 并让匹配与排除自相矛盾, 只在删不掉时才用。通配子域匹配不移除,否则会连带关掉兄弟子域。 匹配被移空的脚本此前会连原始规则一起从匹配器清掉,从 Popup 消失、无法 再用「允许在 X 执行」恢复;现在生效规则为空但原始规则还在时继续解析并 注册原始规则。相应地,注册前须挡下一条 inclusion 都不剩的脚本—— getApiMatchesAndGlobs 对这种规则集会退回 *://*/*,注册出去等于全站运行。 顺带删掉 exclude_on:#1646 把三态压成 exclude_off 单键后它就没有调用点, 本次移除 excludeUrl 后更不可能再被用到。
CodFrm
force-pushed
the
feat/popup-site-scope-always-on
branch
from
August 28, 2026 09:34
70e94da to
42f9516
Compare
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 / 检查清单
N/A — 本 PR 无关联 issue,改动由维护者直接提出。
背景
站点范围快捷操作(「仅在 X 执行 / 排除在 X 上执行 / 允许在 X 执行」)此前藏在设置项
popup_site_scope_actions后面,默认关闭;关闭态走的是另一条excludeUrl分支,只能加排除、不能撤销。「排除在 X 上执行」无论如何都会往
@exclude里写一条。用户覆盖是整体替换作者规则的(
getCombinedMeta),所以写排除会把作者当时的@exclude冻结进用户覆盖,之后脚本更新新增的排除规则不再生效;对于
@match本来就只覆盖当前站点的脚本,还会留下「匹配说要跑、排除说不跑」的自相矛盾状态。本次改动
1. 快捷操作常驻。 删除
popup_site_scope_actions配置项(config getter/setter、备份分区、设置页开关、preload / usePopupData / App 全链路、10 个语言包的两个 key)。随之只在关闭态使用的
excludeUrl(SW handler + client + popup handler)已无调用点,一并删除。
2. 「排除在 X 上执行」改为条件回退(
ScriptService.excludeFromMatch):@match条目;isUrlIncluded对剩余规则重算,只有仍命中当前网址(通配@match、@include、正则等移不动的规则)才追加
*://host/*到排除;因此普通单站脚本只会得到
selfMetadata.match的删减,排除列表保持干净;通配脚本仍按老路子写排除。按钮文案维持「排除在 X 上执行」不变。
3. 删除死键
exclude_on(「恢复在 X 上执行」,10 个语言包)。它在 #1646 把三态压成exclude_off单键时就失去了调用点,本次移除
excludeUrl后更不可能再被用到;terminology-zh-TW.md里对该 key 的引用一并更新。
4. 修掉匹配被移空后从 Popup 消失的死路。
scriptURLPatternResults此前在生效 match+include 为空时返回null,
applyScriptMatchInfo会把uuid与uuid{ORIGINAL}的规则一起清掉,脚本直接从 Popup 消失,再也点不到「允许在 X 执行」(先「仅在此站执行」再「不在此站执行」在改动前就能触发)。现在生效规则为空但原始
规则还在时继续解析并注册原始规则,脚本以「未生效」留在列表里可恢复。
实现考虑
@match *://*/*的匹配列表里根本没有*://host/*可删,只删匹配等于按钮点了没反应;
@include、正则同理。只有排除能表达「除了这个站点」。*://*.example.com/*会连带关掉a.example.com等兄弟子域,超出「不在www.example.com 执行」的语义,因此这类条目一律走排除回退。
getApiMatchesAndGlobs对一条 inclusion 都不剩的规则集会退回matches: ["*://*/*"],第 4 点放行空匹配脚本后如果照常注册,脚本会变成全站运行。
buildAndSaveCompiledResourceFromScript因此在注册前挡下没有 inclusion 规则的脚本(该分支由
runtime.test.ts先复现再修)。excludeFromMatch(uuid, matchPattern)→excludeFromMatch(uuid, host, url),SW 需要完整网址才能做「移出后是否还命中」的重算。这是扩展内部消息,无外部契约。
已知限制
带端口的站点(
localhost:3000这类)host含冒号,构不成合法 match pattern,永远走排除回退分支 —— 与改动前行为一致,没有变差,但享受不到「只删匹配」的好处。
建议审查重点
excludeFromMatch的回退判定:getMatchPatternHost(pattern) !== host的取舍(只删完全等于当前 host 的条目),以及重算时用的生效 include/exclude 取值方式。
scriptURLPatternResults放行空匹配后,所有依赖它的调用点:applyScriptMatchInfo、getOrBuildPatternCache(Popup 禁用脚本匹配器)、buildAndSaveCompiledResourceFromScript(新守卫)。excludeUrl是否还有遗漏调用点(e2e/popup-matching-regressions.spec.ts原本驱动的就是它,已改用excludeFromMatch+allowUrl)。关联
无关联 issue(维护者直接提出)。#1591 的回归守卫仍保留,只是改用新消息驱动。
Screenshots / 截图
改动的是 Popup 折叠区里的动作项,无新增视觉样式。默认设置下展开一个当前页脚本的动作列表
(
node e2e/drive.mjs snapshot,全新 profile):排除本站执行后重开 Popup,同一脚本变为:
对应截图留在本地验证目录
e2e/scratch/site-scope/shots/(gitignore,未入库)。验证
全量单测的 5 个失败与本改动无关:4 个是
check-i18n.test.mjs在 git worktree 里找不到node_modules(直接
node scripts/check-i18n.mjs通过),1 个是并发下超时的 flaky(单独跑通过,main上同样表现)。pre-commit hook 因同一 worktree 原因会退回到全局 TypeScript 5.0.2,已用仓库自带的 6.0.3 手工跑完 hook 的四项
检查后
SKIP_PRE_COMMIT=1提交。实机验证(Chrome,
e2e/session.mjs,全新 profile):@match *://example.com/*)点「排除在 example.com 上执行」selfMetadata = { match: [] },未写排除match恢复,页面重载脚本重新执行@match *://*/*)点「排除在 example.com 上执行」selfMetadata = { exclude: ["*://example.com/*"] },match 未动;example.com 不再执行,iana.org 仍执行存储读取走 Service Worker,与被点击的 Popup UI 不是同一条路径。