转载请注明出处:http://www.cnblogs.com/fangkm/p/3784660.html

本文探讨一下chromium中加载URL的流程,具体来说是从地址栏输入URL地址到通过URLRequest类请求http流的过程。

为避免繁琐, URL请求过程中的NavigationController类和WebContents类姑且略过,直接从RenderViewHostImpl::Navigate方法下手,该方法通过ViewMsg_Navigate消息,将URL请求信息发送到render进程。Render进程中通过RenderViewImpl类的OnNavigate方法响应该请求,

该方法将URL请求信息封装成一个WebURLRequest对象,调用WebKit层WebFrameImpl对象的loadRequest方法。这里有必要简单介绍下几个关键类之间的关系:

RenderViewImpl派生自RenderView类,是Render进程中网页展示部分,对应于browser进程中的RenderViewHostImpl类,负责与browser进程进行IPC消息的通讯、对网页中的诸多行为进行响应。

RenderViewImpl维护一个WebView对象,两者通过一个map对象一一映射。

在WebView接口的实现类中,有一个Page成员,表示整个页面, Page类中又有一个或多个Frame对象,至少有一个主Frame。WebFrame接口应该是Page中主Frame的public访问代理,其关联操作发生在WebViewImpl类的initializeMainFrame方法里。

言归正传,WebFrameImpl的loadRequest方法最终会将请求转给FrameLoader的load方法,

FrameLoader是Frame的加载器。FrameLoader会将该请求委派给内部DocumentLoader成员的startLoadingMainResource方法来处理,再往下探讨之前,先把类之间的结构关系梳理一下:

DocumentLoader类:做为FrameLoader的成员,负责Document的加载。

ResourceFetcher类:资源提取器,相当于Resource的工厂类,负责创建不同的资源类型

的Resource封装。比如Image资源对应的是ImageResource封装类,

Script对应的是ScriptResource封装类。

在这里DocumentLoader调用ResourceFetcher的fetchMainResource方法加载Document资源, 创建的封装类为RawResource,创建完成后调用Resource的load方法,内部创建ResourceLoader类来执行具体的加载行为。

分析到ResourceLoader类,方有拨开云雾见日月的感觉,该类内部维护一个WebURLLoader接口,顾名思义,这才是真正执行URL加载的地方,不过只是个抽象接口,隶属WebKit的public接口部分,与平台相关,chromium对此接口有自己的实现,位于webkit_glue层 的WebURLLoaderImpl实现WebURLLoader接口,相关类结构如下:

IPCResourceLoaderBridge将URL请求任务封装成ResourceHostMsg_RequestResource

消息发送到browser进程,由browser进程请求URL数据。

自此,URL请求消息由browser进程抛到render进程,之后绕一大圈又回到browser进程执行任务, 路由过程中将页面的框架搭建起来, 之后由browser进程的URLRequest请求到的网络数据发送到render进程所做的解析操作都是对页面框架的添砖加瓦。

接下来分析一下browser进程对render进程抛送过来的URL请求的处理。

在ResourceDispatcherHostImpl类的OnRequestResource方法对render进程发送过来的ResourceHostMsg_RequestResource消息进行响应,相关类结构如下:

每收到一个URL请求, ResourceDispatcherHostImpl会创建一个ResourceLoader对象来承接URL的加载任务, ResourceLoader封装URLRequest类的使用,并将请求过程中的相关事件和数据分派到ResourceHandler链中。ResourceHandler链中的AsyncResourceHandler类负责将请求事件和数据封装消息发送到render进程中。Render进程ResourceDispatcher类来响应这些消息。

Chromium源码实在庞大,很多流程以前都看过,没做记录很快就没了印象,还是需要把学习的成果总结出来已做备忘。

Chromium源码--网络请求流程分析的更多相关文章

  1. Netty 源码学习——客户端流程分析

    Netty 源码学习--客户端流程分析 友情提醒: 需要观看者具备一些 NIO 的知识,否则看起来有的地方可能会不明白. 使用版本依赖 <dependency> <groupId&g ...

  2. boost.asio源码剖析(三) ---- 流程分析

    * 常见流程分析之一(Tcp异步连接) 我们用一个简单的demo分析Tcp异步连接的流程: #include <iostream> #include <boost/asio.hpp& ...

  3. flask源码剖析--请求流程

    想了解这篇里面的内容,请先去了解我另外一篇博客Flask上下文 在了解flask之前,我们需要了解两个小知识点 偏函数 import functools def func(a1,a2): print( ...

  4. vue2源码框架和流程分析

    vue整体框架和主要流程分析 之前对看过比较多关于vue源码的文章,但是对于整体框架和流程还是有些模糊,最后用chrome debug对vue的源码进行查看整理出这篇文章.... 本文对vue的整体框 ...

  5. Android4.0源码Launcher启动流程分析【android源码Launcher系列一】

    最近研究ICS4.0的Launcher,发现4.0和2.3有稍微点区别,但是区别不是特别大,所以我就先整理一下Launcher启动的大致流程. Launcher其实是贯彻于手机的整个系统的,时时刻刻都 ...

  6. Chromium源码--视频播放流程分析(拨开云雾)

    转载请注明出处: http://www.cnblogs.com/fangkm/p/3791964.html 在PC浏览器中播放视频,大部分视频网站都是采用flash播放器,这多亏了Adobe Flas ...

  7. Okhttp3源码解析(3)-Call分析(整体流程)

    ### 前言 前面我们讲了 [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析]( ...

  8. chromium源码阅读--Browser进程初始化

    最近在研读chromium源码,经过一段懵懂期,查阅了官网和网上的技术文章,是时候自己总结一下了,首先IPC message loop开始吧,这是每个主线程必须有的一个IPC消息轮训主体,类似之前的q ...

  9. chromium浏览器开发系列第三篇:chromium源码目录结构

    上两篇介绍了下载源码和编译源码,这次主要介绍chromium的源码目录结构,我也是通过源码和官网结合来跟大家说,如果有说的不准确的,欢迎交流. 另外,官网的不一定准确,他们其实也很懒,所以最主要还是靠 ...

随机推荐

  1. 27_网络编程-初识socket

    一.C/S B/S 架构         1.定义             (1)C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Cl ...

  2. 二进制转化为十进制Java实现

    二进制转化为十进制 ①按权展开方法Java实现 /* * 按权展开法 */ public static double BinToTen1(String binary) { //查找该二进制是否存在小数 ...

  3. diamond的设计思路

    diamond主要包含四个包:diamond-client.diamond-sdk.diamond-server和diamond-util client就非常简单的进行http的调用server拿数据 ...

  4. 如何执行超过一百兆(100MB)的sql脚本?

    最近遇到一个问题,在sqlserver的查询分析器里面执行一个超过100MB的数据库脚本,发现老是报“引发类型为“System.OutOfMemoryException”的异常”,上网查了一下,主要是 ...

  5. kindEditor 使用

    1. kindEditor简介: KindEditor是一套开源的HTML可视化编辑器,主要用于让用户在网站上获得所见即所得编辑效果.     主要特点: 1. 体积小,加载速度快,但功能十分丰富.2 ...

  6. Choose GitLab for your next open source project

    原文:https://b.agilob.net/choose-gitlab-for-your-next-project/ GitLab.com is a competitor of GIthub. I ...

  7. JavaScript --Window-对话框

    -----038-Window-对话框.html----- <!DOCTYPE html> <html> <head> <meta http-equiv=&q ...

  8. postgresql逻辑结构(一)

    一.数据库逻辑结构介绍 数据库:应用连接到一个数据库时,一般不能访问其它数据库,除非使用dblink等其他手段. 表.索引:postgresql中标的术语为relation,其它数据库中成为table ...

  9. 生成对抗网络(GAN)

    基本思想 GAN全称生成对抗网络,是生成模型的一种,而他的训练则是处于一种对抗博弈状态中的. 譬如:我要升职加薪,你领导力还不行,我现在领导力有了要升职加薪,你执行力还不行,我现在执行力有了要升职加薪 ...

  10. WPF性能优化的一些建议

    尽量多使用Canvas等简单的布局元素,少使用Grid或者StackPanel等复杂的,减小开销. 少用Margin Padding尤其避免嵌套使用. 在自定义控件,尽量不要在控件的ResourceD ...