首页 > 代码库 > WebKit(Blink分支)各组件的创建(FrameView)

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