谷歌瀏覽器的原始碼分析 12
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
當我們根據自動提示,或者完全自己輸入連線後,再按下回車鍵,這時瀏覽器就會去開啟網頁,或者去查詢內容。那麼瀏覽器是怎麼樣實現這些功能的呢?又是怎麼判斷去開啟網頁,還是去開啟GOOGLE的搜尋引擎的呢?下面就來分析這部份的程式碼,如下:#001 boolAutocompleteEdit::OnKeyDownOnlyWritable(TCHAR key,
#002
#003
#004 // NOTE: Annoyingly,ctrl-alt-<key> generates WM_KEYDOWN rather than
#005 // WM_SYSKEYDOWN, so weneed to check (flags & KF_ALTDOWN) in various places
#006 // in this function evenwith 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 voidAutocompleteEdit::AcceptInput(WindowOpenDisposition disposition,
#002 bool for_drop) {
#003 // Get the URL andtransition type for the selected entry.
#004 PageTransition::Typetransition;
#005 boolis_history_what_you_typed_match;
#006 std::wstringalternate_nav_url;
儲存當前獲取的URL連線串。
#007 const std::wstringurl(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 existingpermanent URL, treat it like a
#015 // reload for scoringpurposes. We could detect this by justchecking
#016 //user_input_in_progress_, but it seems better to treat "edits" thatend
#017 // up leaving the URLunchanged (e.g. deleting the last character and then
#018 // retyping it) asreloads too.
#019 transition =PageTransition::RELOAD;
#020 } else if (for_drop ||((paste_state_ != NONE) &&
#021 is_history_what_you_typed_match)) {
下面是開啟一個新的連線。
#022 // When the user pastedin a URL and hit enter, score it like a link click
#023 // rather than a normaltyped URL, so it doesn't get inline autocompleted
#024 // as aggressivelylater.
#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函式是怎麼樣通過連線來重新載入,還是開啟一個新網頁。