Skip to content

✨ 图标服务新增「禁用」档,彻底关闭 favicon 获取 - #1637

Merged
CodFrm merged 1 commit into
mainfrom
feat/favicon-service-disable
Jul 27, 2026
Merged

✨ 图标服务新增「禁用」档,彻底关闭 favicon 获取#1637
CodFrm merged 1 commit into
mainfrom
feat/favicon-service-disable

Conversation

@CodFrm

@CodFrm CodFrm commented Jul 27, 2026

Copy link
Copy Markdown
Member

Checklist / 检查清单

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

背景

打开脚本猫时会按脚本的 @match / @include 域名逐个请求 favicon。@match 多的脚本(issue 里举例的 Bypass All Shortlinks Debloated 有 500+)会一次性产生大量外部请求,触发安全软件拦截;NSFW / 重定向类脚本的域名被请求还有隐私与审计风险。

#1268 之后用户只能在几个图标服务之间切换,没有真正关掉的选项——这正是 #1255 被重开的原因。

本次改动

@cyfung1031 的 UI 建议,不新增设置行,直接在「设置 → 界面 → 图标服务」下拉里加一档「禁用」:

  • FaviconService 增加 "none"src/pkg/config/config.ts
  • loadScriptFaviconsnone 时直接返回:不读写 favicon 缓存,也不发起任何请求(src/pages/store/favicons.ts
  • 下拉首项为「禁用」,10 个语言包补 favicon_service_none
  • 订阅页 @connect 域名图标同样遵守该开关(见「实现考虑」)

默认值不变,仍是 ScriptCat 图标服务;老用户行为不受影响。

实现考虑

  • fetchIconByService 也显式处理 "none":该 switch 原本是 case "local": default:,任何未处理的取值都会落到「直连目标站点抓 HTML 解析 icon」这条最重的路径上。只在上层拦截、不补这个 case,等于给后续调用者留了个反向默认值的坑。
  • 订阅页 @connect 图标是另一条直连路径SubscribeList 一直是 <img src="https://<domain>/favicon.ico"> 直接打目标站,不走图标服务。不管它,「禁用」就名不副实,所以本次让它遵守 none
    由于配置是异步读出来的,<img> 一旦挂载请求就已经发出去了,撤下来也晚了——因此配置就绪前一律先渲染地球占位。
  • 关闭后 FaviconDots 无数据即返回 null,列表不留空位。

已知限制

  • 订阅页 @connect 图标在非禁用档位下仍然直连站点,没有改走所选图标服务。这是既有行为,不在本次范围内。
  • 运行中切换该设置不会让已打开的列表页把已显示的图标撤下来,需重新打开页面;但不会再产生新请求。
  • 已缓存到 OPFS 的图标不会因切到「禁用」而清理(不产生请求,仅占本地空间)。

建议审查重点

  • loadScriptFavicons 的提前返回是否漏掉了别的 favicon 入口(当前该函数是脚本列表侧唯一调用点)。
  • 订阅页占位逻辑:配置就绪前显示地球是否可接受,还是宁可保持现状不动这个文件。
  • 各语言「禁用」译法是否符合对应 docs/references/terminology-<locale>.md 的 enable/disable 术语。

验证

单测(先写失败用例再实现):

  • src/pages/store/favicons.test.tsloadScriptFavicons(scripts, "none") 零产出且不调用 fetchfetchIconByService(domain, "none") 返回 []
  • src/pages/options/routes/Setting/sections/InterfaceSection.test.tsx — 配置值为 none 时下拉回显「禁用」
  • src/pages/options/routes/SubscribeList/components.test.tsx(新增)— 禁用时不渲染 <img>,启用时正常渲染

命令与结果:

npx vitest run          # 311 files / 3506 tests passed
pnpm run check:i18n     # passed
npx tsc --noEmit        # 无输出
npx eslint <changed>    # 无输出
pnpm run build          # 通过(monaco 既有 warning)

真机验证(e2e/scratch/ 一次性脚本驱动 dist/ext,4 条 @match 的脚本,两个用例各用全新 profile;「禁用」用例先改设置再装脚本,排除命中既有缓存):

  • 默认 ScriptCat 服务,抓到 4 条请求:
https://ext.scriptcat.org/api/v1/open/favicons?domain=github.com&sz=64
https://ext.scriptcat.org/api/v1/open/favicons?domain=www.wikipedia.org&sz=64
https://ext.scriptcat.org/api/v1/open/favicons?domain=developer.mozilla.org&sz=64
https://ext.scriptcat.org/api/v1/open/favicons?domain=stackoverflow.com&sz=64
  • 切「禁用」后同样场景:favicon requests = [],列表正常渲染、不再显示站点图标。

Screenshots / 截图

关联

Close #1255

打开脚本猫时会按脚本的 @match 域名逐个请求 favicon,@match 多的脚本会
产生大量外部请求,并触发安全软件拦截。此前只能换图标服务,无法真正关掉。

在「设置 - 界面 - 图标服务」下拉中增加「禁用」一档(不新增设置行):选中后
loadScriptFavicons 直接返回,不读写 favicon 缓存也不发起任何请求;订阅页
@connect 域名图标同样遵守该开关,且在配置读取完成前先渲染占位,避免 <img>
挂载即发出请求。

Close #1255
@CodFrm
CodFrm merged commit 9686b32 into main Jul 27, 2026
9 of 10 checks passed
@CodFrm
CodFrm deleted the feat/favicon-service-disable branch July 27, 2026 03:46
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.

[Feature] #726 的后续改进:希望加入“关闭 favicon 获取”的设置选项

1 participant