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 |