dont use UI methods on IO thread

This commit is contained in:
deepak1556 2017-12-10 17:29:50 +05:30 committed by Cheng Zhao
parent a518c5c3c4
commit 90acb22a58

View file

@ -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 { namespace {
using ResponseHeadersContainer = using ResponseHeadersContainer =
std::pair<scoped_refptr<net::HttpResponseHeaders>*, const std::string&>; std::pair<scoped_refptr<net::HttpResponseHeaders>*, const std::string&>;
void RunSimpleListener(const AtomNetworkDelegate::SimpleListener& listener, void RunSimpleListener(const AtomNetworkDelegate::SimpleListener& listener,
std::unique_ptr<base::DictionaryValue> details) { std::unique_ptr<base::DictionaryValue> 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())); return listener.Run(*(details.get()));
} }
void RunResponseListener( void RunResponseListener(
const AtomNetworkDelegate::ResponseListener& listener, const AtomNetworkDelegate::ResponseListener& listener,
std::unique_ptr<base::DictionaryValue> details, std::unique_ptr<base::DictionaryValue> details,
int render_process_id,
int render_frame_id,
const AtomNetworkDelegate::ResponseCallback& callback) { 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); 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); details->SetDouble("timestamp", base::Time::Now().ToDoubleT() * 1000);
const auto* info = content::ResourceRequestInfo::ForRequest(request); const auto* info = content::ResourceRequestInfo::ForRequest(request);
if (info) { 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", details->SetString("resourceType",
ResourceTypeToString(info->GetResourceType())); ResourceTypeToString(info->GetResourceType()));
} else { } else {
@ -382,6 +390,10 @@ int AtomNetworkDelegate::HandleResponseEvent(
std::unique_ptr<base::DictionaryValue> details(new base::DictionaryValue); std::unique_ptr<base::DictionaryValue> details(new base::DictionaryValue);
FillDetailsObject(details.get(), request, args...); 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. // The |request| could be destroyed before the |callback| is called.
callbacks_[request->identifier()] = callback; callbacks_[request->identifier()] = callback;
@ -391,7 +403,7 @@ int AtomNetworkDelegate::HandleResponseEvent(
BrowserThread::PostTask( BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE, BrowserThread::UI, FROM_HERE,
base::Bind(RunResponseListener, info.listener, base::Passed(&details), base::Bind(RunResponseListener, info.listener, base::Passed(&details),
response)); render_process_id, render_frame_id, response));
return net::ERR_IO_PENDING; return net::ERR_IO_PENDING;
} }
@ -405,9 +417,14 @@ void AtomNetworkDelegate::HandleSimpleEvent(
std::unique_ptr<base::DictionaryValue> details(new base::DictionaryValue); std::unique_ptr<base::DictionaryValue> details(new base::DictionaryValue);
FillDetailsObject(details.get(), request, args...); 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::PostTask(
BrowserThread::UI, FROM_HERE, 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<typename T> template<typename T>