随笔 - 6  文章 - 0  trackbacks - 0
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

从上次学习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

@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
posted on 2016-03-03 21:40 月下孤影 阅读(163) 评论(0)  编辑 收藏 引用 所属分类: webkit相关学习