dont use UI methods on IO thread
This commit is contained in:
parent
a518c5c3c4
commit
90acb22a58
1 changed files with 30 additions and 13 deletions
|
@ -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>
|
||||||
|
|
Loading…
Add table
Reference in a new issue