天天看點

Mozilla研究—從輸入URL到顯示内容的基本過程

Mozilla研究—從輸入URL到顯示内容的基本過程

轉載時請注明出處和作者聯系方式 

mozilla是一個以浏覽器為中心的軟體平台,它在我們平台中占有重要地位。我們用它來實作WEB浏覽器、WAP浏覽器、郵件系統、電子書和幫助閱讀器等應用程式。為此,我最近花了不少時間去閱讀mozilla的代碼和文檔,我将寫一系列的BLOG作為筆記,供有需要的朋友參考。本文介紹一下從輸入URL到顯示内容的基本過程。

按我的想象,從輸入URL到顯示内容的過程非常簡單:連接配接到伺服器—下載下傳檔案—解析内容—排版布局。而在Mozilla中,實際情況雖然大體差不多,由于中間繞了不少圈子,整個過程顯得比較複雜了。這裡簡單介紹一下:

1.         修正URL。使用者輸入的URL可能不合規範,在URLnsDocShell::LoadURI中,mozilla會調用URIFixup對其進行修正。它不但可以進行諸如加上scheme之類的簡單修正,還可以到指定的URL上去進行關鍵字查詢,以擷取真正的URL。

2.         建立URI對象。調用nsIIOService接口的GetProtocolHandler函數,通過scheme查詢到URI對應的nsIProtocolHandler,然後調用NS_NewURI建立URI對象。

3.         檢查Cache檔案。除了像REFRESH之類的操作不允許取cache的情況外,其它情況都先調用nsIDocShellHistory的函數,看看能否從曆史記錄中擷取cache的檔案。

4.         建立Channel。在nsDocShell::DoURILoad調用NS_NewChannel建立Channel。

5.         設定Cookie等資訊,然後調用AsyncOpen打開Channel。

6.         轉發資料到nsParser。當有資料可用時,會觸發nsInputStreamReadyEvent事件,經過nsInputStreamPump等對象的轉發,資料最終被送到nsParser。

7.         解析資料。nsParser解析資料生成各個元素(Element),解析器的代碼在parser/htmlparser/src目錄下,它支援增量解析,是以可以在檔案傳輸過程中,邊傳輸邊解析,而不必等到傳輸完成之後才解析。

8.         CNavDTD做文法檢查,并做适當的修正。CNavDTD實作了nsIDTD接口。整個解析器的架構是Builder模式的變種,它在Director(即nsParser)和Builder(HTMLContentSink)之間,加了這樣一個nsIDTD,以便對錯誤的文法進行修正。

9.         HTMLContentSink建構nsDocument。

10.     nsDocument經PresShell調用nsCSSFrameConstructor去建立各種layout元素。

Layout部分的處理非常複雜,目前還沒有弄清楚,以後再介紹吧。

~~end~~

繼續閱讀