Index: net/proxy/proxy_resolver_factory.cc |
diff --git a/net/proxy/proxy_resolver_factory.cc b/net/proxy/proxy_resolver_factory.cc |
index 8866b4b1ba8e17fbdf2470d9bccccfae609f1645..b544d892ac7e682c860743ed1a15f7484efe6ee2 100644 |
--- a/net/proxy/proxy_resolver_factory.cc |
+++ b/net/proxy/proxy_resolver_factory.cc |
@@ -8,69 +8,79 @@ |
#include "net/proxy/proxy_resolver.h" |
namespace net { |
-namespace { |
-class Job : public ProxyResolverFactory::Request { |
+class LegacyProxyResolverFactory::Job : public ProxyResolverFactory::Request { |
public: |
- Job(const scoped_refptr<ProxyResolverScriptData>& pac_script, |
+ Job(LegacyProxyResolverFactory* factory, |
+ const scoped_refptr<ProxyResolverScriptData>& pac_script, |
scoped_ptr<ProxyResolver> resolver, |
scoped_ptr<ProxyResolver>* resolver_out, |
const net::CompletionCallback& callback); |
~Job() override; |
int Start(); |
+ void FactoryDestroyed(); |
+ |
private: |
void OnSetPacScriptDone(int error); |
+ LegacyProxyResolverFactory* factory_; |
const scoped_refptr<ProxyResolverScriptData> pac_script_; |
scoped_ptr<ProxyResolver> resolver_; |
scoped_ptr<ProxyResolver>* resolver_out_; |
const net::CompletionCallback callback_; |
- bool in_progress_; |
}; |
-Job::Job(const scoped_refptr<ProxyResolverScriptData>& pac_script, |
- scoped_ptr<ProxyResolver> resolver, |
- scoped_ptr<ProxyResolver>* resolver_out, |
- const net::CompletionCallback& callback) |
- : pac_script_(pac_script), |
+LegacyProxyResolverFactory::Job::Job( |
+ LegacyProxyResolverFactory* factory, |
+ const scoped_refptr<ProxyResolverScriptData>& pac_script, |
+ scoped_ptr<ProxyResolver> resolver, |
+ scoped_ptr<ProxyResolver>* resolver_out, |
+ const net::CompletionCallback& callback) |
+ : factory_(factory), |
+ pac_script_(pac_script), |
resolver_(resolver.Pass()), |
resolver_out_(resolver_out), |
- callback_(callback), |
- in_progress_(false) { |
+ callback_(callback) { |
} |
-Job::~Job() { |
- if (in_progress_) |
+LegacyProxyResolverFactory::Job::~Job() { |
+ if (factory_) { |
resolver_->CancelSetPacScript(); |
+ factory_->RemoveJob(this); |
+ } |
} |
-int Job::Start() { |
+int LegacyProxyResolverFactory::Job::Start() { |
int error = resolver_->SetPacScript( |
pac_script_, |
base::Bind(&Job::OnSetPacScriptDone, base::Unretained(this))); |
if (error != ERR_IO_PENDING) { |
+ factory_ = nullptr; |
if (error == OK) |
*resolver_out_ = resolver_.Pass(); |
return error; |
} |
- in_progress_ = true; |
return ERR_IO_PENDING; |
} |
-void Job::OnSetPacScriptDone(int error) { |
+void LegacyProxyResolverFactory::Job::FactoryDestroyed() { |
+ factory_ = nullptr; |
+ resolver_->CancelSetPacScript(); |
+} |
+ |
+void LegacyProxyResolverFactory::Job::OnSetPacScriptDone(int error) { |
+ factory_->RemoveJob(this); |
if (error == OK) |
*resolver_out_ = resolver_.Pass(); |
CompletionCallback callback = callback_; |
- in_progress_ = false; |
+ factory_ = nullptr; |
if (!callback.is_null()) |
callback.Run(error); |
} |
-} // namespace |
- |
ProxyResolverFactory::ProxyResolverFactory(bool expects_pac_bytes) |
: expects_pac_bytes_(expects_pac_bytes) { |
} |
@@ -83,6 +93,9 @@ LegacyProxyResolverFactory::LegacyProxyResolverFactory(bool expects_pac_bytes) |
} |
LegacyProxyResolverFactory::~LegacyProxyResolverFactory() { |
+ for (auto job : jobs_) { |
+ job->FactoryDestroyed(); |
+ } |
} |
int LegacyProxyResolverFactory::CreateProxyResolver( |
@@ -91,13 +104,19 @@ int LegacyProxyResolverFactory::CreateProxyResolver( |
const net::CompletionCallback& callback, |
scoped_ptr<ProxyResolverFactory::Request>* request) { |
scoped_ptr<Job> job( |
- new Job(pac_script, CreateProxyResolver(), resolver, callback)); |
+ new Job(this, pac_script, CreateProxyResolver(), resolver, callback)); |
int error = job->Start(); |
if (error != ERR_IO_PENDING) |
return error; |
+ jobs_.insert(job.get()); |
*request = job.Pass(); |
return ERR_IO_PENDING; |
} |
+void LegacyProxyResolverFactory::RemoveJob(Job* job) { |
+ size_t erased = jobs_.erase(job); |
+ DCHECK_EQ(1u, erased); |
+} |
+ |
} // namespace net |