加载中…
正文 字体大小:

chromium源码学习笔记(4) -- webkit封装

(2013-03-24 17:23:46)
标签:

chrome

webkit

test_shell

chromium

it

分类: webkit
    前面提到chromium对webkit的使用包括webkit port和webkit glue两部分,依托于test_shell,我们再仔细研究一下chromium是怎样封装和调用webkit的。

    webkit port部分实际上是包含在webkit的源码库里的,在chromium的代码路径“chromium\home\src_tarball\tarball\chromium\src\third_party\WebKit\”下就是webkit的源码。可以看到Source目录下Platform/chromium、Webcore/platform/chromium、Webkit/chromium等,都是webkit的chromium port代码。webkit内部源码这部分我们后面再研究,先把webkit当作一个模块来看。

    chromium代码路径“chromium\home\src_tarball\tarball\chromium\src\webkit”则是对webkit的又一层封装和调用,这里面包含了webkit glue的代码。通过调试test_shell的方式,我们重点研究这部分代码。当然由于test_shell并没有多标签页功能,因此chromium的多进程架构并未在此引入,我们的关注点不在于此,正好可以帮我们简化学习的复杂度。

   chromium源码学习笔记(2) -- test_shell中,我们已经研究了test_shell程序的主要流程,其中核心步骤为:
    1、定义TestShellPlatformDelegate类型的变量,完成OS平台显示相关参数的检查以及初始化UI环境,如InitializeGUI函数在windows平台下完成窗口注册等;
    2、定义MessageLoopForUI类型的变量,初始化一些状态,并通过“MessageLoop::current()->Run();”这句运行消息循环;
    3、定义TestShellWebKitInit类型的变量初始化webkit;
    4、通过TestShell类的InitializeTestShell初始化app,并通过TestShell::CreateNewWindow创建主窗口,加载主页显示。
    简化后的test_shell main函数只有如下几行:
    int main(int argc, char* argv[]) {
        // 使base::Singleton<>类型对象正确释放
        base::AtExitManager at_exit_manager;
        // 初始化命令行, 后续关于命令行的处理代码均去掉
        CommandLine::Init(argc, argv);
        const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess();
        // 见步骤1解释
        TestShellPlatformDelegate platform(parsed_command_line);
        // 见步骤2解释
        MessageLoopForUI main_message_loop;
        // 见步骤3解释
        TestShellWebKitInit test_shell_webkit_init(false);
        // unicode支持
        icu_util::Initialize();
        // 由TestShell::ResourceProvider提供本地有限资源的访问
        net::NetModule::SetResourceProvider(TestShell::ResourceProvider);

        platform.InitializeGUI();

        // 见步骤4解释
        TestShell::InitializeTestShell(false, true);

        // Test shell always exposes the GC.
        webkit_glue::SetJavaScriptFlags("--expose-gc");

        // 首页URL
        GURL starting_url = net::FilePathToFileURL(FilePath(L"D:\\chromium\\home\\src_tarball\\tarball\\chromium\\src\\webkit\\data\\test_shell\\index.html"));

        // 创建主窗口并运行消息循环
        TestShell* shell;
        if (TestShell::CreateNewWindow(starting_url, &shell)) {
            shell->Show(WebKit::WebNavigationPolicyNewWindow);
            MessageLoop::current()->Run();
        }

        // 退出清理
        TestShell::ShutdownTestShell();
        ...
        return 0;
    }
    很明显,关于webkit功能的封装在TestShellWebKitInit中,而TestShell提供了对webkit的调用和控制。

    可以看到TestShellWebKitInit类从webkit_glue::WebKitPlatformSupportImpl继承,因此TestShellWebKitInit主要完成了webkit glue。其构造函数中调用WebKit::initialize完成webkit的初始化,析构时调用WebKit::shutdown。
    单步跟踪到TestShell::CreateNewWindow中,其调用到自己的Initialize函数。该函数完成以下重要工作:
    1、创建主窗口;
    2、创建一个WebViewHost类型的对象;
    3、加载URL显示(TestShell::Navigate)。
    其中3最终是通过2创建的webview来实现页面展示的。webview是UI层与webkit的一个重要桥梁,抽象了webkit显示页面的接口。你可以想象不同OS平台上需要绘制页面时,需要向webkit请求一个绘制样式,webview就做了这个工作,将这一层的接口做了统一封装。
    我们现在已经清楚,我们能看到最终显示的网页,webview起到了封装webkit的作用。关于webview后面会重点研究。
    下一篇要研究chromium的线程和进程架构,要开始脱离test_shell看看外面的世界了!

0

阅读 评论 收藏 转载 喜欢 打印举报
已投稿到:
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有