之前写了几篇载入流程的说明,是从下向上看,有点仅仅见树木不见森林的感觉。经过近期一段时间的学习,有了能加以概括抽象的方法。

WebKit载入流程和页面组成是直接相关的,页面就是WebKit要载入的对象。

所以WebKit负责载入的类也与负责页面管理的类相相应。Apple关于WebView的说明里清楚表现了页面视图上的MVC结构:

一个页面从元素上也有其层次结构。而且和载入类相应,例如以下:

从页面元素上讲WebView代表了一个页面的呈现。相应一个Page. 一个Page包括一个或多个Frame,当中一个称为Main Frame,其他的Frame(iframe或object元素引入HTML)称为Sub Frame。每个Frame,从JavaScript里都有一个window和document对象。

页面中的Frame,Document和子资源,相应到载入的FrameLoader, DocumentLoader和SubresourceLoader。当中Frame能够进行导航(Navigation)操作。即载入、又一次载入、前进、后退操作,而Document则表示一个详细的HTML文档,没有导航操作。

从这里看到的几个Loaders都是载入的逻辑表示,实际的载入行为交给ResourceLoader(s)。即MainResourceLoader和SubresourceLoader来完毕,当中包括了资源载入的队列管理操作(ResourceLoadScheduler)。

ResourceHandle在WebKit中是一个重要的port接口,与各个平台的网络层适配,代表了一个详细的网络载入任务。

主要类的关系

FrameLoader载入时序

从上面能够知道FrameLoader代表了Frame的载入行为。DocumentLoader代表了Document的载入行为。为了区分载入的进程。FrameLoader对载入状态进行了区分。而且让DocumentLoader在不同的状态间转换。除此之外FrameLoader还另外使用一个状态机。管理Frame载入显示的状态(FrameLoaderStateMachine)。

除此之此,FrameLoader还要维护历史项(HistoryController),以相应处理Navigation操作, 详细项目定义在FrameLoaderTypes.h中。

Document Loader

相对FrameLoader而言,DocumentLoader相对简单一些,它的任务就是调用一个MainResourceLoader载入主文档。由于状态的转换在FrameLoader里完毕了。子资源的载入依托于DocumentLoader来管理。

子资源的载入

正如页面元素从属于Document存在一样,负责子资源的载入的类从属于Document,后来又移到了DocumentLoader类中。就形成了以下的关系:

CachedResourceLoader

至于CachedResourceLoader,事实上就是一个封装类。封装了创建各类CachedResource的功能。

各个须要进行载入的页面元素会继承自CachedResourceClient,创建CachedResourceRequest, 通过DocumentLoader/Document里的CachedResourceLoader发起请求。

以下是Script元素发起请求的调用:

Memory Cache/Application Cache

为了让用户有更快的应用体验。缓存机制不能少。

在WebKit里CachedResource/CachedResourceLoader的命名里之所以有了Cached,就是由于它们中缓存的交互。

WebKit也有一些算法上的说明,能够參考这里

Resource Load Scheduler

在HostInformation里存储着两个两个列表,一个是使用不同优先级数组存储的等待载入的列表,一个是正在载入的列表。

使用scheduleServePendingRequests处理排队的请求时,会按优先级依序运行。

以下是基本流程:

以上就是载入流程的概要性说明,中间缺少一些流程内容。能够參考以下两个链接:
  [WebKit]WebCore之页面载入的设计与实现(二)
  [WebKit]WebCore之页面载入的设计与实现(三)

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

最新文章

  1. js中排序问题总结
  2. Excel里生成GUID
  3. select count(*)和select count(1)的区别
  4. JSon_零基础_005_将po(bean)对象集合List转换为JSon格式的对象字符串,返回给界面
  5. O(1)时间内删除指定链表结点
  6. Oracle基础 PL-SQL编程基础(4) 异常处理
  7. [03] SQL优化
  8. Count The Pairs
  9. VS2010调试时候未响应
  10. Cocos性能优化工具的开发介绍Visual Studio内存泄漏检测工具——Visual Leak Detector
  11. 【JS】cookies 的使用
  12. JVM初探- 内存分配、GC原理与垃圾收集器
  13. nasm中的表达式
  14. Educational Codeforces Round 51 (Rated for Div. 2) G. Distinctification(线段树合并 + 并查集)
  15. 测试利器 Postman
  16. Python中关于列表排序并保留id/enumerate()使用方法
  17. vue企业项目搭建过程(vue-cli脚手架超详细教程 傻瓜-入门)
  18. latex学习(二)
  19. tf.argmax
  20. Oracle->mysql碰到的问题

热门文章

  1. mybastis_20190323
  2. 移动端的vue项目,启动错误:Module build failed: Error: No PostCSS Config found in:
  3. ajax 不执行
  4. mysql 密码的破解
  5. tree编译
  6. 洛谷P4994 终于结束的起点
  7. yum下载的rpm包离线安装
  8. Docker和虚拟机的区别
  9. How to customize Skin Gallery - Remove / rename skins and groups
  10. 更新 hadoop eclipse 插件