有来有去 发表于 2012-12-30 16:39:40

利用InjectedBundle定制自己的Webkit(一)

<div id="cnblogs_post_body">Webkit是一个多进程构架,内核WebCore和JS引擎JavaScriptCore都处在WebProcess进程中,而用户界面相关的处理则处在UIProcess进程中。(详见Webkit客户端进程解析)

Webkit提供了大量的API供客户程序调用,但是这些API都是在客户进程中调用的,我们无法访问到内核部分的数据结构并处理,如DOM树、Render树、加载的Web资源等等。为了解决这一问题,Webkit提供了一个运行在内核进程的InjectedBundle来提供对内核数据的操作。
InjectedBundle类似于一个插件,单独编译成一个动态库,在内核进程运行到特定情况时会调用InjectedBundle中注册的对应函数来实现自定义操作。每个WebProcess只能加载一个InjectedBundle,用户可以在创建WebProcess的时候指定使用哪个InjectedBundle。
接下来我们就动手制作一个自己的InjectedBundle然后用Webkit加载它。

1. 准备工作
我采用的编译环境是VC2005
(1)首先需要下载并编译Webkit(详见Windows平台编译Webkit)
(2)然后创建一个空项目,修改项目属性
  a. 配置类型:动态库(.dll)  
    http://pic002.cnblogs.com/images/2012/416103/2012120219033363.png
  b. 添加附加包含目录:Webkit生成文件路径\inlude 和 Webkit生成文件路径\include\include(一定要加两个,第二个是windows平台缺少的第三方库头文件)
    http://pic002.cnblogs.com/images/2012/416103/2012120219041653.png
  c. 添加附加库目录:Webkit生成文件路径\lib
    http://pic002.cnblogs.com/images/2012/416103/2012120219054344.png
好,项目配置完毕!接下来实现Webkit所需的接口

2. 编写InjectedBundle
先上代码
<div class="myCodeClass">#include <WebKit2/WKBundleInitialize.h>
#pragma comment(lib, "WebKit.lib")
extern "C" __declspec(dllexport)
void WKBundleInitialize(WKBundleRef bundle, WKTypeRef initializationUserData)
{
     // 初始化代码
}
页: [1]
查看完整版本: 利用InjectedBundle定制自己的Webkit(一)