日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

谷歌瀏覽器的源碼分析(18)

系統(tǒng) 2970 0
?

現(xiàn)在繼續(xù)分析瀏覽器去下載網(wǎng)頁的過程,上一次說到需要分析函數(shù) NavigateToPendingEntry ,在這個函數(shù)又是怎么去處理下載網(wǎng)頁的呢?那就需要分析它的源碼了,如下:

#001 ? void NavigationController::NavigateToPendingEntry(bool reload) {

#002 ??? TabContents* from_contents = active_contents_;

#003 ?

#004 ??? // For session history navigations only the pending_entry_index_ is set.

?

下面從歷史里找到入口選項(xiàng)。

#005 ??? if (!pending_entry_) {

#006 ????? DCHECK(pending_entry_index_ != -1);

#007 ????? pending_entry_ = entries_[pending_entry_index_].get();

#008 ??? }

#009 ?

?

復(fù)位當(dāng)前的 SSL 狀態(tài)。

#010 ??? // Reset the security states as any SSL error may have been resolved since we

#011 ??? // last visited that page.

#012 ??? pending_entry_->ssl() = NavigationEntry::SSLStatus();

#013 ?

?

設(shè)置內(nèi)容是否可以顯示。

#014 ??? if (from_contents && from_contents->type() != pending_entry_->tab_type())

#015 ????? from_contents->SetActive(false);

#016 ?

?

獲取當(dāng)前的父窗口的句柄。

#017 ??? HWND parent =

#018 ???? ??? from_contents ? GetParent(from_contents->GetContainerHWND()) : 0;

?

獲取當(dāng)前顯示的 TAB 內(nèi)容對象。

#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 ?

?

現(xiàn)在開始打開入口對象里指定的網(wǎng)站。

#030 ??? if (!contents->Navigate(*pending_entry_, reload))

#031 ????? DiscardPendingEntry();

#032 ? }

?

TabContents 類主要描述主顯示區(qū)的內(nèi)容,在第 30 行里就調(diào)用它的函數(shù) Navigate 去瀏覽網(wǎng)頁的內(nèi)容。 pending_entry_ 成員變量是 NavigationEntry 類的對象,它主要保存所有創(chuàng)建瀏覽時需要的信息,比如網(wǎng)絡(luò)連接地址。

?

當(dāng)我再跟蹤 contents->Navigate 這行代碼時,它不是運(yùn)行 TabContents 類的 Navigate ,這比較奇怪,但回過頭來再看一下它的聲明如下:

virtual bool Navigate(const NavigationEntry& entry, bool reload);

可見,它前面加了 virtual 關(guān)鍵字,說明它是虛函數(shù),也就是說設(shè)計(jì)時,就讓它是多態(tài)的出現(xiàn),因此在什么情況下運(yùn)行什么樣的函數(shù)內(nèi)容是不定的,對于這些樣的函數(shù),就需要小心一點(diǎn)了,只有實(shí)際運(yùn)行的類才知道它是什么內(nèi)容。由于我是輸入 URL 關(guān)鍵字,所以它調(diào)用的函數(shù)是類 WebContents 里的 Navigate 函數(shù)。下一次再來分析類 WebContents 里的 Navigate 函數(shù)。

谷歌瀏覽器的源碼分析(18)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 西峡县| 革吉县| 拉孜县| 达日县| 焦作市| 恩施市| 武夷山市| 漯河市| 靖西县| 华安县| 杭锦旗| 宕昌县| 钦州市| 锡林郭勒盟| 尼木县| 新竹市| 广东省| 文山县| 乌拉特前旗| 昌江| 海安县| 遂宁市| 崇信县| 长丰县| 中方县| 离岛区| 东台市| 江都市| 杭锦旗| 囊谦县| 电白县| 福泉市| 天全县| 曲麻莱县| 三穗县| 封丘县| 交城县| 柯坪县| 胶南市| 沙雅县| 淮北市|