浏览 Chromium 源代码目录(Getting Around the Chromium Source Code Directory)

13 Aug 2024

目录

高级概述

Chromium 分为两个主要部分(不包括其他库):浏览器和渲染器(包括 Blink,即网页引擎)。浏览器是主要进程,代表所有的 UI 和 I/O。渲染器是(通常是)每个标签页的子进程,由浏览器驱动。它嵌入 Blink 来进行布局和渲染。

你需要阅读并熟悉我们的多进程架构multi-process architecture以及 Chromium 如何显示网页how Chromium displays web pages

顶级项目

当你浏览和搜索 Chromium 代码或检出 Chromium 代码时,你会注意到一些顶级目录:

由于历史原因,有一些小的顶级目录。未来,新顶级目录的指导方针是用于应用程序(例如 Chrome、Android WebView、Ash)。即使这些应用程序有多个可执行文件,代码也应位于应用程序的子目录中。

这是一个稍微过时的依赖关系图。特别是,WebKit 被 blink/renderer 取代。较低模块不能直接包含较高模块的代码(即 content 不能包含 chrome 的头文件),但可以使用嵌入 API 与之通信。

Content.png

content/ 目录树的快速参考

chrome/ 目录树的快速参考

个人学习计划

最终你会设置好构建环境并开始工作。在一个理想的世界中,我们会有足够的时间阅读每一行代码并在编写第一行代码之前理解它。但在实践中,如果我们什么都不做,只阅读一天内发生的所有检入代码,我们会很难完成,所以我们中的任何人都不可能阅读所有代码。那么,我们该怎么办呢?我们建议你制定自己的学习计划,以下是一些建议的起点。

幸运的是,Chromium 有一些高质量的设计文档。虽然这些文档可能有点过时(例如,跟随阅读时,你可能会发现引用了已被移动、重命名或重构的文件),但能够理解代码整体如何组合在一起是非常有用的。

常见操作的代码路径

关于 Chromium 如何显示网页how Chromium displays web pages,有更多的信息和示例。

应用启动

  1. WinMain 函数位于 chrome/app/main.cc,并链接在 chrome 项目中。
  2. WinMain 启动 Google 更新客户端,这是安装程序/自动更新程序。它将找到当前版本的子目录,并从那里加载 chrome.dll。
  3. 它调用 chrome_main.cc 中 chrome_dll 项目的 ChromeMain。
  4. ChromeMain 为通用组件进行初始化,然后根据命令行标志指示是否应为子进程,转发到 chrome/renderer/renderer_main.cc 中的 RendererMain,或者不这样做则加载应用程序的新副本。在启动时,我们正在启动浏览器。
  5. BrowserMain 进行常见的浏览器初始化。它有不同的模式,用于运行已安装的 web 应用程序、连接到自动化系统(如果正在测试浏览器)等。
  6. 它调用 browser_init.cc 中的 LaunchWithProfile,这在 chrome/browser/ui/browser.cc 中创建一个新的 Browser 对象。这个对象封装了应用程序中的一个顶级窗口。此时添加了第一个标签页。

标签页启动和初始导航

从 URL 栏导航

导航和会话历史

每个 NavigationEntry 都存储一个页面 ID 和一块历史状态数据。页面 ID 用于唯一标识页面加载,因此我们知道它对应于哪个 NavigationEntry。它在页面提交时分配,因此挂起的 NavigationEntry 的页面 ID 为 -1。历史状态数据只是一个 WebCore::HistoryItem 序列化为字符串。此项包括页面 URL、子帧 URL 和表单数据。