[WebKit]WebCore之页面加载的设计与实现(二)

从上次学习WebKit加载已经过去了大半年了,终于又有时间理一次加载流程。期望逐步完善细节,最后能有一个系统的总结。


首先可以这样理解WebKit的加载逻辑,涉及三个主要的组件, 其中HTTP stack为各个平台下使用的HTTP协议模块,WebCore Loaders则依据页面加载及解析过程对加载不同HTML Element的控制,Loading Controller则具体实现了资源加载的行为控制:


虽然从WebKit整体结构上这样理解不太严谨的,但单纯站在加载的角度来看,却有利于理解加载流程。因为HTTP Stack依赖平台实现,这里从中间的Loading Controller说起。


Loading Controller提供了两个重要的接口类,一个是供WebCore调用以加载各个资源的类CachedResourceLoader, 另一个是对接HTTP模块的ResourceHandle。



1. 加载不同的资源

不同的资源的加载其差异在于数据的处理方式不同,比如主文档要提交到Document Parser里去进行解析,图片则要显示出来,但它们的网络加载流程是相同的,所以它们有不同的CachedResourceClient实现,复用了SubresourceLoader的加载流程。


下图可以看到DcoumentLoader及ScriptElement如何关联到CachedResource:


开始加载资源包含两个重要过程:一是创建CachedResource, 二是调用CachedResource::addClient注册CachedResourceClient实例。


下图是ScriptElement的加载序列图:



CachedResourceHandle可以视为CachedResource的一个封装,提供给WebCore Loaders使用。


CachedResourceHandle是一个模板类

template <class R> class CachedResourceHandle


CachedResourceLoader为不同类型的资源提供了不同的接口函数,比如Script对应的加载函数:


CachedResourceHandle<CachedScript> CachedResourceLoader::requestScript(CachedResourceRequest& request)

{

    return static_cast<CachedScript*>( requestResource(CachedResource::Script, request).get() );

}


当收到数据时,从CachedResource派生出来的子类,会通过data函数及时获得已加载的数据,再通过注册的clients完成相应的操作。


上一篇已经提到加载的发起流程,下面是收到数据后,HTTP Stack回调的过程:




  *出错时,则调用到CachedResource::error()

下图是主文档(CachedRawResource)收到数据后的处理流程(DocumentLoader就是CachedRawResource的client):


以下是CachedRawResource::data的代码片段:

if (incrementalDataLength) {

        CachedResourceClientWalker<CachedRawResourceClient> w(m_clients);

        while (CachedRawResourceClient* c = w.next())

            c->dataReceived(this, incrementalData, incrementalDataLength);

    }



2. ResourceHandle的跨平台

关于WebKit的跨平台机制,可以参考<<WebKit模块化分析>>中"兼容并蓄 - WebKit的跨平台方案"。

ResourceHandle,ResourceHandleInternal及NetworkingContext都定义在platform/network目录下. ReourceHandle针对不同平台有部分函数有不同的实现,实现的单元文件在platform/network目录下具体平台port的子目录下。


     

*在使用的HTTP Stack中,除curl等平台实现外,WebKit源代码还提到了SOUP, 这也是一个为GNOME应用提供HTTP支持的库,简介如下:

Soup uses GObjects and the glib main loop, and is designed to work well with Gtk/GNOME applications. This enables GNOME applications to access HTTP servers on the network in a completely asynchronous fashion, very similar to the Gtk+ programming model (a synchronous operation mode is also supported for those who want it).

转载请注明出处: http://blog.csdn.net/horkychen

本系列上一篇:

  [WebKit]WebCore之页面加载的设计与实现(一)

UML图档下载地址(GitHub):

  WebKit-Documentation

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值