1. 程式人生 > >cef瀏覽器 url載入內部詳解

cef瀏覽器 url載入內部詳解

首先先說明環境cef2623 webkit核心瀏覽器探索

    void fire(LocalFrame* frame) override
    {
        OwnPtr<UserGestureIndicator> gestureIndicator = createUserGestureIndicator();
        FrameLoadRequest frameRequest(originDocument());
        m_submission->populateFrameLoadRequest(frameRequest);
        frameRequest.setReplacesCurrentItem(replacesCurrentItem());
        frameRequest.setTriggeringEvent(m_submission->event());
        frameRequest.setForm(m_submission->form());
        frame->loader().load(frameRequest);
    }

上面程式碼位置為:D:\cefcode\chromium\src\third_party\WebKit\Source\core\loader\NavigationScheduler.cpp line230

然後進入到了frame->loader().load(frameRequest) 函式裡面。這個函式裡面包括所有的load行為。

void FrameLoader::load(const FrameLoadRequest& passedRequest, FrameLoadType frameLoadType,
    HistoryItem* historyItem, HistoryLoadType historyLoadType)//line873
{
//...
createWindowForRequest(request, *m_frame, policy, request.shouldSendReferrer(), request.shouldSetOpener());
//... startLoad(request, newLoadType, policy);}
 上面檔案是D:\cefcode\chromium\src\third_party\WebKit\Source\core\loader\FrameLoader.cpp
 

然後第一次是先進入createWindowForRequest 函式裡面。然後進入下一個檔案

void createWindowForRequest(const FrameLoadRequest& request, LocalFrame& openerFrame, NavigationPolicy policy, ShouldSendReferrer shouldSendReferrer, ShouldSetOpener shouldSetOpener)
{
//...
    Frame* newFrame = createWindow(openerFrame, openerFrame, request, features, policy, shouldSetOpener, created);
//...
}
D:\cefcode\chromium\src\third_party\WebKit\Source\core\page\CreateWindow.cpp line 174

然後進入了createwindow


static Frame* createWindow(LocalFrame& openerFrame, LocalFrame& lookupFrame, const FrameLoadRequest& request, const WindowFeatures& features, NavigationPolicy policy, ShouldSetOpener shouldSetOpener, bool& created)
{
//...

    Page* page = oldHost->chromeClient().createWindow(&openerFrame, request, features, policy, shouldSetOpener);
    if (!page)
        return nullptr;
    FrameHost* host = &page->frameHost();

    ASSERT(page->mainFrame());
    Frame& frame = *page->mainFrame();

    if (request.frameName() != "_blank")
        frame.tree().setName(request.frameName());
//...

}


首先進入FrameLoader::loader()

D:\cefcode\chromium\src\third_party\WebKit\Source\core\loader\FrameLoader.cpp