首页 > chromium研究 > chromium代码分析(1): test_shell

chromium代码分析(1): test_shell

2011年10月9日 发表评论 阅读评论

转载时请注明出处和作者联系方式: http://mogoweb.net mogoweb@gmail.com

    chromium浏览器融合了众多开源软件,自身拥有一套复杂的framework。如果一头扎进chromium的代码,首先需要了解chrome的多进程模型、sandbox原理,这对理解webkit移植带来很大的难度。好在chromium中包含了一个测试程序test_shell,用来验证webkit chromium移植工作。test_shell代码位于:src/webkit/tools/test_shell下,test_shell具备浏览器的雏形,有前进/后退/刷新/停止/输入网址等功能,如果仅仅是做一个简单嵌入式的浏览器,使用这部分的代码就足够了。从test_shell入手,更有助于分析webkit chromium移植。

    test_shell运行界面如下:

linux版本的绘制过程

下面的图描述了linux下gtk/skia/cairo之间的关系

 

简单说,页面绘制过程就是先由Webkit渲染到skia的canvas上,然后在bitblt到Cairo surface上,最后到X server后端。

在webkit的chromium移植中,有一个重要的类:WebView(在Qt/android等移植中也有这样一个类),它运用了Facade设计模式,封装了webkit内部复杂的接口,对外提供一个一致/简单的接口,浏览器UI主要和这个WebView打交道。下面看看这个WebView是如何创建的?trace信息如下:

#0  WebKit::WebView::create (client=0x7ffff7f50000) at third_party/WebKit/Source/WebKit/chromium/src/WebViewImpl.cpp:235
#1  0x00000000004387c0 in WebViewHost::Create (parent_view=0x7fffed278830, delegate=0x7ffff7f50000, dev_tools_client=0×0, prefs=…)
    at webkit/tools/test_shell/webview_host_gtk.cc:30
#2  0x000000000042c576 in TestShell::Initialize (this=0x7ffff7e74f20, starting_url=…) at webkit/tools/test_shell/test_shell_gtk.cc:349
#3  0x00000000004245b1 in TestShell::CreateNewWindow (starting_url=…, result=0x7fffffffdc20) at webkit/tools/test_shell/test_shell.cc:203
#4  0x0000000000421e61 in main (argc=1, argv=0x7fffffffdfe8) at webkit/tools/test_shell/test_shell_main.cc:303

UML序列图如下:

Webkit chromium port中,图形后端是采用的skia,在SkCanvas上排版渲染,但最终呈现给用户的却是一个GtkFixed widget。skia canvas中的图像又是如何显示到GtkFixed widget上的呢?答案就在WebWidgetHost::Paint()方法中:

1)根据webkit排版的高度和宽度创建PlatformCanvas

2)webview将内容渲染到canvas

3)BitBlt到GtkFixed的gdk window上

这样webkit就将排版后的内容在gtk窗口中显示出来了。

转载时请注明出处和作者联系方式: chromium代码分析(1): test_shell mogoweb@gmail.com

分类: chromium研究 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.