| 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" |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 callback_.Reset(); | 104 callback_.Reset(); |
| 105 resolver_->RemoveJob(this); | 105 resolver_->RemoveJob(this); |
| 106 callback.Run(error); | 106 callback.Run(error); |
| 107 } | 107 } |
| 108 | 108 |
| 109 void ProxyResolverMojo::Job::LoadStateChanged(int32_t load_state) { | 109 void ProxyResolverMojo::Job::LoadStateChanged(int32_t load_state) { |
| 110 load_state_ = static_cast<LoadState>(load_state); | 110 load_state_ = static_cast<LoadState>(load_state); |
| 111 } | 111 } |
| 112 | 112 |
| 113 ProxyResolverMojo::ProxyResolverMojo( | 113 ProxyResolverMojo::ProxyResolverMojo( |
| 114 MojoProxyResolverFactory* mojo_proxy_resolver_factory, | 114 interfaces::ProxyResolverPtr mojo_proxy_resolver, |
| 115 HostResolver* host_resolver) | 115 scoped_ptr<base::ScopedClosureRunner> runner) |
| 116 : ProxyResolver(true /* |expects_pac_bytes| */), | 116 : ProxyResolver(true /* |expects_pac_bytes| */), |
| 117 mojo_proxy_resolver_factory_(mojo_proxy_resolver_factory), | 117 mojo_proxy_resolver_ptr_(mojo_proxy_resolver.Pass()), |
| 118 host_resolver_(host_resolver), | 118 runner_(runner.Pass()), |
| 119 weak_factory_(this) { | 119 weak_factory_(this) { |
| 120 mojo_proxy_resolver_ptr_.set_error_handler(this); |
| 120 } | 121 } |
| 121 | 122 |
| 122 ProxyResolverMojo::~ProxyResolverMojo() { | 123 ProxyResolverMojo::~ProxyResolverMojo() { |
| 123 DCHECK(thread_checker_.CalledOnValidThread()); | 124 DCHECK(thread_checker_.CalledOnValidThread()); |
| 124 // All pending requests should have been cancelled. | 125 // All pending requests should have been cancelled. |
| 125 DCHECK(pending_jobs_.empty()); | 126 DCHECK(pending_jobs_.empty()); |
| 126 DCHECK(set_pac_script_callback_.IsCancelled()); | 127 DCHECK(set_pac_script_callback_.IsCancelled()); |
| 127 } | 128 } |
| 128 | 129 |
| 129 void ProxyResolverMojo::CancelSetPacScript() { | 130 void ProxyResolverMojo::CancelSetPacScript() { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 141 pac_script->utf16().empty()) { | 142 pac_script->utf16().empty()) { |
| 142 return ERR_PAC_SCRIPT_FAILED; | 143 return ERR_PAC_SCRIPT_FAILED; |
| 143 } | 144 } |
| 144 | 145 |
| 145 DVLOG(1) << "ProxyResolverMojo::SetPacScript: " << pac_script->utf16(); | 146 DVLOG(1) << "ProxyResolverMojo::SetPacScript: " << pac_script->utf16(); |
| 146 set_pac_script_callback_.Reset( | 147 set_pac_script_callback_.Reset( |
| 147 base::Bind(&ProxyResolverMojo::OnSetPacScriptDone, base::Unretained(this), | 148 base::Bind(&ProxyResolverMojo::OnSetPacScriptDone, base::Unretained(this), |
| 148 pac_script, callback)); | 149 pac_script, callback)); |
| 149 | 150 |
| 150 if (!mojo_proxy_resolver_ptr_) | 151 if (!mojo_proxy_resolver_ptr_) |
| 151 SetUpServices(); | 152 return ERR_PAC_SCRIPT_TERMINATED; |
| 152 | 153 |
| 153 mojo_proxy_resolver_ptr_->SetPacScript( | 154 mojo_proxy_resolver_ptr_->SetPacScript( |
| 154 mojo::String::From(pac_script->utf16()), | 155 mojo::String::From(pac_script->utf16()), |
| 155 set_pac_script_callback_.callback()); | 156 set_pac_script_callback_.callback()); |
| 156 | 157 |
| 157 return ERR_IO_PENDING; | 158 return ERR_IO_PENDING; |
| 158 } | 159 } |
| 159 | 160 |
| 160 void ProxyResolverMojo::OnSetPacScriptDone( | 161 void ProxyResolverMojo::OnSetPacScriptDone( |
| 161 const scoped_refptr<ProxyResolverScriptData>& pac_script, | 162 const scoped_refptr<ProxyResolverScriptData>& pac_script, |
| 162 const net::CompletionCallback& callback, | 163 const net::CompletionCallback& callback, |
| 163 int32_t result) { | 164 int32_t result) { |
| 164 DCHECK(thread_checker_.CalledOnValidThread()); | 165 DCHECK(thread_checker_.CalledOnValidThread()); |
| 165 DCHECK(!set_pac_script_callback_.IsCancelled()); | 166 DCHECK(!set_pac_script_callback_.IsCancelled()); |
| 166 DVLOG(1) << "ProxyResolverMojo::OnSetPacScriptDone: " << result; | 167 DVLOG(1) << "ProxyResolverMojo::OnSetPacScriptDone: " << result; |
| 167 | 168 |
| 168 // |callback| is owned by |set_pac_script_callback_|, so make a copy before | 169 // |callback| is owned by |set_pac_script_callback_|, so make a copy before |
| 169 // cancelling. | 170 // cancelling. |
| 170 auto callback_copy = callback; | 171 auto callback_copy = callback; |
| 171 set_pac_script_callback_.Cancel(); | 172 set_pac_script_callback_.Cancel(); |
| 172 callback_copy.Run(result); | 173 callback_copy.Run(result); |
| 173 } | 174 } |
| 174 | 175 |
| 175 void ProxyResolverMojo::SetUpServices() { | |
| 176 DCHECK(thread_checker_.CalledOnValidThread()); | |
| 177 // A Mojo service implementation must outlive its binding. | |
| 178 mojo_host_resolver_binding_.reset(); | |
| 179 | |
| 180 interfaces::HostResolverPtr mojo_host_resolver_ptr; | |
| 181 mojo_host_resolver_.reset(new MojoHostResolverImpl(host_resolver_)); | |
| 182 mojo_host_resolver_binding_.reset(new mojo::Binding<interfaces::HostResolver>( | |
| 183 mojo_host_resolver_.get(), mojo::GetProxy(&mojo_host_resolver_ptr))); | |
| 184 mojo_proxy_resolver_ptr_.reset(); | |
| 185 mojo_proxy_resolver_factory_->Create( | |
| 186 mojo::GetProxy(&mojo_proxy_resolver_ptr_), mojo_host_resolver_ptr.Pass()); | |
| 187 mojo_proxy_resolver_ptr_.set_error_handler(this); | |
| 188 } | |
| 189 | |
| 190 void ProxyResolverMojo::AbortPendingRequests() { | 176 void ProxyResolverMojo::AbortPendingRequests() { |
| 191 DCHECK(thread_checker_.CalledOnValidThread()); | 177 DCHECK(thread_checker_.CalledOnValidThread()); |
| 192 // |this| could be deleted as a result of one of these callbacks so use | 178 // |this| could be deleted as a result of one of these callbacks so use |
| 193 // |weak_this| to check. | 179 // |weak_this| to check. |
| 194 base::WeakPtr<ProxyResolverMojo> weak_this = weak_factory_.GetWeakPtr(); | 180 base::WeakPtr<ProxyResolverMojo> weak_this = weak_factory_.GetWeakPtr(); |
| 195 if (!set_pac_script_callback_.IsCancelled()) | 181 if (!set_pac_script_callback_.IsCancelled()) |
| 196 set_pac_script_callback_.callback().Run(ERR_PAC_SCRIPT_TERMINATED); | 182 set_pac_script_callback_.callback().Run(ERR_PAC_SCRIPT_TERMINATED); |
| 197 | 183 |
| 198 // Need to use this loop because deleting a Job will cause its callback to be | 184 // Need to use this loop because deleting a Job will cause its callback to be |
| 199 // run with a failure error code, which may cause other Jobs to be deleted. | 185 // run with a failure error code, which may cause other Jobs to be deleted. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 229 delete job; | 215 delete job; |
| 230 } | 216 } |
| 231 | 217 |
| 232 int ProxyResolverMojo::GetProxyForURL(const GURL& url, | 218 int ProxyResolverMojo::GetProxyForURL(const GURL& url, |
| 233 ProxyInfo* results, | 219 ProxyInfo* results, |
| 234 const net::CompletionCallback& callback, | 220 const net::CompletionCallback& callback, |
| 235 RequestHandle* request, | 221 RequestHandle* request, |
| 236 const BoundNetLog& net_log) { | 222 const BoundNetLog& net_log) { |
| 237 DCHECK(thread_checker_.CalledOnValidThread()); | 223 DCHECK(thread_checker_.CalledOnValidThread()); |
| 238 | 224 |
| 239 // If the Mojo service is not connected, fail. The Mojo service is connected | 225 if (!mojo_proxy_resolver_ptr_) |
| 240 // when the script is set, which must be done after construction and after a | |
| 241 // previous request returns ERR_PAC_SCRIPT_TERMINATED due to the Mojo proxy | |
| 242 // resolver process crashing. | |
| 243 if (!mojo_proxy_resolver_ptr_) { | |
| 244 DVLOG(1) << "ProxyResolverMojo::GetProxyForURL: Mojo not connected"; | |
| 245 return ERR_PAC_SCRIPT_TERMINATED; | 226 return ERR_PAC_SCRIPT_TERMINATED; |
| 246 } | |
| 247 | 227 |
| 248 Job* job = new Job(this, url, results, callback); | 228 Job* job = new Job(this, url, results, callback); |
| 249 bool inserted = pending_jobs_.insert(job).second; | 229 bool inserted = pending_jobs_.insert(job).second; |
| 250 DCHECK(inserted); | 230 DCHECK(inserted); |
| 251 *request = job; | 231 *request = job; |
| 252 | 232 |
| 253 return ERR_IO_PENDING; | 233 return ERR_IO_PENDING; |
| 254 } | 234 } |
| 255 | 235 |
| 256 void ProxyResolverMojo::CancelRequest(RequestHandle request) { | 236 void ProxyResolverMojo::CancelRequest(RequestHandle request) { |
| 257 DCHECK(thread_checker_.CalledOnValidThread()); | 237 DCHECK(thread_checker_.CalledOnValidThread()); |
| 258 Job* job = static_cast<Job*>(request); | 238 Job* job = static_cast<Job*>(request); |
| 259 DCHECK(job); | 239 DCHECK(job); |
| 260 job->Cancel(); | 240 job->Cancel(); |
| 261 RemoveJob(job); | 241 RemoveJob(job); |
| 262 } | 242 } |
| 263 | 243 |
| 264 LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const { | 244 LoadState ProxyResolverMojo::GetLoadState(RequestHandle request) const { |
| 265 Job* job = static_cast<Job*>(request); | 245 Job* job = static_cast<Job*>(request); |
| 266 CHECK_EQ(1u, pending_jobs_.count(job)); | 246 CHECK_EQ(1u, pending_jobs_.count(job)); |
| 267 return job->load_state(); | 247 return job->load_state(); |
| 268 } | 248 } |
| 269 | 249 |
| 270 } // namespace net | 250 } // namespace net |
| OLD | NEW |