Index: net/proxy/proxy_resolver_mojo.cc |
diff --git a/net/proxy/proxy_resolver_mojo.cc b/net/proxy/proxy_resolver_mojo.cc |
index c676827a90ae9d2e1d190599283e62445d6517b5..c0e38fb26a138a37d53d2ab233fa158894d12730 100644 |
--- a/net/proxy/proxy_resolver_mojo.cc |
+++ b/net/proxy/proxy_resolver_mojo.cc |
@@ -4,20 +4,123 @@ |
#include "net/proxy/proxy_resolver_mojo.h" |
+#include <set> |
+ |
#include "base/bind.h" |
#include "base/logging.h" |
#include "base/stl_util.h" |
+#include "base/threading/thread_checker.h" |
#include "mojo/common/common_type_converters.h" |
#include "mojo/common/url_type_converters.h" |
+#include "net/base/load_states.h" |
#include "net/base/net_errors.h" |
#include "net/dns/mojo_host_resolver_impl.h" |
+#include "net/interfaces/host_resolver_service.mojom.h" |
+#include "net/interfaces/proxy_resolver_service.mojom.h" |
#include "net/proxy/mojo_proxy_resolver_factory.h" |
#include "net/proxy/mojo_proxy_type_converters.h" |
#include "net/proxy/proxy_info.h" |
+#include "net/proxy/proxy_resolver.h" |
+#include "net/proxy/proxy_resolver_error_observer.h" |
+#include "net/proxy/proxy_resolver_script_data.h" |
#include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h" |
#include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h" |
namespace net { |
+namespace { |
+ |
+class ErrorObserverHolder : public interfaces::ProxyResolverErrorObserver { |
+ public: |
+ ErrorObserverHolder( |
+ scoped_ptr<net::ProxyResolverErrorObserver> error_observer, |
+ mojo::InterfaceRequest<interfaces::ProxyResolverErrorObserver> request); |
+ ~ErrorObserverHolder() override; |
+ |
+ void OnPacScriptError(int32_t line_number, |
+ const mojo::String& error) override; |
+ |
+ private: |
+ scoped_ptr<net::ProxyResolverErrorObserver> error_observer_; |
+ mojo::Binding<interfaces::ProxyResolverErrorObserver> binding_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ErrorObserverHolder); |
+}; |
+ |
+ErrorObserverHolder::ErrorObserverHolder( |
+ scoped_ptr<net::ProxyResolverErrorObserver> error_observer, |
+ mojo::InterfaceRequest<interfaces::ProxyResolverErrorObserver> request) |
+ : error_observer_(error_observer.Pass()), binding_(this, request.Pass()) { |
+} |
+ |
+ErrorObserverHolder::~ErrorObserverHolder() = default; |
+ |
+void ErrorObserverHolder::OnPacScriptError(int32_t line_number, |
+ const mojo::String& error) { |
+ DCHECK(error_observer_); |
+ error_observer_->OnPACScriptError(line_number, error.To<base::string16>()); |
+} |
+ |
+// Implementation of ProxyResolver that connects to a Mojo service to evaluate |
+// PAC scripts. This implementation only knows about Mojo services, and |
+// therefore that service may live in or out of process. |
+// |
+// This implementation reports disconnections from the Mojo service (i.e. if the |
+// service is out-of-process and that process crashes) using the error code |
+// ERR_PAC_SCRIPT_TERMINATED. |
+class ProxyResolverMojo : public ProxyResolver, public mojo::ErrorHandler { |
+ public: |
+ // Constructs a ProxyResolverMojo that connects to a mojo proxy resolver |
+ // implementation using |resolver_ptr|. The implementation uses |
+ // |host_resolver| as the DNS resolver, using |host_resolver_binding| to |
+ // communicate with it. When deleted, the closure contained within |
+ // |on_delete_callback_runner| will be run. |
+ // TODO(amistry): Add NetLog. |
+ ProxyResolverMojo( |
+ interfaces::ProxyResolverPtr resolver_ptr, |
+ scoped_ptr<interfaces::HostResolver> host_resolver, |
+ scoped_ptr<mojo::Binding<interfaces::HostResolver>> host_resolver_binding, |
+ scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner, |
+ scoped_ptr<ErrorObserverHolder> error_observer); |
+ ~ProxyResolverMojo() override; |
+ |
+ // ProxyResolver implementation: |
+ int GetProxyForURL(const GURL& url, |
+ ProxyInfo* results, |
+ const net::CompletionCallback& callback, |
+ RequestHandle* request, |
+ const BoundNetLog& net_log) override; |
+ void CancelRequest(RequestHandle request) override; |
+ LoadState GetLoadState(RequestHandle request) const override; |
+ void CancelSetPacScript() override; |
+ int SetPacScript(const scoped_refptr<ProxyResolverScriptData>& pac_script, |
+ const net::CompletionCallback& callback) override; |
+ |
+ private: |
+ class Job; |
+ |
+ // Overridden from mojo::ErrorHandler: |
+ void OnConnectionError() override; |
+ |
+ void RemoveJob(Job* job); |
+ |
+ // Connection to the Mojo proxy resolver. |
+ interfaces::ProxyResolverPtr mojo_proxy_resolver_ptr_; |
+ |
+ // Mojo host resolver service and binding. |
+ scoped_ptr<interfaces::HostResolver> mojo_host_resolver_; |
+ scoped_ptr<mojo::Binding<interfaces::HostResolver>> |
+ mojo_host_resolver_binding_; |
+ |
+ scoped_ptr<ErrorObserverHolder> error_observer_; |
+ |
+ std::set<Job*> pending_jobs_; |
+ |
+ base::ThreadChecker thread_checker_; |
+ |
+ scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ProxyResolverMojo); |
+}; |
class ProxyResolverMojo::Job : public interfaces::ProxyResolverRequestClient, |
public mojo::ErrorHandler { |
@@ -114,11 +217,13 @@ ProxyResolverMojo::ProxyResolverMojo( |
interfaces::ProxyResolverPtr resolver_ptr, |
scoped_ptr<interfaces::HostResolver> host_resolver, |
scoped_ptr<mojo::Binding<interfaces::HostResolver>> host_resolver_binding, |
- scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner) |
+ scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner, |
+ scoped_ptr<ErrorObserverHolder> error_observer) |
: ProxyResolver(true), |
mojo_proxy_resolver_ptr_(resolver_ptr.Pass()), |
mojo_host_resolver_(host_resolver.Pass()), |
mojo_host_resolver_binding_(host_resolver_binding.Pass()), |
+ error_observer_(error_observer.Pass()), |
on_delete_callback_runner_(on_delete_callback_runner.Pass()) { |
mojo_proxy_resolver_ptr_.set_error_handler(this); |
} |
@@ -187,6 +292,8 @@ LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const { |
return job->load_state(); |
} |
+} // namespace |
+ |
class ProxyResolverFactoryMojo::Job |
: public interfaces::ProxyResolverFactoryRequestClient, |
public mojo::ErrorHandler, |
@@ -205,11 +312,20 @@ class ProxyResolverFactoryMojo::Job |
new mojo::Binding<interfaces::HostResolver>(host_resolver_.get())) { |
interfaces::HostResolverPtr host_resolver_ptr; |
interfaces::ProxyResolverFactoryRequestClientPtr client_ptr; |
+ interfaces::ProxyResolverErrorObserverPtr error_observer_ptr; |
binding_.Bind(mojo::GetProxy(&client_ptr)); |
+ if (!factory_->error_observer_factory_.is_null()) { |
+ scoped_ptr<ProxyResolverErrorObserver> error_observer = |
+ factory_->error_observer_factory_.Run(); |
+ if (error_observer) { |
+ error_observer_.reset(new ErrorObserverHolder( |
+ error_observer.Pass(), mojo::GetProxy(&error_observer_ptr))); |
+ } |
+ } |
host_resolver_binding_->Bind(mojo::GetProxy(&host_resolver_ptr)); |
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()); |
+ host_resolver_ptr.Pass(), error_observer_ptr.Pass(), client_ptr.Pass()); |
resolver_ptr_.set_error_handler(this); |
binding_.set_error_handler(this); |
} |
@@ -226,7 +342,8 @@ class ProxyResolverFactoryMojo::Job |
if (error == OK) { |
resolver_->reset(new ProxyResolverMojo( |
resolver_ptr_.Pass(), host_resolver_.Pass(), |
- host_resolver_binding_.Pass(), on_delete_callback_runner_.Pass())); |
+ host_resolver_binding_.Pass(), on_delete_callback_runner_.Pass(), |
+ error_observer_.Pass())); |
} |
on_delete_callback_runner_.reset(); |
callback_.Run(error); |
@@ -240,14 +357,18 @@ class ProxyResolverFactoryMojo::Job |
scoped_ptr<interfaces::HostResolver> host_resolver_; |
scoped_ptr<mojo::Binding<interfaces::HostResolver>> host_resolver_binding_; |
scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner_; |
+ scoped_ptr<ErrorObserverHolder> error_observer_; |
}; |
ProxyResolverFactoryMojo::ProxyResolverFactoryMojo( |
MojoProxyResolverFactory* mojo_proxy_factory, |
- HostResolver* host_resolver) |
+ HostResolver* host_resolver, |
+ const base::Callback<scoped_ptr<ProxyResolverErrorObserver>()>& |
+ error_observer_factory) |
: ProxyResolverFactory(true), |
mojo_proxy_factory_(mojo_proxy_factory), |
- host_resolver_(host_resolver) { |
+ host_resolver_(host_resolver), |
+ error_observer_factory_(error_observer_factory) { |
} |
ProxyResolverFactoryMojo::~ProxyResolverFactoryMojo() = default; |