WebKit(Blink分支)各組件的建立(FrameView)

來源:互聯網
上載者:User

標籤: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實現透明展示網頁

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.