在WebKit渲染一个页面之前,它需要从网络上(其实也可以从本地文件或者内存加载)加载页面以及和它相关的所有派生资源。同加载资源相关的层有很多,在本文中,我将聚焦于解释WebCore,这一WebKit的主要渲染模块,如何参与到加载过程中的。
WebKit有两条加载路线,一条是加载documents到frames里面,另一条是加载派生资源(比如图片和脚本)。下图总结出了这两条路线涉及到的主要对象。
loader
加载Frames
FrameLoader类负责将documents加载到Frames。当你点击一个链接的时候,FrameLoader创建一个新的处于”policy”状态的DocumentLoader对象,等待WebKit客户端决定是否处理这个加载。通常WebKit客户端会指示 FrameLoader将这个加载视为一个导航(navigation),而不是阻止加载等。
一旦客户端指示FrameLoader将本次加载视为一个导航,FrameLoader就推动DocumentLoader进入”provisional”状态,在该状态,DocumentLoader会发起一个网络请求,并等待以确定网络请求将发起一个下载还是一个新的 document。
接下去,DocumentLoader会创建一个MainResourceLoader对象,这个对象主要用来通过ResourceHandle接口同平台网络库进行交互。将MainResourceLoader和DocumentLoader分开来主要有两个目的:(1)MainResourceLoader让DocumentLoader从处理ResourceHandle回调的细节中抽身出来(2)降低 MainResourceLoader的生命周期和DocumentLoader的生命周期(同Document绑定)的耦合度。
一旦加载系统接收到足够的信息可以确定资源确实代表了document,FrameLoader就将DocumentLoader推向”committed”状态,在该状态中,frame将显示document。
加载派生资源
显示一个Web页面,不只是需要组成document的HTML,还需要加载document引用到的图片,脚本及其它派生资源。 DocLoader类负责加载这些派生资源。(注意DocumentLoader和DocLoader有非常相似的名字,但是他们的作用是完全不同的)。
以加载一个图片为例,加载图片时,DocLoader首先询问Cache,在内存中是否有该图片的拷贝(即CachedImage对象)。如果图片已经在Cache中,DocLoader可以以该Cache中的图片立即响应。更有效率更高者,Cache在video内存保留了解码过的图片,这样 webkit连解码图片的过程都不需要了。
如果图片不再Cache中,Cache就会创建一个新的CachedImage对象来代表image。然后CachedImage对象要求 Loader对象发起一个网络请求,Loader对象创建SubresourceLoader。SubresourceLoader在派生资源加载路线上的作用同MainResourceLoader在主资源加载路线上的作用一样,它也是用来同ResourceHandle直接打交道。
可以优化的地方
加载路线上有很多地方可以优化。FrameLoader过于复杂,承担了不止是加载一个frame的任务。比如,FrameLoader有好几个非常相近的名为“load”的方法,非常容易混淆,并负责创建新窗口,这个同加载frame是没有关系的。另外,有很多越级行为,比如,MainResourceLoader将收到的字节直接传给了FrameLoader,而不是DocumentLoader。
从上图可以看出,Cache只要于派生资源(subresource)。主资源的加载并没有从WebKit的内存cache中获益。如果我们结合这两条路线,我们可以提高主资源加载的性能。
- 大小: 78.4 KB
分享到:
相关推荐
而从实际的角度来说,了解WebKit加载网页的流程有助于优化网页性能,解决加载和渲染过程中遇到的问题,提高网页的响应速度和兼容性。对于维护Web应用程序的开发者而言,掌握WebKit的工作原理,能够更有效地利用...
在 WebView 加载网页的过程中,WebKit 将网页资源分为两类:主资源(Main Resource)和子资源(Sub Resource)。 - **主资源**:通常指的是 HTML 文件。这是网页加载的第一个也是最关键的资源。 - **子资源**:包括...
在本文中,我们将深入探讨如何在Qt环境中使用WebKit框架来加载网页,特别是在这个特定的示例中,我们关注的是加载百度主页。这个实例基于Qt 5.5版本,这是一个广泛使用的C++应用开发框架,特别适合创建跨平台的桌面...
通过Awesomium,你可以创建一个浏览器窗口,加载网页,并获取HTML源码。 2. **CEFSharp**:CEFSharp是Chromium Embedded Framework的.NET包装器,它允许你在.NET应用中嵌入Chromium浏览器。CEFSharp提供了丰富的API...
`WebKit加载网页的流程.pdf` 解释了 WebKit 如何从请求网页到呈现完整页面的过程,包括 DNS 查询、HTTP 请求、HTML 解析、CSS 应用、JavaScript 执行和渲染树构建等步骤。 6. **WebKit for Android**: `WebKit+...
- 创建`frame`和`frameLoader`实例,用于加载网页。 - 加载一张空白网页,作为初始化后的默认状态。 2. **Load网页模块**: - 负责将网页数据加载到`WebFrame`中,准备进行字符解码和HTML解析。 - 支持两种加载...
WebView是这个框架的核心,它封装了Webkit引擎,提供了加载网页、执行JavaScript、处理触摸事件等功能。Android Browser与WebView之间的通信是通过WebKitBridge实现的,这是一个桥接模式,允许Java层与C/C++层的...
这意味着开发者可以通过调用Webkit模块的接口,轻松地在应用程序中集成Web浏览功能,比如创建一个网页视图、加载网页、执行JavaScript脚本等。这种设计极大地简化了开发流程,提高了跨平台的兼容性和效率。 ### ...
在Android 4.0.1版本中,WebKit是系统内核的重要组成部分,它是一个开源的网页渲染引擎,负责解析HTML、CSS、JavaScript等Web标准语言,并将这些内容转化为用户友好的图形界面。WebKit的重要性在于,它是Android...
Webkit的工作流程通常分为以下几个步骤: 1. **解析**:Webkit接收到网页请求后,使用网络模块加载HTML和CSS资源。 2. **构建DOM树**:WebCore将HTML解析成DOM树,CSS解析成CSSOM树。 3. **合并DOM与CSSOM**:DOM树...
9. **社区与贡献**:WebKit是一个活跃的开源项目,书中可能涵盖参与WebKit开发的流程、提交代码、参与社区讨论等信息,对于希望贡献自己力量的开发者有指导意义。 通过深入学习《WebKit技术内幕》,不仅可以提升你...
深入研究这些文件,可以了解到WebKit如何处理HTML、CSS和JavaScript,以及如何优化网页加载速度和用户体验。同时,也能够了解到开源项目中的代码组织和开发流程,对于提升自己的编程技能和理解复杂的软件系统具有...
- 理解Web渲染的性能指标,如paint、layout、composite等步骤,以提升网页加载速度。 8. **跨平台开发**: - WebKit支持多个平台,如iOS、macOS、Linux等。理解不同平台的差异,进行相应的适配工作。 - 学习如何...
通过阅读这个“webkit分析报告”,你可以深入了解 WebKit 的设计哲学、工作流程和技术细节,这对于理解和开发基于 WebKit 的浏览器或者其他依赖 WebKit 的应用都有极大的帮助。同时,也可以从中学习到如何优化网页...
通过这些技巧,开发者可以提升网页加载速度,提高用户体验。 **6. 实践案例与代码示例** 压缩包中的代码示例可能涵盖了WebKit的API使用、自定义渲染行为、性能优化实践等方面,是学习和掌握WebKit实际运用的宝贵...
3. **性能测试**:评估Webkit在处理复杂页面、加载速度、资源管理等方面的表现。 4. **兼容性测试**:验证Webkit在不同操作系统、设备和浏览器版本上的兼容性。 5. **安全测试**:检测Webkit是否存在安全漏洞,如XSS...
文档中提到了WebKit如何处理URL请求的基本流程。当用户在浏览器中输入一个URL时,WebKit会解析该URL并发起网络请求来获取资源。这一过程涉及到多个组件之间的交互,包括但不限于解析URL、发送HTTP请求、接收响应数据...
这些库提供了一组C#接口,使得开发者能够调用WebKit的功能,如加载网页、执行JavaScript、处理DOM事件等。 4. 浏览器开发基础:构建一个基于WebKit的浏览器,需要理解网络请求的流程、HTML和CSS解析、JavaScript...