1. 程式人生 > >Webkit學習 ----網頁資源的構建載入流程

Webkit學習 ----網頁資源的構建載入流程

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::loadloader發起請求

2.呼叫MainResourceLoader::loadNow

3.呼叫MainResourceLoader::willSendRequest

4.呼叫ResourceLoader::willSendRequest,callback通過ResourceNotifier傳導給FrameLoaderClientClient可以在回撥中操作ResourceRequest,比如設定請求頭部。

5.呼叫PolicyChecker::checkNavigationPolicy過濾掉重複請求等

6.loader呼叫ResourceHandle::createNetwork發起載入請求

7.收到第一個HTTP響應資料包,Network回撥MainResourceLoader::didReceiveResponse,主要處理HTTP頭部。

8.呼叫PolicyChecker::checkContentPolicy,並最終通過FrameLoaderClientdispatchDecidePolicyForMIMEType判斷是否為下載請求(存在"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::commitProvisionalLoadFrameLoaderprovisional狀態躍遷到Committed狀態

17.呼叫FrameLoaderClientQt::committedLoad

18.呼叫DocumentLoader::commitData,啟動Writer物件來處理資料(DocumentWriter::setEncodingDocumentWriter::addData

19.呼叫DocumentWriter::addData

20.呼叫DocumentParser::appendByte

21.呼叫DecodedDataDocumentParser::appendBytes對文字編碼進行解碼

22.呼叫HTMLDocumentParser::append,進行HTML解析


  好了,下載載入流程就到這,下篇會帶來詳細的HTML詞法解析和壓縮流程

相關推薦

Webkit學習 ----網頁資源構建載入流程

Webkit的作用在這就不多做介紹了,本篇主要還是個人在原始碼分析了webkit之後的心得總結!       webkit有上千個類,在這麼錯綜複雜的結構裡看流程無疑找死,好吧,用GDB除錯看吧!       環境:webkit + Qt4.8.4 + gdb

Android學習歷程--Launcher整體載入流程總結

本文為自己學習思路的總結若有需要或整理詳細程式碼及細節 一、進入  LauncherApplication -> LauncherAppState -> 進行初始化環境(通過傳遞sContext)、進行事件監聽&&初始化一些環境例如:橫豎屏、當

Android Webkit 派生資源載入流程

以image為例解析image資源的載入過程: 1.      HTMLImageElement被建立時在建構函式HTMLImageElement()中將HTMLImageElement物件傳遞給HTMLImageLoader創建出m_imageLoader 2.    

Django學習筆記007-模板載入靜態資源

在一個網頁中,不僅僅有html,還需要css、js、圖片等,因此在DTL中載入靜態資源是必須要解決的問題。 在DTL中,使用static標籤來載入靜態檔案,要使用static標籤,首先需要{% load static %} 載入靜態檔案的步驟如下: 1、首先確保django.contri

資源載入preload和資源預讀取prefetch簡明學習

前面的話   基於VUE的前端小站改造成SSR伺服器端渲染後,HTML文件會自動使用preload和prefetch來預載入所需資源,本文將詳細介紹preload和prefetch的使用 資源優先順序   在介紹preload和prefetch之前,首先要介紹瀏覽器的資源優先順序   在Chr

機器學習深度學習推薦資源(學習流程建議+學習資料+視頻)

-h coursera oos arc process proc tle cap sele 自從從軟件開發轉型到機器學習工程師,期間有人詢問我是如何自學轉型的,最近尤為多,所以寫下這篇文章,會有我自己摸索的學習的流程和花錢收集資料+視頻,自己也是水平有限,且不一定適合每個人

Webkit載入流程概述

之前寫了幾篇載入流程的說明,是從下向上看,有點只見樹木不見森林的感覺。經過最近一段時間的學習,有了能加以概括抽象的方法。 WebKit載入流程和頁面組成是直接相關的,頁面就是WebKit要載入的物件。所以WebKit負責載入的類也與負責頁面管理的類相對應。Apple關於

Launcher啟動流程&&載入流程學習

 宣告: 圖片本來是有的 涉及到有些程式碼不能示人沒有貼上,不過僅文字說也足夠了,請廣大老爺們自行下載原始碼參看流程分析閱讀。 目錄 1、功能 1 2、樣式 2 ①許可權: 5 ③總結 25 一、 認識Launcher: 1、功能

Cocos Creator 資源載入流程剖析【三】——Load部分

Load流程是整個資源載入管線的最後一棒,由Loader這個pipe負責(loader.js)。通過Download流程拿到內容之後,需要對內容做一些“載入”處理。使得這些內容可以在遊戲中使用。這裡並不是所有的資源都需要進行一個載入處理,目前只有圖片、Json、Plist、Uuid(Prefab、場景)等資

Cocos Creator 資源載入流程剖析【五】——從編輯器到執行時

我們在編輯器中看到的資源,在構建之後會進行一些轉化,本章將揭開Creator對資源進行的處理。 資源處理的整體規則 首先我們將Creator的開發和執行劃分為以下幾個場景: 編輯器 當我們將資源放到編輯器中時,Creator會為每個資源生成唯一的uuid以及meta檔案,並在專案的library目錄下生成對應

Cocos Creator 資源載入流程剖析【六】——場景切換流程

這裡討論場景切換的完整流程,從我們呼叫了loadScene開始切換場景,到場景切換完成背後發生的事情。整個流程可以分為場景載入和場景切換兩部分,另外還簡單討論了場景的預載入。 載入場景的流程 loadScene主要做了3件事,通過_getSceneUuid獲取要載入場景的資訊,對於原生平臺的非啟動場景

flutter原始碼學習筆記-圖片載入流程

本文基於1.12.13+hotfix.8版本原始碼分析。 #### 0、大綱 1. Image 2. ImageProvider 3. 圖片資料載入 ImageStream、ImageStreamCompleter 4. 快取池 PaintingBinding#imageCache 5. 網路圖片載入 #

強化學習 相關資源

ren info round count question posit pre tar tor   最近因為某個不可描述的原因需要迅速用強化學習完成一個小實例,但是之前完全不懂強化學習啊,雖然用了人家的代碼但是在找代碼的過程中還是發現了很多不錯的強化學習資源,決定mark下

爬蟲學習——網頁下載器和urllib2模塊

處理器 請求 aid none pro 調用 tps jar header 什麽是網頁下載器? 一、網頁下載器是爬蟲的核心組件 二、常用的python網頁下載器有urlilib2基礎模塊和requests第三方插件兩種 urllib2支持功能:1.支持直接url下載;

Git_學習_00_資源

wiki .com roc dash it教程 學習 http href blank 1.Git教程—廖雪峰:(https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8

新手篇——學習網頁開發需要多長時間就能找到工作

自己的 target 也會 什麽是 遇到 初學 bootstrap common front-end 近幾年Web前端框架層出不窮,比如 React, Vue, AngulaJS等吸引了大量的註意力,前端技術發展勢頭迅猛,各大互聯網公司也越來越重視前端開發,前端開發再也不是

Linux學習筆記之內核啟動流程與模塊機制

oid img 相關 call rootfs _exit alt 執行 分模塊 本文旨在簡單的介紹一下Linux的啟動流程與模塊機制: Linux啟動的C入口位於/Linux.2.6.22.6/init/main.c::start_kernel() 下圖簡要的描述了一下內核

Mybatis_學習_00_資源

logo sub map 源碼 中文 cts batis git 深入 源碼:https://github.com/mybatis/mybatis-3 1.官方 (1)Mybatis官方文檔中文版 (2)MyBatis 從入門到精通 書中指定的網絡資源 (3)My

機器學習pdf資源

導論 pan tps 百度 機器 tro pos div deep 《深度學習》(Deep Learning)中文版pdf, 百度網盤: https://pan.baidu.com/s/1jHDiQTg 《機器學習導論》(Introduction to Machine L

Docker容器學習梳理-Dockerfile構建鏡像

運行時 可執行 創建 管理 部分 重要 環境 每次 定制 在Docker的運用中,從下載鏡像,啟動容器,在容器中輸入命令來運行程序,這些命令都是手工一條條往裏輸入的,無法重復利用,而且效率很低。所以就需要一 種文件或腳本,我們把想執行的操作以命令的方式寫入其中,然後讓doc