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

系统 1710 0
 

上一次说到控制类的派生类 LocationBarView ,现在就来分析这个函数的功能,看看它又把 URL 连接传到那里去,立即就去看代码,在这行代码 controller_->OnAutocompleteAccept 里,可以看到调用函数 OnAutocompleteAccept, 它的代码如下:

#001   void LocationBarView::OnAutocompleteAccept(

#002       const std::wstring& url,

#003       WindowOpenDisposition disposition,

#004       PageTransition::Type transition,

#005       const std::wstring& alternate_nav_url) {

 

判断输入的 URL 连接是否为空。

#006     if (url.empty())

#007       return;

#008  

 

保存相应的参数。

#009     location_input_ = url;

#010     disposition_ = disposition;

#011     transition_ = transition;

#012  

 

调用控制器 controller_ 来打开这个连接。

#013     if (controller_) {

#014       if (alternate_nav_url.empty()) {

#015         controller_->ExecuteCommand(IDC_OPENURL);

#016         return;

#017       }

#018  

 

打开候选的连接。

#019       scoped_ptr<AlternateNavURLFetcher> fetcher(

#020           new AlternateNavURLFetcher(alternate_nav_url));

#021       // The AlternateNavURLFetcher will listen for the pending navigation

#022       // notification that will be issued as a result of the "open URL." It

#023       // will automatically install itself into that navigation controller.

#024       controller_->ExecuteCommand(IDC_OPENURL);

#025       if (fetcher->state() == AlternateNavURLFetcher::NOT_STARTED) {

#026         // I'm not sure this should be reachable, but I'm not also sure enough

#027         // that it shouldn't to stick in a NOTREACHED().   In any case, this is

#028         // harmless; we can simply let the fetcher get deleted here and it will

#029         // clean itself up properly.

#030       } else {

#031         fetcher.release();   // The navigation controller will delete the fetcher.

#032       }

#033     }

#034   }

 

上面的代码主要保存传入来的参数,然后紧接着又调用了控制器 controller_ 的函数 ExecuteCommand 来执行命令,这个命令是 IDC_OPENURL 。为什么要使用命令的方式呢?仔细地思考一下,原来这种方式是便于使用自动化测试,测试时可以自动使用程序来不断传入命令来执行。

 

我们再来分析这行代码:

controller_->ExecuteCommand(IDC_OPENURL)

controller_ 是类 CommandController 的实例,它主要是由 MVC 设计模式的控制类,可见这里可以学习怎么样把 MVC 设计模式应用到实际例子里,使用这种模式主要是分离面渲染、逻辑控制和不同的数据来源,这样方便维护代码。

 

其实所有的命令并不是 CommandController 来处理,它只是一个中传站,把命令发往不同的浏览器对象,如下面的代码:

#001   void CommandController::ExecuteCommand(int id) {

#002     if (IsCommandEnabled(id))

#003       handler_->ExecuteCommand(id);

#004   }

 

这样就把命令发送到 handler_ 处理了,而这里的 handler_ 是什么呢?其实它就是浏览器对象类 Browser 的实例,因此命令就是发送给浏览器对象来处理,它是怎么样处理命令的呢?下一次再来分析。

 

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


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

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

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

【本文对您有帮助就好】

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

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