Chrome 浏览器原生下载逻辑架构
1. 整体分层架构
Chromium 下载系统采用经典的三层架构:组件层 (components/) → 内容层 (content/) → 浏览器层 (chrome/),各层职责清晰,通过接口和委托模式解耦。
UI层
DownloadShelf - 旧UI
DownloadBubble - 新UI
DownloadDisplayController
DownloadBubbleUIController
浏览器层 - chrome/browser/download
DownloadCoreServiceImpl
ChromeDownloadManagerDelegate
DownloadHistory
DownloadUIController
DownloadTargetDeterminer
DownloadPrefs
DownloadRequestLimiter
内容层 - content/browser/download
DownloadManagerImpl
DownloadManager - 接口
DownloadManagerDelegate - 接口
组件层 - components/download
DownloadItem / DownloadItemImpl
DownloadFile / DownloadFileImpl
InProgressDownloadManager
DownloadCreateInfo
DownloadUrlParameters
UrlDownloadHandler
DownloadDB / DownloadDBCache
2. 核心类职责与关系
2.1 组件层 (components/download)
| 类名 | 文件路径 | 职责 |
|---|---|---|
DownloadItem |
components/download/public/common/download_item.h |
下载项公共接口,定义状态枚举、Observer 模式、用户操作接口 |
DownloadItemImpl |
components/download/public/common/download_item_impl.h |
DownloadItem 的内部实现,管理下载状态机、文件重命名、恢复等 |
DownloadFileImpl |
components/download/public/common/download_file_impl.h |
在后台线程执行文件 I/O,从 InputStream 读取数据写入磁盘 |
InProgressDownloadManager |
components/download/public/common/in_progress_download_manager.h |
管理所有活跃下载,实现 UrlDownloadHandler::Delegate 和 DownloadItemImplDelegate |
DownloadCreateInfo |
components/download/public/common/download_create_info.h |
跨线程传递的新下载信息结构体 |
DownloadUrlParameters |
components/download/public/common/download_url_parameters.h |
发起下载的参数封装(URL、referrer、回调等) |
UrlDownloadHandler |
components/download/public/common/url_download_handler.h |
URL 下载处理接口,通过 Delegate 回调 OnUrlDownloadStarted/Stopped |
DownloadDBCache |
components/download/database/download_db_cache.h |
基于 LevelDB 的下载进度持久化缓存 |
2.2 内容层 (content/browser/download)
| 类名 | 文件路径 | 职责 |
|---|---|---|
DownloadManager |
content/public/browser/download_manager.h |
公共接口,每个 BrowserContext 一个实例,Observer 模式通知下载事件 |
DownloadManagerImpl |
content/browser/download/download_manager_impl.h |
DownloadManager 的实现,协调下载生命周期 |
DownloadManagerDelegate |
content/public/browser/download_manager_delegate.h |
委托接口,允许 Chrome 层定制 content 层的下载行为 |
2.3 浏览器层 (chrome/browser/download)
| 类名 | 文件路径 | 职责 |
|---|---|---|
DownloadCoreService |
chrome/browser/download/download_core_service.h |
Per-profile KeyedService 接口 |
DownloadCoreServiceImpl |
chrome/browser/download/download_core_service_impl.h |
拥有 ChromeDownloadManagerDelegate、DownloadHistory、DownloadUIController |
ChromeDownloadManagerDelegate |
chrome/browser/download/chrome_download_manager_delegate.h |
实现 DownloadManagerDelegate,处理目标确定、安全检查、打开下载等 |
DownloadHistory |
chrome/browser/download/download_history.h |
桥接 DownloadManager 和 HistoryService,负责下载记录持久化 |
DownloadUIController |
chrome/browser/download/download_ui_controller.h |
观察 DownloadManager,通过 Delegate 通知 UI 新下载 |
DownloadTargetDeterminer |
`chrome/browser/download/download_target_determiner.h) | 自管理对象,确定下载目标路径、危险类型、中间路径 |
DownloadPrefs |
chrome/browser/download/download_prefs.h |
Per-profile 下载偏好设置(下载路径、自动打开等) |
DownloadRequestLimiter |
`chrome/browser/download/download_request_limiter.h) | 限制同一页面的多次下载请求 |
3. 核心类关系图
delegate_
manages many
manages active
owns
observes
observes
<<interface>>
DownloadManager
+DownloadUrl(params)
+GetAllDownloads()
+AddObserver(observer)
DownloadManagerImpl
-in_progress_manager_
-downloads_by_guid_
-delegate_
+DownloadUrl(params)
+StartDownload(info, stream, callback)
-BeginDownloadInternal(params)
-BeginResourceDownloadOnChecksComplete(params)
InProgressDownloadManager
-url_download_handlers_
-download_db_cache_
+BeginDownload(params)
+InterceptDownloadFromNavigation(...)
+StartDownload(info, stream, callback)
-DetermineDownloadTarget(item, callback)
DownloadItemImpl
-state_
-download_file_
-target_path_
+OnAllDataSaved()
+OnDownloadedFileRemoved()
+Cancel()
+Pause()
+Resume()
DownloadFileImpl
-input_stream_
-file_
+Initialize()
+RenameAndValidate()
+Close()
ChromeDownloadManagerDelegate
+CheckDownloadAllowed(...)
+DetermineDownloadTarget(...)
+OpenDownload()
+ShouldCompleteDownload()
DownloadCoreServiceImpl
-manager_delegate_
-download_history_
-download_ui_
DownloadUIController
-delegate_
+OnDownloadCreated()
DownloadHistory
+OnDownloadCreated()
+OnDownloadUpdated()
4. 下载完整生命周期流程
4.1 下载触发阶段
下载可以通过多种方式触发:
- 用户点击下载链接:渲染进程检测到导航为下载类型
- 编程式调用 :
DownloadManager::DownloadUrl()传入DownloadUrlParameters - 页面保存 :
SavePageAs创建 SavePackage 下载项 - 导航拦截 :
InterceptDownloadFromNavigation()拦截导航响应
4.2 完整下载流程
UI层 DownloadUIController DownloadHistory DownloadTargetDeterminer DownloadFileImpl DownloadItemImpl UrlDownloadHandler InProgressDownloadManager ChromeDownloadManagerDelegate DownloadManagerImpl 用户/渲染进程 UI层 DownloadUIController DownloadHistory DownloadTargetDeterminer DownloadFileImpl DownloadItemImpl UrlDownloadHandler InProgressDownloadManager ChromeDownloadManagerDelegate DownloadManagerImpl 用户/渲染进程 文件下载进行中 确定下载目标 下载完成 1. DownloadUrl - params 2. BeginDownloadInternal - 安全检查 3. CheckDownloadAllowed - 下载许可检查 4. is_download_allowed = true 5. BeginDownload - params + URLLoaderFactory 6. 创建 UrlDownloadHandler - IO线程发起网络请求 7. OnUrlDownloadStarted - DownloadCreateInfo + InputStream 8. StartDownloadItem - CreateInfo 9. GetNextId - 获取下载ID 10. CreateActiveItem - 创建 DownloadItemImpl 11. callback.Run - 传递 item 给 IPDM 12. Start - 绑定 DownloadFileImpl 13. OnDownloadCreated - 通知UI控制器 14. OnNewDownloadReady - 通知UI显示 15. Initialize + 写入数据 16. 进度回调 17. DetermineDownloadTarget 18. delegate_->>DetermineDownloadTarget 19. DownloadTargetDeterminer::Start 20. 目标路径 + 危险类型 21. OnAllDataSaved 22. 重命名文件到最终路径 23. OnDownloadUpdated - 持久化到历史 24. 通知UI更新状态
4.3 关键流程说明
步骤 1-4:下载触发与安全检查
DownloadManagerImpl::DownloadUrl() 接收 DownloadUrlParameters,调用 BeginDownloadInternal() 进行安全检查:
- 检查 URL 是否安全(
DownloadRequestUtils::IsURLSafe) - 检查渲染进程是否被禁止网络访问
- 通过
delegate_->CheckDownloadAllowed()让 Chrome 层做额外检查(如DownloadRequestLimiter限流)
步骤 5-7:网络请求
InProgressDownloadManager::BeginDownload() 在 IO 线程创建 UrlDownloadHandler,发起网络请求。当收到响应头后,通过 OnUrlDownloadStarted 回调返回 DownloadCreateInfo 和 InputStream。
步骤 8-12:创建下载项
DownloadManagerImpl::StartDownloadItem() 在 UI 线程:
- 为新下载获取唯一 ID(
GetNextId) - 通过
DownloadItemFactory::CreateActiveItem()创建DownloadItemImpl - 将 item 传回
InProgressDownloadManager绑定DownloadFileImpl
步骤 13-14:通知 UI
DownloadManagerImpl 通知所有 Observer(包括 DownloadUIController),DownloadUIController 通过其 Delegate::OnNewDownloadReady() 通知 UI 层显示新下载。
步骤 17-20:确定下载目标
DownloadTargetDeterminer 是自管理对象,负责:
- 确定目标文件路径(基于 URL、Content-Disposition、MIME 类型等)
- 判断危险类型(恶意软件、危险URL等)
- 确定中间文件路径
- 可能弹出用户确认对话框
步骤 21-24:下载完成
DownloadFileImpl 通知所有数据已保存,DownloadItemImpl 执行文件重命名(从中间路径到最终路径),更新状态为 COMPLETE,通知 DownloadHistory 持久化,通知 UI 更新。
5. UI 层架构
5.1 两套 UI 系统
Chromium 目前有两套下载 UI 系统:
| 特性 | Download Shelf(旧) | Download Bubble(新) |
|---|---|---|
| 位置 | 浏览器底部横条 | 工具栏按钮 + 弹出面板 |
| 入口 | DownloadShelf |
DownloadBubbleUIController |
| 控制器 | 直接由 Browser 管理 | DownloadDisplayController 控制工具栏按钮 |
| 视图 | 单一列表 | Main View(24h内) + Partial View(进行中/未交互) |
| 状态 | 逐步被替代 | 当前默认 |
5.2 UI 通知链路
OnDownloadCreated
OnNewDownloadReady
显示动画/按钮
实现
OnDownloadCreated
DownloadManagerImpl
DownloadUIController
DownloadDisplayController
DownloadDisplay - 接口
DownloadBubble UI
DownloadShelf - 旧
DownloadUIController 是连接下载核心和 UI 的桥梁:
- 观察
DownloadManager的下载事件 - 通过
Delegate::OnNewDownloadReady()通知 UI - 在 Chrome 层由
DownloadCoreServiceImpl持有
DownloadDisplayController 控制工具栏按钮:
- 管理
DownloadDisplay接口(工具栏按钮的抽象) - 处理新下载动画、按钮显示/隐藏
- 监听全屏状态变化、电源挂起事件
DownloadBubbleUIController 管理窗口级逻辑:
- 每个 Browser 窗口一个实例
- 由 Download Toolbar Button 持有
- 提供
GetMainView()和GetPartialView()数据 - 处理下载项的添加、更新、删除通知
6. 持久化存储
6.1 双重持久化机制
下载系统使用两套持久化机制:
历史记录持久化
OnDownloadCreated/Updated
DownloadItemImpl
DownloadHistory
HistoryAdapter
HistoryService
SQLite - History DB
进行中下载持久化
状态变更
DownloadItemImpl
DownloadDBCache
DownloadDB / DownloadDBImpl
LevelDB - in_progress/
进行中下载持久化 (InProgress DB)
- 目的:浏览器崩溃后恢复进行中的下载
- 存储 :LevelDB,位于
in_progress/目录 - 核心类 :
DownloadDBCache→DownloadDBImpl - 数据 :
DownloadEntry(guid、状态、路径、hash 等) - 时机:下载状态变更时实时写入
历史记录持久化 (History DB)
- 目的:长期保存下载记录,供下载历史页面展示
- 存储 :SQLite,通过
HistoryService - 核心类 :
DownloadHistory→HistoryAdapter→HistoryService - 数据:下载 URL、路径、时间、状态等
- 时机:下载创建/更新/删除时同步
6.2 启动恢复流程
HistoryService DownloadDBCache InProgressDownloadManager DownloadManagerImpl 浏览器启动 HistoryService DownloadDBCache InProgressDownloadManager DownloadManagerImpl 浏览器启动 1. 初始化 DownloadManager 2. Initialize - 传入 db_dir 3. Initialize - 加载 LevelDB 4. 返回缓存的 DownloadEntry 列表 5. StartDownloadItem - 恢复进行中下载 6. QueryDownloads - 查询历史下载 7. 返回历史下载记录 8. 合并进行中下载和历史记录
7. 线程模型
后台线程 - Download Task Runner
IO线程 - Network Thread
UI线程 - Main Thread
PostTask
PostTask
PostTask
PostTask
PostTask
DownloadManagerImpl
DownloadItemImpl - 状态管理
ChromeDownloadManagerDelegate
DownloadTargetDeterminer
DownloadUIController
DownloadHistory
UrlDownloadHandler
Network Service
DownloadFileImpl - 文件I/O
DownloadDB - LevelDB操作
- UI 线程 :所有
DownloadItem状态管理、UI 通知、委托调用 - IO 线程:网络请求发起、响应头处理
- Download Task Runner:文件 I/O(写入、重命名)、LevelDB 操作
9. 关键设计模式总结
| 模式 | 应用场景 |
|---|---|
| Delegate 模式 | DownloadManagerDelegate 允许 Chrome 层定制 content 层行为 |
| Observer 模式 | DownloadManager::Observer、DownloadItem::Observer 通知状态变化 |
| Factory 模式 | DownloadItemFactory 创建 DownloadItemImpl,便于测试 |
| 自管理对象 | DownloadTargetDeterminer 自行管理生命周期,完成后自动销毁 |
| KeyedService | DownloadCoreService 绑定到 Profile 的生命周期 |
| 线程分离 | UI/IO/文件操作分线程,通过 PostTask 通信 |
| 双重持久化 | LevelDB 存进行中状态,SQLite 存历史记录 |