本文件记录 Encrypted Bookmark 项目的所有重要变更。
格式基于 Keep a Changelog。
- 引入 Vitest 单元测试框架,配置 jsdom 环境、覆盖率报告(v8)
- 新增
test、test:watch、test:coveragenpm scripts - 创建 Chrome API Mock(chrome.storage、chrome.runtime、chrome.tabs、chrome.idle)
- 创建 Web Crypto API 测试环境配置
- 工具函数单元测试:passwordHasher、passwordValidator、xssProtection、favicon、helpers(67 tests)
- 解析器单元测试:HtmlParser、HtmlGenerator、JsonParser(41 tests)
- 存储层单元测试:ChromeStorageAdapter、FileSystemAdapter、StorageLockManager、StorageMigrator(30 tests)
- 核心服务层单元测试:EncryptionService、AuthService、PasswordService、SessionService、LockService、SettingsService 等(71 tests)
- React Hooks 单元测试:useBookmarks、useCurrentTab、useFolders、useTags、useSearch 等(12 tests)
- Smoke test 验证测试基础设施完整性(13 tests)
- 新增 devDependencies:vitest、@vitest/coverage-v8、jsdom、@testing-library/react、@testing-library/jest-dom、@testing-library/user-event
- 侧边栏新增"🕐 稍后再读"虚拟文件夹入口,支持集中查看和管理稍后再读书签
- "稍后再读"入口显示待读书签数量角标
- 底部状态栏上下文感知:选中"稍后再读"时显示"X 个待读书签"
- BookmarkService.getBookmarks() 实现 isReadLater 筛选逻辑
- FolderItem 组件支持自定义图标(icon)和系统文件夹标记(isSystem)
- "全部书签"统计数量排除稍后再读书签,各文件夹数量统计同步排除
- 开启"稍后再读"开关时自动隐藏文件夹选择器(互斥逻辑),关闭时恢复
- ContextMenu 边界检测增强:使用 popup-container 的 getBoundingClientRect() 替代 window.innerHeight,防止菜单溢出和滚动条
- 修复 QuickAddPanel 文件夹下拉列表出现两个"未分类"的问题
- 修复书签右键菜单在 Popup 底部区域溢出导致出现滚动条的问题
- 修复文件夹 Hooks(useFolders/useFolderActions)中 ChromeStorageAdapter 实例化错误,folderStorage 误用默认书签存储键导致文件夹映射紊乱和空名称文件夹问题
- 修复标签 Hooks(useTags/useTagActions)中 ChromeStorageAdapter 实例化错误,tagStorage 误用默认书签存储键
- 修复侧边栏书签数量统计基于筛选结果而非全量数据的问题,选中文件夹或搜索时数量不再变化
- 修复侧边栏「未分类」默认文件夹与「全部书签」重复显示的问题
- 统一所有 Hooks 中 ChromeStorageAdapter 使用工厂方法(getInstance/getFolderInstance/getTagInstance)
- 修复 Options 设置页侧边栏宽度不足导致插件名"Encrypted Bookmark"换行的问题(240px → 260px)
- 修复 Popup 添加书签按钮"+"号未水平垂直居中的问题(改用 CSS 伪元素绘制十字图形)
- Popup 快速添加面板新增"稍后再读"Toggle 开关,收藏书签时可标记为稍后再读
- 书签数据模型新增
isReadLater可选字段,支持"稍后再读"标记
- 优化 Options 页面分割线:移除
.settings-section冗余border-bottom,.panel-actions和.section-divider颜色降级为#F3F4F6,移除.sidebar-header冗余分割线 - 优化 Popup 弹窗分割线:标题栏、搜索栏、底部栏的硬分割线替换为轻量
box-shadow,侧边栏分割线颜色降级 - 重构 Options 详情页布局:侧边栏从
position: fixed改为sticky,内容区改为 Flex 自适应布局 - Options 面板宽度自适应:使用
clamp()和min()实现渐进增强的响应式宽度 - Options 垂直高度自适应:内容区支持自然撑开和滚动
- 完善响应式断点:新增 1024px 中等屏幕断点,优化 768px 以下移动端适配
- 文件夹管理增强:文件夹右键菜单支持重命名和删除操作
- 文件夹行内编辑重命名:右键选择重命名后直接在列表中编辑文件夹名称,支持 Enter 确认 / Escape 取消
- 文件夹删除确认弹窗:删除文件夹时显示影响书签数量,确认后书签自动迁移至「未分类」
- 新建文件夹入口:文件夹列表底部新增「+ 新建文件夹」按钮
- 侧边栏标签视图:左侧侧边栏支持「文件夹」和「标签」Tab 切换
- 标签删除功能:右键标签可删除,自动从关联书签中移除
- 标签使用统计展示:标签列表中每个标签显示关联书签数量
- 通用确认弹窗组件(ConfirmDialog):用于文件夹/标签删除等危险操作的二次确认
- 行内编辑组件(InlineEdit):用于文件夹重命名的行内编辑交互
- 侧边栏 Tab 组件(SidebarTabs):文件夹与标签视图切换
- 新增 Hooks:useTags、useFolderActions、useTagActions、useLockSettings
- 自动锁定时间全局统一:Background Service Worker 动态读取用户设置的 autoLockMinutes,移除硬编码 15 分钟默认值
- 设置变更实时同步:新增 chrome.storage.onChanged 监听器,Options 修改锁定时间后 Background 和 Popup 实时生效,无需重启浏览器
- LockService 默认值统一:DEFAULT_LOCK_MINUTES 统一为 15 分钟,与 SettingsService 保持一致
- Popup UI 现代化重构:整体布局重构为顶部标题栏 + 搜索栏 + 侧边栏 + 书签列表 + 底部状态栏
- Indigo 主色调设计系统:统一采用 Indigo 600 (#4F46E5) 作为品牌色,规范色彩、圆角、间距、字体体系
- 解锁页面品牌化 UI:居中布局、品牌 Logo、现代化输入框样式
- 书签卡片标签显示优化:标签显示真实名称和颜色(替代原 ID 显示)
- 搜索框 UI 优化:添加搜索图标前缀,增加 focus 视觉反馈
- 右键菜单样式统一:ContextMenu 增加图标,统一视觉风格
- ContextMenu 右键菜单事件竞态问题:修复多个右键菜单同时触发时的事件冲突
所有核心功能开发完成,项目从 PrivateBookMark 正式更名为 Encrypted Bookmark。
| 阶段 | 模块 | 说明 |
|---|---|---|
| Task1 | 基础架构与加密核心层 | 项目脚手架搭建、EncryptionService(AES-256-GCM)、PBKDF2 密钥派生、密钥管理 |
| Task2 | 存储层抽象与双存储实现 | StorageProvider 接口抽象、chrome.storage.local 实现、本地文件系统存储实现 |
| Task3 | 书签核心业务层 | 书签 CRUD、文件夹管理、标签系统、全文搜索 |
| Task4 | 安全与会话管理 | 主密码验证、会话状态管理、自动锁定(空闲 15min)、防暴力破解机制 |
| Task5 | UI 交互层与 Popup 实现 | Popup 弹窗界面、React 组件开发、交互逻辑与状态管理 |
| Task6 | 设置页与路径配置 | Options 设置页面、存储路径配置、存储模式切换、密码修改 |
| Task7 | 导入导出与数据迁移 | HTML/JSON 书签导入、加密/明文导出、数据格式转换 |
| Task8 | 文档整理与项目更名 | 项目更名(PrivateBookMark → Encrypted Bookmark)、文档清理与整理、快速使用指南 |
- 前端框架:React 18 + TypeScript
- 构建工具:Vite + @crxjs/vite-plugin
- 加密方案:Web Crypto API(AES-256-GCM + PBKDF2)
- 浏览器规范:Manifest V3
- 浏览器 API:Chrome Storage / Tabs / Idle / Bookmarks