Gecko處理HTML HTTP請求流程

Gecko處理HTML HTTP請求流程

(1) LoadURI或webshell調用nsWebShell::DoLoadURL開始讀取url。然後webshell通知DocumentLoader(使用“view”命令)讀取url。【nsWebShell.mObserver是一個nsIStreamObserver,webshell是傳給DocLoader的nsIContentViewerContainer】
(2) Document Loader調用NS_OpenURI傳遞請求文件,Necko(一個網絡lib)檢查url策略(這裏就是http:)後尋找對應的nsIProtocolHandler(這裏是nsHTTPHandler),然後向它申請一個nsIChannel(即nsHTTPChannel)。channel表示到server的一個連接,可以理解爲是一條html數據流。
(3) webserver發來數據,nsIChannel調用DocumenLoader的OnStartRequest,因爲此時channel已經知道了數據中的content type,DocumentLoader可以根據content type找對應的nsIDocumentLoaderFactory(nsLayoutDLF)處理"text/html"。然後Factory創建ContentViewer併發出創建nsIContentViewer的通知。多數情況下還要創建一個nsIDocument(nsHTMLDocument)綁定到ContentViewer。之後ContentViewer會嵌入到ContentViewerContainer當中。
(4) Document使用nsIParser解析輸入數據流,HTML文檔就是nsParser,本身已經實現了nsIStreamListener。nsIStreamListener返回到DocumentLoader並與nsIChannel的請求連接。
(5) Document(nsHTMLDocument)還創建了nsIContentSink(nsHTMLContentSink),連接parser和document,parser使用StreamListener解析數據流,轉化成ContentSink中的nsIParserNodes。parser以8kb爲單位從數據流讀取數據,逐塊解析並將解析出的nsIParserNodes傳給ContentSink,如果parser發生阻塞,期間還會繼續解析緩存數據。
(6) contentsink通過調用NS_NewHTMLXxxxElement()創建nsIContent節點描述document。各元素節點已包含了nsIHTMLContent接口和DOM接口。nsIContent::AppendChild()可以創建content tree,接收的參數aNotify通知document是否content model變化。content sink調用AppendChild時該參數始終爲PR_FALSE。nsHTMLContentSink::WillInterrupt()和nsHTMLContentSink::DidBuildModel()執行時,content sink會調用NotifyBody()通知document關於content model的變化。parser處理每個8kb數據塊都要執行WillInterrup。
(7) 因爲presentation shell (nsPresShell) 已經在nsIDocument註冊爲一個DocumentObserver,所以Document/Content tree變化的時候也會收到通知,這樣就可以通過nsCSSFrameConstructor創建和更新nsIFrame,參考用戶agent樣式單(ua.css)爲每個content節點創建frames,當然除了那些displaytype是"none"的節點。一個content節點對應一個或多個nsIFrame,如果有幾個frames都是由一個content node創建,第一個就稱爲"primary"節點,後面的那些frames可以用nsIFrame的GetNextInFlow()方法進行查找。nsHTMLContentSink::OpenBody()通過調用nsHTMLContentSink::StartLayout()完成首個流程 。
(8) 每個nsIFrame都包含了屏幕呈現的方法,PresShell調用nsIFrame::Paint()佈局frames,通過傳遞presentation context和rendering context的引用進行繪製。rendering context是一個native類(nsGtkRenderingContext on unix),包含了繪製的方法。

出處
https://developer.mozilla.org/en-US/docs/The_life_of_an_HTML_HTTP_request


本文來自 zsw0314 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/zsw0314/article/details/46422619?utm_source=copy

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章