android源生Browser分析(四)---Webkit部分

瀏覽器探究——webkit部分——WebKit平臺相關層基本架構

該部分研究的很淺,會有很多錯誤之處,請注意。

這裏主要先關注下Source/WebKit/android下的幾個文件

跟FrameWork層通過JNI關聯的類在jni/目錄下

跟WebCore相關聯的一些類在WebCoreSupport/目錄下

一些跟cache相關的和WebView對應的jni在nav/目錄下

 

WebCoreFrameBridge.h/cppWebFrame

這個文件中提供的類實際上是WebFrame,對應的java層的類是BrowserFrame。

這個文件名WebCoreFrameBridge的確很讓人迷惑,所以在WebCoreFrameBridge.h的開頭就寫了TODO: change name to WebFrame.h

BrowserFrame通過jni傳下來的調用都會調用到WebCoreFrameBridge.cpp中的對應函數中,其他webkit的模塊想回調信息給BrowserFrame則要通過WebFrame類。

主要使用WebFrame類的是WebCoreSupport/目錄下的WebUrlLoadClient,ChromeClientAndroid,FrameLoaderClientAndroid。這三個類都保存了WebFrame的指針作爲成員變量,而在jni目錄下還有些類用到WebFrame,但只是在某個功能中用到,並沒有把它作爲成員。

BrowserFrame的正向與反向的jni調用

在WebCoreFrameBridge.cpp中提供的JNI函數中,主要提供了對WebCore::Frame的調用,即BrowserFrame通過jni調用到c層的WebCoreFrameBridge.cpp中的函數,在WebCoreFrameBridge.cpp中可以找到對應的WebCore::Frame,並執行WebCore::Frame的操作,或者通過WebCore::Frame找到WebCore::Frame中的成員,調用WebCore::Frame中成員的操作。

典型的例子如:

Java層執行前進或後退時,會調用BrowserFrame::goBackOrForward,該函數中會調用jni函數nativeGoBackOrForward,該jni函數對應c層的WebCoreFrameBridge.cpp中的GoBackOrForward。GoBackOrForward會找到對應的WebCore::Frame,然後調用pFrame->page()->goBack()之類的函數。

對於回調給java層BrameFrame,是通過WebFrame的函數,反向調用jni,來回調到java層的BrowserFrame的。

典型的例子如:

當需要向java層回調加載進度信息時,首先在WebKit平臺相關層的WebCoreSupport/的FrameLoaderClientAndroid::postProgressEstimateChangedNotification(),在FrameLoaderClientAndroid中存有WebFrame的成員變量,所以這裏通過成員WebFrame調用它的WebFrame::setProgress(),在WebFrame::setProgress()中通過jni反向調用,調用到java層BrowserFrame::setProgress。這樣就完成了整個回調的過程。


CreateFrame

WebCoreFrameBridge.cpp中很重要的一個函數就是CreateFrame。這個函數在java層的BrowserFrame的構造函數中通過jni調用的。

在CreateFrame中會創建很多對象,這些對象的關係比較複雜。

下圖爲CreateFrame中創建的幾個主要的類對象。

 

 

這個圖上的關係還是比較複雜的,但是搞明白還是很有必要的。

首先要明確,這個CreateFrame是在BrowserFrame構造時被創建的,而BrowserFrame又是同WebView一同創建的,即每個WebView有唯一的一個BrowserFrame對應。

這樣可見上述的這些類對象,都是跟一個WebView對應的。

對於WebCore中的類的概念:

WebCore::Page

一個Page對應瀏覽器的一個Tab頁,也即對應一個WebView,就是說一個Page對應一個Tab下的完整的html網頁

所以Page是個比較大的總體的概念.

它包括對這個頁面的設置Settings,它的窗口類Chrome,加載的進度信息ProgressTracker,前進後退的管理控制BackForwardController,渲染的主題RenderTheme,主Frame。

Settings:

一個頁面的設置。Java層的WebSettings通過jni與c層的WebSettings關聯,在執行同步設置時,就會在c層的WebSettings中使用java層的設置項來配置Page中的WebCore::Settings成員。這樣完成java層WebView的WebSettings與c層WebKit的WebCore::Settings的同步。

Chrome:

這個還不是很清楚,貌似是WebCore的角度看來是頁面窗口相關的內容,提供窗口,控件等行爲的類。在WebCore::Chrome中有接口類成員WebCore::ChromeClient實際實現爲ChromeClientAndroid子類,用於實現平臺相關的回調部分。ChromeClientAndroid是在WebCoreSupport/目錄下的,它又可以通過找到WebFrame來實現與上層jni的回調。

ProgressTracker:

維護了Page中接收數據的數量和進度等信息。回調時主要通過Frame->FrameLoader-> FrameLoaderClient執行回調,這個就是FrameLoaderClientAndroid,定義在WebCoreSupport/目錄下,它又可以通過找到WebFrame來實現與上層jni的回調。

WebCore::BackForwardController:

維護了前進與後退的操作

RenderTheme:

定義了很多默認樣式屬性,作爲一些默認的CSS的樣式,比如一些控件的顏色值等。

Frame:

Page中只有一個Frame就是m_mainFrame,是這個Page的主體數據內容。

 

 

WebCore::Frame

一個Frame對應一棵DOM樹。一個html網頁還可以有子Frame用iFrame來標識的,就像貓撲那樣的頁面,這樣一個Page下就可以有多個Frame。但是Page中只有一個Frame就是mainFrame。其他的Frame是由Frame結構中的FrameTree結構來組建。

另外一個Frame有一個FrameLoader,在構造時一併創建,用於加載html網頁及其資源用。

由下圖可見,Frame針對一個網頁的加載(FrameLoader),顯示(FrameView),DOM樹(Document),控制(ScriptController,Editor,SelectionController,EventHandler等)

 

 

Jni/WebViewCore

對應於java層的WebViewCore,java層主要傳遞了一些事件,如click事件,以及對控件的一些回調,比如SendListBoxChoices。

可以看到,這些是跟某個頁面(即BrowserFrame)無關的,是系統的一些事件,這些會直接在java層的WebViewCore中直接通過native方法調用到c層的。之前的Framework架構的介紹中可以看到,很多情況下都是app層發消息給WebViewCore線程,然後WebViewCore中又通過其BrowserFrame成員來調用BrowserFrame的native方法。該流程是針對跟某個Frame相關的一些操作,如果是跟Frame不直接相關的,則會通過WebViewCore自身的native方法,直接調用到c層的jni/WebViewCore中。

 

To be continued……

 

主要的JNI類:


發佈了20 篇原創文章 · 獲贊 11 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章