月度归档:2012年06月

Chromium源码分析:Content API

您是否曾经垂涎于chromium强大的性能而试图将chromium嵌入到您的产品中呢?相信有此想法的人不少,但chromium庞大的代码会让人望而却步。针对这种需求,有人整出了开源项目CEF(Chromium Embedded Framework)。CEF的目的是提供基于chromium的浏览器控件,可以让渲染网页的功能方便地嵌入到应用程序之中。chromium团队也意识到了这个需求(更多的是分层的考虑,使得chromium browser的架构更加清晰),定义了Content API。

在理解Content API之前,需要从chromium browser的架构说起。下图您一定看过(摘自How Chromium Displays Web Pages),也可能和您之前看过的版本有点不同,毕竟chromium在不停的向前发展。

 

这是一幅介绍页面如何被渲染和显示的概括性的层次结构图。每个方框表示概念上的应用层,相临两个层之间存在联系,除此不再依赖其它的层。Renderer进程和RendererHost进程通过IPC来交换信息,其作用是把网页的内容(content)渲染成Tab的显示内容。一个Tab可能会包含多个页面的内容,因而它会管理Tab中的多个页面内容。Tab contents之上就是浏览器,Tab contents会把内容绘制在browser窗口的一个标签中。

Chromium把RendererHost及其以下部分称为Content,里面还包括很多对HTML5功能实现的支持。content API基于此两部分,包装成为一套公开的接口。Tab contents及以上部分称为Chrome(chrome的原意即是包装在网页内容之上的框)。浏览器中相关的功能仅仅在content API之上才有,而不存在于content API中。

这样,chromium在两个层次上提供了API:一个是chromium webkit API,chromium提供了test_shell示例程序展示如何使用chromium webkit API;另一个是chromium Content API,如下图所示:

相比WebKit API而言,Content API增加了HTML5支持、GPU硬件加速、沙箱模型,更重要的是,Content API带来了多进程模型,您再也不用去费力的研究WebKit2了。

content shell

为了方便测试,chromium提供了一个基于content api的简单测试程序content shell。它非常的简单,仅仅是一个壳,调用了content API并实现了部分必需的回调接口,可以用来测试和其他一些简单的功能。下面是content shell linux版的截图:

和test shell的界面差不多,不过查看进程信息,起了好几个进程:

所以,如果您基于Content API开发浏览器,可以不费力的就是实现多进程模型(当然,如果在移动设备上,CPU和RAM有限的情况下,您也可以不开启多进程支持)。

content shell API

Content API的相关的接口定义文件均在content/public目录下,按照功能分成六个部分:每个部分的接口一般也可以分成两类,第一类是嵌入者(embedder,这里可以是Chrome浏览器,CEF3和content shell)调用的接口,另一类是嵌入者实现的回调接口,被content API的内部实现所调用,例如参与实现的逻辑,事件的监听等。

1)App

这部分主要是跟应用程序或者进程的创建和初始化相关。第一类,主要包括创建进程的初始化函数,content的初始化和关闭;第二类,主要是实现回调函数,告诉嵌入者启动完成,进程启动,进程推出,沙盒模型初始化开始和结束等等。

2)Browser

第一类包括,对一些HTML5功能和其他一些高级功能实现的参与,例如resource,sensor,notification, speech recognition, web worker, download, web intents,等等;

第二类包括ContentBrowserClient,主要是嵌入者实现部分逻辑,还有就是一些事件的回调函数。

3)Common:

主要定义一些公共的接口,被render和browser共享,例如一些进程相关,参数,gpu相关等等。

4)Plugin

仅有一个接口告诉嵌入者plugin进程被创建了。

5)Render

第一类包含获取RenderThread的消息循环,注册v8 extension,计算JavaScript表达式等等;第二类包括ContentRendererClient,主要是嵌入者实现部分逻辑,还有就是一些事件的回调函数。

6)Utility

工具类接口,主要包括让嵌入者参与Content API中的线程创建和消息的过滤。

参考文档

1. Chromium: Content API和CEF3. http://blog.csdn.net/milado_nju/article/details/7455373

2. How Chromium Displays Web Pages. http://dev.chromium.org/developers/design-documents/displaying-a-web-page-in-chrome

3. chromiumembedded project. http://code.google.com/p/chromiumembedded/