| 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/proxy_resolver_mojo.h" | 5 #include "net/proxy/proxy_resolver_mojo.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/stl_util.h" | 9 #include "base/stl_util.h" |
| 10 #include "mojo/common/common_type_converters.h" | 10 #include "mojo/common/common_type_converters.h" |
| 11 #include "mojo/common/url_type_converters.h" | 11 #include "mojo/common/url_type_converters.h" |
| 12 #include "net/base/net_errors.h" | 12 #include "net/base/net_errors.h" |
| 13 #include "net/dns/mojo_host_resolver_impl.h" | 13 #include "net/dns/mojo_host_resolver_impl.h" |
| 14 #include "net/proxy/mojo_proxy_resolver_factory.h" |
| 14 #include "net/proxy/mojo_proxy_type_converters.h" | 15 #include "net/proxy/mojo_proxy_type_converters.h" |
| 15 #include "net/proxy/proxy_info.h" | 16 #include "net/proxy/proxy_info.h" |
| 16 #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h" | 17 #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h" |
| 17 #include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h" | 18 #include "third_party/mojo/src/mojo/public/cpp/bindings/error_handler.h" |
| 18 | 19 |
| 19 namespace net { | 20 namespace net { |
| 20 | 21 |
| 21 class ProxyResolverMojo::Job : public interfaces::ProxyResolverRequestClient, | 22 class ProxyResolverMojo::Job : public interfaces::ProxyResolverRequestClient, |
| 22 public mojo::ErrorHandler { | 23 public mojo::ErrorHandler { |
| 23 public: | 24 public: |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 callback.Run(error); | 106 callback.Run(error); |
| 106 } | 107 } |
| 107 | 108 |
| 108 void ProxyResolverMojo::Job::LoadStateChanged(int32_t load_state) { | 109 void ProxyResolverMojo::Job::LoadStateChanged(int32_t load_state) { |
| 109 load_state_ = static_cast<LoadState>(load_state); | 110 load_state_ = static_cast<LoadState>(load_state); |
| 110 } | 111 } |
| 111 | 112 |
| 112 ProxyResolverMojo::ProxyResolverMojo( | 113 ProxyResolverMojo::ProxyResolverMojo( |
| 113 interfaces::ProxyResolverPtr resolver_ptr, | 114 interfaces::ProxyResolverPtr resolver_ptr, |
| 114 scoped_ptr<interfaces::HostResolver> host_resolver, | 115 scoped_ptr<interfaces::HostResolver> host_resolver, |
| 115 scoped_ptr<mojo::Binding<interfaces::HostResolver>> host_resolver_binding) | 116 scoped_ptr<mojo::Binding<interfaces::HostResolver>> host_resolver_binding, |
| 117 scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner) |
| 116 : ProxyResolver(true), | 118 : ProxyResolver(true), |
| 117 mojo_proxy_resolver_ptr_(resolver_ptr.Pass()), | 119 mojo_proxy_resolver_ptr_(resolver_ptr.Pass()), |
| 118 mojo_host_resolver_(host_resolver.Pass()), | 120 mojo_host_resolver_(host_resolver.Pass()), |
| 119 mojo_host_resolver_binding_(host_resolver_binding.Pass()) { | 121 mojo_host_resolver_binding_(host_resolver_binding.Pass()), |
| 122 on_delete_callback_runner_(on_delete_callback_runner.Pass()) { |
| 120 mojo_proxy_resolver_ptr_.set_error_handler(this); | 123 mojo_proxy_resolver_ptr_.set_error_handler(this); |
| 121 } | 124 } |
| 122 | 125 |
| 123 ProxyResolverMojo::~ProxyResolverMojo() { | 126 ProxyResolverMojo::~ProxyResolverMojo() { |
| 124 DCHECK(thread_checker_.CalledOnValidThread()); | 127 DCHECK(thread_checker_.CalledOnValidThread()); |
| 125 // All pending requests should have been cancelled. | 128 // All pending requests should have been cancelled. |
| 126 DCHECK(pending_jobs_.empty()); | 129 DCHECK(pending_jobs_.empty()); |
| 127 } | 130 } |
| 128 | 131 |
| 129 void ProxyResolverMojo::CancelSetPacScript() { | 132 void ProxyResolverMojo::CancelSetPacScript() { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 152 delete job; | 155 delete job; |
| 153 } | 156 } |
| 154 | 157 |
| 155 int ProxyResolverMojo::GetProxyForURL(const GURL& url, | 158 int ProxyResolverMojo::GetProxyForURL(const GURL& url, |
| 156 ProxyInfo* results, | 159 ProxyInfo* results, |
| 157 const CompletionCallback& callback, | 160 const CompletionCallback& callback, |
| 158 RequestHandle* request, | 161 RequestHandle* request, |
| 159 const BoundNetLog& net_log) { | 162 const BoundNetLog& net_log) { |
| 160 DCHECK(thread_checker_.CalledOnValidThread()); | 163 DCHECK(thread_checker_.CalledOnValidThread()); |
| 161 | 164 |
| 162 // If the Mojo service is not connected, fail. The Mojo service is connected | 165 if (!mojo_proxy_resolver_ptr_) |
| 163 // when the script is set, which must be done after construction and after a | |
| 164 // previous request returns ERR_PAC_SCRIPT_TERMINATED due to the Mojo proxy | |
| 165 // resolver process crashing. | |
| 166 if (!mojo_proxy_resolver_ptr_) { | |
| 167 DVLOG(1) << "ProxyResolverMojo::GetProxyForURL: Mojo not connected"; | |
| 168 return ERR_PAC_SCRIPT_TERMINATED; | 166 return ERR_PAC_SCRIPT_TERMINATED; |
| 169 } | |
| 170 | 167 |
| 171 Job* job = new Job(this, url, results, callback); | 168 Job* job = new Job(this, url, results, callback); |
| 172 bool inserted = pending_jobs_.insert(job).second; | 169 bool inserted = pending_jobs_.insert(job).second; |
| 173 DCHECK(inserted); | 170 DCHECK(inserted); |
| 174 *request = job; | 171 *request = job; |
| 175 | 172 |
| 176 return ERR_IO_PENDING; | 173 return ERR_IO_PENDING; |
| 177 } | 174 } |
| 178 | 175 |
| 179 void ProxyResolverMojo::CancelRequest(RequestHandle request) { | 176 void ProxyResolverMojo::CancelRequest(RequestHandle request) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 203 resolver_(resolver), | 200 resolver_(resolver), |
| 204 callback_(callback), | 201 callback_(callback), |
| 205 binding_(this), | 202 binding_(this), |
| 206 host_resolver_(new MojoHostResolverImpl(factory_->host_resolver_)), | 203 host_resolver_(new MojoHostResolverImpl(factory_->host_resolver_)), |
| 207 host_resolver_binding_( | 204 host_resolver_binding_( |
| 208 new mojo::Binding<interfaces::HostResolver>(host_resolver_.get())) { | 205 new mojo::Binding<interfaces::HostResolver>(host_resolver_.get())) { |
| 209 interfaces::HostResolverPtr host_resolver_ptr; | 206 interfaces::HostResolverPtr host_resolver_ptr; |
| 210 interfaces::ProxyResolverFactoryRequestClientPtr client_ptr; | 207 interfaces::ProxyResolverFactoryRequestClientPtr client_ptr; |
| 211 binding_.Bind(mojo::GetProxy(&client_ptr)); | 208 binding_.Bind(mojo::GetProxy(&client_ptr)); |
| 212 host_resolver_binding_->Bind(mojo::GetProxy(&host_resolver_ptr)); | 209 host_resolver_binding_->Bind(mojo::GetProxy(&host_resolver_ptr)); |
| 213 factory_->mojo_proxy_factory_->CreateResolver( | 210 on_delete_callback_runner_ = factory_->mojo_proxy_factory_->CreateResolver( |
| 214 mojo::String::From(pac_script->utf16()), mojo::GetProxy(&resolver_ptr_), | 211 mojo::String::From(pac_script->utf16()), mojo::GetProxy(&resolver_ptr_), |
| 215 host_resolver_ptr.Pass(), client_ptr.Pass()); | 212 host_resolver_ptr.Pass(), client_ptr.Pass()); |
| 216 resolver_ptr_.set_error_handler(this); | 213 resolver_ptr_.set_error_handler(this); |
| 217 binding_.set_error_handler(this); | 214 binding_.set_error_handler(this); |
| 218 } | 215 } |
| 219 | 216 |
| 220 void OnConnectionError() override { | 217 void OnConnectionError() override { |
| 221 callback_.Run(ERR_PAC_SCRIPT_TERMINATED); | 218 callback_.Run(ERR_PAC_SCRIPT_TERMINATED); |
| 219 on_delete_callback_runner_.reset(); |
| 222 } | 220 } |
| 223 | 221 |
| 224 private: | 222 private: |
| 225 void ReportResult(int32_t error) override { | 223 void ReportResult(int32_t error) override { |
| 226 resolver_ptr_.set_error_handler(nullptr); | 224 resolver_ptr_.set_error_handler(nullptr); |
| 227 binding_.set_error_handler(nullptr); | 225 binding_.set_error_handler(nullptr); |
| 228 if (error == OK) { | 226 if (error == OK) { |
| 229 resolver_->reset(new ProxyResolverMojo(resolver_ptr_.Pass(), | 227 resolver_->reset(new ProxyResolverMojo( |
| 230 host_resolver_.Pass(), | 228 resolver_ptr_.Pass(), host_resolver_.Pass(), |
| 231 host_resolver_binding_.Pass())); | 229 host_resolver_binding_.Pass(), on_delete_callback_runner_.Pass())); |
| 232 } | 230 } |
| 231 on_delete_callback_runner_.reset(); |
| 233 callback_.Run(error); | 232 callback_.Run(error); |
| 234 } | 233 } |
| 235 | 234 |
| 236 ProxyResolverFactoryMojo* const factory_; | 235 ProxyResolverFactoryMojo* const factory_; |
| 237 scoped_ptr<ProxyResolver>* resolver_; | 236 scoped_ptr<ProxyResolver>* resolver_; |
| 238 const CompletionCallback callback_; | 237 const CompletionCallback callback_; |
| 239 interfaces::ProxyResolverPtr resolver_ptr_; | 238 interfaces::ProxyResolverPtr resolver_ptr_; |
| 240 mojo::Binding<interfaces::ProxyResolverFactoryRequestClient> binding_; | 239 mojo::Binding<interfaces::ProxyResolverFactoryRequestClient> binding_; |
| 241 scoped_ptr<interfaces::HostResolver> host_resolver_; | 240 scoped_ptr<interfaces::HostResolver> host_resolver_; |
| 242 scoped_ptr<mojo::Binding<interfaces::HostResolver>> host_resolver_binding_; | 241 scoped_ptr<mojo::Binding<interfaces::HostResolver>> host_resolver_binding_; |
| 242 scoped_ptr<base::ScopedClosureRunner> on_delete_callback_runner_; |
| 243 }; | 243 }; |
| 244 | 244 |
| 245 ProxyResolverFactoryMojo::ProxyResolverFactoryMojo( | 245 ProxyResolverFactoryMojo::ProxyResolverFactoryMojo( |
| 246 interfaces::ProxyResolverFactory* mojo_proxy_factory, | 246 MojoProxyResolverFactory* mojo_proxy_factory, |
| 247 HostResolver* host_resolver) | 247 HostResolver* host_resolver) |
| 248 : ProxyResolverFactory(true), | 248 : ProxyResolverFactory(true), |
| 249 mojo_proxy_factory_(mojo_proxy_factory), | 249 mojo_proxy_factory_(mojo_proxy_factory), |
| 250 host_resolver_(host_resolver) { | 250 host_resolver_(host_resolver) { |
| 251 } | 251 } |
| 252 | 252 |
| 253 ProxyResolverFactoryMojo::~ProxyResolverFactoryMojo() = default; |
| 254 |
| 253 int ProxyResolverFactoryMojo::CreateProxyResolver( | 255 int ProxyResolverFactoryMojo::CreateProxyResolver( |
| 254 const scoped_refptr<ProxyResolverScriptData>& pac_script, | 256 const scoped_refptr<ProxyResolverScriptData>& pac_script, |
| 255 scoped_ptr<ProxyResolver>* resolver, | 257 scoped_ptr<ProxyResolver>* resolver, |
| 256 const CompletionCallback& callback, | 258 const CompletionCallback& callback, |
| 257 scoped_ptr<ProxyResolverFactory::Request>* request) { | 259 scoped_ptr<ProxyResolverFactory::Request>* request) { |
| 258 DCHECK(resolver); | 260 DCHECK(resolver); |
| 259 DCHECK(request); | 261 DCHECK(request); |
| 260 if (pac_script->type() != ProxyResolverScriptData::TYPE_SCRIPT_CONTENTS || | 262 if (pac_script->type() != ProxyResolverScriptData::TYPE_SCRIPT_CONTENTS || |
| 261 pac_script->utf16().empty()) { | 263 pac_script->utf16().empty()) { |
| 262 return ERR_PAC_SCRIPT_FAILED; | 264 return ERR_PAC_SCRIPT_FAILED; |
| 263 } | 265 } |
| 264 request->reset(new Job(this, pac_script, resolver, callback)); | 266 request->reset(new Job(this, pac_script, resolver, callback)); |
| 265 return ERR_IO_PENDING; | 267 return ERR_IO_PENDING; |
| 266 } | 268 } |
| 267 | 269 |
| 268 } // namespace net | 270 } // namespace net |
| OLD | NEW |