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

系统 1448 0
当我们根据自动提示,或者完全自己输入连接后,再按下回车键,这时浏览器就会去打开网页,或者去查找内容。那么浏览器是怎么样实现这些功能的呢?又是怎么判断去打开网页,还是去打开 GOOGLE 的搜索引擎的呢?下面就来分析这部份的代码,如下:

#001   bool AutocompleteEdit::OnKeyDownOnlyWritable(TCHAR key,

#002                                                UINT repeat_count,

#003                                                UINT flags) {

#004     // NOTE: Annoyingly, ctrl-alt-<key> generates WM_KEYDOWN rather than

#005     // WM_SYSKEYDOWN, so we need to check (flags & KF_ALTDOWN) in various places

#006     // in this function even with a WM_SYSKEYDOWN handler.

#007  

#008     int count = repeat_count;

#009     switch (key) {

#010       case VK_RETURN:

#011         AcceptInput((flags & KF_ALTDOWN) ? NEW_FOREGROUND_TAB : CURRENT_TAB,

#012                     false);

#013         return true;

#014  

#015       case VK_UP:

#016         count = -count;

#017         // FALL THROUGH

#018        case VK_DOWN:

 

当用户按下回车键,就会调用上面的函数 OnKeyDownOnlyWritable ,并且在 VK_RETURN 按键处理回车的事件,接着就是调用函数 AcceptInput 来处理。

这个函数的代码如下:

#001   void AutocompleteEdit::AcceptInput(WindowOpenDisposition disposition,

#002                                      bool for_drop) {

#003     // Get the URL and transition type for the selected entry.

#004     PageTransition::Type transition;

#005     bool is_history_what_you_typed_match;

#006     std::wstring alternate_nav_url;

 

保存当前获取的 URL 连接串。

#007     const std::wstring url(GetURLForCurrentText(&transition,

#008                                                 &is_history_what_you_typed_match,

#009                                                 &alternate_nav_url));

#010     if (url.empty())

#011       return;

#012  

 

 

判断是否重新加载当前的网页。

#013     if (url == permanent_text_) {

#014        // When the user hit enter on the existing permanent URL, treat it like a

#015       // reload for scoring purposes.   We could detect this by just checking

#016       // user_input_in_progress_, but it seems better to treat "edits" that end

#017       // up leaving the URL unchanged (e.g. deleting the last character and then

#018       // retyping it) as reloads too.

#019       transition = PageTransition::RELOAD;

#020     } else if (for_drop || ((paste_state_ != NONE) &&

#021                             is_history_what_you_typed_match)) {

 

下面是打开一个新的连接。

#022       // When the user pasted in a URL and hit enter, score it like a link click

#023       // rather than a normal typed URL, so it doesn't get inline autocompleted

#024       // as aggressively later.

#025       transition = PageTransition::LINK;

#026     }

#027  

 

这里是调用 OpenURL 函数打开这个连接的内容。

#028     OpenURL(url, disposition, transition, alternate_nav_url,

#029             AutocompletePopupModel::kNoMatch,

#030             is_keyword_hint_ ? std::wstring() : keyword_);

#031   }

 

这段代码的流程很清楚,就是先通过判断按键输入,是否按下回车键,如果是回车键就调用函数 AcceptInput 处理,然后在这个函数就判断这个连接是否已经打开了,如果已经打开,只需要重新加载就行了,如果不是当前的,就是打开一个新的连接。下一次再来分析 OpenURL 函数是怎么样通过连接来重新加载,还是打开一个新网页。

 

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


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

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

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

【本文对您有帮助就好】

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

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