| 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
|
|
|