Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/proxy/proxy_resolver_mojo.h" | 5 #include "net/proxy/proxy_resolver_mojo.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "mojo/common/common_type_converters.h" | 10 #include "mojo/common/common_type_converters.h" |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 93 int32_t error, | 93 int32_t error, |
| 94 mojo::Array<interfaces::ProxyServerPtr> proxy_servers) { | 94 mojo::Array<interfaces::ProxyServerPtr> proxy_servers) { |
| 95 DCHECK(thread_checker_.CalledOnValidThread()); | 95 DCHECK(thread_checker_.CalledOnValidThread()); |
| 96 DVLOG(1) << "ProxyResolverMojo::Job::ReportResult: " << error; | 96 DVLOG(1) << "ProxyResolverMojo::Job::ReportResult: " << error; |
| 97 | 97 |
| 98 if (error == OK) { | 98 if (error == OK) { |
| 99 *results_ = proxy_servers.To<ProxyInfo>(); | 99 *results_ = proxy_servers.To<ProxyInfo>(); |
| 100 DVLOG(1) << "Servers: " << results_->ToPacString(); | 100 DVLOG(1) << "Servers: " << results_->ToPacString(); |
| 101 } | 101 } |
| 102 | 102 |
| 103 callback_.Run(error); | 103 CompletionCallback callback = callback_; |
| 104 callback_.Reset(); | 104 callback_.Reset(); |
| 105 resolver_->RemoveJob(this); | 105 resolver_->RemoveJob(this); |
| 106 callback.Run(error); | |
| 106 } | 107 } |
| 107 | 108 |
| 108 void ProxyResolverMojo::Job::LoadStateChanged(int32_t load_state) { | 109 void ProxyResolverMojo::Job::LoadStateChanged(int32_t load_state) { |
| 109 load_state_ = static_cast<LoadState>(load_state); | 110 load_state_ = static_cast<LoadState>(load_state); |
| 110 } | 111 } |
| 111 | 112 |
| 112 ProxyResolverMojo::ProxyResolverMojo( | 113 ProxyResolverMojo::ProxyResolverMojo( |
| 113 MojoProxyResolverFactory* mojo_proxy_resolver_factory, | 114 MojoProxyResolverFactory* mojo_proxy_resolver_factory, |
| 114 HostResolver* host_resolver) | 115 HostResolver* host_resolver) |
| 115 : ProxyResolver(true /* |expects_pac_bytes| */), | 116 : ProxyResolver(true /* |expects_pac_bytes| */), |
| 116 mojo_proxy_resolver_factory_(mojo_proxy_resolver_factory), | 117 mojo_proxy_resolver_factory_(mojo_proxy_resolver_factory), |
| 117 host_resolver_(host_resolver) { | 118 host_resolver_(host_resolver), |
| 119 weak_factory_(this) { | |
| 118 } | 120 } |
| 119 | 121 |
| 120 ProxyResolverMojo::~ProxyResolverMojo() { | 122 ProxyResolverMojo::~ProxyResolverMojo() { |
| 121 DCHECK(thread_checker_.CalledOnValidThread()); | 123 DCHECK(thread_checker_.CalledOnValidThread()); |
| 122 // All pending requests should have been cancelled. | 124 // All pending requests should have been cancelled. |
| 123 DCHECK(pending_jobs_.empty()); | 125 DCHECK(pending_jobs_.empty()); |
| 124 DCHECK(set_pac_script_callback_.IsCancelled()); | 126 DCHECK(set_pac_script_callback_.IsCancelled()); |
| 125 } | 127 } |
| 126 | 128 |
| 127 void ProxyResolverMojo::CancelSetPacScript() { | 129 void ProxyResolverMojo::CancelSetPacScript() { |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 156 } | 158 } |
| 157 | 159 |
| 158 void ProxyResolverMojo::OnSetPacScriptDone( | 160 void ProxyResolverMojo::OnSetPacScriptDone( |
| 159 const scoped_refptr<ProxyResolverScriptData>& pac_script, | 161 const scoped_refptr<ProxyResolverScriptData>& pac_script, |
| 160 const net::CompletionCallback& callback, | 162 const net::CompletionCallback& callback, |
| 161 int32_t result) { | 163 int32_t result) { |
| 162 DCHECK(thread_checker_.CalledOnValidThread()); | 164 DCHECK(thread_checker_.CalledOnValidThread()); |
| 163 DCHECK(!set_pac_script_callback_.IsCancelled()); | 165 DCHECK(!set_pac_script_callback_.IsCancelled()); |
| 164 DVLOG(1) << "ProxyResolverMojo::OnSetPacScriptDone: " << result; | 166 DVLOG(1) << "ProxyResolverMojo::OnSetPacScriptDone: " << result; |
| 165 | 167 |
| 166 callback.Run(result); | 168 // |callback| is owned by |set_pac_script_callback_|, so make a copy before |
| 169 // cancelling. | |
| 170 auto callback_copy = callback; | |
| 167 set_pac_script_callback_.Cancel(); | 171 set_pac_script_callback_.Cancel(); |
| 172 callback_copy.Run(result); | |
| 168 } | 173 } |
| 169 | 174 |
| 170 void ProxyResolverMojo::SetUpServices() { | 175 void ProxyResolverMojo::SetUpServices() { |
| 171 DCHECK(thread_checker_.CalledOnValidThread()); | 176 DCHECK(thread_checker_.CalledOnValidThread()); |
| 172 // A Mojo service implementation must outlive its binding. | 177 // A Mojo service implementation must outlive its binding. |
| 173 mojo_host_resolver_binding_.reset(); | 178 mojo_host_resolver_binding_.reset(); |
| 174 | 179 |
| 175 interfaces::HostResolverPtr mojo_host_resolver_ptr; | 180 interfaces::HostResolverPtr mojo_host_resolver_ptr; |
| 176 mojo_host_resolver_.reset(new MojoHostResolverImpl(host_resolver_)); | 181 mojo_host_resolver_.reset(new MojoHostResolverImpl(host_resolver_)); |
| 177 mojo_host_resolver_binding_.reset(new mojo::Binding<interfaces::HostResolver>( | 182 mojo_host_resolver_binding_.reset(new mojo::Binding<interfaces::HostResolver>( |
| 178 mojo_host_resolver_.get(), mojo::GetProxy(&mojo_host_resolver_ptr))); | 183 mojo_host_resolver_.get(), mojo::GetProxy(&mojo_host_resolver_ptr))); |
| 179 mojo_proxy_resolver_ptr_.reset(); | 184 mojo_proxy_resolver_ptr_.reset(); |
| 180 mojo_proxy_resolver_factory_->Create( | 185 mojo_proxy_resolver_factory_->Create( |
| 181 mojo::GetProxy(&mojo_proxy_resolver_ptr_), mojo_host_resolver_ptr.Pass()); | 186 mojo::GetProxy(&mojo_proxy_resolver_ptr_), mojo_host_resolver_ptr.Pass()); |
| 182 mojo_proxy_resolver_ptr_.set_error_handler(this); | 187 mojo_proxy_resolver_ptr_.set_error_handler(this); |
| 183 } | 188 } |
| 184 | 189 |
| 185 void ProxyResolverMojo::AbortPendingRequests() { | 190 void ProxyResolverMojo::AbortPendingRequests() { |
| 186 DCHECK(thread_checker_.CalledOnValidThread()); | 191 DCHECK(thread_checker_.CalledOnValidThread()); |
| 187 if (!set_pac_script_callback_.IsCancelled()) { | 192 // |this| could be deleted as a result of one of these callbacks so use |
| 193 // |weak_this| to check. | |
| 194 base::WeakPtr<ProxyResolverMojo> weak_this = weak_factory_.GetWeakPtr(); | |
| 195 if (!set_pac_script_callback_.IsCancelled()) | |
| 188 set_pac_script_callback_.callback().Run(ERR_PAC_SCRIPT_TERMINATED); | 196 set_pac_script_callback_.callback().Run(ERR_PAC_SCRIPT_TERMINATED); |
| 189 set_pac_script_callback_.Cancel(); | |
| 190 } | |
| 191 | 197 |
| 192 // Need to use this loop because deleting a Job will cause its callback to be | 198 // Need to use this loop because deleting a Job will cause its callback to be |
| 193 // run with a failure error code, which may cause other Jobs to be deleted. | 199 // run with a failure error code, which may cause other Jobs to be deleted. |
| 194 while (!pending_jobs_.empty()) { | 200 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
| |
| 195 auto it = pending_jobs_.begin(); | 201 auto it = pending_jobs_.begin(); |
| 196 Job* job = *it; | 202 Job* job = *it; |
| 197 pending_jobs_.erase(it); | 203 pending_jobs_.erase(it); |
| 198 | 204 |
| 199 // Deleting the job will cause its completion callback to be run with an | 205 // Deleting the job will cause its completion callback to be run with an |
| 200 // ERR_PAC_SCRIPT_TERMINATED error. | 206 // ERR_PAC_SCRIPT_TERMINATED error. |
| 201 delete job; | 207 delete job; |
| 202 } | 208 } |
| 203 } | 209 } |
| 204 | 210 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 255 RemoveJob(job); | 261 RemoveJob(job); |
| 256 } | 262 } |
| 257 | 263 |
| 258 LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const { | 264 LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const { |
| 259 Job* job = static_cast<Job*>(request); | 265 Job* job = static_cast<Job*>(request); |
| 260 CHECK_EQ(1u, pending_jobs_.count(job)); | 266 CHECK_EQ(1u, pending_jobs_.count(job)); |
| 261 return job->load_state(); | 267 return job->load_state(); |
| 262 } | 268 } |
| 263 | 269 |
| 264 } // namespace net | 270 } // namespace net |
| OLD | NEW |