从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实现透明展示网页