Index: net/proxy/proxy_resolver_mojo.cc |
diff --git a/net/proxy/proxy_resolver_mojo.cc b/net/proxy/proxy_resolver_mojo.cc |
index 3801d41a093cb723ab7f21b87f3326ca48ed3f0a..ffa093cdb47772711686e51f5f53736d1476b75d 100644 |
--- a/net/proxy/proxy_resolver_mojo.cc |
+++ b/net/proxy/proxy_resolver_mojo.cc |
@@ -14,6 +14,7 @@ |
#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_error_observer.h" |
#include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h" |
#include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h" |
@@ -54,6 +55,28 @@ class ProxyResolverMojo::Job : public interfaces::ProxyResolverRequestClient, |
mojo::Binding<interfaces::ProxyResolverRequestClient> binding_; |
}; |
+class ProxyResolverMojo::ErrorObserverHolder |
+ : public interfaces::ProxyResolverErrorObserver { |
+ public: |
+ ErrorObserverHolder( |
+ scoped_ptr<net::ProxyResolverErrorObserver> error_observer); |
+ |
+ // Returns an interfaces::ProxyResolverErrorObserverPtr that can be used to |
+ // report errors to the ProxyResolverErrorObserver passed when constructing |
+ // |this|. The results of previous calls will no longer able to report errors |
+ // when this is called. |
+ interfaces::ProxyResolverErrorObserverPtr CreateHandle(); |
+ |
+ 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); |
+}; |
+ |
ProxyResolverMojo::Job::Job(ProxyResolverMojo* resolver, |
const GURL& url, |
ProxyInfo* results, |
@@ -111,10 +134,12 @@ void ProxyResolverMojo::Job::LoadStateChanged(int32_t load_state) { |
ProxyResolverMojo::ProxyResolverMojo( |
MojoProxyResolverFactory* mojo_proxy_resolver_factory, |
- HostResolver* host_resolver) |
+ HostResolver* host_resolver, |
+ scoped_ptr<ProxyResolverErrorObserver> error_observer) |
: ProxyResolver(true /* |expects_pac_bytes| */), |
mojo_proxy_resolver_factory_(mojo_proxy_resolver_factory), |
- host_resolver_(host_resolver) { |
+ host_resolver_(host_resolver), |
+ error_observer_(new ErrorObserverHolder(error_observer.Pass())) { |
} |
ProxyResolverMojo::~ProxyResolverMojo() { |
@@ -178,7 +203,8 @@ void ProxyResolverMojo::SetUpServices() { |
mojo_host_resolver_.get(), mojo::GetProxy(&mojo_host_resolver_ptr))); |
mojo_proxy_resolver_ptr_.reset(); |
mojo_proxy_resolver_factory_->Create( |
- mojo::GetProxy(&mojo_proxy_resolver_ptr_), mojo_host_resolver_ptr.Pass()); |
+ mojo::GetProxy(&mojo_proxy_resolver_ptr_), mojo_host_resolver_ptr.Pass(), |
+ error_observer_->CreateHandle()); |
mojo_proxy_resolver_ptr_.set_error_handler(this); |
} |
@@ -261,4 +287,27 @@ LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const { |
return job->load_state(); |
} |
+ProxyResolverMojo::ErrorObserverHolder::ErrorObserverHolder( |
+ scoped_ptr<net::ProxyResolverErrorObserver> error_observer) |
+ : error_observer_(error_observer.Pass()), binding_(this) { |
+} |
+ |
+interfaces::ProxyResolverErrorObserverPtr |
+ProxyResolverMojo::ErrorObserverHolder::CreateHandle() { |
+ interfaces::ProxyResolverErrorObserverPtr result; |
+ if (error_observer_) { |
+ if (binding_.is_bound()) |
+ binding_.Close(); |
+ binding_.Bind(mojo::GetProxy(&result)); |
+ } |
+ return result.Pass(); |
+} |
+ |
+void ProxyResolverMojo::ErrorObserverHolder::OnPacScriptError( |
+ int32_t line_number, |
+ const mojo::String& error) { |
+ DCHECK(error_observer_); |
+ error_observer_->OnPACScriptError(line_number, error.To<base::string16>()); |
+} |
+ |
} // namespace net |