GOOGLE瀏覽器CHROME的網頁抓取原理

處理網頁下載
入口函數NavigateToPendingEntry:
#001 void NavigationController::NavigateToPendingEntry(boolreload) {
#002 TabContents* from_contents = active_contents_;
#003
#004 // For session history navigations onlythe pending_entry_index_ is set.

下面從歷史裏找到入口選項。
#005 if (!pending_entry_) {
#006 DCHECK(pending_entry_index_ != -1);
#007 pending_entry_ = entries_[pending_entry_index_].get();
#008 }
#009


復位當前的SSL狀態。
#010 // Reset the security states as any SSLerror may have been resolved since we
#011 // last visited that page.
#012 pending_entry_->ssl() = NavigationEntry::SSLStatus();
#013


設置內容是否可以顯示。
#014 if (from_contents && from_contents->type()!= pending_entry_->tab_type())
#015 from_contents->SetActive(false);
#016


獲取當前的父窗口的句柄。
#017 HWND parent =
#018 from_contents ? GetParent(from_contents->GetContainerHWND()): 0;


獲取當前顯示的TAB內容對象。
#019 TabContents* contents =
#020 GetTabContentsCreateIfNecessary(parent,*pending_entry_);
#021
#022 contents->SetActive(true);
#023 active_contents_ = contents;
#024


修改委託對象。
#025 if (from_contents && from_contents!= contents) {
#026 if (from_contents->delegate())
#027 from_contents->delegate()->ReplaceContents(from_contents,contents);
#028 }
#029


現在開始打開入口對象裏指定的網站。
#030 if (!contents->Navigate(*pending_entry_,reload))
#031 DiscardPendingEntry();
#032 }

TabContents類主要描述主顯示區的內容,在第30行裏就調用它的函數Navigate去瀏覽網頁的內容。pending_entry_成員變量是NavigationEntry類的對象,它主要保存所有創建瀏覽時需要的信息,比如網絡連接地址。

當我再跟蹤contents->Navigate這行代碼時,它不是運行TabContents類的Navigate,這比較奇怪,但回過頭來再看一下它的聲明如下:
virtual bool Navigate(constNavigationEntry& entry, bool reload);
可見,它前面加了virtual關鍵字,說明它是虛函數,也就是說設計時,就讓它是多態的出現,因此在什麼情況下運行什麼樣的函數內容是不定的,對於這些樣的函數,就需要小心一點了,只有實際運行的類才知道它是什麼內容。由於我是輸入URL關鍵字,所以它調用的函數是類WebContents裏的Navigate函數。下一次再來分析類WebContents裏的Navigate函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章