Chromium Code Reviews| Index: net/proxy/proxy_resolver_mojo.cc |
| diff --git a/net/proxy/proxy_resolver_mojo.cc b/net/proxy/proxy_resolver_mojo.cc |
| index 3801d41a093cb723ab7f21b87f3326ca48ed3f0a..6e12a43d317d21629e435673100ad4a1887e81be 100644 |
| --- a/net/proxy/proxy_resolver_mojo.cc |
| +++ b/net/proxy/proxy_resolver_mojo.cc |
| @@ -100,9 +100,10 @@ void ProxyResolverMojo::Job::ReportResult( |
| DVLOG(1) << "Servers: " << results_->ToPacString(); |
| } |
| - callback_.Run(error); |
| + CompletionCallback callback = callback_; |
| callback_.Reset(); |
| resolver_->RemoveJob(this); |
| + callback.Run(error); |
| } |
| void ProxyResolverMojo::Job::LoadStateChanged(int32_t load_state) { |
| @@ -114,7 +115,8 @@ ProxyResolverMojo::ProxyResolverMojo( |
| HostResolver* host_resolver) |
| : ProxyResolver(true /* |expects_pac_bytes| */), |
| mojo_proxy_resolver_factory_(mojo_proxy_resolver_factory), |
| - host_resolver_(host_resolver) { |
| + host_resolver_(host_resolver), |
| + weak_factory_(this) { |
| } |
| ProxyResolverMojo::~ProxyResolverMojo() { |
| @@ -163,8 +165,11 @@ void ProxyResolverMojo::OnSetPacScriptDone( |
| DCHECK(!set_pac_script_callback_.IsCancelled()); |
| DVLOG(1) << "ProxyResolverMojo::OnSetPacScriptDone: " << result; |
| - callback.Run(result); |
| + // |callback| is owned by |set_pac_script_callback_|, so make a copy before |
| + // cancelling. |
| + auto callback_copy = callback; |
| set_pac_script_callback_.Cancel(); |
| + callback_copy.Run(result); |
| } |
| void ProxyResolverMojo::SetUpServices() { |
| @@ -184,14 +189,15 @@ void ProxyResolverMojo::SetUpServices() { |
| void ProxyResolverMojo::AbortPendingRequests() { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| - if (!set_pac_script_callback_.IsCancelled()) { |
| + // |this| could be deleted as a result of one of these callbacks so use |
| + // |weak_this| to check. |
| + base::WeakPtr<ProxyResolverMojo> weak_this = weak_factory_.GetWeakPtr(); |
| + if (!set_pac_script_callback_.IsCancelled()) |
| set_pac_script_callback_.callback().Run(ERR_PAC_SCRIPT_TERMINATED); |
| - set_pac_script_callback_.Cancel(); |
| - } |
| // Need to use this loop because deleting a Job will cause its callback to be |
| // run with a failure error code, which may cause other Jobs to be deleted. |
| - while (!pending_jobs_.empty()) { |
| + while (weak_this && !pending_jobs_.empty()) { |
|
eroman
2015/04/15 00:56:52
What is this needed for? This doesn't seem right,
Sam McNally
2015/04/15 04:35:56
Done. GetProxyForUrl requests will no longer immed
|
| auto it = pending_jobs_.begin(); |
| Job* job = *it; |
| pending_jobs_.erase(it); |