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

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

Issue 1516493003: Change ProxyResolverMojo::Job to use mojo::StrongBindingSet. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@mojo-geolocation-untangle
Patch Set: Created 5 years 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/stl_util.h" 11 #include "base/stl_util.h"
12 #include "base/threading/thread_checker.h" 12 #include "base/threading/thread_checker.h"
13 #include "base/values.h" 13 #include "base/values.h"
14 #include "mojo/common/common_type_converters.h" 14 #include "mojo/common/common_type_converters.h"
15 #include "mojo/common/strong_binding_set.h"
15 #include "mojo/common/url_type_converters.h" 16 #include "mojo/common/url_type_converters.h"
16 #include "mojo/public/cpp/bindings/binding.h" 17 #include "mojo/public/cpp/bindings/binding.h"
17 #include "net/base/load_states.h" 18 #include "net/base/load_states.h"
18 #include "net/base/net_errors.h" 19 #include "net/base/net_errors.h"
19 #include "net/dns/mojo_host_resolver_impl.h" 20 #include "net/dns/mojo_host_resolver_impl.h"
20 #include "net/interfaces/host_resolver_service.mojom.h" 21 #include "net/interfaces/host_resolver_service.mojom.h"
21 #include "net/interfaces/proxy_resolver_service.mojom.h" 22 #include "net/interfaces/proxy_resolver_service.mojom.h"
22 #include "net/proxy/mojo_proxy_resolver_factory.h" 23 #include "net/proxy/mojo_proxy_resolver_factory.h"
23 #include "net/proxy/mojo_proxy_type_converters.h" 24 #include "net/proxy/mojo_proxy_type_converters.h"
24 #include "net/proxy/proxy_info.h" 25 #include "net/proxy/proxy_info.h"
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 // ProxyResolver implementation: 116 // ProxyResolver implementation:
116 int GetProxyForURL(const GURL& url, 117 int GetProxyForURL(const GURL& url,
117 ProxyInfo* results, 118 ProxyInfo* results,
118 const net::CompletionCallback& callback, 119 const net::CompletionCallback& callback,
119 RequestHandle* request, 120 RequestHandle* request,
120 const BoundNetLog& net_log) override; 121 const BoundNetLog& net_log) override;
121 void CancelRequest(RequestHandle request) override; 122 void CancelRequest(RequestHandle request) override;
122 LoadState GetLoadState(RequestHandle request) const override; 123 LoadState GetLoadState(RequestHandle request) const override;
123 124
124 private: 125 private:
125 class Job; 126 class Job : public ClientMixin<interfaces::ProxyResolverRequestClient> {
127 public:
128 Job(ProxyResolverMojo* resolver,
129 ProxyInfo* results,
130 const CompletionCallback& callback,
131 const BoundNetLog& net_log);
132 ~Job() override;
133
134 // Cancels the job and prevents the callback from being run.
135 void Cancel();
136
137 // Returns the LoadState of this job.
138 LoadState GetLoadState();
139
140 private:
141 // Overridden from interfaces::ProxyResolverRequestClient:
142 void ReportResult(
143 int32_t error,
144 mojo::Array<interfaces::ProxyServerPtr> proxy_servers) override;
145
146 ProxyResolverMojo* resolver_;
147 ProxyInfo* results_;
148 CompletionCallback callback_;
149
150 base::ThreadChecker thread_checker_;
151 };
126 152
127 // Mojo error handler. 153 // Mojo error handler.
128 void OnConnectionError(); 154 void OnConnectionError();
129 155
130 void RemoveJob(Job* job);
131
132 // Connection to the Mojo proxy resolver. 156 // Connection to the Mojo proxy resolver.
133 interfaces::ProxyResolverPtr mojo_proxy_resolver_ptr_; 157 interfaces::ProxyResolverPtr mojo_proxy_resolver_ptr_;
134 158
135 HostResolver* host_resolver_; 159 HostResolver* host_resolver_;
136 160
137 scoped_ptr<ProxyResolverErrorObserver> error_observer_; 161 scoped_ptr<ProxyResolverErrorObserver> error_observer_;
138 162
139 NetLog* net_log_; 163 NetLog* net_log_;
140 164
141 std::set<Job*> pending_jobs_; 165 mojo::StrongBindingSet<Job> pending_jobs_;
142 166
143 base::ThreadChecker thread_checker_; 167 base::ThreadChecker thread_checker_;
144 168
145 scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner_; 169 scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner_;
146 170
147 DISALLOW_COPY_AND_ASSIGN(ProxyResolverMojo); 171 DISALLOW_COPY_AND_ASSIGN(ProxyResolverMojo);
148 }; 172 };
149 173
150 class ProxyResolverMojo::Job
151 : public ClientMixin<interfaces::ProxyResolverRequestClient> {
152 public:
153 Job(ProxyResolverMojo* resolver,
154 const GURL& url,
155 ProxyInfo* results,
156 const CompletionCallback& callback,
157 const BoundNetLog& net_log);
158 ~Job() override;
159
160 // Cancels the job and prevents the callback from being run.
161 void Cancel();
162
163 // Returns the LoadState of this job.
164 LoadState GetLoadState();
165
166 private:
167 // Mojo error handler.
168 void OnConnectionError();
169
170 // Overridden from interfaces::ProxyResolverRequestClient:
171 void ReportResult(
172 int32_t error,
173 mojo::Array<interfaces::ProxyServerPtr> proxy_servers) override;
174
175 ProxyResolverMojo* resolver_;
176 const GURL url_;
177 ProxyInfo* results_;
178 CompletionCallback callback_;
179
180 base::ThreadChecker thread_checker_;
181 mojo::Binding<interfaces::ProxyResolverRequestClient> binding_;
182 };
183
184 ProxyResolverMojo::Job::Job(ProxyResolverMojo* resolver, 174 ProxyResolverMojo::Job::Job(ProxyResolverMojo* resolver,
185 const GURL& url,
186 ProxyInfo* results, 175 ProxyInfo* results,
187 const CompletionCallback& callback, 176 const CompletionCallback& callback,
188 const BoundNetLog& net_log) 177 const BoundNetLog& net_log)
189 : ClientMixin<interfaces::ProxyResolverRequestClient>( 178 : ClientMixin<interfaces::ProxyResolverRequestClient>(
190 resolver->host_resolver_, 179 resolver->host_resolver_,
191 resolver->error_observer_.get(), 180 resolver->error_observer_.get(),
192 resolver->net_log_, 181 resolver->net_log_,
193 net_log), 182 net_log),
194 resolver_(resolver), 183 resolver_(resolver),
195 url_(url),
196 results_(results), 184 results_(results),
197 callback_(callback), 185 callback_(callback) {}
198 binding_(this) {
199 binding_.set_connection_error_handler(base::Bind(
200 &ProxyResolverMojo::Job::OnConnectionError, base::Unretained(this)));
201
202 interfaces::ProxyResolverRequestClientPtr client_ptr;
203 binding_.Bind(mojo::GetProxy(&client_ptr));
204 resolver_->mojo_proxy_resolver_ptr_->GetProxyForUrl(mojo::String::From(url_),
205 client_ptr.Pass());
206 }
207 186
208 ProxyResolverMojo::Job::~Job() { 187 ProxyResolverMojo::Job::~Job() {
209 DCHECK(thread_checker_.CalledOnValidThread()); 188 DCHECK(thread_checker_.CalledOnValidThread());
210 if (!callback_.is_null()) 189 if (!callback_.is_null())
211 callback_.Run(ERR_PAC_SCRIPT_TERMINATED); 190 callback_.Run(ERR_PAC_SCRIPT_TERMINATED);
212 } 191 }
213 192
214 void ProxyResolverMojo::Job::Cancel() { 193 void ProxyResolverMojo::Job::Cancel() {
215 DCHECK(thread_checker_.CalledOnValidThread()); 194 DCHECK(thread_checker_.CalledOnValidThread());
216 DCHECK(!callback_.is_null()); 195 DCHECK(!callback_.is_null());
217 callback_.Reset(); 196 callback_.Reset();
218 } 197 }
219 198
220 LoadState ProxyResolverMojo::Job::GetLoadState() { 199 LoadState ProxyResolverMojo::Job::GetLoadState() {
221 return dns_request_in_progress() ? LOAD_STATE_RESOLVING_HOST_IN_PROXY_SCRIPT 200 return dns_request_in_progress() ? LOAD_STATE_RESOLVING_HOST_IN_PROXY_SCRIPT
222 : LOAD_STATE_RESOLVING_PROXY_FOR_URL; 201 : LOAD_STATE_RESOLVING_PROXY_FOR_URL;
223 } 202 }
224 203
225 void ProxyResolverMojo::Job::OnConnectionError() {
226 DCHECK(thread_checker_.CalledOnValidThread());
227 DVLOG(1) << "ProxyResolverMojo::Job::OnConnectionError";
228 resolver_->RemoveJob(this);
229 }
230
231 void ProxyResolverMojo::Job::ReportResult( 204 void ProxyResolverMojo::Job::ReportResult(
232 int32_t error, 205 int32_t error,
233 mojo::Array<interfaces::ProxyServerPtr> proxy_servers) { 206 mojo::Array<interfaces::ProxyServerPtr> proxy_servers) {
234 DCHECK(thread_checker_.CalledOnValidThread()); 207 DCHECK(thread_checker_.CalledOnValidThread());
235 DVLOG(1) << "ProxyResolverMojo::Job::ReportResult: " << error; 208 DVLOG(1) << "ProxyResolverMojo::Job::ReportResult: " << error;
236 209
237 if (error == OK) { 210 if (error == OK) {
238 *results_ = proxy_servers.To<ProxyInfo>(); 211 *results_ = proxy_servers.To<ProxyInfo>();
239 DVLOG(1) << "Servers: " << results_->ToPacString(); 212 DVLOG(1) << "Servers: " << results_->ToPacString();
240 } 213 }
241 214
242 CompletionCallback callback = callback_; 215 CompletionCallback callback = callback_;
243 callback_.Reset(); 216 callback_.Reset();
244 resolver_->RemoveJob(this); 217 resolver_->pending_jobs_.DestroyService(this);
245 callback.Run(error); 218 callback.Run(error);
246 } 219 }
247 220
248 ProxyResolverMojo::ProxyResolverMojo( 221 ProxyResolverMojo::ProxyResolverMojo(
249 interfaces::ProxyResolverPtr resolver_ptr, 222 interfaces::ProxyResolverPtr resolver_ptr,
250 HostResolver* host_resolver, 223 HostResolver* host_resolver,
251 scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner, 224 scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner,
252 scoped_ptr<ProxyResolverErrorObserver> error_observer, 225 scoped_ptr<ProxyResolverErrorObserver> error_observer,
253 NetLog* net_log) 226 NetLog* net_log)
254 : mojo_proxy_resolver_ptr_(resolver_ptr.Pass()), 227 : mojo_proxy_resolver_ptr_(resolver_ptr.Pass()),
(...skipping 12 matching lines...) Expand all
267 } 240 }
268 241
269 void ProxyResolverMojo::OnConnectionError() { 242 void ProxyResolverMojo::OnConnectionError() {
270 DCHECK(thread_checker_.CalledOnValidThread()); 243 DCHECK(thread_checker_.CalledOnValidThread());
271 DVLOG(1) << "ProxyResolverMojo::OnConnectionError"; 244 DVLOG(1) << "ProxyResolverMojo::OnConnectionError";
272 245
273 // Disconnect from the Mojo proxy resolver service. 246 // Disconnect from the Mojo proxy resolver service.
274 mojo_proxy_resolver_ptr_.reset(); 247 mojo_proxy_resolver_ptr_.reset();
275 } 248 }
276 249
277 void ProxyResolverMojo::RemoveJob(Job* job) {
278 DCHECK(thread_checker_.CalledOnValidThread());
279 size_t num_erased = pending_jobs_.erase(job);
280 DCHECK(num_erased);
281 delete job;
282 }
283
284 int ProxyResolverMojo::GetProxyForURL(const GURL& url, 250 int ProxyResolverMojo::GetProxyForURL(const GURL& url,
285 ProxyInfo* results, 251 ProxyInfo* results,
286 const CompletionCallback& callback, 252 const CompletionCallback& callback,
287 RequestHandle* request, 253 RequestHandle* request,
288 const BoundNetLog& net_log) { 254 const BoundNetLog& net_log) {
289 DCHECK(thread_checker_.CalledOnValidThread()); 255 DCHECK(thread_checker_.CalledOnValidThread());
290 256
291 if (!mojo_proxy_resolver_ptr_) 257 if (!mojo_proxy_resolver_ptr_)
292 return ERR_PAC_SCRIPT_TERMINATED; 258 return ERR_PAC_SCRIPT_TERMINATED;
293 259
294 Job* job = new Job(this, url, results, callback, net_log); 260 interfaces::ProxyResolverRequestClientPtr client_ptr;
295 bool inserted = pending_jobs_.insert(job).second; 261 *request = pending_jobs_.EmplaceService(mojo::GetProxy(&client_ptr), this,
296 DCHECK(inserted); 262 results, callback, net_log);
297 *request = job; 263 mojo_proxy_resolver_ptr_->GetProxyForUrl(mojo::String::From(url),
298 264 client_ptr.Pass());
299 return ERR_IO_PENDING; 265 return ERR_IO_PENDING;
300 } 266 }
301 267
302 void ProxyResolverMojo::CancelRequest(RequestHandle request) { 268 void ProxyResolverMojo::CancelRequest(RequestHandle request) {
303 DCHECK(thread_checker_.CalledOnValidThread()); 269 DCHECK(thread_checker_.CalledOnValidThread());
304 Job* job = static_cast<Job*>(request); 270 pending_jobs_.DestroyService(static_cast<Job*>(request));
305 DCHECK(job);
306 job->Cancel();
307 RemoveJob(job);
308 } 271 }
309 272
310 LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const { 273 LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const {
311 Job* job = static_cast<Job*>(request); 274 Job* job = static_cast<Job*>(request);
312 CHECK_EQ(1u, pending_jobs_.count(job));
313 return job->GetLoadState(); 275 return job->GetLoadState();
314 } 276 }
315 277
316 } // namespace 278 } // namespace
317 279
318 // A Job to create a ProxyResolver instance. 280 // A Job to create a ProxyResolver instance.
319 // 281 //
320 // Note: a Job instance is not tied to a particular resolve request, and hence 282 // Note: a Job instance is not tied to a particular resolve request, and hence
321 // there is no per-request logging to be done (any netlog events are only sent 283 // there is no per-request logging to be done (any netlog events are only sent
322 // globally) so this always uses an empty BoundNetLog. 284 // globally) so this always uses an empty BoundNetLog.
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 return ERR_PAC_SCRIPT_FAILED; 366 return ERR_PAC_SCRIPT_FAILED;
405 } 367 }
406 request->reset(new Job(this, pac_script, resolver, callback, 368 request->reset(new Job(this, pac_script, resolver, callback,
407 error_observer_factory_.is_null() 369 error_observer_factory_.is_null()
408 ? nullptr 370 ? nullptr
409 : error_observer_factory_.Run())); 371 : error_observer_factory_.Run()));
410 return ERR_IO_PENDING; 372 return ERR_IO_PENDING;
411 } 373 }
412 374
413 } // namespace net 375 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698