WebKit(Blink分支)各组件的创建(FrameView)
2020-12-13 05:40
标签: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 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 PassRefPtrFrame::create(PassRefPtr { RefPtr 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 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实现透明展示网页 WebKit(Blink分支)各组件的创建(FrameView),搜素材,soscw.com WebKit(Blink分支)各组件的创建(FrameView) 标签:webkit blink frameview 创建过程 原文地址:http://blog.csdn.net/u011882998/article/details/26150415
文章标题:WebKit(Blink分支)各组件的创建(FrameView)
文章链接:http://soscw.com/essay/31485.html