cef瀏覽器 url載入內部詳解
阿新 • • 發佈:2018-12-25
首先先說明環境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 函式裡面。然後進入下一個檔案
D:\cefcode\chromium\src\third_party\WebKit\Source\core\page\CreateWindow.cpp line 174void createWindowForRequest(const FrameLoadRequest& request, LocalFrame& openerFrame, NavigationPolicy policy, ShouldSendReferrer shouldSendReferrer, ShouldSetOpener shouldSetOpener) { //... Frame* newFrame = createWindow(openerFrame, openerFrame, request, features, policy, shouldSetOpener, created); //... }
然後進入了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