content shell 代码分析

chromium的工程是如此的庞大,以致我很长的一段时间内都无法找到突破点。后来我发现了content_shell这个工程,它是基于choromium里面的content  api实现了一个非常简单的浏览器。仿佛是武侠小说里的主人公在山洞里找到了一个武林秘籍,从此武功就突飞猛进,我们可以从这个不是很复杂的工程学到chromium的架构。

废话少说,我们从WinMain开始。

WinMain里面我只用关注ShellMainDelegate这个类。ShellMainDelegate的逻辑非常简单,只是做一些非常早期的初始化工作,比如沙箱,资源初始化。在这里我们可以override ContentBrowserClient、ContentPluginClient、ContentRendererClient、ContentUtilityClient这4个类。看它们的名字是分别代表browser、Plugin、Renderer、Utility的逻辑。如果是定制或者修改chromium,我们只实现ContentBrowserClient里面的逻辑。

ShellContentBrowserClient继承自ContentBrowserClient。ShellContentBrowserClient本身的逻辑也不多。它是单实例的,在这里创建一些浏览器browser端一些重要对象,比如BrowserMainParts。

ShellBrowserMainParts继承自BrowserMainParts,这里运行这UI线程消息循环,在这里我们就可以创建浏览器的UI了。在这个类里面创建了一个非常重要的对象ShellBrowserContext,它继承自BrowserContext,里面包含了浏览器会话的上下文信息。

在ShellBrowserContext里面我们可以找到所有浏览器网络有关的逻辑。比如获取下载有关的DownloadManagerDelegate,跟请求和回应上下文的net::URLRequestContextGetter,ResourceContext。

ShellBrowserMainParts里面创建UI的代码是这样的:

这个Shell是继承自WebContentsDelegate,相当于多标签浏览器里面标签逻辑的管理。content shell就在这里实现了浏览器窗口的打开网址、刷新、停止、前进、后退等逻辑。WebContents就代表每个网页,我们可以把WebContents渲染好的网页画面显示到我们的窗口上。

好了,就只有这些。

wWinMain

《content shell 代码分析》有4个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注