| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/proxy/mojo_proxy_resolver_factory_impl.h" | 5 #include "net/proxy/mojo_proxy_resolver_factory_impl.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
| 11 #include "net/dns/host_resolver_mojo.h" | 11 #include "net/dns/host_resolver_mojo.h" |
| 12 #include "net/proxy/mojo_proxy_resolver_impl.h" | 12 #include "net/proxy/mojo_proxy_resolver_impl.h" |
| 13 #include "net/proxy/proxy_resolver_error_observer_mojo.h" | 13 #include "net/proxy/proxy_resolver_error_observer_mojo.h" |
| 14 #include "net/proxy/proxy_resolver_factory.h" | 14 #include "net/proxy/proxy_resolver_factory.h" |
| 15 #include "net/proxy/proxy_resolver_v8.h" | 15 #include "net/proxy/proxy_resolver_v8.h" |
| 16 #include "net/proxy/proxy_resolver_v8_tracing.h" | 16 #include "net/proxy/proxy_resolver_v8_tracing_wrapper.h" |
| 17 #include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h" | 17 #include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h" |
| 18 | 18 |
| 19 namespace net { | 19 namespace net { |
| 20 namespace { | 20 namespace { |
| 21 | 21 |
| 22 scoped_ptr<ProxyResolverErrorObserver> ReturnErrorObserver( | 22 scoped_ptr<ProxyResolverErrorObserver> ReturnErrorObserver( |
| 23 scoped_ptr<ProxyResolverErrorObserver> error_observer) { | 23 scoped_ptr<ProxyResolverErrorObserver> error_observer) { |
| 24 return error_observer; | 24 return error_observer; |
| 25 } | 25 } |
| 26 | 26 |
| 27 scoped_ptr<ProxyResolverFactory> CreateDefaultProxyResolver( | 27 scoped_ptr<ProxyResolverFactory> CreateDefaultProxyResolver( |
| 28 HostResolver* host_resolver, | 28 HostResolver* host_resolver, |
| 29 scoped_ptr<ProxyResolverErrorObserver> error_observer, | 29 scoped_ptr<ProxyResolverErrorObserver> error_observer) { |
| 30 const ProxyResolver::LoadStateChangedCallback& callback) { | 30 return make_scoped_ptr(new ProxyResolverFactoryV8TracingWrapper( |
| 31 return make_scoped_ptr(new ProxyResolverFactoryV8Tracing( | 31 host_resolver, nullptr, |
| 32 host_resolver, nullptr, callback, | |
| 33 base::Bind(&ReturnErrorObserver, base::Passed(&error_observer)))); | 32 base::Bind(&ReturnErrorObserver, base::Passed(&error_observer)))); |
| 34 } | 33 } |
| 35 | 34 |
| 36 class LoadStateChangeForwarder | |
| 37 : public base::RefCounted<LoadStateChangeForwarder> { | |
| 38 public: | |
| 39 LoadStateChangeForwarder() = default; | |
| 40 | |
| 41 void OnLoadStateChanged(ProxyResolver::RequestHandle request_handle, | |
| 42 LoadState load_state) const { | |
| 43 if (!callback_.is_null()) | |
| 44 callback_.Run(request_handle, load_state); | |
| 45 } | |
| 46 | |
| 47 void set_load_state_changed_callback( | |
| 48 const ProxyResolver::LoadStateChangedCallback& callback) { | |
| 49 callback_ = callback; | |
| 50 } | |
| 51 | |
| 52 private: | |
| 53 friend class base::RefCounted<LoadStateChangeForwarder>; | |
| 54 ~LoadStateChangeForwarder() = default; | |
| 55 | |
| 56 ProxyResolver::LoadStateChangedCallback callback_; | |
| 57 | |
| 58 DISALLOW_COPY_AND_ASSIGN(LoadStateChangeForwarder); | |
| 59 }; | |
| 60 | |
| 61 // A class to manage the lifetime of a MojoProxyResolverImpl and a | 35 // A class to manage the lifetime of a MojoProxyResolverImpl and a |
| 62 // HostResolverMojo. An instance will remain while the message pipes for both | 36 // HostResolverMojo. An instance will remain while the message pipes for both |
| 63 // mojo connections remain open. | 37 // mojo connections remain open. |
| 64 class MojoProxyResolverHolder : public mojo::ErrorHandler { | 38 class MojoProxyResolverHolder : public mojo::ErrorHandler { |
| 65 public: | 39 public: |
| 66 MojoProxyResolverHolder( | 40 MojoProxyResolverHolder( |
| 67 scoped_ptr<HostResolverMojo> host_resolver, | 41 scoped_ptr<HostResolverMojo> host_resolver, |
| 68 scoped_ptr<ProxyResolver> proxy_resolver_impl, | 42 scoped_ptr<ProxyResolver> proxy_resolver_impl, |
| 69 const scoped_refptr<LoadStateChangeForwarder>& | |
| 70 load_state_change_forwarder, | |
| 71 mojo::InterfaceRequest<interfaces::ProxyResolver> request); | 43 mojo::InterfaceRequest<interfaces::ProxyResolver> request); |
| 72 | 44 |
| 73 private: | 45 private: |
| 74 // mojo::ErrorHandler override. | 46 // mojo::ErrorHandler override. |
| 75 void OnConnectionError() override; | 47 void OnConnectionError() override; |
| 76 | 48 |
| 77 scoped_ptr<HostResolverMojo> host_resolver_; | 49 scoped_ptr<HostResolverMojo> host_resolver_; |
| 78 MojoProxyResolverImpl mojo_proxy_resolver_; | 50 MojoProxyResolverImpl mojo_proxy_resolver_; |
| 79 mojo::Binding<interfaces::ProxyResolver> binding_; | 51 mojo::Binding<interfaces::ProxyResolver> binding_; |
| 80 | 52 |
| 81 DISALLOW_COPY_AND_ASSIGN(MojoProxyResolverHolder); | 53 DISALLOW_COPY_AND_ASSIGN(MojoProxyResolverHolder); |
| 82 }; | 54 }; |
| 83 | 55 |
| 84 MojoProxyResolverHolder::MojoProxyResolverHolder( | 56 MojoProxyResolverHolder::MojoProxyResolverHolder( |
| 85 scoped_ptr<HostResolverMojo> host_resolver, | 57 scoped_ptr<HostResolverMojo> host_resolver, |
| 86 scoped_ptr<ProxyResolver> proxy_resolver_impl, | 58 scoped_ptr<ProxyResolver> proxy_resolver_impl, |
| 87 const scoped_refptr<LoadStateChangeForwarder>& load_state_change_forwarder, | |
| 88 mojo::InterfaceRequest<interfaces::ProxyResolver> request) | 59 mojo::InterfaceRequest<interfaces::ProxyResolver> request) |
| 89 : host_resolver_(host_resolver.Pass()), | 60 : host_resolver_(host_resolver.Pass()), |
| 90 mojo_proxy_resolver_( | 61 mojo_proxy_resolver_(proxy_resolver_impl.Pass()), |
| 91 proxy_resolver_impl.Pass(), | |
| 92 base::Bind(&LoadStateChangeForwarder::set_load_state_changed_callback, | |
| 93 load_state_change_forwarder)), | |
| 94 binding_(&mojo_proxy_resolver_, request.Pass()) { | 62 binding_(&mojo_proxy_resolver_, request.Pass()) { |
| 95 binding_.set_error_handler(this); | 63 binding_.set_error_handler(this); |
| 96 host_resolver_->set_disconnect_callback(base::Bind( | 64 host_resolver_->set_disconnect_callback(base::Bind( |
| 97 &MojoProxyResolverHolder::OnConnectionError, base::Unretained(this))); | 65 &MojoProxyResolverHolder::OnConnectionError, base::Unretained(this))); |
| 98 } | 66 } |
| 99 | 67 |
| 100 void MojoProxyResolverHolder::OnConnectionError() { | 68 void MojoProxyResolverHolder::OnConnectionError() { |
| 101 delete this; | 69 delete this; |
| 102 } | 70 } |
| 103 | 71 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 115 ~Job() override; | 83 ~Job() override; |
| 116 | 84 |
| 117 private: | 85 private: |
| 118 // mojo::ErrorHandler override. | 86 // mojo::ErrorHandler override. |
| 119 void OnConnectionError() override; | 87 void OnConnectionError() override; |
| 120 | 88 |
| 121 void OnProxyResolverCreated(int error); | 89 void OnProxyResolverCreated(int error); |
| 122 | 90 |
| 123 MojoProxyResolverFactoryImpl* const parent_; | 91 MojoProxyResolverFactoryImpl* const parent_; |
| 124 scoped_ptr<HostResolverMojo> host_resolver_; | 92 scoped_ptr<HostResolverMojo> host_resolver_; |
| 125 scoped_refptr<LoadStateChangeForwarder> load_state_change_forwarder_; | |
| 126 scoped_ptr<ProxyResolver> proxy_resolver_impl_; | 93 scoped_ptr<ProxyResolver> proxy_resolver_impl_; |
| 127 mojo::InterfaceRequest<interfaces::ProxyResolver> proxy_request_; | 94 mojo::InterfaceRequest<interfaces::ProxyResolver> proxy_request_; |
| 128 scoped_ptr<net::ProxyResolverFactory> factory_; | 95 scoped_ptr<net::ProxyResolverFactory> factory_; |
| 129 scoped_ptr<net::ProxyResolverFactory::Request> request_; | 96 scoped_ptr<net::ProxyResolverFactory::Request> request_; |
| 130 interfaces::ProxyResolverFactoryRequestClientPtr client_ptr_; | 97 interfaces::ProxyResolverFactoryRequestClientPtr client_ptr_; |
| 131 | 98 |
| 132 DISALLOW_COPY_AND_ASSIGN(Job); | 99 DISALLOW_COPY_AND_ASSIGN(Job); |
| 133 }; | 100 }; |
| 134 | 101 |
| 135 MojoProxyResolverFactoryImpl::Job::Job( | 102 MojoProxyResolverFactoryImpl::Job::Job( |
| 136 MojoProxyResolverFactoryImpl* factory, | 103 MojoProxyResolverFactoryImpl* factory, |
| 137 const scoped_refptr<ProxyResolverScriptData>& pac_script, | 104 const scoped_refptr<ProxyResolverScriptData>& pac_script, |
| 138 const MojoProxyResolverFactoryImpl::Factory& proxy_resolver_factory, | 105 const MojoProxyResolverFactoryImpl::Factory& proxy_resolver_factory, |
| 139 mojo::InterfaceRequest<interfaces::ProxyResolver> request, | 106 mojo::InterfaceRequest<interfaces::ProxyResolver> request, |
| 140 interfaces::HostResolverPtr host_resolver, | 107 interfaces::HostResolverPtr host_resolver, |
| 141 interfaces::ProxyResolverErrorObserverPtr error_observer, | 108 interfaces::ProxyResolverErrorObserverPtr error_observer, |
| 142 interfaces::ProxyResolverFactoryRequestClientPtr client) | 109 interfaces::ProxyResolverFactoryRequestClientPtr client) |
| 143 : parent_(factory), | 110 : parent_(factory), |
| 144 host_resolver_(new HostResolverMojo( | 111 host_resolver_(new HostResolverMojo( |
| 145 host_resolver.Pass(), | 112 host_resolver.Pass(), |
| 146 base::Bind(&MojoProxyResolverFactoryImpl::Job::OnConnectionError, | 113 base::Bind(&MojoProxyResolverFactoryImpl::Job::OnConnectionError, |
| 147 base::Unretained(this)))), | 114 base::Unretained(this)))), |
| 148 load_state_change_forwarder_(new LoadStateChangeForwarder), | |
| 149 proxy_request_(request.Pass()), | 115 proxy_request_(request.Pass()), |
| 150 factory_(proxy_resolver_factory.Run( | 116 factory_(proxy_resolver_factory.Run( |
| 151 host_resolver_.get(), | 117 host_resolver_.get(), |
| 152 ProxyResolverErrorObserverMojo::Create(error_observer.Pass()), | 118 ProxyResolverErrorObserverMojo::Create(error_observer.Pass()))), |
| 153 base::Bind(&LoadStateChangeForwarder::OnLoadStateChanged, | |
| 154 load_state_change_forwarder_))), | |
| 155 client_ptr_(client.Pass()) { | 119 client_ptr_(client.Pass()) { |
| 156 client_ptr_.set_error_handler(this); | 120 client_ptr_.set_error_handler(this); |
| 157 factory_->CreateProxyResolver( | 121 factory_->CreateProxyResolver( |
| 158 pac_script, &proxy_resolver_impl_, | 122 pac_script, &proxy_resolver_impl_, |
| 159 base::Bind(&MojoProxyResolverFactoryImpl::Job::OnProxyResolverCreated, | 123 base::Bind(&MojoProxyResolverFactoryImpl::Job::OnProxyResolverCreated, |
| 160 base::Unretained(this)), | 124 base::Unretained(this)), |
| 161 &request_); | 125 &request_); |
| 162 } | 126 } |
| 163 | 127 |
| 164 MojoProxyResolverFactoryImpl::Job::~Job() = default; | 128 MojoProxyResolverFactoryImpl::Job::~Job() = default; |
| 165 | 129 |
| 166 void MojoProxyResolverFactoryImpl::Job::OnConnectionError() { | 130 void MojoProxyResolverFactoryImpl::Job::OnConnectionError() { |
| 167 client_ptr_->ReportResult(ERR_PAC_SCRIPT_TERMINATED); | 131 client_ptr_->ReportResult(ERR_PAC_SCRIPT_TERMINATED); |
| 168 parent_->RemoveJob(this); | 132 parent_->RemoveJob(this); |
| 169 } | 133 } |
| 170 | 134 |
| 171 void MojoProxyResolverFactoryImpl::Job::OnProxyResolverCreated(int error) { | 135 void MojoProxyResolverFactoryImpl::Job::OnProxyResolverCreated(int error) { |
| 172 if (error == OK) { | 136 if (error == OK) { |
| 173 // The MojoProxyResolverHolder will delete itself if either | 137 // The MojoProxyResolverHolder will delete itself if either |
| 174 // |host_resolver_| or |proxy_request_| encounters a connection error. | 138 // |host_resolver_| or |proxy_request_| encounters a connection error. |
| 175 new MojoProxyResolverHolder( | 139 new MojoProxyResolverHolder(host_resolver_.Pass(), |
| 176 host_resolver_.Pass(), proxy_resolver_impl_.Pass(), | 140 proxy_resolver_impl_.Pass(), |
| 177 load_state_change_forwarder_, proxy_request_.Pass()); | 141 proxy_request_.Pass()); |
| 178 } | 142 } |
| 179 client_ptr_->ReportResult(error); | 143 client_ptr_->ReportResult(error); |
| 180 parent_->RemoveJob(this); | 144 parent_->RemoveJob(this); |
| 181 } | 145 } |
| 182 | 146 |
| 183 MojoProxyResolverFactoryImpl::MojoProxyResolverFactoryImpl( | 147 MojoProxyResolverFactoryImpl::MojoProxyResolverFactoryImpl( |
| 184 const MojoProxyResolverFactoryImpl::Factory& proxy_resolver_factory, | 148 const MojoProxyResolverFactoryImpl::Factory& proxy_resolver_factory, |
| 185 mojo::InterfaceRequest<interfaces::ProxyResolverFactory> request) | 149 mojo::InterfaceRequest<interfaces::ProxyResolverFactory> request) |
| 186 : proxy_resolver_impl_factory_(proxy_resolver_factory), | 150 : proxy_resolver_impl_factory_(proxy_resolver_factory), |
| 187 binding_(this, request.Pass()) { | 151 binding_(this, request.Pass()) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 211 error_observer.Pass(), client.Pass())); | 175 error_observer.Pass(), client.Pass())); |
| 212 } | 176 } |
| 213 | 177 |
| 214 void MojoProxyResolverFactoryImpl::RemoveJob(Job* job) { | 178 void MojoProxyResolverFactoryImpl::RemoveJob(Job* job) { |
| 215 size_t erased = jobs_.erase(job); | 179 size_t erased = jobs_.erase(job); |
| 216 DCHECK_EQ(1u, erased); | 180 DCHECK_EQ(1u, erased); |
| 217 delete job; | 181 delete job; |
| 218 } | 182 } |
| 219 | 183 |
| 220 } // namespace net | 184 } // namespace net |
| OLD | NEW |