feat: 按域名授权、iframe 多帧填充、自动提交限流修正,并补齐工程规范与文档
安全与权限: - 站点访问权限改为 optional_host_permissions,保存配置时逐域名授权;移除 host_permissions 与 tabs,安装提示不再出现全站数据访问与浏览记录 - 主口令不再写入 storage.session,改用 IndexedDB 中不可导出的 CryptoKey 句柄恢复解锁,锁定即丢弃 - content script 注入范围只注册已授权域名,并随权限变化即时收敛 自动登录: - 支持 iframe 内的登录表单:脚本注入所有帧,逐帧按自身地址匹配配置 - 手动填充改为逐帧探测,定向发送到真正含密码框的帧 - 限流修正:只在真正触发提交后计数;判定登录成功后立即清零;达到上限时页面给出可见提示;重置判断只看启用中的配置 - SPA 重试改为 DOM 变更门控 + 退避,并单独监听已发现的 Shadow Root 工程化与文档: - 引入 ESLint(扁平配置)与 Prettier,CI 增加 lint 与 format:check - 信息类日志改为 debugLog(默认静默,chrome.storage.local.debugLog 开关) - 测试 123 → 128 用例(新增权限、iframe、限流相关用例) - README / PRIVACY / CHANGELOG 同步
This commit is contained in:
+23
-2
@@ -9,6 +9,7 @@
|
||||
|
||||
### Added
|
||||
|
||||
- iframe 支持:脚本注入所有帧(`allFrames`),可填充内嵌在 iframe 中的登录表单(如 SSO 登录页)
|
||||
- 构建管线:引入 esbuild 负责打包与压缩,`tsc` 只做类型检查(`scripts/build.mjs`)
|
||||
- 构建自检:校验 `manifest.json` / `popup.html` 引用的文件是否存在、版本号是否一致
|
||||
- 打包与发布脚本:`npm run package` 产出 zip,`npm run release -- <patch|minor|major|x.y.z>` 递增版本并同步 `manifest.json` / `package.json` / `updates.xml`
|
||||
@@ -16,19 +17,34 @@
|
||||
- 密钥句柄存储模块 `src/key-store.ts`:以不可导出的 `CryptoKey` 句柄替代明文口令,实现 Service Worker 重启后自动解锁
|
||||
- `utils.toMatchPatterns()`:把域名配置转成合法的 Chrome match pattern
|
||||
- 按域名的动态脚本注入:只向用户配置过的域名注册 content script
|
||||
- 测试:新增 `tests/key-store.test.js`、`tests/content-fill.test.js`(jsdom 真实 DOM),测试总数 54 → 99
|
||||
- 测试:新增 `tests/key-store.test.js`、`tests/content-fill.test.js`(jsdom 真实 DOM)、`tests/permissions.test.js`,测试总数 54 → 114
|
||||
- 文档:`README.md`、`PRIVACY.md`、`CHANGELOG.md`、`LICENSE`
|
||||
- 代码规范:ESLint(扁平配置)+ Prettier,提供 `npm run lint` / `format` 脚本,CI 中执行检查
|
||||
- 调试日志开关:`chrome.storage.local.debugLog`(`utils.initDebugLog` / `debugLog`),默认静默
|
||||
|
||||
### Changed
|
||||
|
||||
- `popup.ts`(1479 行)拆分为 `src/popup/` 下 15 个模块,模块间通过 `PopupCtx` 上下文互相调用,消除网状耦合
|
||||
- `manifest.json` 移除静态 `content_scripts`(原为 `<all_urls>` 无条件注入所有页面)
|
||||
- 手动填充改为"探测已注入标记 → `chrome.scripting.executeScript` 按需注入"
|
||||
- **站点访问权限改为按域名授权**:移除 `host_permissions: <all_urls>`,改用 `optional_host_permissions`,在保存配置时逐域名询问;未授权域名不再自动填充,但手动填充仍可用
|
||||
- 移除 `tabs` 权限(改用 `activeTab`),安装提示不再包含"读取您的浏览记录"
|
||||
- 配置列表新增「未授权」标记,点击即可重新申请站点访问权限
|
||||
- 别名兜底改为优先取当前标签页标题(`activeTab` 即可读),并修正未声明 `tabs` 时 `tabs.query({url})` 过滤被忽略导致可能取到无关标题的问题
|
||||
- 信息类日志改为按需输出(默认静默),仅保留异常告警常驻输出;新增 `chrome.storage.local.debugLog` 开关
|
||||
- 多环境浮窗的移除逻辑收敛为 `closeEnvPicker()`,去掉几处"表达式语句"写法
|
||||
|
||||
### Performance
|
||||
|
||||
- SPA 重试改为"DOM 变更门控 + 退避"策略:页面自上次扫描后无任何变更时跳过该轮全量 DOM 扫描,重试间隔从固定 500ms 改为 300ms → 3s 逐步退避。大页面(数万节点)在 30 秒窗口内的全量扫描次数从最多 60 次降到个位数
|
||||
- 扫描中发现的 Shadow Root 会被单独监听(body 上的 MutationObserver 感知不到 Shadow DOM 内部变化),在降低扫描频次的同时避免漏填组件内部后渲染的登录框
|
||||
- 手动填充改为"探测已注入标记 → `chrome.scripting.executeScript` 按需注入",并逐帧探测、定向发消息到"真正有密码框"的帧
|
||||
- 多环境选择浮窗只在顶层帧渲染;子帧(iframe)内命中多个环境时改用当前激活环境的配置,避免浮窗被 iframe 裁切
|
||||
- `dist/` 不再纳入版本控制,改为构建产物;克隆后需执行 `npm run build`
|
||||
- 类型检查与产物生成分离:`tsconfig.json` 设置 `noEmit`
|
||||
|
||||
### Security
|
||||
|
||||
- **按最小权限运行**:不再持有"访问所有网站"的永久权限,站点访问权改为用户逐域名授予;配合已移除的 `tabs` 权限,安装提示中不再出现全站数据访问与浏览记录条目
|
||||
- **移除明文口令存储**:不再把主口令写入 `chrome.storage.session`,改为在 IndexedDB 保存不可导出的密钥句柄;旧版本残留的 `__autoPwd` 在升级后会被自动迁移为句柄并立即删除
|
||||
- 锁定(手动或 10 分钟无操作)时一并删除密钥句柄,解锁状态不再"自动复活"
|
||||
- 脚本注入范围由"所有网站"收敛为"用户配置过的域名",锁定时自动清空
|
||||
@@ -36,6 +52,11 @@
|
||||
|
||||
### Fixed
|
||||
|
||||
- 尝试次数只在**真正触发提交后**才累加:此前命中域名但页面没有登录框也会消耗配额,导致"登录成功后在站内浏览几个页面,自动提交就被暂停"
|
||||
- 登录成功后计数不再累积:新增提交结果观察(登录框消失或已离开匹配地址 → 判定成功 → 清零),修正了纯域名配置下"连续 3 次成功登录后停止自动提交"的问题
|
||||
- 达到上限时给出**页面可见提示**(此前只有一条默认静默的调试日志,用户只看到"填了但不提交")
|
||||
- 计数重置判断只看启用中的配置,被禁用的配置不再阻止重置
|
||||
- 命中配置但整页始终没有登录框时清掉旧的尝试计数
|
||||
- `tests/detect-captcha.test.js` 缺少 `chrome.runtime.sendMessage` mock,导致加载 `content.js` 时抛出未处理的 Promise 拒绝,测试结果不干净
|
||||
|
||||
## [1.0.0] - 2026-09-14
|
||||
|
||||
Reference in New Issue
Block a user