Webkit学习 ----网页资源的构建加载流程

转载 2013年12月02日 19:35:22


Webkit的作用在这就不多做介绍了,本篇主要还是个人在源码分析了webkit之后的心得总结!

      webkit有上千个类,在这么错综复杂的结构里看流程无疑找死,好吧,用GDB调试看吧!

      环境:webkit + Qt4.8.4 + gdb

      调试之前,当然先要生成调试版本的程序了,关于调试环境的搭建后续文章会阐述。。。。。。。

      现在就开始总结加载流程吧!

      当我们在浏览器中输入网站地址后,会通过把url赋给ResourceRequest这个类,并将ResourceRequest作为类参数传给Frameloader的load方法,ResourceRequest从头文件看貌似是关于网络协议的一系列接口封装(以后再深入了解这个类,应该可以提取出来做自己为用。之后通过CreateDocumentLoader创建出documentloader对象(该对象负责对于请求资源动作的一系列封装,eg.请求数据,数据请求完成等动作的响应,其实就是对于下载接口的一层封装),并作为参数传给frameloader的load方法。

   在该方法中,获取之前得到的ResourceRequest对象,通过addExtraFieldsToMainResourceRequest对于ResourceRequest对象中的一些关于http的头信息的内如注册,比如Agent字段和Accept字段等(其实就是填充HTTP协议头),接着通过调用loadwithDocumentloader进行正式的下载流程。

   先来看下之前操作流程的栈信息:

    

注:frameloader doucmentloader 和resourceRequest这几个类之间都是你中有我我中有你的好基友,所以都可以在各自的类中分别调用到

   接着往下看,进入loadwithDocumentloader之后,获取之前的resourceRequest对象的url,并将该url对象给到KURL类中(该类又是一个对于URL的功能封装),之后通过Documentloader的startloadingMainResource方法开始加载主页面数据(一般网页就是html文件),接着创建mainresourceloader类对象(这个类看名字就知道是做什么的了)

通过调用loadnow开始进行下载工作。

   先来看下之前操作流程的栈信息:

   

   因为我用的是Qt的port,所以具体的下载动作由Qt来做了,接着看数据接收的操作。

   当数据下载完之后,mainresourceloader的didreceivedata负责接收下载下来的数据,把接收的数据给到Documentloader,再由Documentloader的方法commitload发布加载的内容(在这一步中,浏览器先将旧的页面清除掉在加载新的页面),之后进过很多步的转发,给到了DOM文件夹中的DecodeDataDocumentParse的appendBytes。从这开始正式进入HTML的解压和词法解析流程,这之后将对HTML内容解析工作。

   先来看下之前操作流程的栈信息:

   

   总结下主要流程:

1.        DocumentLoader 调用 MainResourceLoader::load  loader 发起请求

2.        调用 MainResourceLoader::loadNow

3.        调用 MainResourceLoader::willSendRequest

4.        调用 ResourceLoader::willSendRequest,  callback 通过 ResourceNotifier 传导给 FrameLoaderClient  Client 可以在回调中操作 ResourceRequest ,比如设置请求头部。

5.        调用 PolicyChecker::checkNavigationPolicy 过滤掉重复请求等

6.        loader 调用 ResourceHandle::create  Network 发起加载请求

7.        收到第一个 HTTP 响应数据包 ,Network 回调MainResourceLoader::didReceiveResponse ,主要处理 HTTP 头部。

8.        调用 PolicyChecker:: checkContentPolicy, 并最终通过 FrameLoaderClient dispatchDecidePolicyForMIMEType 判断是否为下载请求(存在 "Content-Disposition"http 头部)

9.        调用 MainResourceLoader::continueAfterContentPolicy ,根据ResourceResponse 检测是否发生错误。

10.   调用 ResourceLoader::didReceiveResponse ,将 callback 通过 ResourceNotifier传导给 FrameLoaderClient 

11.   收到 HTTP 体部数据,调用 MainResourceLoader::didReceiveData

12.   调用 ResourceLoader::didReceiveData ,将 callback 通过 ResourceNotifier 传导给 FrameLoaderClient

13.   调用 MainResourceLoader::addData

14.   调用 DocumentLoader::receivedData

15.   调用 DocumentLoader::commitLoad

16.   调用 FrameLoader::commitProvisionalLoad  FrameLoader  provisional 状态跃迁到 Committed 状态

17.   调用 FrameLoaderClientQt::committedLoad

18.   调用 DocumentLoader::commitData ,启动 Writer 对象来处理数据(DocumentWriter::setEncoding  DocumentWriter::addData 

19.   调用 DocumentWriter::addData

20.   调用 DocumentParser::appendByte

21.   调用 DecodedDataDocumentParser::appendBytes 对文本编码进行解码

22.   调用 HTMLDocumentParser::append ,进行 HTML 解析


  好了,下载加载流程就到这,下篇会带来详细的HTML词法解析和压缩流程

Webkit主资源加载流程(推荐)

原帖地址  :http://blog.csdn.net/luoxinwu123/article/details/8204824 1,Webkit加载的主要模块 Loader的主要模块包括Frame...
  • augfun
  • augfun
  • 2017年01月15日 17:21
  • 695

WebKit加载流程 - 概述

之前写了几篇加载流程的说明,是从下向上看,有点只见树木不见森林的感觉。经过最近一段时间的学习,有了能加以概括抽象的方法。 WebKit加载流程和页面组成是直接相关的,页面就是WebKit要加载的对象。...
  • HorkyChen
  • HorkyChen
  • 2014年05月21日 06:52
  • 6508

webkit资源加载

在浏览器整个渲染过程中,资源获取这一过程无疑是最消耗时间的,同时浏览器内核也通过了各种方式去减少事件,比如资源加载多线程、并发下载资源、DNS预处理、缓存资源、缓存网络请求等。下面介绍从用户输入URL...
  • wmaoshu
  • wmaoshu
  • 2017年04月07日 18:16
  • 372

webkit加载网页

一、读取url 以下内容部分引自http://blog.csdn.net/dlmu2001/article/details/5936122 http的协议细节实现并不需要Web...
  • aaa550
  • aaa550
  • 2014年09月09日 23:21
  • 1323

webkit的加载过程

类图 类介绍 Frame --包含FrameLoader FrameLoader --指针Frame --指针FrameLoaderClient --引用DocumentLoader...
  • zevolo
  • zevolo
  • 2012年12月23日 14:55
  • 904

webkit资源加载流程(预览)

原帖地址: http://blog.csdn.net/shunzi__1984/article/details/6244003 frame应该是整个webcore里面最核心的对象之一,前面在讲Pag...
  • augfun
  • augfun
  • 2017年01月15日 16:33
  • 782

WebKit之常用操作代码调用流程

构造 HTML/XML tokenizer [HTML]Document::createTokenizer() [HTML]Document::implicitOpen() FrameL...
  • sauphy
  • sauphy
  • 2016年02月22日 20:18
  • 358

WebKit(展示Web界面)

WKWebView
  • y550918116j
  • y550918116j
  • 2015年11月30日 15:29
  • 1569

Chromium网页URL加载过程分析

Chromium在Browser进程中为网页创建了一个Frame Tree之后,会将网页的URL发送给Render进程进行加载。Render进程接收到网页URL加载请求之后,会做一些必要的初始化工作,...
  • Luoshengyang
  • Luoshengyang
  • 2016年01月25日 01:00
  • 25821

简单聊聊网页的资源加载优化

移动开发中很重要的一块是资源的加载优化。移动开发由于网速低带宽,高延迟,移动设备小内存,低处理器性能的原因,因此很多时候不得不通过优化前端页面的性能来满足用户对网页加载的预期。前段时间做了相关方面的优...
  • u012903926
  • u012903926
  • 2017年03月02日 09:48
  • 639
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Webkit学习 ----网页资源的构建加载流程
举报原因:
原因补充:

(最多只允许输入30个字)