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 |