Index: net/proxy/proxy_resolver_factory_mojo.cc |
diff --git a/net/proxy/proxy_resolver_factory_mojo.cc b/net/proxy/proxy_resolver_factory_mojo.cc |
index 592e7489f127b0d97e7d2bde8c68f3725f788183..9ba83daee90a8a22dbc2b7f8002738c457e19c62 100644 |
--- a/net/proxy/proxy_resolver_factory_mojo.cc |
+++ b/net/proxy/proxy_resolver_factory_mojo.cc |
@@ -12,6 +12,7 @@ |
#include "base/threading/thread_checker.h" |
#include "base/values.h" |
#include "mojo/common/common_type_converters.h" |
+#include "mojo/common/strong_binding_set.h" |
#include "mojo/common/url_type_converters.h" |
#include "mojo/public/cpp/bindings/binding.h" |
#include "net/base/load_states.h" |
@@ -122,13 +123,36 @@ class ProxyResolverMojo : public ProxyResolver { |
LoadState GetLoadState(RequestHandle request) const override; |
private: |
- class Job; |
+ class Job : public ClientMixin<interfaces::ProxyResolverRequestClient> { |
+ public: |
+ Job(ProxyResolverMojo* resolver, |
+ ProxyInfo* results, |
+ const CompletionCallback& callback, |
+ const BoundNetLog& net_log); |
+ ~Job() override; |
+ |
+ // Cancels the job and prevents the callback from being run. |
+ void Cancel(); |
+ |
+ // Returns the LoadState of this job. |
+ LoadState GetLoadState(); |
+ |
+ private: |
+ // Overridden from interfaces::ProxyResolverRequestClient: |
+ void ReportResult( |
+ int32_t error, |
+ mojo::Array<interfaces::ProxyServerPtr> proxy_servers) override; |
+ |
+ ProxyResolverMojo* resolver_; |
+ ProxyInfo* results_; |
+ CompletionCallback callback_; |
+ |
+ base::ThreadChecker thread_checker_; |
+ }; |
// Mojo error handler. |
void OnConnectionError(); |
- void RemoveJob(Job* job); |
- |
// Connection to the Mojo proxy resolver. |
interfaces::ProxyResolverPtr mojo_proxy_resolver_ptr_; |
@@ -138,7 +162,7 @@ class ProxyResolverMojo : public ProxyResolver { |
NetLog* net_log_; |
- std::set<Job*> pending_jobs_; |
+ mojo::StrongBindingSet<Job> pending_jobs_; |
base::ThreadChecker thread_checker_; |
@@ -147,42 +171,7 @@ class ProxyResolverMojo : public ProxyResolver { |
DISALLOW_COPY_AND_ASSIGN(ProxyResolverMojo); |
}; |
-class ProxyResolverMojo::Job |
- : public ClientMixin<interfaces::ProxyResolverRequestClient> { |
- public: |
- Job(ProxyResolverMojo* resolver, |
- const GURL& url, |
- ProxyInfo* results, |
- const CompletionCallback& callback, |
- const BoundNetLog& net_log); |
- ~Job() override; |
- |
- // Cancels the job and prevents the callback from being run. |
- void Cancel(); |
- |
- // Returns the LoadState of this job. |
- LoadState GetLoadState(); |
- |
- private: |
- // Mojo error handler. |
- void OnConnectionError(); |
- |
- // Overridden from interfaces::ProxyResolverRequestClient: |
- void ReportResult( |
- int32_t error, |
- mojo::Array<interfaces::ProxyServerPtr> proxy_servers) override; |
- |
- ProxyResolverMojo* resolver_; |
- const GURL url_; |
- ProxyInfo* results_; |
- CompletionCallback callback_; |
- |
- base::ThreadChecker thread_checker_; |
- mojo::Binding<interfaces::ProxyResolverRequestClient> binding_; |
-}; |
- |
ProxyResolverMojo::Job::Job(ProxyResolverMojo* resolver, |
- const GURL& url, |
ProxyInfo* results, |
const CompletionCallback& callback, |
const BoundNetLog& net_log) |
@@ -192,18 +181,8 @@ ProxyResolverMojo::Job::Job(ProxyResolverMojo* resolver, |
resolver->net_log_, |
net_log), |
resolver_(resolver), |
- url_(url), |
results_(results), |
- callback_(callback), |
- binding_(this) { |
- binding_.set_connection_error_handler(base::Bind( |
- &ProxyResolverMojo::Job::OnConnectionError, base::Unretained(this))); |
- |
- interfaces::ProxyResolverRequestClientPtr client_ptr; |
- binding_.Bind(mojo::GetProxy(&client_ptr)); |
- resolver_->mojo_proxy_resolver_ptr_->GetProxyForUrl(mojo::String::From(url_), |
- client_ptr.Pass()); |
-} |
+ callback_(callback) {} |
ProxyResolverMojo::Job::~Job() { |
DCHECK(thread_checker_.CalledOnValidThread()); |
@@ -222,12 +201,6 @@ LoadState ProxyResolverMojo::Job::GetLoadState() { |
: LOAD_STATE_RESOLVING_PROXY_FOR_URL; |
} |
-void ProxyResolverMojo::Job::OnConnectionError() { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- DVLOG(1) << "ProxyResolverMojo::Job::OnConnectionError"; |
- resolver_->RemoveJob(this); |
-} |
- |
void ProxyResolverMojo::Job::ReportResult( |
int32_t error, |
mojo::Array<interfaces::ProxyServerPtr> proxy_servers) { |
@@ -241,7 +214,7 @@ void ProxyResolverMojo::Job::ReportResult( |
CompletionCallback callback = callback_; |
callback_.Reset(); |
- resolver_->RemoveJob(this); |
+ resolver_->pending_jobs_.DestroyService(this); |
callback.Run(error); |
} |
@@ -274,13 +247,6 @@ void ProxyResolverMojo::OnConnectionError() { |
mojo_proxy_resolver_ptr_.reset(); |
} |
-void ProxyResolverMojo::RemoveJob(Job* job) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- size_t num_erased = pending_jobs_.erase(job); |
- DCHECK(num_erased); |
- delete job; |
-} |
- |
int ProxyResolverMojo::GetProxyForURL(const GURL& url, |
ProxyInfo* results, |
const CompletionCallback& callback, |
@@ -291,25 +257,21 @@ int ProxyResolverMojo::GetProxyForURL(const GURL& url, |
if (!mojo_proxy_resolver_ptr_) |
return ERR_PAC_SCRIPT_TERMINATED; |
- Job* job = new Job(this, url, results, callback, net_log); |
- bool inserted = pending_jobs_.insert(job).second; |
- DCHECK(inserted); |
- *request = job; |
- |
+ interfaces::ProxyResolverRequestClientPtr client_ptr; |
+ *request = pending_jobs_.EmplaceService(mojo::GetProxy(&client_ptr), this, |
+ results, callback, net_log); |
+ mojo_proxy_resolver_ptr_->GetProxyForUrl(mojo::String::From(url), |
+ client_ptr.Pass()); |
return ERR_IO_PENDING; |
} |
void ProxyResolverMojo::CancelRequest(RequestHandle request) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- Job* job = static_cast<Job*>(request); |
- DCHECK(job); |
- job->Cancel(); |
- RemoveJob(job); |
+ pending_jobs_.DestroyService(static_cast<Job*>(request)); |
} |
LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const { |
Job* job = static_cast<Job*>(request); |
- CHECK_EQ(1u, pending_jobs_.count(job)); |
return job->GetLoadState(); |
} |