谷歌浏览器的源码分析(18)

系统 2087 0
 

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

谷歌浏览器的源码分析(18)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论