| 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| */), |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 } | 157 } |
| 157 | 158 |
| 158 void ProxyResolverMojo::OnSetPacScriptDone( | 159 void ProxyResolverMojo::OnSetPacScriptDone( |
| 159 const scoped_refptr<ProxyResolverScriptData>& pac_script, | 160 const scoped_refptr<ProxyResolverScriptData>& pac_script, |
| 160 const net::CompletionCallback& callback, | 161 const net::CompletionCallback& callback, |
| 161 int32_t result) { | 162 int32_t result) { |
| 162 DCHECK(thread_checker_.CalledOnValidThread()); | 163 DCHECK(thread_checker_.CalledOnValidThread()); |
| 163 DCHECK(!set_pac_script_callback_.IsCancelled()); | 164 DCHECK(!set_pac_script_callback_.IsCancelled()); |
| 164 DVLOG(1) << "ProxyResolverMojo::OnSetPacScriptDone: " << result; | 165 DVLOG(1) << "ProxyResolverMojo::OnSetPacScriptDone: " << result; |
| 165 | 166 |
| 166 callback.Run(result); | 167 // |callback| is owned by |set_pac_script_callback_|, so make a copy before |
| 168 // cancelling. |
| 169 auto callback_copy = callback; |
| 167 set_pac_script_callback_.Cancel(); | 170 set_pac_script_callback_.Cancel(); |
| 171 callback_copy.Run(result); |
| 168 } | 172 } |
| 169 | 173 |
| 170 void ProxyResolverMojo::SetUpServices() { | 174 void ProxyResolverMojo::SetUpServices() { |
| 171 DCHECK(thread_checker_.CalledOnValidThread()); | 175 DCHECK(thread_checker_.CalledOnValidThread()); |
| 172 // A Mojo service implementation must outlive its binding. | 176 // A Mojo service implementation must outlive its binding. |
| 173 mojo_host_resolver_binding_.reset(); | 177 mojo_host_resolver_binding_.reset(); |
| 174 | 178 |
| 175 interfaces::HostResolverPtr mojo_host_resolver_ptr; | 179 interfaces::HostResolverPtr mojo_host_resolver_ptr; |
| 176 mojo_host_resolver_.reset(new MojoHostResolverImpl(host_resolver_)); | 180 mojo_host_resolver_.reset(new MojoHostResolverImpl(host_resolver_)); |
| 177 mojo_host_resolver_binding_.reset(new mojo::Binding<interfaces::HostResolver>( | 181 mojo_host_resolver_binding_.reset(new mojo::Binding<interfaces::HostResolver>( |
| 178 mojo_host_resolver_.get(), mojo::GetProxy(&mojo_host_resolver_ptr))); | 182 mojo_host_resolver_.get(), mojo::GetProxy(&mojo_host_resolver_ptr))); |
| 179 mojo_proxy_resolver_ptr_.reset(); | 183 mojo_proxy_resolver_ptr_.reset(); |
| 180 mojo_proxy_resolver_factory_->Create( | 184 mojo_proxy_resolver_factory_->Create( |
| 181 mojo::GetProxy(&mojo_proxy_resolver_ptr_), mojo_host_resolver_ptr.Pass()); | 185 mojo::GetProxy(&mojo_proxy_resolver_ptr_), mojo_host_resolver_ptr.Pass()); |
| 182 mojo_proxy_resolver_ptr_.set_error_handler(this); | 186 mojo_proxy_resolver_ptr_.set_error_handler(this); |
| 183 } | 187 } |
| 184 | 188 |
| 185 void ProxyResolverMojo::AbortPendingRequests() { | |
| 186 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 187 if (!set_pac_script_callback_.IsCancelled()) { | |
| 188 set_pac_script_callback_.callback().Run(ERR_PAC_SCRIPT_TERMINATED); | |
| 189 set_pac_script_callback_.Cancel(); | |
| 190 } | |
| 191 | |
| 192 // 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. | |
| 194 while (!pending_jobs_.empty()) { | |
| 195 auto it = pending_jobs_.begin(); | |
| 196 Job* job = *it; | |
| 197 pending_jobs_.erase(it); | |
| 198 | |
| 199 // Deleting the job will cause its completion callback to be run with an | |
| 200 // ERR_PAC_SCRIPT_TERMINATED error. | |
| 201 delete job; | |
| 202 } | |
| 203 } | |
| 204 | |
| 205 void ProxyResolverMojo::OnConnectionError() { | 189 void ProxyResolverMojo::OnConnectionError() { |
| 206 DCHECK(thread_checker_.CalledOnValidThread()); | 190 DCHECK(thread_checker_.CalledOnValidThread()); |
| 207 DVLOG(1) << "ProxyResolverMojo::OnConnectionError"; | 191 DVLOG(1) << "ProxyResolverMojo::OnConnectionError"; |
| 208 | 192 |
| 209 // Disconnect from the Mojo proxy resolver service. An attempt to reconnect | 193 // Disconnect from the Mojo proxy resolver service. An attempt to reconnect |
| 210 // will happen on the next |SetPacScript()| request. | 194 // will happen on the next |SetPacScript()| request. |
| 211 mojo_proxy_resolver_ptr_.reset(); | 195 mojo_proxy_resolver_ptr_.reset(); |
| 212 | 196 |
| 213 // Aborting requests will invoke their callbacks, which may call | 197 // This callback may call |SetPacScript()| and re-create the connection. So |
| 214 // |SetPacScript()| and re-create the connection. So disconnect from the Mojo | 198 // disconnect from the Mojo service (above) before aborting the pending |
| 215 // service (above) before aborting the pending requests. | 199 // request. |
| 216 AbortPendingRequests(); | 200 if (!set_pac_script_callback_.IsCancelled()) |
| 201 set_pac_script_callback_.callback().Run(ERR_PAC_SCRIPT_TERMINATED); |
| 217 } | 202 } |
| 218 | 203 |
| 219 void ProxyResolverMojo::RemoveJob(Job* job) { | 204 void ProxyResolverMojo::RemoveJob(Job* job) { |
| 220 DCHECK(thread_checker_.CalledOnValidThread()); | 205 DCHECK(thread_checker_.CalledOnValidThread()); |
| 221 size_t num_erased = pending_jobs_.erase(job); | 206 size_t num_erased = pending_jobs_.erase(job); |
| 222 DCHECK(num_erased); | 207 DCHECK(num_erased); |
| 223 delete job; | 208 delete job; |
| 224 } | 209 } |
| 225 | 210 |
| 226 int ProxyResolverMojo::GetProxyForURL(const GURL& url, | 211 int ProxyResolverMojo::GetProxyForURL(const GURL& url, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 255 RemoveJob(job); | 240 RemoveJob(job); |
| 256 } | 241 } |
| 257 | 242 |
| 258 LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const { | 243 LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const { |
| 259 Job* job = static_cast<Job*>(request); | 244 Job* job = static_cast<Job*>(request); |
| 260 CHECK_EQ(1u, pending_jobs_.count(job)); | 245 CHECK_EQ(1u, pending_jobs_.count(job)); |
| 261 return job->load_state(); | 246 return job->load_state(); |
| 262 } | 247 } |
| 263 | 248 |
| 264 } // namespace net | 249 } // namespace net |
| OLD | NEW |