現在繼續分析瀏覽器去下載網頁的過程,上一次說到需要分析函數
NavigateToPendingEntry
,在這個函數又是怎么去處理下載網頁的呢?那就需要分析它的源碼了,如下:
#001
?
void NavigationController::NavigateToPendingEntry(bool reload) {
#002
???
TabContents* from_contents = active_contents_;
#003
?
#004
???
// For session history navigations only the pending_entry_index_ is set.
下面從歷史里找到入口選項。
#005
???
if (!pending_entry_) {
#006
?????
DCHECK(pending_entry_index_ != -1);
#007
?????
pending_entry_ = entries_[pending_entry_index_].get();
#008
???
}
#009
?
復位當前的
SSL
狀態。
#010
???
// Reset the security states as any SSL error may have been resolved since we
#011
???
// last visited that page.
#012
???
pending_entry_->ssl() = NavigationEntry::SSLStatus();
#013
?
設置內容是否可以顯示。
#014
???
if (from_contents && from_contents->type() != pending_entry_->tab_type())
#015
?????
from_contents->SetActive(false);
#016
?
獲取當前的父窗口的句柄。
#017
???
HWND parent =
#018
????
???
from_contents ? GetParent(from_contents->GetContainerHWND()) : 0;
獲取當前顯示的
TAB
內容對象。
#019
???
TabContents* contents =
#020
???????
GetTabContentsCreateIfNecessary(parent, *pending_entry_);
#021
?
#022
???
contents->SetActive(true);
#023
???
active_contents_ = contents;
#024
?
修改委托對象。
#025
???
if (from_contents && from_contents != contents) {
#026
?????
if (from_contents->delegate())
#027
???????
from_contents->delegate()->ReplaceContents(from_contents, contents);
#028
???
}
#029
?
現在開始打開入口對象里指定的網站。
#030
???
if (!contents->Navigate(*pending_entry_, reload))
#031
?????
DiscardPendingEntry();
#032
?
}
TabContents
類主要描述主顯示區的內容,在第
30
行里就調用它的函數
Navigate
去瀏覽網頁的內容。
pending_entry_
成員變量是
NavigationEntry
類的對象,它主要保存所有創建瀏覽時需要的信息,比如網絡連接地址。
當我再跟蹤
contents->Navigate
這行代碼時,它不是運行
TabContents
類的
Navigate
,這比較奇怪,但回過頭來再看一下它的聲明如下:
virtual bool Navigate(const NavigationEntry& entry, bool reload);
可見,它前面加了
virtual
關鍵字,說明它是虛函數,也就是說設計時,就讓它是多態的出現,因此在什么情況下運行什么樣的函數內容是不定的,對于這些樣的函數,就需要小心一點了,只有實際運行的類才知道它是什么內容。由于我是輸入
URL
關鍵字,所以它調用的函數是類
WebContents
里的
Navigate
函數。下一次再來分析類
WebContents
里的
Navigate
函數。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
