#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函数是怎么样通过连接来重新加载,还是打开一个新网页。