chromium代码分析(1): test_shell
转载时请注明出处和作者联系方式: https://mogoweb.net(betway官网首页) betway官网首页@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(betway官网首页) betway官网首页@gmail.com