Chromium源碼--網絡請求流程分析


轉載請注明出處: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源碼實在龐大,很多流程以前都看過,沒做記錄很快就沒了印象,還是需要把學習的成果總結出來已做備忘。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM