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
		Add a link
		
	
		Reference in a new issue