OnAutocompleteAccept里,可以看到調用函數OnAutocompleteAccept,它的代碼如下:#001voidLocationBarView::OnAutocompleteAccept(#002conststd::wstring&url,#003WindowOpenDi" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

谷歌瀏覽器的源碼分析(14)

系統 2196 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條評論
主站蜘蛛池模板: 欧美色老太婆 | 久久综合激情 | 亚洲欧洲国产成人综合一本 | 一区二区在线 | 成年毛片 | 久久不卡一区二区三区 | 日本爽快片100色毛片 | 国产精品日本一区二区不卡视频 | 亚洲综合在线观看视频 | 亚洲欧洲日本在线观看 | 俄罗斯毛片视频 | 999人在线精品播放视频 | 一本色道久久爱88av俺来也 | 九天玄帝诀在线观看 | 欧美三级在线观看不卡视频 | 国产成人久久久精品一区二区三区 | 久久免费精品视频在线观看 | 五月花在线观看播放视频 | 一区二区3区免费视频 | 在线日韩欧美 | 伊人久久成人 | 国产一级做a爱免费视频 | 亚洲综合图片 | 久久精品免视看国产盗摄 | 国产精品久久国产精品99 | 国产精品v免费视频 | 久久成人国产精品免费 | 国产精品女在线观看 | 成人另类视频 | 国产亚洲第一伦理第一区 | 久久五月天综合网 | 亚洲国产成人成上人色 | 国产一级视频播放 | 日本在线 | 中文 | 四虎影院com | 久久久久久在线 | 天堂亚洲国产日韩在线看 | 国产亚洲欧美日韩综合综合二区 | 免费在线观看h片 | 国产成年视频 | 亚洲一区二区三区精品国产 |