Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(153)

Side by Side Diff: net/proxy/proxy_resolver_mojo.cc

Issue 1076083002: Shut down proxy resolver utility processes when no longer needed. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@proxy-service-with-factory-restart
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/proxy/proxy_resolver_mojo.h ('k') | net/proxy/proxy_resolver_mojo_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « net/proxy/proxy_resolver_mojo.h ('k') | net/proxy/proxy_resolver_mojo_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698