当输入的网页连接传送给
LoadURL
函数之后,还需要处理很多内容,其实这是由类
NavigationController
来管理的,
NavigationController
类主要就是管理加载网页、退回、前进等等控制。
#001
void NavigationController::LoadURL(const GURL& url,
#002
PageTransition::Type transition) {
#003
// The user initiated a load, we don't need to reload anymore.
#004
needs_reload_ = false;
#005
#006
NavigationEntry* entry = CreateNavigationEntry(url, transition);
#007
#008
LoadEntry(entry);
#009
}
这个函数的第一个参数
url
是网络连接地址,第二个参数
transition
是传送的类型。
第
4
行代码里设置不是重新加载。
第
6
行里创建了一个处理网页浏览的入口对象,它是由类
NavigationEntry
管理。
第
8
行里就调用函数
LoadEntry
来加载网页。
LoadEntry
函数更进一步去加载网页的内容,它的代码如下:
#001
void NavigationController::LoadEntry(NavigationEntry* entry) {
#002
// When navigating to a new page, we don't know for sure if we will actually
#003
// end up leaving the current page.
The new page load could for example
#004
// result in a download or a 'no content' response (e.g., a mailto: URL).
#005
#006
// TODO(pkasting): http://b/1113085 Should this use DiscardPendingEntry()?
清除内部变量。
#007
DiscardPendingEntryInternal();
保存当前的入口对象。
#008
pending_entry_ = entry;
通知服务器有一个浏览器对象加入。
#009
NotificationService::current()->Notify(
#010
NOTIFY_NAV_ENTRY_PENDING,
#011
Source<NavigationController>(this),
#012
NotificationService::NoDetails());
下面开始进入加载网页的动作。
#013
NavigateToPendingEntry(false);
#014
}
第
9
行里的类
NotificationService
是使用
OBSERVER
的设计模式来实现一对多的显示关系。这个设计模式也是跟
MVC
与生具来的,显然设计这个浏览器代码的人,已经是对设计模式是专家式的人物了。
第
13
行里调用函数
NavigateToPendingEntry
,下一次再来分析它的功能。