FrameLoader类负责一个Frame的加载,在Frame的流程中起到非常重要的重要,同很多组件都有交互,本文将分析FrameLoader类的代码。

1. 概述

顾名思义,FrameLoader是一个Frame的loader,它的作用就是为客户提供一个下载一个Frame的一系列接口。这里的客户指的是类的客户,比如Frame类,间接客户是上层应用,比如qwebframe。
    从它的定义看,最容易想到的是一个load接口,用来将一个frame load下来。任何一个页面至少都需要一个mainframe,因此一个页面的下载一般就是从load一个mainframe开始。
    在load frame的过程中,通过FrameLoaderClient接口将load过程的不同阶段告知客户。
    FrameLoader通过setDocumentLoader相当于把load的工作委托给了DocumentLoader类。
    FrameLoader同DocumentLoader是has-a的关系。一般在load的时候创建DocumentLoader。Frame调用DocumentLoader的startLoadingMainResource开始load frame。

2. 类关系

1)Frame和FrameLoader是contain-a的关系,在Frame的构造函数中调用FrameLoader的构造函数,调用时传入参数Frame指针和FrameLoaderClient指针。
2)Frame有可能有子Frame,所以维护SubFrameLoader对象m_subframeLoader来管理子Frame的load。Frame可以对应xml document,也可对应html document,等等。跟Document相关的子resource的load不在FrameLoader的职责范围内。
3)包含一个DocumentWriter类对象m_writer,当Frame的数据load finish的时候,将数据传给DocumentWriter类,进行下一步的处理(比如解码)
4)FrameLoader维护了三个DocumentLoader对象,分别对应于不同的阶段,m_policyDocumentLoader对应于收到用户load调用,进行policy check阶段,m_provisionalDocumentLoader对应于policy check通过以后,Frame数据还没有到来之前,它会负责startLoadingMainResource的调用。m_documentLoader则是Frame第一个数据到来以后使用的DocumentLoader,这个时候,前一个主Frame的DocumentLoader已经不能再用(user agent开始白屏,刷掉前一个页面的显示)。
5)包含一个HistoryController对象,用于操作历史记录相关的接口,保存或者恢复Document和View相关的状态,维护前进后退队列,以实现前进后退功能,前进后退本质上是同Page对象关联的,FrameLoader通过HistoryController操作m_backFowardController对象
6)包含一个ResourceLoadNotifier对象,主要用于同ResourceLoader及FrameLoaderClient打交道,可以理解为ResourceLoader有事件变化或者发生的时候,通知FrameLoader的一个手段
7)包含一个SubframeLoader对象,当FrameLoader下载的Document有子帧需要请求的时候(比如HTMLDocument中解析到iframe 元素),用来处理子帧请求
8)将FrameLoader的状态封装到FrameLoaderStateMachine中,这个状态同FrameState不同,FrameState倾向于判断Frame涉及的Document的下载状态,是出于发起状态(Provisional),还是出于已经收到响应但不全(CommittedPage),还是响应收全的状态,倾向于同http相关。而FramLoaderStateMachine倾向于同DocumentLoader相关,用来描述FrameLoader处理DocumentLoader的节点,是处于已经创建,还是显示的状态。
9)PolicyChecker主要用来对FrameLoader进行一些校验。包括三种校验:NewWindow,Navigation和Content。NewWindow对应于浏览器需要新开一个tab页或窗口的时候,Navigation对应于一个页面请求发起的时候,Content校验对应于收到数据以后(判断Mime type等),PolicyChecker通过提供对应的接口,由FrameLoaderClient来对这些请求进行校验,以确定是否允许继续,或者需要其它的动作。

3.   主要接口

Frame::init

功能:FrameLoader的初始化

函数调用系列
QWebFrame::QWebFrame(QwebPage* parent,QWebFrameData *frameData)
QWebFramePrivate::init(QWebFrame* qwebframe,QWebFrameData* frameData)
Frame::init()
FrameLoader::init()

说明:主要做一些自身的初始化工作,比如初始化状态机,Sandbox Flags,创建DocumentLoader被设置为Policy DocumentLoader和Provisional DocumentLoader,调用DocumentLoader和documentWriter等的接口进行初始化操作

FrameLoader::commitProvisionalLoad

功能:提交Provisional阶段下载的数据

函数调用系列:
DocumentLoader::finishLoading
DocumentLoader::commitIfReady
FrameLoader::commitProvisionalLoad

或者
ResourceLoader::didReceiveData
MainResourceLoader::addData
DocumentLoader::receiveData
DocumentLoader::commitLoad
DocumentLoader::commitIfReady
DocumentLoader::commitProvisionalLoad

说明:这个接口主要的操作是将Provisional DocumentLoader设置成DocumentLoader,因为已经收到数据,所以FrameState也会跃迁到FrameStateCommittedPage。还有历史记录,PageCache相关的操作。另外,这个接口会间接调用FrameLoaderClientQt::transitionToCommittedForNewPage,通过Frame::createView创建出FrameView来。

Frame::finishedLoading

功能:frame请求网络加载完成的时候调用此接口

函数调用系列
ResourceLoader::didFinishLoading
MainResourceLoader::didFinishLoading
FrameLoader::finishedLoading
FrameLoader::init()

说明:检查是否有网络错误,告诉DocumentLoader和DocumentWriter下载完成,以便进行后续操作(提交数据,解析)。

FrameLoader::finishedParsing

功能:解析完成调用此接口

函数调用系列
DocumentWritter::end
….
Document::finishParsing
….
Document::finishedParsing
FrameLoader::finishedParsing

FrameLoader::load(const ResourceRequest& request,bool lockHistory)

功能:加载一个frame请求,Frame请求相关的数据,封装成ResourceRequest传入。

函数调用系列:一般由应用触发调用

说明:这个接口调用FrameLoaderClientQt::createDocumentLoader创建出DocumentLoader,并以此DocumentLoader为Policy Document Loader,进入Policy check流程。

WebKit 内核源码分析 (二) FrameLoader相关推荐

  1. WebKit 内核源码分析 (三) Page

    浏览器的请求一般是以页面请求为单位,当用户通过网址栏输入一个url,浏览器就开始一个页面请求.而一个页面请求可能包含有一到多个页面子帧,以及图片.CSS和插件等派生子资源.Page类就是用来对应这样的 ...

  2. WebKit 内核源码分析 (四)

    本文介绍 WebCore 中 Loader 模块是如何加载资源的,分主资源和派生资源分析 loader 模块的类关系. 关键词: WebKit,Loader,Network,ResouceLoader ...

  3. WebKit 内核源码分析 (一) Frame

    在分析内核的时候,Frame是首当其冲的一个类,本文将分析Frame类的代码. 1.    描述 Frame类是WebCore内核同应用之间联系的一个重要的类.它有点像设计模式中的Façade,将内核 ...

  4. WebKit 内核源码分析 (五)

    本文分析WebKit中html的解析过程,DOM节点树的建立. 关键词:WebKit,html解析,html tree construction,WebCore, DOM节点树,dlmu2001 1. ...

  5. 鸿蒙内核源码分析:调度机制篇

    作者 | 深入研究鸿蒙,鸿蒙内核发烧友 出品 | CSDN(ID:CSDNnews) 头图 | CSDN 下载自东方 IC 阅读之前建议先读本系列其他文章,以便对本文任务调度机制的理解. 为什么要学这 ...

  6. Linux kernel 3.10内核源码分析--进程上下文切换

    一.疑问 进程调度时,当被选中的next进程不是current进程时,需要进行上下文切换. 进行上下文切换时,有一些问题不太容易理解,比如: 1.进程上下文切换必然发生在内核态吗? 2.上下文切换后原 ...

  7. Linux内核源码分析方法

    说明:这是一个刚接触内核三个月的同学,通过对一个内核特性的分析,总结出一套分析内核的方法. 一.内核源码之我见 Linux内核代码的庞大令不少人"望而生畏",也正因为如此,使得人们 ...

  8. LiteOS内核源码分析:静态内存Static Memory

    本文分享自华为云社区<LiteOS内核源码分析系列十二 静态内存Static Memory>,原文作者:zhushy . 内存管理模块管理系统的内存资源,它是操作系统的核心模块之一,主要包 ...

  9. Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现

    写在之前 这两篇文章是我2021年3月初看KeyMaster的笔记,本来打算等分析完KeyMaster和KeyStore以后再一起做成一系列贴出来,后来KeyStore的分析中断了,这一系列的文章就变 ...

最新文章

  1. 安装PHP7.3.2make编译出现报错,内存不足导致,临时解决方法
  2. Mac mysql sql_model引起的问题
  3. Zookeeper3.4.9分布式集群安装
  4. Springboot 抛出Failed to determine a suitable driver class异常原因
  5. matlab模拟塞曼图谱,塞曼效应以及能级的计算
  6. 戴上VR眼镜来场球赛?开启上帝视角
  7. [Android官方API阅读]___Application Fundamentals
  8. python故事书_python的故事
  9. 在ARM开发板的嵌入式linux系统上运行的QT程序,必须得要在linux里用QT编吗
  10. import json java_JAVA的JSON数据包装-博客园老牛大讲
  11. echart 地图 某个地区_一站式解决echarts实现区域地图
  12. 英语总结系列(二):爽约Pauel叔十五天
  13. 判断链表是否存在环 Linked List Cycle
  14. 宝贝,后端接口如何提高性能?
  15. XINS 3.0 正式版发布,远程 API 调用规范
  16. Java项目:医院门诊收费管理系统(java+html+jdbc+mysql)
  17. flutter全局状态管理Provider
  18. selenium web自动化判断页面元素加载完毕
  19. matlab 绘制扇形区域
  20. android开机动画切换

热门文章

  1. My cnblogs's first day
  2. Angular2.0 基础: User Input
  3. android 使用String.format(%.2f,67.876)自已定义语言(俄语、西班牙语)会把小数点变为逗号...
  4. 安装完Oracle数据库之后设置手动启动方法
  5. C# 温故而知新:Stream篇(—)
  6. 外企面试官最爱提的10个问题
  7. Android中AutoCompleteTextView的特殊使用方法
  8. JAVA设计模式之装饰模式
  9. mysql分库分表备份脚本[转帖]
  10. BZOJ3123: [Sdoi2013]森林