WebKit在渲染一張頁面之前,首先,需要從網(wǎng)絡(luò) 上載入頁面數(shù)據(jù),以及頁面中所使用到的圖片、腳本、CSS等資源。然后,通過布局引擎將獲取的資源信息布局。最后,渲染引擎將數(shù)據(jù)渲染到瀏覽器的視圖中。 那么,網(wǎng)頁數(shù)據(jù)資源在WebKit中是如何被載入的,以及載入過程中涉及了那些組件模塊呢? 在WebKit中所有的資源獲取、網(wǎng)頁布局和渲染都是由WebCore組件模塊負(fù)責(zé),WebKit在載入頁面時(shí),將預(yù)載入的資源分成了兩類,一類是文檔,一類是文檔中所使用的資源(圖片、腳本、CSS等)。對待這兩類數(shù)據(jù),WebKit也采用了不同的處理流程。 框架載入 WebKit源碼中的FrameLoader類,是 專門負(fù)責(zé)將文檔載入到Frame中。當(dāng)用戶點(diǎn)擊一個(gè)連接時(shí),F(xiàn)rameLoader會(huì)得到通知,并且重新創(chuàng)建一個(gè)DocumentLoader對象用來載 入文檔。DocumentLoader此時(shí)并不會(huì)直接去訪問網(wǎng)絡(luò)下載數(shù)據(jù),而是會(huì)首先訪問WebKit的Client對象的 shouldOverrideURL方法,決定是否應(yīng)該載入指定的URL數(shù)據(jù)。如果該URL允許載入,則DocumentLoader會(huì)創(chuàng)建 MainResourceLoader對象,該對象使用ResourceHandle接口與平臺(tái)相關(guān)的網(wǎng)絡(luò)庫通信。MainResourceLoader 會(huì)從網(wǎng)絡(luò)上獲取Frame的信息,然后交給相應(yīng)的解析器解析。 資源載入 在解析Document的過程中,如果發(fā)現(xiàn)文檔中引 用了圖片、腳本、CSS等資源,Document對象會(huì)創(chuàng)建一個(gè)DocLoader對象,該對主要負(fù)責(zé)文檔中引用資源的載入。DocLoader對象,首 先會(huì)判斷Cache系統(tǒng)中是否已經(jīng)將相應(yīng)的數(shù)據(jù)緩存在內(nèi)存中(CacheImage對象),如果Image已經(jīng)存在在Cache中,則DocLoader 則立即返回該Cache的圖片數(shù)據(jù)。如果Image數(shù)據(jù)并不存在在Cache中,則DocLoader會(huì)重新創(chuàng)建一個(gè)CacheImage,該對象會(huì)請求 SubresourceLoader載入資源。SubresourceLoader最終會(huì)使用ResourceHandle接口和平臺(tái)相關(guān)的網(wǎng)絡(luò)庫通信, 從網(wǎng)絡(luò)上獲取指定的資源數(shù)據(jù)。 |
|