chromium顯示頁面(一)

最近在進行校園招聘,也有一段時間沒有更新博客了。這篇文章是關於chromium如何組織網頁的顯示的,在講解顯示之前,需要了解一下這些類在顯示中過程中起到什麼作用。整體的類圖如下


RenderProcessHostImpl:對應一個RenderProcess,他們之間通過ChannelProxy來通信,也就是說每一個RenderProcessHost控制着一個渲染進程。

SiteInstanceImpl: SiteInstanceImpl對象對應一個RenderProcessHost,同時SiteInstanceImpl對應着一個站點site_,也就是說來源於該站點的url會被分配到SiteInstanceImpl對應的RenderProcessHost中。同時它包含對象BrowsingInstance,它會決定url被分配到哪一個SiteInstanceImpl,也就是決定該url在哪一個渲染進程中進行渲染。

BrowsingInstance:包含着一個映射關係site_instance_map_,它決定url到SiteInstanceImp的對應關係,函數GetSiteInstanceForURL的作用是輸入一個url,它會先計算該url屬於哪一個site_,然後返回該site_對應的SiteInstanceImpl,如果該site_對應的SiteInstanceImpl還沒有創建,則會進行創建並保存在site_instance_map_中。

RenderViewHostImpl:與RenderProcess中的某一個RenderView對應,同樣是通過ChannelProxy來通信。

FrameTree:這個結構在當前的大多數文檔中都沒有提到,所以也是我看得最吃力的地方,後來我在文章中發現了該改動的一些基本的思路

http://www.chromium.org/developers/design-documents/oop-iframes
目前chromium希望frame相關的邏輯從content模塊的RenderView和RenderViewHost類中分離,放入一個新的RenderFame和RenderFrameHost類中。這些新的類會分配一個channel_id用於進程間通信。對於每個活動的Frame,它在當前進程中會有一個完整RenderFrame,並在其他進程中保存一個換出(swapped out)RenderFrame。下圖展示了一個包含了兩個tab的BrowsingInstance,每個tab中都包括兩個子frame,這些可換出的代理對象,用虛線表示。


FrameTreeNode:FrameTree的節點結構,每一個FrameTreeNode都包含一個RenderFrameHostManager,RenderFrameHostManager包含RenderFrameHostImpl,就是FrameTreeNode通過RenderFrameHostManager對RenderFrameHostImpl進行操作。每一個WebContents都會維護一棵以FrameTreeNode爲節點的FrameTree,與當前頁面的frame樹相對應,FrameTreeNode維護frame的相關信息,負責frame中的跨進程導航,並處理其他進程frame傳遞過來的消息。

RenderFrameHostImpl:與RenderViewHost類似,對應於一個其它進程中的RenderFame。

NavigationController接口:負責某一個標籤頁中的導航邏輯。其內部維護一個導航過的NavigationEntry列表,也可以理解成用戶操作的記錄,用於處理前進、後退、刷新等操作。

NavigatorImpl:用於處理FrameTree某個節點上的Navigation,它會綁定在一棵FrameTree上,並且該棵的每一個節點都會包含這個NavigatorImpl的指針。

WebContants:應於一個標籤頁,瀏覽器中打開的標籤頁都會對應一個WebContants。當用戶點擊瀏覽器上的添加按鈕或者是從一個網頁的一個連接來打開一個新的頁面,這樣一個新的頁面就被創建了。一個WebContents對象對應於一個HTML頁面和顯示該頁面的標籤頁,創建一個頁面其實就是創建一個WebContents對象。


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