上一次说到调用函数
OpenURL
来打开网络连接,这仅是网络浏览的开始,现在再来分析它怎么样去下载网页数据,然后再显示出来。
#001
void AutocompleteEdit::OpenURL(const std::wstring& url,
#002
WindowOpenDisposition disposition,
#003
PageTransition::Type transition,
#004
const std::wstring& alternate_nav_url,
#005
size_t selected_line,
#006
const std::wstring& keyword) {
#007
if (url.empty())
#008
return;
#009
#010
ScopedFreeze freeze(this, GetTextObjectModel());
#011
SendOpenNotification(selected_line, keyword);
#012
#013
if (disposition != NEW_BACKGROUND_TAB)
#014
RevertAll();
// Revert the box to its unedited state
#015
controller_->OnAutocompleteAccept(url, disposition, transition,
#016
alternate_nav_url);
#017
}
在这个函数里第一个参数
url
是要打开的网络连接;第二个参数
disposition
是显示位置,比如新添加一个
TAB
显示,还是在原来的
TAB
显示;第三个参数
transition
是下载的类型,比如是重新加载,还是新的连接下载;第四个参数
alternate_nav_url
是候选的连接;第五个参数是选择那一行提示菜单;第六个参数
keyword
是关键字。
第
7
行判断打开的连接是否为空,如果为空就不用打开连接了。
第
10
行锁定输入框。
第
11
行通知选中的关键字。
第
13
行,
14
行关闭当前输入提示,直接在当前窗口显示,清除一些状态和内容。
第
15
行调控制实例来打开输入的连接。
上面的代码在
AutocompleteEdit
类里处理完成了,然后就把打开网络连接放到别的类里来执行,这样可以提高代码的复用性,降低了代码复杂程度。那么这个
controller_
是何方神圣呢?一看
AutocompleteEdit
类有
Controller
类的定义,肯定就是它了,但再仔细一看它,它只是一个接口类,所有函数都是纯虚函数,真是百思不得其解时,突然想起,既然它是接口类,肯定就有其它类继承它的,那么再通过搜索,一查看,果然找到一个继承它的类
LocationBarView
,接着查看它的声明,如下:
#001
/////////////////////////////////////////////////////////////////////////////
#002
//
#003
// LocationBarView class
#004
//
#005
//
The LocationBarView class is a View subclass that paints the background
#006
//
of the URL bar strip and contains its content.
#007
//
#008
/////////////////////////////////////////////////////////////////////////////
#009
class LocationBarView : public ChromeViews::View,
#010
public AutocompleteEdit::Controller {
#011
public:
可见类
LocationBarView
是继承
ChromeViews::View
类,并且继承
AutocompleteEdit::Controller
类。说明它是一个窗口类,并且是控制类,那么就是说所有接口的功能都是在这个类里实现的,只需要分析这个类里的内容,就知道它是怎么样打开连接的了,下一次再来分析它。