欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統(tǒng) 1727 0
?

消息的流通過程,是一個(gè)不同類相互交流的過程,如果不了解這個(gè)過程,根本就不知道這些類是怎么樣相互協(xié)作的。由于上一次說到 ViewHostMsg_RequestResource 消息已經(jīng)發(fā)送出來,它的處理過徎其實(shí)就是一般資源的消息處理過程,下面就來看看這個(gè)消息的處理過程,如下:

1. ?????? base::MessagePumpWin::Run 函數(shù)消息

2. ?????? base::MessagePumpWin::RunWithDispatcher

3. ?????? base::MessagePumpWin::DoRunLoop

4. ?????? base::MessagePumpWin::WaitForWork

5. ?????? base::MessagePumpWin::SignalWatcher

6. ?????? IPC::Channel::OnObjectSignaled 通道的消息處理。

7. ?????? IPC::Channel::ProcessIncomingMessages

8. ?????? IPC::SyncChannel::SyncContext::OnMessageReceived

9. ?????? IPC::ChannelProxy::Context::TryFilters

10. ??? ResourceMessageFilter::OnMessageReceived

11. ??? IPC::MessageWithTuple<Tuple2<int,ViewHostMsg_Resource_Request> >::Dispatch<ResourceMessageFilter,int,ViewHostMsg_Resource_Request const &>

12. ??? ResourceMessageFilter::OnRequestResource

13. ??? ResourceDispatcherHost::BeginRequest

?

消息通過上面 12 個(gè)函數(shù)的流轉(zhuǎn),到達(dá)到處理這個(gè)消息的函數(shù) ResourceDispatcherHost::BeginRequest ,它在里面就會(huì)把消息變成一個(gè)網(wǎng)絡(luò)下載請(qǐng)求,函數(shù)代碼如下:

#001 ? void ResourceDispatcherHost::BeginRequest(

#002 ????? Receiver* receiver,

#003 ????? HANDLE render_process_handle,

#004 ????? int render_process_host_id,

#005 ????? int render_view_id,

#006 ????? int request_id,

#007 ????? const ViewHostMsg_Resource_Request& request_data,

#008 ????? URLRequestContext* request_context,

#009 ????? IPC::Message* sync_result) {

?

是否已經(jīng)傳送完成,或者關(guān)閉。

#010 ??? if (is_shutdown_ ||

#011 ??????? !ShouldServiceRequest(render_process_host_id, request_data)) {

#012 ??? ?? // Tell the renderer that this request was disallowed.

#013 ????? receiver->Send(new ViewMsg_Resource_RequestComplete(

#014 ????????? render_view_id,

#015 ????????? request_id,

#016 ????????? URLRequestStatus(URLRequestStatus::FAILED, net::ERR_ABORTED)));

#017 ????? return;

#018 ??? }

#019 ?

?

保證所有插件已經(jīng)加載。

#020 ??? // Ensure the Chrome plugins are loaded, as they may intercept network

#021 ??? // requests. ? Does nothing if they are already loaded.

#022 ??? // TODO(mpcomplete): This takes 200 ms! ? Investigate parallelizing this by

#023 ??? // starting the load earlier in a BG thread.

#024 ??? plugin_service_->LoadChromePlugins(this);

#025 ?

?

構(gòu)造事件處理器。

#026 ??? // Construct the event handler.

#027 ??? scoped_refptr<EventHandler> handler;

#028 ??? if (sync_result) {

#029 ???? ? handler = new SyncEventHandler(receiver, request_data.url, sync_result);

#030 ??? } else {

#031 ????? handler = new AsyncEventHandler(receiver,

#032 ????????????????????????????????????? render_process_host_id,

#033 ????????????????????????????????????? render_view_id,

#034 ????????????????????????????????????? render_process_handle,

#035 ????????????????????????????????????? request_data.url,

#036 ????????????????????????????????????? this);

#037 ??? }

#038 ?

#039 ??? if (HandleExternalProtocol(request_id, render_process_host_id, render_view_id,

#040 ?????????????????????????????? request_data.url, request_data.resource_type,

#041 ?????????????????????????????? handler)) {

#042 ????? return;

#043 ??? }

#044 ?

?

構(gòu)造下載請(qǐng)求。

#045 ??? // Construct the request.

#046 ??? URLRequest* request = new URLRequest(request_data.url, this);

#047 ??? request->set_method(request_data.method);

#048 ??? request->set_policy_url(request_data.policy_url);

#049 ??? request->set_referrer(request_data.referrer.spec());

#050 ??? request->SetExtraRequestHeaders(request_data.headers);

#051 ??? request->set_load_flags(request_data.load_flags);

#052 ??? request->set_context(request_context);

#053 ??? request->set_origin_pid(request_data.origin_pid);

#054 ?

?

設(shè)置上傳數(shù)據(jù)。

#055 ??? // Set upload data.

#056 ??? uint64 upload_size = 0;

#057 ??? if (!request_data.upload_content.empty()) {

#058 ????? scoped_refptr<net::UploadData> upload = new net::UploadData();

#059 ????? upload->set_elements(request_data.upload_content); ? // Deep copy.

#060 ????? request->set_upload(upload);

#061 ????? upload_size = upload->GetContentLength();

#062 ??? }

#063 ?

?

安裝一個(gè) CrossSiteEventHandler 事件處理器。

#064 ??? // Install a CrossSiteEventHandler if this request is coming from a

#065 ??? // RenderViewHost with a pending cross-site request. ? We only check this for

#066 ??? // MAIN_FRAME requests.

#067 ?? ? // TODO(mpcomplete): remove "render_process_host_id != -1"

#068 ??? // ?????????????????? when http://b/viewIssue?id=1080959 is fixed.

#069 ??? if (request_data.resource_type == ResourceType::MAIN_FRAME &&

#070 ??????? render_process_host_id != -1 &&

#071 ??? ???? Singleton<CrossSiteRequestManager>::get()->

#072 ??????????? HasPendingCrossSiteRequest(render_process_host_id, render_view_id)) {

#073 ????? // Wrap the event handler to be sure the current page's onunload handler

#074 ????? // has a chance to run before we render the new page.

#075 ????? handler = new CrossSiteEventHandler(handler,

#076 ????????????????????????????????????????? render_process_host_id,

#077 ????????????????????????????????????????? render_view_id,

#078 ??????????????????????????????????????? ?? this);

#079 ??? }

#080 ?

#081 ??? if (safe_browsing_->enabled() &&

#082 ??????? safe_browsing_->CanCheckUrl(request_data.url)) {

#083 ????? handler = new SafeBrowsingEventHandler(handler,

#084 ???????????????????????????????????????????? render_process_host_id,

#085 ???????????????????????????????????????????? render_view_id,

#086 ???????????????????????????????????????????? request_data.url,

#087 ???????????????????????????????????????????? request_data.resource_type,

#088 ??????????????????????????????????????? ????? safe_browsing_,

#089 ???????????????????????????????????????????? this);

#090 ??? }

#091 ?

?

創(chuàng)建一個(gè)緩沖區(qū)處理。

#092 ??? // Insert a buffered event handler before the actual one.

#093 ??? handler = new BufferedEventHandler(handler, this, request);

#094 ?

#095 ??? // Make extra info and read footer (contains request ID).

#096 ??? ExtraRequestInfo* extra_info =

#097 ??????? new ExtraRequestInfo(handler,

#098 ???????????????????????????? request_id,

#099 ???????????????????????????? render_process_host_id,

#100 ??????????????????????? ????? render_view_id,

#101 ???????????????????????????? request_data.mixed_content,

#102 ???????????????????????????? request_data.resource_type,

#103 ???????????????????????????? upload_size);

#104 ??? extra_info->allow_download =

#105 ??????? ResourceType::IsFrame(request_data.resource_type);

#106 ??? request->set_user_data(extra_info); ? // takes pointer ownership

#107 ?

?

開始調(diào)用內(nèi)部處理請(qǐng)求函數(shù)。

#108 ??? BeginRequestInternal(request, request_data.mixed_content);

#109 ? }

?

通過上面的分析,已經(jīng)知道消息轉(zhuǎn)換為一個(gè)請(qǐng)求任務(wù) URLRequest ,這個(gè)任務(wù)就需要交給后面的工作進(jìn)程來處理了,它是通過函數(shù) BeginRequestInternal 來把任務(wù)進(jìn)一步發(fā)送出去。

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


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

主站蜘蛛池模板: 免费综合网 | 亚洲日本中文 | 狠狠躁夜夜躁人人爽天天高潮 | 中文精品在线 | 亚洲色片网站 | 欧美日韩亚洲区久久综合 | 久草成人网| 中文字幕在亚洲第一在线 | 四虎天海翼 | 久久不色| 性夜影院爽黄e爽在线观看 苏晓晖个人简介军衔 | 一级视频在线 | 久久亚洲欧美日韩精品专区 | 亚洲AV在线无码播放毛片浪潮 | 亚洲一区美女 | 国产精品国色综合久久 | 起视碰碰97摸摸碰碰视频 | 久久这里只有精品9 | 久久精品一区 | 亚洲国产精品久久久久秋霞蜜臀 | 狠狠躁日日躁夜夜躁A片小说按摩 | 一区二区在线不卡 | 中文字幕在线一区二区三区 | 亚洲欧美日韩在线不卡 | 国产亚洲欧美日本一二三本道 | 免费精品久久久久久中文字幕 | 91视频视频| 久久久视频在线 | 国产睡熟迷奷系列网站 | 欧美日韩在线视频一区 | 日日摸夜夜添夜夜添破第一 | 欧美日韩国产综合网 | 国产高清区 | 96精品专区国产在线观看高清 | 国产美女福利视频福利 | 精品日韩欧美一区二区三区在线播放 | 黑人狂躁日本妞无码A片 | 欧美精品欧美极品欧美激情 | 天堂va在线高清一区 | 天天操天天摸天天爽 | 国产精品九九久久一区hh |