標籤:webkit blink frameview 建立過程
從render_view_impl.cc開始說起。
1. 方法RenderViewImpl::Initialize中有:
webview()->setMainFrame(WebFrame::create(main_render_frame_.get()));
2. 先看裡面的參數,即WebFrame::create
此代碼執行:檔案WebFraemImpl.cc中方法:WebFrame::create
3. 上面方法執行同檔案中方法:WebFrameImpl::create
4. 上面方法會執行同檔案的重載方法:WebFrameImpl::create
5. 上面方法執行建構函式:WebFrameImpl::WebFrameImpl
註:在該建構函式中會建立WebFrameInit對象。
WebFrameInit類是在檔案WebFrameImpl.h中定義。該類繼承了FrameInit。
class WebFrameInit : public WebCore::FrameInit
WebFrameInit的建構函式,如下:
WebFrameInit(WebFrameImpl*webFrameImpl, int64_t frameID)
: WebCore::FrameInit(frameID)
,m_frameLoaderClientImpl(webFrameImpl)
{
setFrameLoaderClient(&m_frameLoaderClientImpl);
}
在該建構函式中,建立了FrameInit對象;並且將webFrameImpl值付給FrameLoaderClient對象。
FrameInit類在檔案Frame.h中定義。
class FrameInit : publicRefCounted<FrameInit>
6. 接著,我們看看
webview()->setMainFrame(WebFrame::create(main_render_frame_.get()));
看看方法setMainFrame
7. 該方法是檔案WebViewImpl.cc中方法:WebViewImpl::setMainFrame
該方法的實現如下:
voidWebViewImpl::setMainFrame(WebFrame* frame)
{
toWebFrameImpl(frame)->initializeAsMainFrame(page());
}
8. 我們再看方法initializeAsMainFrame
該方法是在檔案WebFrameImpl.cpp中,
WebFrameImpl::initializeAsMainFrame
該方法中,有
setWebCoreFrame(Frame::create(m_frameInit));
和m_frame->init();
這兩個代碼比較關鍵。
9. 我們先看Frame::create(m_frameInit)
該方法是在檔案Frame.cpp中Frame::create
PassRefPtr<Frame>Frame::create(PassRefPtr<FrameInit> frameInit)
{
RefPtr<Frame> frame = adoptRef(newFrame(frameInit));
if (!frame->ownerElement())
frame->page()->setMainFrame(frame);
InspectorInstrumentation::frameAttachedToParent(frame.get());
return frame.release();
}
會建立Frame對象,
注意:建立Frame對象的時候,也會建立FrameLoader對象。
其建構函式中有代碼:
, m_loader(this,frameInit->frameLoaderClient())
並且,可執行frame->page()->setMainFrame方法。
10. 再來看看m_frame->init();
11. 上面方法是在檔案Frame.h,有方法:
inlinevoid Frame::init()
{
m_loader.init();
}
12. 再看看m_loader.init();
m_loader是FrameLoader類型。該方法會執行FrameLoader.cpp檔案中方法FrameLoader::init()
13. 這裡有代碼m_client->createDocumentLoader
執行的是檔案FrameLoaderClientImpl.cpp中方法:
FrameLoaderClientImpl::createDocumentLoader
裡面,有代碼:
RefPtr<WebDataSourceImpl>ds = WebDataSourceImpl::create(frame, request, data);
14. 上面方法在檔案WebDataSourceImpl.cpp中,WebDataSourceImpl::create。
15. 該方法會調用WebDataSourceImpl的建構函式。
在該建構函式中有,
WebDataSourceImpl::WebDataSourceImpl(Frame*frame, const ResourceRequest& request, const SubstituteData& data)
: DocumentLoader(frame, request, data)
即建立了DocumentLoader對象。
這是第一次建立DocumentLoader對象。
16. 之後,會執行DocumentLoader::finishedLoading()方法,該方法中有代碼: commitIfReady()
執行同檔案的DocumentLoader::commitIfReady()方法。
17. 再執行方法FrameLoader::commitProvisionalLoad()
18. 再執行方法:
FrameLoaderClientImpl::transitionToCommittedForNewPage()
19. 再執行方法:
WebFrameImpl::createFrameView()建立第一個FrameView
20. 以上是建立第一個DocumentLoader對象和FraemView對象。
21. 接著執行方法:
FrameLoader::loadWithNavigationAction
FrameLoaderClientImpl::createDocumentLoader
WebDataSourceImpl::create
DocumentLoader::DocumentLoader
建立第二個DocumentLoader對象。
22. 接著執行:
DocumentLoader::dataReceived()
DocumentLoader::commitIfReady()
FrameLoader::commitProvisionalLoad()
FrameLoaderClientImpl::transitionToCommittedForNewPage()
WebFrameImpl::createFrameView()
建立第二個FrameView.
FrameView是個比較關鍵的組件,它是否透明,可以讓整個chromium實現透明展示網頁