Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(420)

Side by Side Diff: net/proxy/proxy_resolver_factory_mojo.cc

Issue 1439053002: Change ProxyResolver::GetProxyForURL() to take a scoped_ptr<Request>* rather than a RequestHandle* (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: ToT Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_factory_mojo.h" 5 #include "net/proxy/proxy_resolver_factory_mojo.h"
6 6
7 #include <set> 7 #include <set>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 HostResolver* host_resolver, 111 HostResolver* host_resolver,
112 scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner, 112 scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner,
113 scoped_ptr<ProxyResolverErrorObserver> error_observer, 113 scoped_ptr<ProxyResolverErrorObserver> error_observer,
114 NetLog* net_log); 114 NetLog* net_log);
115 ~ProxyResolverMojo() override; 115 ~ProxyResolverMojo() override;
116 116
117 // ProxyResolver implementation: 117 // ProxyResolver implementation:
118 int GetProxyForURL(const GURL& url, 118 int GetProxyForURL(const GURL& url,
119 ProxyInfo* results, 119 ProxyInfo* results,
120 const net::CompletionCallback& callback, 120 const net::CompletionCallback& callback,
121 RequestHandle* request, 121 scoped_ptr<Request>* request,
122 const BoundNetLog& net_log) override; 122 const BoundNetLog& net_log) override;
123 void CancelRequest(RequestHandle request) override;
124 LoadState GetLoadState(RequestHandle request) const override;
125 123
126 private: 124 private:
127 class Job; 125 class Job;
126 class RequestImpl;
127
128 base::ThreadChecker thread_checker_;
128 129
129 // Mojo error handler. 130 // Mojo error handler.
130 void OnConnectionError(); 131 void OnConnectionError();
131 132
132 void RemoveJob(Job* job); 133 void RemoveJob(Job* job);
133 134
134 // Connection to the Mojo proxy resolver. 135 // Connection to the Mojo proxy resolver.
135 interfaces::ProxyResolverPtr mojo_proxy_resolver_ptr_; 136 interfaces::ProxyResolverPtr mojo_proxy_resolver_ptr_;
136 137
137 HostResolver* host_resolver_; 138 HostResolver* host_resolver_;
138 139
139 scoped_ptr<ProxyResolverErrorObserver> error_observer_; 140 scoped_ptr<ProxyResolverErrorObserver> error_observer_;
140 141
141 NetLog* net_log_; 142 NetLog* net_log_;
142 143
143 std::set<Job*> pending_jobs_; 144 std::set<Job*> pending_jobs_;
144 145
145 base::ThreadChecker thread_checker_;
146 146
147 scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner_; 147 scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner_;
148 148
149 DISALLOW_COPY_AND_ASSIGN(ProxyResolverMojo); 149 DISALLOW_COPY_AND_ASSIGN(ProxyResolverMojo);
150 }; 150 };
151 151
152 class ProxyResolverMojo::RequestImpl : public ProxyResolver::Request {
153 public:
154 RequestImpl(base::WeakPtr<Job> job);
155
156 ~RequestImpl() override;
157
158 LoadState GetLoadState() override;
159
160 private:
161 base::WeakPtr<Job> job_;
162 };
163
152 class ProxyResolverMojo::Job 164 class ProxyResolverMojo::Job
153 : public ClientMixin<interfaces::ProxyResolverRequestClient> { 165 : public ClientMixin<interfaces::ProxyResolverRequestClient>,
166 public base::SupportsWeakPtr<Job>,
167 public base::RefCounted<Job> {
154 public: 168 public:
155 Job(ProxyResolverMojo* resolver, 169 Job(ProxyResolverMojo* resolver,
156 const GURL& url, 170 const GURL& url,
157 ProxyInfo* results, 171 ProxyInfo* results,
158 const CompletionCallback& callback, 172 const CompletionCallback& callback,
159 const BoundNetLog& net_log); 173 const BoundNetLog& net_log);
160 ~Job() override;
161 174
162 // Cancels the job and prevents the callback from being run. 175 // Cancels the job and prevents the callback from being run.
163 void Cancel(); 176 void Cancel();
164 177
165 // Returns the LoadState of this job. 178 // Returns the LoadState of this job.
166 LoadState GetLoadState(); 179 LoadState GetLoadState();
167 180
181 ProxyResolverMojo* GetResolver();
182
183 // Delete seld owned refpointer
184 void Remove();
185
168 private: 186 private:
187 ~Job() override;
188 friend class base::RefCounted<Job>;
169 // Mojo error handler. 189 // Mojo error handler.
170 void OnConnectionError(); 190 void OnConnectionError();
171 191
172 // Overridden from interfaces::ProxyResolverRequestClient: 192 // Overridden from interfaces::ProxyResolverRequestClient:
173 void ReportResult( 193 void ReportResult(
174 int32_t error, 194 int32_t error,
175 mojo::Array<interfaces::ProxyServerPtr> proxy_servers) override; 195 mojo::Array<interfaces::ProxyServerPtr> proxy_servers) override;
176 196
177 ProxyResolverMojo* resolver_; 197 ProxyResolverMojo* resolver_;
178 const GURL url_; 198 const GURL url_;
179 ProxyInfo* results_; 199 ProxyInfo* results_;
180 CompletionCallback callback_; 200 CompletionCallback callback_;
181 201
182 base::ThreadChecker thread_checker_; 202 base::ThreadChecker thread_checker_;
183 mojo::Binding<interfaces::ProxyResolverRequestClient> binding_; 203 mojo::Binding<interfaces::ProxyResolverRequestClient> binding_;
204
205 // The job holds a reference to itself to ensure that it remains alive until
206 // either completion or cancellation. This is the only owner.
207 scoped_refptr<Job> owned_self_reference_ = this;
184 }; 208 };
185 209
210 ProxyResolverMojo::RequestImpl::RequestImpl(base::WeakPtr<Job> job)
211 : job_(job) {}
212
213 ProxyResolverMojo::RequestImpl::~RequestImpl() {
214 if (job_) {
215 job_->Cancel();
216 job_->GetResolver()->RemoveJob(job_.get());
217 }
218 }
219
220 LoadState ProxyResolverMojo::RequestImpl::GetLoadState() {
221 CHECK_EQ(1u, job_->GetResolver()->pending_jobs_.count(job_.get()));
222 return job_->GetLoadState();
223 }
224
186 ProxyResolverMojo::Job::Job(ProxyResolverMojo* resolver, 225 ProxyResolverMojo::Job::Job(ProxyResolverMojo* resolver,
187 const GURL& url, 226 const GURL& url,
188 ProxyInfo* results, 227 ProxyInfo* results,
189 const CompletionCallback& callback, 228 const CompletionCallback& callback,
190 const BoundNetLog& net_log) 229 const BoundNetLog& net_log)
191 : ClientMixin<interfaces::ProxyResolverRequestClient>( 230 : ClientMixin<interfaces::ProxyResolverRequestClient>(
192 resolver->host_resolver_, 231 resolver->host_resolver_,
193 resolver->error_observer_.get(), 232 resolver->error_observer_.get(),
194 resolver->net_log_, 233 resolver->net_log_,
195 net_log), 234 net_log),
(...skipping 20 matching lines...) Expand all
216 DCHECK(thread_checker_.CalledOnValidThread()); 255 DCHECK(thread_checker_.CalledOnValidThread());
217 DCHECK(!callback_.is_null()); 256 DCHECK(!callback_.is_null());
218 callback_.Reset(); 257 callback_.Reset();
219 } 258 }
220 259
221 LoadState ProxyResolverMojo::Job::GetLoadState() { 260 LoadState ProxyResolverMojo::Job::GetLoadState() {
222 return dns_request_in_progress() ? LOAD_STATE_RESOLVING_HOST_IN_PROXY_SCRIPT 261 return dns_request_in_progress() ? LOAD_STATE_RESOLVING_HOST_IN_PROXY_SCRIPT
223 : LOAD_STATE_RESOLVING_PROXY_FOR_URL; 262 : LOAD_STATE_RESOLVING_PROXY_FOR_URL;
224 } 263 }
225 264
265 ProxyResolverMojo* ProxyResolverMojo::Job::GetResolver() {
266 return resolver_;
267 };
268
269 void ProxyResolverMojo::Job::Remove() {
270 owned_self_reference_ = NULL;
271 }
272
226 void ProxyResolverMojo::Job::OnConnectionError() { 273 void ProxyResolverMojo::Job::OnConnectionError() {
227 DCHECK(thread_checker_.CalledOnValidThread()); 274 DCHECK(thread_checker_.CalledOnValidThread());
228 DVLOG(1) << "ProxyResolverMojo::Job::OnConnectionError"; 275 DVLOG(1) << "ProxyResolverMojo::Job::OnConnectionError";
229 resolver_->RemoveJob(this); 276 resolver_->RemoveJob(this);
230 } 277 }
231 278
232 void ProxyResolverMojo::Job::ReportResult( 279 void ProxyResolverMojo::Job::ReportResult(
233 int32_t error, 280 int32_t error,
234 mojo::Array<interfaces::ProxyServerPtr> proxy_servers) { 281 mojo::Array<interfaces::ProxyServerPtr> proxy_servers) {
235 DCHECK(thread_checker_.CalledOnValidThread()); 282 DCHECK(thread_checker_.CalledOnValidThread());
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 DVLOG(1) << "ProxyResolverMojo::OnConnectionError"; 319 DVLOG(1) << "ProxyResolverMojo::OnConnectionError";
273 320
274 // Disconnect from the Mojo proxy resolver service. 321 // Disconnect from the Mojo proxy resolver service.
275 mojo_proxy_resolver_ptr_.reset(); 322 mojo_proxy_resolver_ptr_.reset();
276 } 323 }
277 324
278 void ProxyResolverMojo::RemoveJob(Job* job) { 325 void ProxyResolverMojo::RemoveJob(Job* job) {
279 DCHECK(thread_checker_.CalledOnValidThread()); 326 DCHECK(thread_checker_.CalledOnValidThread());
280 size_t num_erased = pending_jobs_.erase(job); 327 size_t num_erased = pending_jobs_.erase(job);
281 DCHECK(num_erased); 328 DCHECK(num_erased);
282 delete job; 329 job->Remove();
283 } 330 }
284 331
285 int ProxyResolverMojo::GetProxyForURL(const GURL& url, 332 int ProxyResolverMojo::GetProxyForURL(const GURL& url,
286 ProxyInfo* results, 333 ProxyInfo* results,
287 const CompletionCallback& callback, 334 const CompletionCallback& callback,
288 RequestHandle* request, 335 scoped_ptr<Request>* request,
289 const BoundNetLog& net_log) { 336 const BoundNetLog& net_log) {
290 DCHECK(thread_checker_.CalledOnValidThread()); 337 DCHECK(thread_checker_.CalledOnValidThread());
291 338
292 if (!mojo_proxy_resolver_ptr_) 339 if (!mojo_proxy_resolver_ptr_)
293 return ERR_PAC_SCRIPT_TERMINATED; 340 return ERR_PAC_SCRIPT_TERMINATED;
294 341
295 Job* job = new Job(this, url, results, callback, net_log); 342 // Job owns itselfs.
296 bool inserted = pending_jobs_.insert(job).second; 343 scoped_refptr<Job> job = new Job(this, url, results, callback, net_log);
344 bool inserted = pending_jobs_.insert(job.get()).second;
297 DCHECK(inserted); 345 DCHECK(inserted);
298 *request = job; 346 request->reset(new RequestImpl(job->AsWeakPtr()));
299 347
300 return ERR_IO_PENDING; 348 return ERR_IO_PENDING;
301 } 349 }
302 350
303 void ProxyResolverMojo::CancelRequest(RequestHandle request) {
304 DCHECK(thread_checker_.CalledOnValidThread());
305 Job* job = static_cast<Job*>(request);
306 DCHECK(job);
307 job->Cancel();
308 RemoveJob(job);
309 }
310 351
311 LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const {
312 Job* job = static_cast<Job*>(request);
313 CHECK_EQ(1u, pending_jobs_.count(job));
314 return job->GetLoadState();
315 }
316 352
317 } // namespace 353 } // namespace
318 354
319 // A Job to create a ProxyResolver instance. 355 // A Job to create a ProxyResolver instance.
320 // 356 //
321 // Note: a Job instance is not tied to a particular resolve request, and hence 357 // Note: a Job instance is not tied to a particular resolve request, and hence
322 // there is no per-request logging to be done (any netlog events are only sent 358 // there is no per-request logging to be done (any netlog events are only sent
323 // globally) so this always uses an empty BoundNetLog. 359 // globally) so this always uses an empty BoundNetLog.
324 class ProxyResolverFactoryMojo::Job 360 class ProxyResolverFactoryMojo::Job
325 : public ClientMixin<interfaces::ProxyResolverFactoryRequestClient>, 361 : public ClientMixin<interfaces::ProxyResolverFactoryRequestClient>,
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 return ERR_PAC_SCRIPT_FAILED; 441 return ERR_PAC_SCRIPT_FAILED;
406 } 442 }
407 request->reset(new Job(this, pac_script, resolver, callback, 443 request->reset(new Job(this, pac_script, resolver, callback,
408 error_observer_factory_.is_null() 444 error_observer_factory_.is_null()
409 ? nullptr 445 ? nullptr
410 : error_observer_factory_.Run())); 446 : error_observer_factory_.Run()));
411 return ERR_IO_PENDING; 447 return ERR_IO_PENDING;
412 } 448 }
413 449
414 } // namespace net 450 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698