| 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 4203eea39cdc06ec09a5ecb7b4d2cabedb1dd5d2..51f511c5eccb33d4b97225c23863075f5eaec648 100644
|
| --- a/net/proxy/proxy_resolver_factory_mojo.cc
|
| +++ b/net/proxy/proxy_resolver_factory_mojo.cc
|
| @@ -118,13 +118,14 @@ class ProxyResolverMojo : public ProxyResolver {
|
| int GetProxyForURL(const GURL& url,
|
| ProxyInfo* results,
|
| const net::CompletionCallback& callback,
|
| - RequestHandle* request,
|
| + scoped_ptr<Request>* request,
|
| const BoundNetLog& net_log) override;
|
| - void CancelRequest(RequestHandle request) override;
|
| - LoadState GetLoadState(RequestHandle request) const override;
|
|
|
| private:
|
| class Job;
|
| + class RequestImpl;
|
| +
|
| + base::ThreadChecker thread_checker_;
|
|
|
| // Mojo error handler.
|
| void OnConnectionError();
|
| @@ -142,22 +143,34 @@ class ProxyResolverMojo : public ProxyResolver {
|
|
|
| std::set<Job*> pending_jobs_;
|
|
|
| - base::ThreadChecker thread_checker_;
|
|
|
| scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(ProxyResolverMojo);
|
| };
|
|
|
| +class ProxyResolverMojo::RequestImpl : public ProxyResolver::Request {
|
| + public:
|
| + RequestImpl(base::WeakPtr<Job> job);
|
| +
|
| + ~RequestImpl() override;
|
| +
|
| + LoadState GetLoadState() override;
|
| +
|
| + private:
|
| + base::WeakPtr<Job> job_;
|
| +};
|
| +
|
| class ProxyResolverMojo::Job
|
| - : public ClientMixin<interfaces::ProxyResolverRequestClient> {
|
| + : public ClientMixin<interfaces::ProxyResolverRequestClient>,
|
| + public base::SupportsWeakPtr<Job>,
|
| + public base::RefCounted<Job> {
|
| 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();
|
| @@ -165,7 +178,14 @@ class ProxyResolverMojo::Job
|
| // Returns the LoadState of this job.
|
| LoadState GetLoadState();
|
|
|
| + ProxyResolverMojo* GetResolver();
|
| +
|
| + // Delete seld owned refpointer
|
| + void Remove();
|
| +
|
| private:
|
| + ~Job() override;
|
| + friend class base::RefCounted<Job>;
|
| // Mojo error handler.
|
| void OnConnectionError();
|
|
|
| @@ -181,8 +201,27 @@ class ProxyResolverMojo::Job
|
|
|
| base::ThreadChecker thread_checker_;
|
| mojo::Binding<interfaces::ProxyResolverRequestClient> binding_;
|
| +
|
| + // The job holds a reference to itself to ensure that it remains alive until
|
| + // either completion or cancellation. This is the only owner.
|
| + scoped_refptr<Job> owned_self_reference_ = this;
|
| };
|
|
|
| +ProxyResolverMojo::RequestImpl::RequestImpl(base::WeakPtr<Job> job)
|
| + : job_(job) {}
|
| +
|
| +ProxyResolverMojo::RequestImpl::~RequestImpl() {
|
| + if (job_) {
|
| + job_->Cancel();
|
| + job_->GetResolver()->RemoveJob(job_.get());
|
| + }
|
| +}
|
| +
|
| +LoadState ProxyResolverMojo::RequestImpl::GetLoadState() {
|
| + CHECK_EQ(1u, job_->GetResolver()->pending_jobs_.count(job_.get()));
|
| + return job_->GetLoadState();
|
| +}
|
| +
|
| ProxyResolverMojo::Job::Job(ProxyResolverMojo* resolver,
|
| const GURL& url,
|
| ProxyInfo* results,
|
| @@ -223,6 +262,14 @@ LoadState ProxyResolverMojo::Job::GetLoadState() {
|
| : LOAD_STATE_RESOLVING_PROXY_FOR_URL;
|
| }
|
|
|
| +ProxyResolverMojo* ProxyResolverMojo::Job::GetResolver() {
|
| + return resolver_;
|
| +};
|
| +
|
| +void ProxyResolverMojo::Job::Remove() {
|
| + owned_self_reference_ = NULL;
|
| +}
|
| +
|
| void ProxyResolverMojo::Job::OnConnectionError() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DVLOG(1) << "ProxyResolverMojo::Job::OnConnectionError";
|
| @@ -279,40 +326,29 @@ void ProxyResolverMojo::RemoveJob(Job* job) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| size_t num_erased = pending_jobs_.erase(job);
|
| DCHECK(num_erased);
|
| - delete job;
|
| + job->Remove();
|
| }
|
|
|
| int ProxyResolverMojo::GetProxyForURL(const GURL& url,
|
| ProxyInfo* results,
|
| const CompletionCallback& callback,
|
| - RequestHandle* request,
|
| + scoped_ptr<Request>* request,
|
| const BoundNetLog& net_log) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| 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;
|
| + // Job owns itselfs.
|
| + scoped_refptr<Job> job = new Job(this, url, results, callback, net_log);
|
| + bool inserted = pending_jobs_.insert(job.get()).second;
|
| DCHECK(inserted);
|
| - *request = job;
|
| + request->reset(new RequestImpl(job->AsWeakPtr()));
|
|
|
| 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);
|
| -}
|
|
|
| -LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const {
|
| - Job* job = static_cast<Job*>(request);
|
| - CHECK_EQ(1u, pending_jobs_.count(job));
|
| - return job->GetLoadState();
|
| -}
|
|
|
| } // namespace
|
|
|
|
|