1. 程式人生 > >谷歌瀏覽器的原始碼分析 12

谷歌瀏覽器的原始碼分析 12

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                當我們根據自動提示,或者完全自己輸入連線後,再按下回車鍵,這時瀏覽器就會去開啟網頁,或者去查詢內容。那麼瀏覽器是怎麼樣實現這些功能的呢?又是怎麼判斷去開啟網頁,還是去開啟GOOGLE的搜尋引擎的呢?下面就來分析這部份的程式碼,如下:

#001  boolAutocompleteEdit::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 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函式是怎麼樣通過連線來重新載入,還是開啟一個新網頁。

 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述