第四章 WebKit之网络加载

4.1 Loader概述

我们使用浏览器上网时,首先会在地址栏输入一个网址,浏览器会依据网址向服务器发送资源请求,服务器解析请求,并将相关数据资源传回给浏览器,这些数据资源包括Page的描述文档、图片、Javascript脚本、CSS等。此后,浏览器引擎会对数据进行解码、解析、排版、绘制等操作,最终呈现出完整的页面。

WebKit 执行流程示意图

在过去,Webkit资源分成两类,一类是主资源,比如HTML页面,或者下载项,一类是派生资源,比如HTML页面中内嵌的图片或者脚本、样式表链接,分别对应代码中两个类:MainResourceLoader和SubresourceLoader。这两类资源的加载过程颇有不同,比如对资源加载失败的处理,主资源下载失败会有报错提示,而派生资源如图片下载失败,往往只显示一个占位符。所以网络加载模块分别设计了MainResourceLoader和SubresourceLoader来处理它们。它们的公共基类ResourceLoader主要完成两种资源加载都需要进行的操作,如在资源加载过程中,反馈加载状态的回调等。

注:自从WebKit有了PageCache(主资源也可以缓存)的功能以后。WebKit资源加载已经不区分MainResourceLoader和SubresourceLoader,统一由CachedResourceLoader加载资源,而区分主资源和派生资源则是通过CachedResource类里面Type类型:

enum Type {

MainResource,

ImageResource,

CSSStyleSheet,

Script,

FontResource,

RawResource

};

可以看到加载主资源的时候,Type类型就为MainResource。由于目前我们使用的WebKit代码已经使用了比较新的代码,所以本章后面介绍的流程都与过去的流程不一样了。

4.2 Loader中的类结构以及作用

为了梳理出Loader模块中相关类之间的关系!在阅读源码时,可参考这张图,有助于加深对Loader整体的理解。

Loader类图设计

FrameLoader类提供了资源加载的一系列接口,因此与FrameLoader交互的类比较多,以下是FrameLoader类与其他比较重要类的内在关系图:

FrameLoader的交互

首先简要说明图中几个类的作用。

FrameLoaderClient:是FrameLoader的客户接口类,在不同的平台实现也不相同,比如在Qt平台、Android平台、Gtk平台等。FrameLoader将加载过程中的状态、结果等信息传递给FrameLoaderClient,FrameLoaderClient可以管控FrameLoader的动作。

HistoryController:处理历史记录相关的接口,保存或者恢复Page和Document的状态到HistoryItem,维护浏览器页面的前进后退队列,以实现前进后退功能。

PolicyChecker:对FrameLoader进行一些校验。包括三种校验:NewWindowPolicy、NavigationPolicy、ContentPolicy。NewWindowPolicy对应于浏览器需要新开一个tab页或者窗口时。NavigationPolicy对应于一个页面请求发起时。ContentPolicy校验对应于收到数据以后(如判断MimeType等)。PolicyChecker提供对应的接口,由FrameLoaderClient来对这些请求进行校验,以确定是否允许继续加载或者需要执行其他的动作。

ResourceLoadNotifier:用于与ResourceLoader和FrameLoaderClient通信。在资源加载过程中,将ResourceLoader的状态通过ResourceLoadNotifier通知给FrameLoaderClient。

SubFrameLoader:用于控制MainFrame的子Frame(如iframe)的加载。

DocumentLoader:FrameLoader包含了三个DocumentLoader对象,在资源加载的不同阶段被使用,其中m_policyDocumentLoader应用在Load请求产生时的Policy Check阶段。m_provisionalDocumentLoader应用在Policy Check通过后,发起网络请求的阶段。m_documentLoader则是收到Server发回的资源数据包后使用的DocumentLoader。不过在实际的资源加载过程中,三个DocumentLoader对应于同一个对象。

FrameLoaderStateMachine:通过FrameLoaderStateMachine来反映FrameLoader的状态,描述DocumentLoader的状态。

4.3 资源加载流程

正如概述所说,比较新的WebKit代码主资源已经加入了缓存机制,所以统一由CachedResourceLoader加载资源,以下加载主资源的时序图:

主资源加载流程

WebKit派生资源包含的类型主要如下:

Javascript脚本(CachedScript);

CSS样式文本(CachedCSSStyleSheet);

图片(CachedImage);

字体(CachedFont);

XSL样式表(CachedXSLStyleSheet);

可以说除了主资源剩下的网络资源都是派生资源。派生资源的WebKit中都有对应的类实现,它们有着共同的基类(CachedResource),下面是类图:

派生资源继承关系图

WebKit在加载主资源后,主资源会被解码,然后进行解析,生成DOM树。在解析的过程中,如果遇到派生资源的标签,会创建相应的HTMLElement类。我们以image(会创建HTMLImageElement类)为例,时序图如下:

Image资源加载流程

4.4 本章小结

本章主要介绍了Loader模块的设计与实现,包括Loader的相关类介绍。对比主资源和派生资源加载流程,大家会发现很多相似之处。Loader模块较为复杂但非常重要,希望本章能给大家一些帮助。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容