现在继续分析浏览器去下载网页的过程,上一次说到需要分析函数
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
函数。