谷歌浏览器的源码分析(26)

系统 1504 0
 

消息的流通过程,是一个不同类相互交流的过程,如果不了解这个过程,根本就不知道这些类是怎么样相互协作的。由于上一次说到 ViewHostMsg_RequestResource 消息已经发送出来,它的处理过徎其实就是一般资源的消息处理过程,下面就来看看这个消息的处理过程,如下:

1.        base::MessagePumpWin::Run 函数消息

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 个函数的流转,到达到处理这个消息的函数 ResourceDispatcherHost::BeginRequest ,它在里面就会把消息变成一个网络下载请求,函数代码如下:

#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) {

 

是否已经传送完成,或者关闭。

#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  

 

保证所有插件已经加载。

#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  

 

构造事件处理器。

#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  

 

构造下载请求。

#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  

 

设置上传数据。

#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  

 

安装一个 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  

 

创建一个缓冲区处理。

#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  

 

开始调用内部处理请求函数。

#108     BeginRequestInternal(request, request_data.mixed_content);

#109   }

 

通过上面的分析,已经知道消息转换为一个请求任务 URLRequest ,这个任务就需要交给后面的工作进程来处理了,它是通过函数 BeginRequestInternal 来把任务进一步发送出去。

谷歌浏览器的源码分析(26)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论