APP下载

Webkit内核源码研究

2020-11-30席文强

科学与信息化 2020年30期
关键词:调用内核浏览器

席文强

摘 要 在众多开源源浏览器引擎中,當属Webkit的代码结构框架较为清晰,因此对于webkit内核源码的研究显得尤为基础和重要。本文对webkit内核工作运行中调用的几个重要方法和模块进行了分析,介绍了内核加载模块Loader、网页解析模块Parser和JScore模块的运行流程和方法。

关键词 WebKit;Javascriptcore;浏览器;网络爬虫

引言

Webkit是一个开源的Web浏览器引擎。对于一个完整的浏览器,需要能够发出特定格式的HTTP请求,接收到响应数据后解析,并将解析后的数据显示的屏幕上。webkit仅仅关注页面排版,对于网络层和图形界面等需要第三方库的支持。webkit主体的实现不依赖于某种特定的库,便于移植到各种环境中。

1Loader

Webkit在发起一个页面请求时,首先会调用FrameLoader的load方法。FrameLoader对象是Frame的一个成员,负责页面的加载。之后会调用到DocumentLoader的一些方法,顾名思义DocumentLoader是负责页面中的文档的加载的。这个过程中会检查加载策略(PolicyChecker负责),并通过回调等方式调用FrameLoaderClient中的方法,这个类中的方法主要是与外层交互,如可以询问用户是否真的要加载[1]。

然后会调用DocumentLoader中的startLoadingMainResource,在这个方法里生成一个资源请求CachedResourceRequest,并调用CachedResourceLoader的requestMainResource方法。

为了节省在网络加载上耗费的时间,webkit使用了cache机制,它会把请求的资源缓存在一个singleton类,MemoryCache中。所有加载请求都会先在其中查找是否已保存有这个资源,是的话会直接取出。CachedResourceLoader类的主要作用就是负责查找要请求的资源是否在MemoryCache中。如果不存在,会生成一个代表这个资源的CachedResource,将其加入MemoryCache,并调用它的loader方法。之后会到ResourceLoader这个资源加载类的start方法中,在ResourceHandle这个与底层网络库打交道的类中开始真正的网络请求。

2Parser

这部分主要是拿到源码后到dom树的生成。在有数据到来时,会调用到网络库的回调函数,里面又会调到ResourceLoader的didReceiveData方法,一级级将数据往上提交,到达DocumentWriter类。DocumentWriter类主要有两个成员,分别是TextResourceDecoder和DocumentParser,前者负责对拿到的源码根据需要解码,后者负责dom树的生成。HTMLDocumentParser又有两个成员变量,HTMLTokenizer负责词法分析,里面有一个重要的函数nextToken,维护着一个状态机,不停的读取字符并生成一个个token。另一个成员HTMLTreeBuilder,在constructTree方法里调用processToken方法处理上面生成的token,通过HTMLConstructionSite的createElement等方法生成Node节点后,再用insertHTMLElement等将Element插入生成dom树[2]。

3Javascriptcore

Jscore要为webcore服务,需要一层binding。jsbinding的作用可以理解为,对于一些内置函数,如document.write,它的实现在webcore内,但webcore不认识这些js语句中的函数,所以需要jscore认出这些函数,然后调用webcore中它的实现。在webkit编译过程中,会自动生成一些代码。对于每种webcore中的Node类型,会生成响应的JSNode类型的定义,对于上述的接口,会通过表记录映射关系,在jscore初始化的时候生成。

实时编译JIT用来将频繁使用的那些字节码编译成本地机器码,然后栈上替换之前的字节码,执行本地码。

参考文献

[1] 段虎才,倪宏,邓峰,等.WebKit内核的嵌入式浏览器磁盘缓存方法[J]. 计算机工程与设计,2015(3):624-629.

[2] 刘庆平,任寰.一种基于Webkit内核提供网页浏览的方法及装置[P]. 中国:CN102681850A,2012-9-19.

猜你喜欢

调用内核浏览器
人民情怀:柳青为文为人的内核(评论)
初春
微软发布新Edge浏览器预览版下载换装Chrome内核
基于Android Broadcast的短信安全监听系统的设计和实现
利用RFC技术实现SAP系统接口通信
浏览器
lE8设置技巧大放送
C++语言中函数参数传递方式剖析
具备DV解码功能的DVD编码器——数字视频刻录应用的理想选择