Webkit JNI

WebCoreFrameBridge.cpphtml

BrowserFrame經過jni傳下來的調用都會調用到WebCoreFrameBridge.cpp中的對應函數中,其餘webkit的模塊想回調信息給BrowserFrame則要經過WebFrame類。主要使用WebFrame類的是WebCoreSupport/目錄下的WebUrlLoadClient,ChromeClientAndroid,FrameLoaderClientAndroid。這三個類都保存了WebFrame的指針做爲成員變量,而在jni目錄下還有些類用到WebFrame,但只是在某個功能中用到,並無把它做爲成員。java

 

BrowserFrame.java的正向與反向的jni調用web

在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()之類的函數。app

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

典型的例子如:post

當須要向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中。

 

主要的JNI類:

相關文章
相關標籤/搜索