星期二, 4月 27, 2010

Trace WebView.loadUrl

為了想知道 Android 到底使用哪個 proxy 設定,所以只能往下追了。

WebView.loadUrl( String url ) 送 message (LOAD_URL) 給 WebViewCore
WebViewCore.transfermessages() 收到以後呼叫 loadUrl( String url )
loadUrl() 呼叫 BrowserFrame.loadUrl()
BrowserFrame.loadUrl( String url ) 如果 url 是 javascript: 開頭的,丟給 javascript engine,一般情況則是呼叫 nativeLoadUrl( url )

nativeLoadUrl() 位於 WebCoreFrameBridge.cpp 裡,根據 JNI 函數對照表,對應到的是 loadUrl()。loadUrl() 則先依照 url 建立 ResourceRequest 物件,再傳入 pFrame->loader()->load() 裡。
pFrame 真正的身份是 external/webkit/WebCore/page 下的 Frame,裏面的 loader() 真實身份則是 external/webkit/WebCore/loader/FrameLoader。

接下來可以參考 http://trac.webkit.org/wiki/CodePaths 最後一項: Get data from network。

稍稍不一樣的是,Android 使用 external/webkit/WebCore/platform/network/android 下的 ResourceRequest、ResourceHandleAndroid...等類別,而非一般的 soup 或是 curl。

我幾乎可以確定應該是 ResourceHandleAndroid 類別負責真正的下載工作,但我卻看不懂裏面是怎麼呼叫的,裏面使用了相當迂迴的方法來呼叫。
以 network/curl/ResourceHandleCurl 來說,裏面就很清楚的用到 curl library,network/qt/ResourceHandleQt、network/soup/ResourceHandleSoup 也是如此。

今天就先看到這裡吧。

沒有留言: