| Index: net/proxy/proxy_resolver_mojo.cc
|
| diff --git a/net/proxy/proxy_resolver_mojo.cc b/net/proxy/proxy_resolver_mojo.cc
|
| index 6008a84a70e048b5431181197534fc23055d2cfd..c676827a90ae9d2e1d190599283e62445d6517b5 100644
|
| --- a/net/proxy/proxy_resolver_mojo.cc
|
| +++ b/net/proxy/proxy_resolver_mojo.cc
|
| @@ -11,6 +11,7 @@
|
| #include "mojo/common/url_type_converters.h"
|
| #include "net/base/net_errors.h"
|
| #include "net/dns/mojo_host_resolver_impl.h"
|
| +#include "net/proxy/mojo_proxy_resolver_factory.h"
|
| #include "net/proxy/mojo_proxy_type_converters.h"
|
| #include "net/proxy/proxy_info.h"
|
| #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h"
|
| @@ -112,11 +113,13 @@ void ProxyResolverMojo::Job::LoadStateChanged(int32_t load_state) {
|
| ProxyResolverMojo::ProxyResolverMojo(
|
| interfaces::ProxyResolverPtr resolver_ptr,
|
| scoped_ptr<interfaces::HostResolver> host_resolver,
|
| - scoped_ptr<mojo::Binding<interfaces::HostResolver>> host_resolver_binding)
|
| + scoped_ptr<mojo::Binding<interfaces::HostResolver>> host_resolver_binding,
|
| + scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner)
|
| : ProxyResolver(true),
|
| mojo_proxy_resolver_ptr_(resolver_ptr.Pass()),
|
| mojo_host_resolver_(host_resolver.Pass()),
|
| - mojo_host_resolver_binding_(host_resolver_binding.Pass()) {
|
| + mojo_host_resolver_binding_(host_resolver_binding.Pass()),
|
| + on_delete_callback_runner_(on_delete_callback_runner.Pass()) {
|
| mojo_proxy_resolver_ptr_.set_error_handler(this);
|
| }
|
|
|
| @@ -159,14 +162,8 @@ int ProxyResolverMojo::GetProxyForURL(const GURL& url,
|
| const BoundNetLog& net_log) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| - // If the Mojo service is not connected, fail. The Mojo service is connected
|
| - // when the script is set, which must be done after construction and after a
|
| - // previous request returns ERR_PAC_SCRIPT_TERMINATED due to the Mojo proxy
|
| - // resolver process crashing.
|
| - if (!mojo_proxy_resolver_ptr_) {
|
| - DVLOG(1) << "ProxyResolverMojo::GetProxyForURL: Mojo not connected";
|
| + if (!mojo_proxy_resolver_ptr_)
|
| return ERR_PAC_SCRIPT_TERMINATED;
|
| - }
|
|
|
| Job* job = new Job(this, url, results, callback);
|
| bool inserted = pending_jobs_.insert(job).second;
|
| @@ -210,7 +207,7 @@ class ProxyResolverFactoryMojo::Job
|
| interfaces::ProxyResolverFactoryRequestClientPtr client_ptr;
|
| binding_.Bind(mojo::GetProxy(&client_ptr));
|
| host_resolver_binding_->Bind(mojo::GetProxy(&host_resolver_ptr));
|
| - factory_->mojo_proxy_factory_->CreateResolver(
|
| + on_delete_callback_runner_ = factory_->mojo_proxy_factory_->CreateResolver(
|
| mojo::String::From(pac_script->utf16()), mojo::GetProxy(&resolver_ptr_),
|
| host_resolver_ptr.Pass(), client_ptr.Pass());
|
| resolver_ptr_.set_error_handler(this);
|
| @@ -219,6 +216,7 @@ class ProxyResolverFactoryMojo::Job
|
|
|
| void OnConnectionError() override {
|
| callback_.Run(ERR_PAC_SCRIPT_TERMINATED);
|
| + on_delete_callback_runner_.reset();
|
| }
|
|
|
| private:
|
| @@ -226,10 +224,11 @@ class ProxyResolverFactoryMojo::Job
|
| resolver_ptr_.set_error_handler(nullptr);
|
| binding_.set_error_handler(nullptr);
|
| if (error == OK) {
|
| - resolver_->reset(new ProxyResolverMojo(resolver_ptr_.Pass(),
|
| - host_resolver_.Pass(),
|
| - host_resolver_binding_.Pass()));
|
| + resolver_->reset(new ProxyResolverMojo(
|
| + resolver_ptr_.Pass(), host_resolver_.Pass(),
|
| + host_resolver_binding_.Pass(), on_delete_callback_runner_.Pass()));
|
| }
|
| + on_delete_callback_runner_.reset();
|
| callback_.Run(error);
|
| }
|
|
|
| @@ -240,16 +239,19 @@ class ProxyResolverFactoryMojo::Job
|
| mojo::Binding<interfaces::ProxyResolverFactoryRequestClient> binding_;
|
| scoped_ptr<interfaces::HostResolver> host_resolver_;
|
| scoped_ptr<mojo::Binding<interfaces::HostResolver>> host_resolver_binding_;
|
| + scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner_;
|
| };
|
|
|
| ProxyResolverFactoryMojo::ProxyResolverFactoryMojo(
|
| - interfaces::ProxyResolverFactory* mojo_proxy_factory,
|
| + MojoProxyResolverFactory* mojo_proxy_factory,
|
| HostResolver* host_resolver)
|
| : ProxyResolverFactory(true),
|
| mojo_proxy_factory_(mojo_proxy_factory),
|
| host_resolver_(host_resolver) {
|
| }
|
|
|
| +ProxyResolverFactoryMojo::~ProxyResolverFactoryMojo() = default;
|
| +
|
| int ProxyResolverFactoryMojo::CreateProxyResolver(
|
| const scoped_refptr<ProxyResolverScriptData>& pac_script,
|
| scoped_ptr<ProxyResolver>* resolver,
|
|
|