✨ 安装页更新时按差异呈现权限,并移除安全警示条 - #1732
Merged
Merged
Conversation
更新页此前与全新安装共用同一份无基线的权限渲染,权限一项没改也全量重复 上次已确认过的内容(#1716)。已安装脚本的 metadata 其实早已取到,只是被 丢弃,因此计算差异不需要任何新的跨进程调用。 以已安装版本为基线逐取值标注新增与移除:新增与移除常驻可见,未变动项收 进「未变动 N 项」折叠桶,有变动的类别排到最前、未变动的类别塌成单行。变 动状态只由字重、描边与 +/− 记号表达,chip 底色继续只表达风险等级——否则 新增的 @connect * 会被染成「新增色」,把最该报警的情况伪装成安全的。每个 带状态的 chip 另附 sr-only 文案,使变动不只靠颜色传达。 某类别在新版本被清空但旧版本非空时仍然成行,否则「不再请求网络访问」这类 变化会整行消失。全新安装没有基线,呈现一字不改。 Ref #1716
维护者决定:权限卡重设计后颜色与位置已足够显眼,常驻横幅每次安装/更新都 复读同一句,反而钝化了它。危险权限由权限 chip 的红底描边表达,反特性由身 份卡的琥珀 Tag 表达,两者都不依赖这条横幅。 这是一项有意的能力减少而非遗漏:横幅独有的「请从合法来源安装脚本」这句来 源可信度提示,移除后在安装页不再有承载位置——权限卡说的是脚本能做什么, 不说这个来源该不该信。 连带清理仅被该组件使用的 6 个文案键(10 个语言包共 60 条),并修正 terminology-ja-JP.md 中指向其中一个键的术语示例。 Ref #1716
规格写明「没有任何权限的更新沿用现有空态文案,不进入差异呈现」,但权限卡 只把空行排除在整卡折叠之外,卡头仍按更新态渲染「无变化」与「对比已安装的 X」——一张没有任何可比之物的卡片替用户报出了差异结论。改为把「有基线且 有权限行」作为进入差异呈现的唯一条件。 折叠单行上的 aria-label 会覆盖按钮内容参与可访问名计算,辅助技术只听得到 一句「展开权限详情」;而规格要求这一行呈现「无变化」标记、与已安装版本相 同的说明以及类别数与取值总数——折叠的本该是注意力而不是信息。改用 aria-expanded 声明收起态,可访问名回到可见内容;未变动类别的塌行同样补上 aria-expanded,让「展开控件」这一语义对辅助技术成立。随之清理仅被该 aria-label 使用的 perm_card_expand(10 个语言包)。 Ref #1716
移动端 Accordion 的默认展开按 isUpdate 分支,只要传了基线版本就只展开「有变动」 的类别。零变化整卡是用户主动点开的,此时一个变动类别都没有,defaultValue 为空, 四类权限全部收起——桌面端同一状态给的是全量清单,CollapsedCard 上「点开即得到与 全新安装一致的全量清单」的承诺在移动端落空。改按 rows 是否真的存在变动来分支,与 桌面端 changed.length > 0 的塌行条件对齐;「无变化」标记同步改用 row.diff 判定, 与 PermissionRow 同一口径。 差异分支的 chip 列表还漏掉了 maxVisible:只有 pinned 的增删让位时才走折叠桶,一项 没变的行直接把 row.values 整片摊开。更新时权限没变是最常见的情况,几十条 @match 的脚本一点开就会铺满整卡,而同一份取值在全新安装页是 8 条 + 「+N」。补回截断, 有增删时仍用「未变动 N 项」文案,无增删时退回与全新安装一致的 +N。
Collaborator
|
既有 vitest timeout 问题见 #1734 |
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 — “Code reviewed by human” 尚未发生:本分支只经过 agent 的规格核对与代码复核两轮,按模板要求不能勾。
背景
更新页与全新安装页共用同一份没有基线的权限渲染(
App.tsx把同一个PermissionCard喂给两种场景,数据来自只吃新版本 metadata 的derivePermissions),所以权限一项没改时,更新页仍旧全量重复上次安装时已经确认过的内容——#1716 的截图即此。差异基线其实早就取到了:
prepareScriptByCode返回完整的oldScript,只是调用处仅取了版本号与代码。计算差异不需要任何新的跨进程调用。同一根因还有第二个表现:安全警示条无条件渲染,且风险分句只判断「当前是否存在 danger 权限」。脚本上个版本就声明了
@connect *、本次毫无改动时,用户每次更新都会再吃一遍同样的红色警告。本次改动
更新场景改为差异呈现。 以已安装版本为基线逐取值标注新增/移除:新增与移除常驻可见,未变动项收进「未变动 N 项」折叠桶,有变动的类别排到最前、未变动的类别塌成单行。权限一项没变时整卡默认折叠成一行(基线版本 + 类别数 + 取值总数),点开即得到与全新安装完全一致的全量清单。
全新安装呈现一字未改——此时没有基线,每一项对用户都是新的。
移除安装页安全警示条(安装与更新两种场景),并清掉仅被它使用的 6 个文案键 × 10 个语言包。
实现考虑
变动状态不占用颜色。 chip 底色现在编码的是风险等级(红=危险),所以增删只用字重、描边和
+/−记号表达。若用绿色表示「新增」,新增的@connect *会被渲染成一个看起来很安全的绿色 chip——恰好把最该报警的情况伪装成最安全的。排序键是「有变动 > 风险 > 类别序」。 更新页首先要回答「这次变了什么」;未变动的高危项是用户上次安装时已经确认过的内容。
类别被整个清空时仍然成行(计数 0 +
−N+ 删除线 chip),否则「这个脚本不再请求网络访问了」这类实质变化会整行消失。变动不只靠颜色传达:每个带状态的 chip 附 sr-only 文案,屏幕阅读器可区分新增/移除/未变动。
已知限制
移除警示条是一项有意的能力减少,不是遗漏。危险权限由权限 chip 表达、反特性由身份卡的琥珀 Tag 表达,但横幅独有的「请从合法来源安装脚本」这句来源可信度提示,移除后在安装页不再有承载位置——权限卡说的是脚本能做什么,不说这个来源该不该信。这是维护者在 #1716 讨论中拍板接受的取舍。
不在本次范围:非权限类 metadata(
@name/@run-at等)的更新差异、订阅更新的差异呈现、Skill 安装页的警示条与权限呈现。建议审查重点
permissions.ts的derivePermissionDiff:类别在新版本被清空但旧版本非空时仍成行、以及排序键的优先级。PermissionRow.tsx的Chip:风险底色与变动描边的组合——尤其「新增 + danger」是否仍是全卡视觉权重最高的元素。PermissionChips的截断策略:有增删时未变动项整体让位给折叠桶,一项没变时退回全新安装的maxVisible截断(几十条@match的脚本一更新会整片摊开,这是复核阶段抓到的回归)。App.tsx的渲染顺序,以及 10 个语言包是否清干净。关联
close #1716
验证
运行时验证:在构建产物
dist/ext上驱动真实 Chrome 扩展会话,走完「全新安装 → 有变动更新 → 零变化更新」,11 项需求全部 holds,无替代依赖、无未观察项。场景脚本用@connect新增*、@grant新增GM_cookie且移除GM_notification、@require整类清空、@match不变。Screenshots / 截图
证据(9 张定格 + 61.75s 全流程录屏)在本地
e2e/scratch/2026-09-08-install-permission-diff/,该目录已 gitignore,尚未上传到本 PR,需要人工拖入:shots/05-update-nochange-collapsed-light.png@connect *)shots/02b-update-changed-card-light.png权限变化 +2 −2、+ *红底、− GM_notification删除线、外部资源 0 −1、运行网站塌成单行shots/06-update-nochange-expanded-light.pngshots/01-fresh-install-light.pngshots/03/07/08-*-dark.pngshots/04-update-changed-mobile-dark.pnginstall-permission-diff-run.mp4