chromium源码分析系列:前言

        以前做过webkit方面的研究,最近在看chromium代码,鉴于代码实在太过庞大,经常会只见树木,不见森林,而见了树木,又部分橡树榛树。既需要广,也需要深,搞得很头疼。因此,记录下来自己的学习经历,和大家探讨,同时加深自己的理解。

        同时,自己也很喜欢布道师这个角色,看看自己是否能解释清楚问题吧。

        声明一点,这里列出了学习目录,而这个目录会随着学习历程而更新。


目录

        入门程序:content_shell

        进程模型

        线程

        锁和条件变量

图形

        view系统之compositor

        aura简介

         图像解码

        cache系统

        多媒体视频播放


事件

工具




             

Chromium 源码中修改内置的 `chrome://` 路径为自定义协议 `xiaozhi://` 涉及到多个组件的调整,包括协议注册、URL 处理逻辑以及相关的资源映射。以下是一个较为完整的修改流程: ### 1. 注册自定义协议 Chromium 使用 `content::ContentBrowserClient` 类来注册自定义协议。你需要在 `BrowserClient` 的派生类中重写 `RegisterNonNetworkSubresourceURLLoaderFactories` 方法,以支持 `xiaozhi://` 协议。 ```cpp void MyContentBrowserClient::RegisterNonNetworkSubresourceURLLoaderFactories( content::RenderFrameHost* frame_host, ukm::SourceId source_id, NonNetworkURLLoaderFactoryMap* factories) { // 注册 xiaozhi:// 协议 factories->Add( frame_host, std::make_unique<XiaozhiURLLoaderFactory>(frame_host->GetProcess()->GetID())); } ``` 同时,在 `BrowserMainParts` 的派生类中注册协议处理程序: ```cpp void MyBrowserMainParts::PostCreateMainMessageLoop() { // 注册 xiaozhi:// 协议 content::RegisterContentSchemes(); content::RegisterNonNetworkSubresourceURLLoaderFactories( base::BindRepeating(&MyContentBrowserClient::RegisterNonNetworkSubresourceURLLoaderFactories)); } ``` ### 2. 实现自定义协议的 URL 处理逻辑 你需要实现一个 `URLLoaderFactory` 来处理 `xiaozhi://` 协议的请求。该类负责解析 URL 并返回相应的资源内容。 ```cpp class XiaozhiURLLoaderFactory : public network::mojom::URLLoaderFactory { public: explicit XiaozhiURLLoaderFactory(int render_process_id) : render_process_id_(render_process_id) {} void CreateLoaderAndStart(network::mojom::URLLoaderRequest request, int32_t routing_id, int32_t request_id, uint32_t options, const network::ResourceRequest& url_request, network::mojom::URLLoaderClientPtr client, const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) override { // 处理 xiaozhi:// 协议的请求 if (url_request.url.scheme() == "xiaozhi") { // 创建一个自定义的 URLLoader 来处理请求 std::make_unique<XiaozhiURLLoader>(std::move(request), render_process_id_, url_request, std::move(client)); } else { // 其他协议交给默认处理 client->OnReceiveResponse( network::mojom::URLResponseHead::New(), nullptr, absl::nullopt); client->OnComplete(network::URLLoaderCompletionStatus(net::ERR_NOT_FOUND)); } } private: int render_process_id_; }; ``` ### 3. 替换所有 `chrome://` 的引用 在整个 Chromium 源码中,`chrome://` 协议被广泛用于访问内部页面(如设置、扩展管理、任务管理器等)。为了将这些页面改为使用 `xiaozhi://` 协议,需要全局搜索并替换所有 `chrome://` 的引用。 你可以使用以下命令在源码目录中查找所有 `chrome://` 的引用: ```bash find . -type f -exec grep -l "chrome://" {} \; ``` 找到相关文件后,手动将 `chrome://` 替换为 `xiaozhi://`。例如: ```cpp // 原始代码 GURL settings_url("chrome://settings"); // 修改后 GURL settings_url("xiaozhi://settings"); ``` ### 4. 修改资源映射逻辑 Chromium 中的 `chrome://` 页面通常通过 `content::WebContents` 或 `content::RenderFrameHost` 加载特定的 HTML 资源。你需要确保这些资源能够通过 `xiaozhi://` 协议正确加载。 你可以在 `XiaozhiURLLoader` 中实现资源映射逻辑,将 `xiaozhi://` 请求映射到对应的资源路径: ```cpp class XiaozhiURLLoader : public network::mojom::URLLoader { public: XiaozhiURLLoader(network::mojom::URLLoaderRequest request, int render_process_id, const network::ResourceRequest& url_request, network::mojom::URLLoaderClientPtr client) : request_(std::move(request)), client_(std::move(client)) { // 解析 URL 并加载对应的资源 std::string path = url_request.url.path(); if (path == "/settings") { LoadSettingsPage(); } else if (path == "/extensions") { LoadExtensionsPage(); } else { client_->OnComplete(network::URLLoaderCompletionStatus(net::ERR_NOT_FOUND)); } } private: void LoadSettingsPage() { // 加载 settings 页面的 HTML 内容 std::string html_content = "<html><body>Settings Page</body></html>"; network::mojom::URLResponseHeadPtr response_head = network::mojom::URLResponseHead::New(); response_head->mime_type = "text/html"; client_->OnReceiveResponse(std::move(response_head), nullptr, absl::nullopt); client_->OnStartLoadingResponseBody( base::MakeRefCounted<base::RefCountedString>(html_content)); client_->OnComplete(network::URLLoaderCompletionStatus(net::OK)); } network::mojom::URLLoaderRequest request_; network::mojom::URLLoaderClientPtr client_; }; ``` ### 5. 编译与测试 完成上述修改后,重新编译 Chromium 源码,并启动浏览器测试 `xiaozhi://` 协议是否能够正常加载页面。 ```bash gn gen out/Default ninja -C out/Default chrome out/Default/chrome ``` 在地址栏输入 `xiaozhi://settings` 或 `xiaozhi://extensions`,验证是否能够正确加载对应的页面。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值