1. 程式人生 > >谷歌瀏覽器的源碼分析 26

谷歌瀏覽器的源碼分析 26

ext received before earlier use filter ase sss color

消息的流通過程,是一個不同類相互交流的過程,如果不了解這個過程,根本就不知道這些類是怎麽樣相互協作的。由於上一次說到ViewHostMsg_RequestResource消息已經發送出來,它的處理過徎其實就是一般資源的消息處理過程,下面就來看看這個消息的處理過程,如下:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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來把任務進一步發送出去。

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

谷歌瀏覽器的源碼分析 26