From 90acb22a58e992c6dd2dc3db1bbcc28525089ecc Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Sun, 10 Dec 2017 17:29:50 +0530 Subject: [PATCH] dont use UI methods on IO thread --- atom/browser/net/atom_network_delegate.cc | 43 ++++++++++++++++------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/atom/browser/net/atom_network_delegate.cc b/atom/browser/net/atom_network_delegate.cc index 5a76d966d6fd..1306ae59a683 100644 --- a/atom/browser/net/atom_network_delegate.cc +++ b/atom/browser/net/atom_network_delegate.cc @@ -41,20 +41,38 @@ const char* ResourceTypeToString(content::ResourceType type) { } } +int32_t GetWebContentsID(int process_id, int frame_id) { + auto* webContents = content::WebContents::FromRenderFrameHost( + content::RenderFrameHost::FromID(process_id, frame_id)); + return atom::api::WebContents::GetIDFromWrappedClass(webContents); +} + namespace { using ResponseHeadersContainer = std::pair*, const std::string&>; void RunSimpleListener(const AtomNetworkDelegate::SimpleListener& listener, - std::unique_ptr details) { + std::unique_ptr details, + int render_process_id, + int render_frame_id) { + int32_t id = GetWebContentsID(render_process_id, render_frame_id); + // id must be greater than zero + if (id) + details->SetInteger("webContentsId", id); return listener.Run(*(details.get())); } void RunResponseListener( const AtomNetworkDelegate::ResponseListener& listener, std::unique_ptr details, + int render_process_id, + int render_frame_id, const AtomNetworkDelegate::ResponseCallback& callback) { + int32_t id = GetWebContentsID(render_process_id, render_frame_id); + // id must be greater than zero + if (id) + details->SetInteger("webContentsId", id); return listener.Run(*(details.get()), callback); } @@ -78,16 +96,6 @@ void ToDictionary(base::DictionaryValue* details, net::URLRequest* request) { details->SetDouble("timestamp", base::Time::Now().ToDoubleT() * 1000); const auto* info = content::ResourceRequestInfo::ForRequest(request); if (info) { - int process_id = info->GetChildID(); - int frame_id = info->GetRenderFrameID(); - auto* webContents = content::WebContents::FromRenderFrameHost( - content::RenderFrameHost::FromID(process_id, frame_id)); - int webContentsId = atom::api::WebContents::GetIDFromWrappedClass( - webContents); - - // webContentsId must be greater than zero - if (webContentsId) - details->SetInteger("webContentsId", webContentsId); details->SetString("resourceType", ResourceTypeToString(info->GetResourceType())); } else { @@ -382,6 +390,10 @@ int AtomNetworkDelegate::HandleResponseEvent( std::unique_ptr details(new base::DictionaryValue); FillDetailsObject(details.get(), request, args...); + int render_process_id, render_frame_id; + content::ResourceRequestInfo::GetRenderFrameForRequest( + request, &render_process_id, &render_frame_id); + // The |request| could be destroyed before the |callback| is called. callbacks_[request->identifier()] = callback; @@ -391,7 +403,7 @@ int AtomNetworkDelegate::HandleResponseEvent( BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(RunResponseListener, info.listener, base::Passed(&details), - response)); + render_process_id, render_frame_id, response)); return net::ERR_IO_PENDING; } @@ -405,9 +417,14 @@ void AtomNetworkDelegate::HandleSimpleEvent( std::unique_ptr details(new base::DictionaryValue); FillDetailsObject(details.get(), request, args...); + int render_process_id, render_frame_id; + content::ResourceRequestInfo::GetRenderFrameForRequest( + request, &render_process_id, &render_frame_id); + BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, - base::Bind(RunSimpleListener, info.listener, base::Passed(&details))); + base::Bind(RunSimpleListener, info.listener, base::Passed(&details), + render_process_id, render_frame_id)); } template