ResourceHandle::create(constResourceReque" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統(tǒng) 2205 0
?

上一次說到需要把顯示的網(wǎng)絡(luò)連接地址變成一個資源的消息發(fā)送出去,它是通過函數(shù) ResourceHandle::create 來實現(xiàn)的,但這個函數(shù)到底是怎么樣實現(xiàn)的呢?現(xiàn)在就分析它的實現(xiàn)代碼,了解它怎么樣把資源變換成消息,并且通過 IPC 機(jī)制把消息發(fā)送到資源下載進(jìn)程去。數(shù) ResourceHandle::create 的代碼如下:

#001 ? PassRefPtr<ResourceHandle> ResourceHandle::create(const ResourceRequest& request,

#002 ??????????????????????????????????????????????????? ResourceHandleClient* client,

#003 ??????????????????????????????????????????????????? Frame* deprecated,

#004 ????????????????????????????????????? ?????????????? bool defersLoading,

#005 ??????????????????????????????????????????????????? bool shouldContentSniff,

#006 ??????????????????????????????????????????????????? bool mightDownloadFromHandle) {

上面的參數(shù) request 是把所有請求網(wǎng)絡(luò)連接地址信息傳進(jìn)來了。

?

#007 ??? RefPtr<ResourceHandle> newHandle(

#008 ??????? new ResourceHandle(request, client, defersLoading, shouldContentSniff,

#009 ?????????????????????????? mightDownloadFromHandle));

這里創(chuàng)建資源類 ResourceHandle 對象,通過它來生成一個消息發(fā)送出去。

?

#010 ?

#011 ??? if (newHandle->start(NULL))

#012 ???? ? return newHandle.release();

上面的代碼里,調(diào)用函數(shù) start 來處理資源請求下載。

?

#013 ?

#014 ??? return NULL;

#015 ? }

?

在這個函數(shù)里調(diào)用 newHandle->start 函數(shù)來處理,其實它是調(diào)用下面的函數(shù)來工作的:

bool ResourceHandle::start(Frame* deprecated) {

? return d->Start(NULL);

}

那么這里的 d 實例是什么呢?可以通過 ResourceHandle 的構(gòu)造函數(shù)來看到它的類,如下:

ResourceHandle::ResourceHandle(const ResourceRequest& request,

?????????????????????????????? ResourceHandleClient* client,

?????????????????????????????? bool defersLoading,

?????????????????????????????? bool shouldContentSniff,

????????????????? ????????????? bool mightDownloadFromHandle)

#pragma warning(suppress: 4355) ? // it's okay to pass |this| here!

????? : d(new ResourceHandleInternal(this, request, client)) {

? // TODO(darin): figure out what to do with the two bool params

} ???????????????

可以看到 d 是類 ResourceHandleInternal 的實例,這就是說調(diào)用 d->Start 函數(shù),其實就是調(diào)用下面的函數(shù):

#001 ? bool ResourceHandleInternal::Start(

#002 ????? ResourceLoaderBridge::SyncLoadResponse* sync_load_response) {

#003 ??? DCHECK(!bridge_.get());

#004 ?

#005 ??? // The WebFrame is the Frame's FrameWinClient

#006 ??? WebFrameImpl* webframe =

#007 ??????? request_.frame() ? WebFrameImpl::FromFrame(request_.frame()) : NULL;

......

#154 ?

#155 ??? if (sync_load_response) {

#156 ????? bridge_->SyncLoad(sync_load_response);

#157 ????? return true;

#158 ??? }

#159 ?

?

通過上面的處理,然后就調(diào)用橋連接成員 bridge_ 來創(chuàng)建消息。

#160 ??? bool rv = bridge_->Start(this);

#161 ??? if (rv) {

#162 ????? pending_ = true;

#163 ????? job_->ref(); ? // to be released when we get a OnCompletedRequest.

#164 ??? } else {

#165 ????? bridge_.reset();

#166 ??? }

#167 ?

#168 ??? return rv;

#169 ? }

在這里使用一個設(shè)計模式,叫橋連接模式。函數(shù) bridge_->Start 的代碼如下:

// Writes a footer on the message and sends it

bool IPCResourceLoaderBridge::Start(Peer* peer) {

? if (request_id_ != -1) {

??? NOTREACHED() << "Starting a request twice";

??? return false;

? }

?

? RESOURCE_LOG("Starting request for " << url_);

?

?

保存當(dāng)前接收的連接端點。

? peer_ = peer;

?

?

生成請求 ID ,以便返回數(shù)據(jù)時可以找到相應(yīng)的顯示進(jìn)程和窗口。

? // generate the request ID, and append it to the message

? request_id_ = dispatcher_->AddPendingRequest(peer_, request_.resource_type,

?????????????????????????????????????????????? request_.mixed_content);

?

?

找到 IPC 的消息發(fā)送對象,然后創(chuàng)建 ViewHostMsg_RequestResource 消息并發(fā)送出去。

? IPC::Message::Sender* sender = dispatcher_->message_sender();

? bool ret = false;

? if (sender)

??? ret = sender->Send(new ViewHostMsg_RequestResource(MSG_ROUTING_NONE,

?????????????????????????????????????????????????????? request_id_,

?????????????????????????????????????????????????????? request_));

? return ret;

}

?

通過上面漫長的分析,總算搞清楚了這個過程:

從界面開始輸入 URL 地址,然后界面把 URL 發(fā)送到渲染進(jìn)程,渲染進(jìn)程再進(jìn)行處理,把這個 URL 連接請求再次發(fā)送到資源下載進(jìn)程去處理。串起來是一個極其簡單的過程,但在這個瀏覽器里比較復(fù)雜的,因為它是多進(jìn)程的瀏覽器,進(jìn)程之間相互消息傳送,就比其它瀏覽器復(fù)雜,并且它還有很多安全策略的使用和優(yōu)化處理,導(dǎo)致這個處理過程是比較復(fù)雜的。

OK ,資源下載請求消息已經(jīng)發(fā)送出去,那么這個消息又往何處而去呢?又怎么樣通過網(wǎng)絡(luò)連接下載回來呢?欲知后事如何,請繼續(xù)看下一篇!

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


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久免费精品视频在线观看 | 好吊妞免费视频 | 色爱激情网 | 亚洲综合亚洲综合网成人 | 亚洲欧洲日产国码天堂 | 国产精品久久久久国产精品三级 | 四虎影视4hu4虎成人 | 日日夜夜天天人人 | 日本不卡高清 | 久久这里只精品国产99热8 | 久久国产三级 | 亚洲第一毛片 | 在线 | 一区二区三区四区 | 国产在线小视频 | 九九视频免费在线 | 综合伊人| 欧美日韩亚洲m码色帝国 | 国产精品久久久久久久9999 | 国产精品福利视频一区二区三区 | 久久久久久久国产高清 | 日韩经典一区 | 国产精品98视频全部国产 | 在线久久| 麻豆精品永久免费视频 | 亚洲欧美一区二区三区在线 | 在线观看视频99 | 婷婷色综合 | 神马影院午夜剧场 | 亚洲成人国产精品 | 欧美综合中文字幕久久 | 国产高清在线精品一区免费97 | 奇米影视在线观看 | 免费看欧美一级特黄a大片一 | 欧美孕妇乱大交xxxxx | 热久久久久久久 | 色综合久久久久久中文网 | 日韩欧美第一区二区三区 | 成人a网站 | 奇米青青草 | 国产玖玖玖精品视频 | 一级特黄aaa大片在线观看 |