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

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

Issue 1145153004: Split ProxyResolverV8Tracing into an implementation and a wrapper. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 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_v8_tracing.h ('k') | net/proxy/proxy_resolver_v8_tracing_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 (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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_v8_tracing.h" 5 #include "net/proxy/proxy_resolver_v8_tracing.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/single_thread_task_runner.h" 12 #include "base/single_thread_task_runner.h"
13 #include "base/strings/stringprintf.h" 13 #include "base/strings/stringprintf.h"
14 #include "base/synchronization/cancellation_flag.h" 14 #include "base/synchronization/cancellation_flag.h"
15 #include "base/synchronization/waitable_event.h" 15 #include "base/synchronization/waitable_event.h"
16 #include "base/thread_task_runner_handle.h" 16 #include "base/thread_task_runner_handle.h"
17 #include "base/threading/thread.h" 17 #include "base/threading/thread.h"
18 #include "base/threading/thread_restrictions.h" 18 #include "base/threading/thread_restrictions.h"
19 #include "base/values.h"
20 #include "net/base/address_list.h" 19 #include "net/base/address_list.h"
21 #include "net/base/net_errors.h" 20 #include "net/base/net_errors.h"
22 #include "net/dns/host_resolver.h" 21 #include "net/dns/host_resolver.h"
23 #include "net/log/net_log.h"
24 #include "net/proxy/proxy_info.h" 22 #include "net/proxy/proxy_info.h"
25 #include "net/proxy/proxy_resolver_error_observer.h" 23 #include "net/proxy/proxy_resolver_error_observer.h"
26 #include "net/proxy/proxy_resolver_v8.h" 24 #include "net/proxy/proxy_resolver_v8.h"
27 25
28 // The intent of this class is explained in the design document: 26 // The intent of this class is explained in the design document:
29 // https://docs.google.com/a/chromium.org/document/d/16Ij5OcVnR3s0MH4Z5XkhI9VTPo MJdaBn9rKreAmGOdE/edit 27 // https://docs.google.com/a/chromium.org/document/d/16Ij5OcVnR3s0MH4Z5XkhI9VTPo MJdaBn9rKreAmGOdE/edit
30 // 28 //
31 // In a nutshell, PAC scripts are Javascript programs and may depend on 29 // In a nutshell, PAC scripts are Javascript programs and may depend on
32 // network I/O, by calling functions like dnsResolve(). 30 // network I/O, by calling functions like dnsResolve().
33 // 31 //
(...skipping 17 matching lines...) Expand all
51 // number of DNS resolves, as well as scripts which are misbehaving 49 // number of DNS resolves, as well as scripts which are misbehaving
52 // under the tracing optimization. It is not expected to hit this normally. 50 // under the tracing optimization. It is not expected to hit this normally.
53 const size_t kMaxUniqueResolveDnsPerExec = 20; 51 const size_t kMaxUniqueResolveDnsPerExec = 20;
54 52
55 // Approximate number of bytes to use for buffering alerts() and errors. 53 // Approximate number of bytes to use for buffering alerts() and errors.
56 // This is a failsafe in case repeated executions of the script causes 54 // This is a failsafe in case repeated executions of the script causes
57 // too much memory bloat. It is not expected for well behaved scripts to 55 // too much memory bloat. It is not expected for well behaved scripts to
58 // hit this. (In fact normal scripts should not even have alerts() or errors). 56 // hit this. (In fact normal scripts should not even have alerts() or errors).
59 const size_t kMaxAlertsAndErrorsBytes = 2048; 57 const size_t kMaxAlertsAndErrorsBytes = 2048;
60 58
61 // Returns event parameters for a PAC error message (line number + message).
62 scoped_ptr<base::Value> NetLogErrorCallback(
63 int line_number,
64 const base::string16* message,
65 NetLogCaptureMode /* capture_mode */) {
66 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
67 dict->SetInteger("line_number", line_number);
68 dict->SetString("message", *message);
69 return dict.Pass();
70 }
71
72 // The Job class is responsible for executing GetProxyForURL() and 59 // The Job class is responsible for executing GetProxyForURL() and
73 // creating ProxyResolverV8 instances, since both of these operations share 60 // creating ProxyResolverV8 instances, since both of these operations share
74 // similar code. 61 // similar code.
75 // 62 //
76 // The DNS for these operations can operate in either blocking or 63 // The DNS for these operations can operate in either blocking or
77 // non-blocking mode. Blocking mode is used as a fallback when the PAC script 64 // non-blocking mode. Blocking mode is used as a fallback when the PAC script
78 // seems to be misbehaving under the tracing optimization. 65 // seems to be misbehaving under the tracing optimization.
79 // 66 //
80 // Note that this class runs on both the origin thread and a worker 67 // Note that this class runs on both the origin thread and a worker
81 // thread. Most methods are expected to be used exclusively on one thread 68 // thread. Most methods are expected to be used exclusively on one thread
82 // or the other. 69 // or the other.
83 // 70 //
84 // The lifetime of Jobs does not exceed that of the ProxyResolverV8Tracing that 71 // The lifetime of Jobs does not exceed that of the ProxyResolverV8TracingImpl
85 // spawned it. Destruction might happen on either the origin thread or the 72 // that spawned it. Destruction might happen on either the origin thread or the
86 // worker thread. 73 // worker thread.
87 class Job : public base::RefCountedThreadSafe<Job>, 74 class Job : public base::RefCountedThreadSafe<Job>,
88 public ProxyResolverV8::JSBindings { 75 public ProxyResolverV8::JSBindings {
89 public: 76 public:
90 struct Params { 77 struct Params {
91 Params( 78 Params(
92 const scoped_refptr<base::SingleThreadTaskRunner>& worker_task_runner, 79 const scoped_refptr<base::SingleThreadTaskRunner>& worker_task_runner,
93 HostResolver* host_resolver,
94 ProxyResolverErrorObserver* error_observer,
95 NetLog* net_log,
96 ProxyResolver::LoadStateChangedCallback on_load_state_changed,
97 int* num_outstanding_callbacks) 80 int* num_outstanding_callbacks)
98 : v8_resolver(nullptr), 81 : v8_resolver(nullptr),
99 worker_task_runner(worker_task_runner), 82 worker_task_runner(worker_task_runner),
100 host_resolver(host_resolver),
101 error_observer(error_observer),
102 net_log(net_log),
103 on_load_state_changed(on_load_state_changed),
104 num_outstanding_callbacks(num_outstanding_callbacks) {} 83 num_outstanding_callbacks(num_outstanding_callbacks) {}
105 84
106 ProxyResolverV8* v8_resolver; 85 ProxyResolverV8* v8_resolver;
107 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner; 86 scoped_refptr<base::SingleThreadTaskRunner> worker_task_runner;
108 HostResolver* host_resolver;
109 ProxyResolverErrorObserver* error_observer;
110 NetLog* net_log;
111 ProxyResolver::LoadStateChangedCallback on_load_state_changed;
112 int* num_outstanding_callbacks; 87 int* num_outstanding_callbacks;
113 }; 88 };
114 // |params| is non-owned. It contains the parameters for this Job, and must 89 // |params| is non-owned. It contains the parameters for this Job, and must
115 // outlive it. 90 // outlive it.
116 explicit Job(const Params* params); 91 Job(const Params* params,
92 scoped_ptr<ProxyResolverV8Tracing::Bindings> bindings);
117 93
118 // Called from origin thread. 94 // Called from origin thread.
119 void StartCreateV8Resolver( 95 void StartCreateV8Resolver(
120 const scoped_refptr<ProxyResolverScriptData>& script_data, 96 const scoped_refptr<ProxyResolverScriptData>& script_data,
121 scoped_ptr<ProxyResolverV8>* resolver, 97 scoped_ptr<ProxyResolverV8>* resolver,
122 const CompletionCallback& callback); 98 const CompletionCallback& callback);
123 99
124 // Called from origin thread. 100 // Called from origin thread.
125 void StartGetProxyForURL(const GURL& url, 101 void StartGetProxyForURL(const GURL& url,
126 ProxyInfo* results, 102 ProxyInfo* results,
127 const BoundNetLog& net_log,
128 const CompletionCallback& callback); 103 const CompletionCallback& callback);
129 104
130 // Called from origin thread. 105 // Called from origin thread.
131 void Cancel(); 106 void Cancel();
132 107
133 // Called from origin thread. 108 // Called from origin thread.
134 LoadState GetLoadState() const; 109 LoadState GetLoadState() const;
135 110
136 private: 111 private:
137 typedef std::map<std::string, std::string> DnsCache; 112 typedef std::map<std::string, std::string> DnsCache;
(...skipping 14 matching lines...) Expand all
152 127
153 void CheckIsOnWorkerThread() const; 128 void CheckIsOnWorkerThread() const;
154 void CheckIsOnOriginThread() const; 129 void CheckIsOnOriginThread() const;
155 130
156 void SetCallback(const CompletionCallback& callback); 131 void SetCallback(const CompletionCallback& callback);
157 void ReleaseCallback(); 132 void ReleaseCallback();
158 133
159 ProxyResolverV8* v8_resolver(); 134 ProxyResolverV8* v8_resolver();
160 const scoped_refptr<base::SingleThreadTaskRunner>& worker_task_runner(); 135 const scoped_refptr<base::SingleThreadTaskRunner>& worker_task_runner();
161 HostResolver* host_resolver(); 136 HostResolver* host_resolver();
162 ProxyResolverErrorObserver* error_observer();
163 NetLog* net_log();
164 137
165 // Invokes the user's callback. 138 // Invokes the user's callback.
166 void NotifyCaller(int result); 139 void NotifyCaller(int result);
167 void NotifyCallerOnOriginLoop(int result); 140 void NotifyCallerOnOriginLoop(int result);
168 141
169 void Start(Operation op, bool blocking_dns, 142 void Start(Operation op, bool blocking_dns,
170 const CompletionCallback& callback); 143 const CompletionCallback& callback);
171 144
172 void ExecuteBlocking(); 145 void ExecuteBlocking();
173 void ExecuteNonBlocking(); 146 void ExecuteNonBlocking();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 // convenience, to avoid defining custom comparators. 189 // convenience, to avoid defining custom comparators.
217 static std::string MakeDnsCacheKey(const std::string& host, 190 static std::string MakeDnsCacheKey(const std::string& host,
218 ResolveDnsOperation op); 191 ResolveDnsOperation op);
219 192
220 void HandleAlertOrError(bool is_alert, int line_number, 193 void HandleAlertOrError(bool is_alert, int line_number,
221 const base::string16& message); 194 const base::string16& message);
222 void DispatchBufferedAlertsAndErrors(); 195 void DispatchBufferedAlertsAndErrors();
223 void DispatchAlertOrError(bool is_alert, int line_number, 196 void DispatchAlertOrError(bool is_alert, int line_number,
224 const base::string16& message); 197 const base::string16& message);
225 198
226 void LogEventToCurrentRequestAndGlobally( 199 // The thread which called into ProxyResolverV8TracingImpl, and on which the
227 NetLog::EventType type,
228 const NetLog::ParametersCallback& parameters_callback);
229
230 // The thread which called into ProxyResolverV8Tracing, and on which the
231 // completion callback is expected to run. 200 // completion callback is expected to run.
232 scoped_refptr<base::SingleThreadTaskRunner> origin_runner_; 201 scoped_refptr<base::SingleThreadTaskRunner> origin_runner_;
233 202
234 // The Parameters for this Job. 203 // The Parameters for this Job.
235 // Initialized on origin thread and then accessed from both threads. 204 // Initialized on origin thread and then accessed from both threads.
236 const Params* const params_; 205 const Params* const params_;
237 206
207 scoped_ptr<ProxyResolverV8Tracing::Bindings> bindings_;
208
238 // The callback to run (on the origin thread) when the Job finishes. 209 // The callback to run (on the origin thread) when the Job finishes.
239 // Should only be accessed from origin thread. 210 // Should only be accessed from origin thread.
240 CompletionCallback callback_; 211 CompletionCallback callback_;
241 212
242 // Flag to indicate whether the request has been cancelled. 213 // Flag to indicate whether the request has been cancelled.
243 base::CancellationFlag cancelled_; 214 base::CancellationFlag cancelled_;
244 215
245 // The operation that this Job is running. 216 // The operation that this Job is running.
246 // Initialized on origin thread and then accessed from both threads. 217 // Initialized on origin thread and then accessed from both threads.
247 Operation operation_; 218 Operation operation_;
(...skipping 22 matching lines...) Expand all
270 scoped_refptr<ProxyResolverScriptData> script_data_; 241 scoped_refptr<ProxyResolverScriptData> script_data_;
271 scoped_ptr<ProxyResolverV8>* resolver_out_; 242 scoped_ptr<ProxyResolverV8>* resolver_out_;
272 243
273 // ------------------------------------------------------- 244 // -------------------------------------------------------
274 // State specific to GET_PROXY_FOR_URL. 245 // State specific to GET_PROXY_FOR_URL.
275 // ------------------------------------------------------- 246 // -------------------------------------------------------
276 247
277 ProxyInfo* user_results_; // Owned by caller, lives on origin thread. 248 ProxyInfo* user_results_; // Owned by caller, lives on origin thread.
278 GURL url_; 249 GURL url_;
279 ProxyInfo results_; 250 ProxyInfo results_;
280 BoundNetLog bound_net_log_;
281 251
282 // --------------------------------------------------------------------------- 252 // ---------------------------------------------------------------------------
283 // State for ExecuteNonBlocking() 253 // State for ExecuteNonBlocking()
284 // --------------------------------------------------------------------------- 254 // ---------------------------------------------------------------------------
285 // These variables are used exclusively on the worker thread and are only 255 // These variables are used exclusively on the worker thread and are only
286 // meaningful when executing inside of ExecuteNonBlocking(). 256 // meaningful when executing inside of ExecuteNonBlocking().
287 257
288 // Whether this execution was abandoned due to a missing DNS dependency. 258 // Whether this execution was abandoned due to a missing DNS dependency.
289 bool abandoned_; 259 bool abandoned_;
290 260
(...skipping 26 matching lines...) Expand all
317 // These are the inputs to DoDnsOperation(). Written on the worker thread, 287 // These are the inputs to DoDnsOperation(). Written on the worker thread,
318 // read by the origin thread. 288 // read by the origin thread.
319 std::string pending_dns_host_; 289 std::string pending_dns_host_;
320 ResolveDnsOperation pending_dns_op_; 290 ResolveDnsOperation pending_dns_op_;
321 291
322 // This contains the resolved address list that DoDnsOperation() fills in. 292 // This contains the resolved address list that DoDnsOperation() fills in.
323 // Used exclusively on the origin thread. 293 // Used exclusively on the origin thread.
324 AddressList pending_dns_addresses_; 294 AddressList pending_dns_addresses_;
325 }; 295 };
326 296
327 class ProxyResolverV8Tracing : public ProxyResolver, 297 class ProxyResolverV8TracingImpl : public ProxyResolverV8Tracing,
328 public base::NonThreadSafe { 298 public base::NonThreadSafe {
329 public: 299 public:
330 // Constructs a ProxyResolver that will issue DNS requests through 300 ProxyResolverV8TracingImpl(scoped_ptr<base::Thread> thread,
331 // |job_params->host_resolver|, forward Javascript errors through 301 scoped_ptr<ProxyResolverV8> resolver,
332 // |error_observer|, and log Javascript errors and alerts to 302 scoped_ptr<Job::Params> job_params);
333 // |job_params->net_log|. When the LoadState for a request changes,
334 // |job_params->on_load_state_changed| will be invoked with the RequestHandle
335 // for that request with the new LoadState.
336 //
337 // Note that the constructor takes ownership of |error_observer|, whereas
338 // |job_params->host_resolver| and |job_params->net_log| are expected to
339 // outlive |this|.
340 ProxyResolverV8Tracing(scoped_ptr<ProxyResolverErrorObserver> error_observer,
341 scoped_ptr<base::Thread> thread,
342 scoped_ptr<ProxyResolverV8> resolver,
343 scoped_ptr<Job::Params> job_params);
344 303
345 ~ProxyResolverV8Tracing() override; 304 ~ProxyResolverV8TracingImpl() override;
346 305
347 // ProxyResolver implementation: 306 // ProxyResolverV8Tracing overrides.
348 int GetProxyForURL(const GURL& url, 307 void GetProxyForURL(const GURL& url,
349 ProxyInfo* results, 308 ProxyInfo* results,
350 const CompletionCallback& callback, 309 const CompletionCallback& callback,
351 RequestHandle* request, 310 ProxyResolver::RequestHandle* request,
352 const BoundNetLog& net_log) override; 311 scoped_ptr<Bindings> bindings) override;
353 void CancelRequest(RequestHandle request) override; 312 void CancelRequest(ProxyResolver::RequestHandle request) override;
354 LoadState GetLoadState(RequestHandle request) const override; 313 LoadState GetLoadState(ProxyResolver::RequestHandle request) const override;
355 314
356 private: 315 private:
357 // The worker thread on which the ProxyResolverV8 will be run. 316 // The worker thread on which the ProxyResolverV8 will be run.
358 scoped_ptr<base::Thread> thread_; 317 scoped_ptr<base::Thread> thread_;
359 scoped_ptr<ProxyResolverV8> v8_resolver_; 318 scoped_ptr<ProxyResolverV8> v8_resolver_;
360 319
361 scoped_ptr<ProxyResolverErrorObserver> error_observer_;
362
363 scoped_ptr<Job::Params> job_params_; 320 scoped_ptr<Job::Params> job_params_;
364 321
365 // The number of outstanding (non-cancelled) jobs. 322 // The number of outstanding (non-cancelled) jobs.
366 int num_outstanding_callbacks_; 323 int num_outstanding_callbacks_;
367 324
368 DISALLOW_COPY_AND_ASSIGN(ProxyResolverV8Tracing); 325 DISALLOW_COPY_AND_ASSIGN(ProxyResolverV8TracingImpl);
369 }; 326 };
370 327
371 Job::Job(const Job::Params* params) 328 Job::Job(const Job::Params* params,
329 scoped_ptr<ProxyResolverV8Tracing::Bindings> bindings)
372 : origin_runner_(base::ThreadTaskRunnerHandle::Get()), 330 : origin_runner_(base::ThreadTaskRunnerHandle::Get()),
373 params_(params), 331 params_(params),
332 bindings_(bindings.Pass()),
374 event_(true, false), 333 event_(true, false),
375 last_num_dns_(0), 334 last_num_dns_(0),
376 pending_dns_(NULL) { 335 pending_dns_(NULL) {
377 CheckIsOnOriginThread(); 336 CheckIsOnOriginThread();
378 } 337 }
379 338
380 void Job::StartCreateV8Resolver( 339 void Job::StartCreateV8Resolver(
381 const scoped_refptr<ProxyResolverScriptData>& script_data, 340 const scoped_refptr<ProxyResolverScriptData>& script_data,
382 scoped_ptr<ProxyResolverV8>* resolver, 341 scoped_ptr<ProxyResolverV8>* resolver,
383 const CompletionCallback& callback) { 342 const CompletionCallback& callback) {
384 CheckIsOnOriginThread(); 343 CheckIsOnOriginThread();
385 344
386 resolver_out_ = resolver; 345 resolver_out_ = resolver;
387 script_data_ = script_data; 346 script_data_ = script_data;
388 347
389 // Script initialization uses blocking DNS since there isn't any 348 // Script initialization uses blocking DNS since there isn't any
390 // advantage to using non-blocking mode here. That is because the 349 // advantage to using non-blocking mode here. That is because the
391 // parent ProxyService can't submit any ProxyResolve requests until 350 // parent ProxyService can't submit any ProxyResolve requests until
392 // initialization has completed successfully! 351 // initialization has completed successfully!
393 Start(CREATE_V8_RESOLVER, true /*blocking*/, callback); 352 Start(CREATE_V8_RESOLVER, true /*blocking*/, callback);
394 } 353 }
395 354
396 void Job::StartGetProxyForURL(const GURL& url, 355 void Job::StartGetProxyForURL(const GURL& url,
397 ProxyInfo* results, 356 ProxyInfo* results,
398 const BoundNetLog& net_log,
399 const CompletionCallback& callback) { 357 const CompletionCallback& callback) {
400 CheckIsOnOriginThread(); 358 CheckIsOnOriginThread();
401 359
402 url_ = url; 360 url_ = url;
403 user_results_ = results; 361 user_results_ = results;
404 bound_net_log_ = net_log;
405 362
406 Start(GET_PROXY_FOR_URL, false /*non-blocking*/, callback); 363 Start(GET_PROXY_FOR_URL, false /*non-blocking*/, callback);
407 } 364 }
408 365
409 void Job::Cancel() { 366 void Job::Cancel() {
410 CheckIsOnOriginThread(); 367 CheckIsOnOriginThread();
411 368
412 // There are several possibilities to consider for cancellation: 369 // There are several possibilities to consider for cancellation:
413 // (a) The job has been posted to the worker thread, however script execution 370 // (a) The job has been posted to the worker thread, however script execution
414 // has not yet started. 371 // has not yet started.
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 440
484 ProxyResolverV8* Job::v8_resolver() { 441 ProxyResolverV8* Job::v8_resolver() {
485 return params_->v8_resolver; 442 return params_->v8_resolver;
486 } 443 }
487 444
488 const scoped_refptr<base::SingleThreadTaskRunner>& Job::worker_task_runner() { 445 const scoped_refptr<base::SingleThreadTaskRunner>& Job::worker_task_runner() {
489 return params_->worker_task_runner; 446 return params_->worker_task_runner;
490 } 447 }
491 448
492 HostResolver* Job::host_resolver() { 449 HostResolver* Job::host_resolver() {
493 return params_->host_resolver; 450 return bindings_->GetHostResolver();
494 }
495
496 ProxyResolverErrorObserver* Job::error_observer() {
497 return params_->error_observer;
498 }
499
500 NetLog* Job::net_log() {
501 return params_->net_log;
502 } 451 }
503 452
504 void Job::NotifyCaller(int result) { 453 void Job::NotifyCaller(int result) {
505 CheckIsOnWorkerThread(); 454 CheckIsOnWorkerThread();
506 455
507 origin_runner_->PostTask( 456 origin_runner_->PostTask(
508 FROM_HERE, base::Bind(&Job::NotifyCallerOnOriginLoop, this, result)); 457 FROM_HERE, base::Bind(&Job::NotifyCallerOnOriginLoop, this, result));
509 } 458 }
510 459
511 void Job::NotifyCallerOnOriginLoop(int result) { 460 void Job::NotifyCallerOnOriginLoop(int result) {
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 688
740 void Job::DoDnsOperation() { 689 void Job::DoDnsOperation() {
741 CheckIsOnOriginThread(); 690 CheckIsOnOriginThread();
742 DCHECK(!pending_dns_); 691 DCHECK(!pending_dns_);
743 692
744 if (cancelled_.IsSet()) 693 if (cancelled_.IsSet())
745 return; 694 return;
746 695
747 HostResolver::RequestHandle dns_request = NULL; 696 HostResolver::RequestHandle dns_request = NULL;
748 int result = host_resolver()->Resolve( 697 int result = host_resolver()->Resolve(
749 MakeDnsRequestInfo(pending_dns_host_, pending_dns_op_), 698 MakeDnsRequestInfo(pending_dns_host_, pending_dns_op_), DEFAULT_PRIORITY,
750 DEFAULT_PRIORITY, 699 &pending_dns_addresses_, base::Bind(&Job::OnDnsOperationComplete, this),
751 &pending_dns_addresses_, 700 &dns_request, bindings_->GetBoundNetLog());
752 base::Bind(&Job::OnDnsOperationComplete, this),
753 &dns_request,
754 bound_net_log_);
755 701
756 pending_dns_completed_synchronously_ = result != ERR_IO_PENDING; 702 pending_dns_completed_synchronously_ = result != ERR_IO_PENDING;
757 703
758 // Check if the request was cancelled as a side-effect of calling into the 704 // Check if the request was cancelled as a side-effect of calling into the
759 // HostResolver. This isn't the ordinary execution flow, however it is 705 // HostResolver. This isn't the ordinary execution flow, however it is
760 // exercised by unit-tests. 706 // exercised by unit-tests.
761 if (cancelled_.IsSet()) { 707 if (cancelled_.IsSet()) {
762 if (!pending_dns_completed_synchronously_) 708 if (!pending_dns_completed_synchronously_)
763 host_resolver()->CancelRequest(dns_request); 709 host_resolver()->CancelRequest(dns_request);
764 return; 710 return;
765 } 711 }
766 712
767 if (pending_dns_completed_synchronously_) { 713 if (pending_dns_completed_synchronously_) {
768 OnDnsOperationComplete(result); 714 OnDnsOperationComplete(result);
769 } else { 715 } else {
770 DCHECK(dns_request); 716 DCHECK(dns_request);
771 pending_dns_ = dns_request; 717 pending_dns_ = dns_request;
772 if (!params_->on_load_state_changed.is_null()) {
773 params_->on_load_state_changed.Run(
774 this, LOAD_STATE_RESOLVING_HOST_IN_PROXY_SCRIPT);
775 }
776 // OnDnsOperationComplete() will be called by host resolver on completion. 718 // OnDnsOperationComplete() will be called by host resolver on completion.
777 } 719 }
778 720
779 if (!blocking_dns_) { 721 if (!blocking_dns_) {
780 // The worker thread always blocks waiting to see if the result can be 722 // The worker thread always blocks waiting to see if the result can be
781 // serviced from cache before restarting. 723 // serviced from cache before restarting.
782 event_.Signal(); 724 event_.Signal();
783 } 725 }
784 } 726 }
785 727
786 void Job::OnDnsOperationComplete(int result) { 728 void Job::OnDnsOperationComplete(int result) {
787 CheckIsOnOriginThread(); 729 CheckIsOnOriginThread();
788 730
789 DCHECK(!cancelled_.IsSet()); 731 DCHECK(!cancelled_.IsSet());
790 DCHECK(pending_dns_completed_synchronously_ == (pending_dns_ == NULL)); 732 DCHECK(pending_dns_completed_synchronously_ == (pending_dns_ == NULL));
791 733
792 SaveDnsToLocalCache(pending_dns_host_, pending_dns_op_, result, 734 SaveDnsToLocalCache(pending_dns_host_, pending_dns_op_, result,
793 pending_dns_addresses_); 735 pending_dns_addresses_);
794 pending_dns_ = NULL; 736 pending_dns_ = NULL;
795 737
796 if (!params_->on_load_state_changed.is_null() &&
797 !pending_dns_completed_synchronously_ && !cancelled_.IsSet()) {
798 params_->on_load_state_changed.Run(this,
799 LOAD_STATE_RESOLVING_PROXY_FOR_URL);
800 }
801
802 if (blocking_dns_) { 738 if (blocking_dns_) {
803 event_.Signal(); 739 event_.Signal();
804 return; 740 return;
805 } 741 }
806 742
807 if (!blocking_dns_ && !pending_dns_completed_synchronously_) { 743 if (!blocking_dns_ && !pending_dns_completed_synchronously_) {
808 // Restart. This time it should make more progress due to having 744 // Restart. This time it should make more progress due to having
809 // cached items. 745 // cached items.
810 worker_task_runner()->PostTask(FROM_HERE, 746 worker_task_runner()->PostTask(FROM_HERE,
811 base::Bind(&Job::ExecuteNonBlocking, this)); 747 base::Bind(&Job::ExecuteNonBlocking, this));
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
942 878
943 void Job::DispatchAlertOrError(bool is_alert, 879 void Job::DispatchAlertOrError(bool is_alert,
944 int line_number, 880 int line_number,
945 const base::string16& message) { 881 const base::string16& message) {
946 CheckIsOnWorkerThread(); 882 CheckIsOnWorkerThread();
947 883
948 // Note that the handling of cancellation is racy with regard to 884 // Note that the handling of cancellation is racy with regard to
949 // alerts/errors. The request might get cancelled shortly after this 885 // alerts/errors. The request might get cancelled shortly after this
950 // check! (There is no lock being held to guarantee otherwise). 886 // check! (There is no lock being held to guarantee otherwise).
951 // 887 //
952 // If this happens, then some information will get written to the NetLog 888 // If this happens, then some information will be logged needlessly, however
953 // needlessly, however the NetLog will still be alive so it shouldn't cause 889 // the Bindings are responsible for handling this case so it shouldn't cause
954 // problems. 890 // problems.
955 if (cancelled_.IsSet()) 891 if (cancelled_.IsSet())
956 return; 892 return;
957 893
958 if (is_alert) { 894 if (is_alert) {
959 // ------------------- 895 // -------------------
960 // alert 896 // alert
961 // ------------------- 897 // -------------------
962 VLOG(1) << "PAC-alert: " << message; 898 VLOG(1) << "PAC-alert: " << message;
963 899
964 // Send to the NetLog. 900 bindings_->Alert(message);
965 LogEventToCurrentRequestAndGlobally(
966 NetLog::TYPE_PAC_JAVASCRIPT_ALERT,
967 NetLog::StringCallback("message", &message));
968 } else { 901 } else {
969 // ------------------- 902 // -------------------
970 // error 903 // error
971 // ------------------- 904 // -------------------
972 if (line_number == -1) 905 if (line_number == -1)
973 VLOG(1) << "PAC-error: " << message; 906 VLOG(1) << "PAC-error: " << message;
974 else 907 else
975 VLOG(1) << "PAC-error: " << "line: " << line_number << ": " << message; 908 VLOG(1) << "PAC-error: " << "line: " << line_number << ": " << message;
976 909
977 // Send the error to the NetLog. 910 bindings_->OnError(line_number, message);
978 LogEventToCurrentRequestAndGlobally(
979 NetLog::TYPE_PAC_JAVASCRIPT_ERROR,
980 base::Bind(&NetLogErrorCallback, line_number, &message));
981
982 if (error_observer())
983 error_observer()->OnPACScriptError(line_number, message);
984 } 911 }
985 } 912 }
986 913
987 void Job::LogEventToCurrentRequestAndGlobally( 914 ProxyResolverV8TracingImpl::ProxyResolverV8TracingImpl(
988 NetLog::EventType type,
989 const NetLog::ParametersCallback& parameters_callback) {
990 CheckIsOnWorkerThread();
991 bound_net_log_.AddEvent(type, parameters_callback);
992
993 // Emit to the global NetLog event stream.
994 if (net_log())
995 net_log()->AddGlobalEntry(type, parameters_callback);
996 }
997
998 ProxyResolverV8Tracing::ProxyResolverV8Tracing(
999 scoped_ptr<ProxyResolverErrorObserver> error_observer,
1000 scoped_ptr<base::Thread> thread, 915 scoped_ptr<base::Thread> thread,
1001 scoped_ptr<ProxyResolverV8> resolver, 916 scoped_ptr<ProxyResolverV8> resolver,
1002 scoped_ptr<Job::Params> job_params) 917 scoped_ptr<Job::Params> job_params)
1003 : thread_(thread.Pass()), 918 : thread_(thread.Pass()),
1004 v8_resolver_(resolver.Pass()), 919 v8_resolver_(resolver.Pass()),
1005 error_observer_(error_observer.Pass()),
1006 job_params_(job_params.Pass()), 920 job_params_(job_params.Pass()),
1007 num_outstanding_callbacks_(0) { 921 num_outstanding_callbacks_(0) {
1008 job_params_->num_outstanding_callbacks = &num_outstanding_callbacks_; 922 job_params_->num_outstanding_callbacks = &num_outstanding_callbacks_;
1009 } 923 }
1010 924
1011 ProxyResolverV8Tracing::~ProxyResolverV8Tracing() { 925 ProxyResolverV8TracingImpl::~ProxyResolverV8TracingImpl() {
1012 // Note, all requests should have been cancelled. 926 // Note, all requests should have been cancelled.
1013 CHECK_EQ(0, num_outstanding_callbacks_); 927 CHECK_EQ(0, num_outstanding_callbacks_);
1014 928
1015 // Join the worker thread. See http://crbug.com/69710. 929 // Join the worker thread. See http://crbug.com/69710.
1016 base::ThreadRestrictions::ScopedAllowIO allow_io; 930 base::ThreadRestrictions::ScopedAllowIO allow_io;
1017 thread_.reset(); 931 thread_.reset();
1018 } 932 }
1019 933
1020 int ProxyResolverV8Tracing::GetProxyForURL(const GURL& url, 934 void ProxyResolverV8TracingImpl::GetProxyForURL(
1021 ProxyInfo* results, 935 const GURL& url,
1022 const CompletionCallback& callback, 936 ProxyInfo* results,
1023 RequestHandle* request, 937 const CompletionCallback& callback,
1024 const BoundNetLog& net_log) { 938 ProxyResolver::RequestHandle* request,
939 scoped_ptr<Bindings> bindings) {
1025 DCHECK(CalledOnValidThread()); 940 DCHECK(CalledOnValidThread());
1026 DCHECK(!callback.is_null()); 941 DCHECK(!callback.is_null());
1027 942
1028 scoped_refptr<Job> job = new Job(job_params_.get()); 943 scoped_refptr<Job> job = new Job(job_params_.get(), bindings.Pass());
1029 944
1030 if (request) 945 if (request)
1031 *request = job.get(); 946 *request = job.get();
1032 947
1033 job->StartGetProxyForURL(url, results, net_log, callback); 948 job->StartGetProxyForURL(url, results, callback);
1034 return ERR_IO_PENDING;
1035 } 949 }
1036 950
1037 void ProxyResolverV8Tracing::CancelRequest(RequestHandle request) { 951 void ProxyResolverV8TracingImpl::CancelRequest(
952 ProxyResolver::RequestHandle request) {
1038 Job* job = reinterpret_cast<Job*>(request); 953 Job* job = reinterpret_cast<Job*>(request);
1039 job->Cancel(); 954 job->Cancel();
1040 } 955 }
1041 956
1042 LoadState ProxyResolverV8Tracing::GetLoadState(RequestHandle request) const { 957 LoadState ProxyResolverV8TracingImpl::GetLoadState(
958 ProxyResolver::RequestHandle request) const {
1043 Job* job = reinterpret_cast<Job*>(request); 959 Job* job = reinterpret_cast<Job*>(request);
1044 return job->GetLoadState(); 960 return job->GetLoadState();
1045 } 961 }
1046 962
1047 } // namespace 963 class ProxyResolverV8TracingFactoryImpl : public ProxyResolverV8TracingFactory {
964 public:
965 ProxyResolverV8TracingFactoryImpl();
966 ~ProxyResolverV8TracingFactoryImpl() override;
1048 967
1049 class ProxyResolverFactoryV8Tracing::CreateJob 968 void CreateProxyResolverV8Tracing(
969 const scoped_refptr<ProxyResolverScriptData>& pac_script,
970 scoped_ptr<ProxyResolverV8Tracing::Bindings> bindings,
971 scoped_ptr<ProxyResolverV8Tracing>* resolver,
972 const CompletionCallback& callback,
973 scoped_ptr<ProxyResolverFactory::Request>* request) override;
974
975 private:
976 class CreateJob;
977
978 void RemoveJob(CreateJob* job);
979
980 std::set<CreateJob*> jobs_;
981
982 DISALLOW_COPY_AND_ASSIGN(ProxyResolverV8TracingFactoryImpl);
983 };
984
985 class ProxyResolverV8TracingFactoryImpl::CreateJob
1050 : public ProxyResolverFactory::Request { 986 : public ProxyResolverFactory::Request {
1051 public: 987 public:
1052 CreateJob(ProxyResolverFactoryV8Tracing* factory, 988 CreateJob(ProxyResolverV8TracingFactoryImpl* factory,
1053 HostResolver* host_resolver, 989 scoped_ptr<ProxyResolverV8Tracing::Bindings> bindings,
1054 scoped_ptr<ProxyResolverErrorObserver> error_observer,
1055 NetLog* net_log,
1056 const ProxyResolver::LoadStateChangedCallback&
1057 load_state_changed_callback,
1058 const scoped_refptr<ProxyResolverScriptData>& pac_script, 990 const scoped_refptr<ProxyResolverScriptData>& pac_script,
1059 scoped_ptr<ProxyResolver>* resolver_out, 991 scoped_ptr<ProxyResolverV8Tracing>* resolver_out,
1060 const CompletionCallback& callback) 992 const CompletionCallback& callback)
1061 : factory_(factory), 993 : factory_(factory),
1062 thread_(new base::Thread("Proxy Resolver")), 994 thread_(new base::Thread("Proxy Resolver")),
1063 error_observer_(error_observer.Pass()),
1064 resolver_out_(resolver_out), 995 resolver_out_(resolver_out),
1065 callback_(callback), 996 callback_(callback),
1066 num_outstanding_callbacks_(0) { 997 num_outstanding_callbacks_(0) {
1067 // Start up the thread. 998 // Start up the thread.
1068 base::Thread::Options options; 999 base::Thread::Options options;
1069 options.timer_slack = base::TIMER_SLACK_MAXIMUM; 1000 options.timer_slack = base::TIMER_SLACK_MAXIMUM;
1070 CHECK(thread_->StartWithOptions(options)); 1001 CHECK(thread_->StartWithOptions(options));
1071 job_params_.reset(new Job::Params( 1002 job_params_.reset(
1072 thread_->task_runner(), host_resolver, error_observer_.get(), net_log, 1003 new Job::Params(thread_->task_runner(), &num_outstanding_callbacks_));
1073 load_state_changed_callback, &num_outstanding_callbacks_)); 1004 create_resolver_job_ = new Job(job_params_.get(), bindings.Pass());
1074 create_resolver_job_ = new Job(job_params_.get());
1075 create_resolver_job_->StartCreateV8Resolver( 1005 create_resolver_job_->StartCreateV8Resolver(
1076 pac_script, &v8_resolver_, 1006 pac_script, &v8_resolver_,
1077 base::Bind( 1007 base::Bind(
1078 &ProxyResolverFactoryV8Tracing::CreateJob::OnV8ResolverCreated, 1008 &ProxyResolverV8TracingFactoryImpl::CreateJob::OnV8ResolverCreated,
1079 base::Unretained(this))); 1009 base::Unretained(this)));
1080 } 1010 }
1081 1011
1082 ~CreateJob() override { 1012 ~CreateJob() override {
1083 if (factory_) { 1013 if (factory_) {
1084 factory_->RemoveJob(this); 1014 factory_->RemoveJob(this);
1085 DCHECK(create_resolver_job_); 1015 DCHECK(create_resolver_job_);
1086 create_resolver_job_->Cancel(); 1016 create_resolver_job_->Cancel();
1087 StopWorkerThread(); 1017 StopWorkerThread();
1088 } 1018 }
1089 DCHECK_EQ(0, num_outstanding_callbacks_); 1019 DCHECK_EQ(0, num_outstanding_callbacks_);
1090 } 1020 }
1091 1021
1092 void FactoryDestroyed() { 1022 void FactoryDestroyed() {
1093 factory_ = nullptr; 1023 factory_ = nullptr;
1094 create_resolver_job_->Cancel(); 1024 create_resolver_job_->Cancel();
1095 create_resolver_job_ = nullptr; 1025 create_resolver_job_ = nullptr;
1096 StopWorkerThread(); 1026 StopWorkerThread();
1097 } 1027 }
1098 1028
1099 private: 1029 private:
1100 void OnV8ResolverCreated(int error) { 1030 void OnV8ResolverCreated(int error) {
1101 DCHECK(factory_); 1031 DCHECK(factory_);
1102 if (error == OK) { 1032 if (error == OK) {
1103 job_params_->v8_resolver = v8_resolver_.get(); 1033 job_params_->v8_resolver = v8_resolver_.get();
1104 resolver_out_->reset( 1034 resolver_out_->reset(new ProxyResolverV8TracingImpl(
1105 new ProxyResolverV8Tracing(error_observer_.Pass(), thread_.Pass(), 1035 thread_.Pass(), v8_resolver_.Pass(), job_params_.Pass()));
1106 v8_resolver_.Pass(), job_params_.Pass()));
1107 } else { 1036 } else {
1108 StopWorkerThread(); 1037 StopWorkerThread();
1109 } 1038 }
1110 1039
1111 factory_->RemoveJob(this); 1040 factory_->RemoveJob(this);
1112 factory_ = nullptr; 1041 factory_ = nullptr;
1113 create_resolver_job_ = nullptr; 1042 create_resolver_job_ = nullptr;
1114 callback_.Run(error); 1043 callback_.Run(error);
1115 } 1044 }
1116 1045
1117 void StopWorkerThread() { 1046 void StopWorkerThread() {
1118 // Join the worker thread. See http://crbug.com/69710. 1047 // Join the worker thread. See http://crbug.com/69710.
1119 base::ThreadRestrictions::ScopedAllowIO allow_io; 1048 base::ThreadRestrictions::ScopedAllowIO allow_io;
1120 thread_.reset(); 1049 thread_.reset();
1121 } 1050 }
1122 1051
1123 ProxyResolverFactoryV8Tracing* factory_; 1052 ProxyResolverV8TracingFactoryImpl* factory_;
1124 scoped_ptr<base::Thread> thread_; 1053 scoped_ptr<base::Thread> thread_;
1125 scoped_ptr<ProxyResolverErrorObserver> error_observer_;
1126 scoped_ptr<Job::Params> job_params_; 1054 scoped_ptr<Job::Params> job_params_;
1127 scoped_refptr<Job> create_resolver_job_; 1055 scoped_refptr<Job> create_resolver_job_;
1128 scoped_ptr<ProxyResolverV8> v8_resolver_; 1056 scoped_ptr<ProxyResolverV8> v8_resolver_;
1129 scoped_ptr<ProxyResolver>* resolver_out_; 1057 scoped_ptr<ProxyResolverV8Tracing>* resolver_out_;
1130 const CompletionCallback callback_; 1058 const CompletionCallback callback_;
1131 int num_outstanding_callbacks_; 1059 int num_outstanding_callbacks_;
1132 1060
1133 DISALLOW_COPY_AND_ASSIGN(CreateJob); 1061 DISALLOW_COPY_AND_ASSIGN(CreateJob);
1134 }; 1062 };
1135 1063
1136 ProxyResolverFactoryV8Tracing::ProxyResolverFactoryV8Tracing( 1064 ProxyResolverV8TracingFactoryImpl::ProxyResolverV8TracingFactoryImpl() {
1137 HostResolver* host_resolver,
1138 NetLog* net_log,
1139 const ProxyResolver::LoadStateChangedCallback& callback,
1140 const base::Callback<scoped_ptr<ProxyResolverErrorObserver>()>&
1141 error_observer_factory)
1142 : ProxyResolverFactory(true),
1143 host_resolver_(host_resolver),
1144 net_log_(net_log),
1145 load_state_changed_callback_(callback),
1146 error_observer_factory_(error_observer_factory) {
1147 } 1065 }
1148 1066
1149 ProxyResolverFactoryV8Tracing::~ProxyResolverFactoryV8Tracing() { 1067 ProxyResolverV8TracingFactoryImpl::~ProxyResolverV8TracingFactoryImpl() {
1150 for (auto job : jobs_) { 1068 for (auto job : jobs_) {
1151 job->FactoryDestroyed(); 1069 job->FactoryDestroyed();
1152 } 1070 }
1153 } 1071 }
1154 1072
1155 // ProxyResolverFactory override. 1073 void ProxyResolverV8TracingFactoryImpl::CreateProxyResolverV8Tracing(
1156 int ProxyResolverFactoryV8Tracing::CreateProxyResolver(
1157 const scoped_refptr<ProxyResolverScriptData>& pac_script, 1074 const scoped_refptr<ProxyResolverScriptData>& pac_script,
1158 scoped_ptr<ProxyResolver>* resolver, 1075 scoped_ptr<ProxyResolverV8Tracing::Bindings> bindings,
1076 scoped_ptr<ProxyResolverV8Tracing>* resolver,
1159 const CompletionCallback& callback, 1077 const CompletionCallback& callback,
1160 scoped_ptr<Request>* request) { 1078 scoped_ptr<ProxyResolverFactory::Request>* request) {
1161 scoped_ptr<CreateJob> job(new CreateJob( 1079 scoped_ptr<CreateJob> job(
1162 this, host_resolver_, 1080 new CreateJob(this, bindings.Pass(), pac_script, resolver, callback));
1163 error_observer_factory_.is_null() ? nullptr
1164 : error_observer_factory_.Run(),
1165 net_log_, load_state_changed_callback_, pac_script, resolver, callback));
1166 jobs_.insert(job.get()); 1081 jobs_.insert(job.get());
1167 *request = job.Pass(); 1082 *request = job.Pass();
1168 return ERR_IO_PENDING;
1169 } 1083 }
1170 1084
1171 void ProxyResolverFactoryV8Tracing::RemoveJob( 1085 void ProxyResolverV8TracingFactoryImpl::RemoveJob(
1172 ProxyResolverFactoryV8Tracing::CreateJob* job) { 1086 ProxyResolverV8TracingFactoryImpl::CreateJob* job) {
1173 size_t erased = jobs_.erase(job); 1087 size_t erased = jobs_.erase(job);
1174 DCHECK_EQ(1u, erased); 1088 DCHECK_EQ(1u, erased);
1175 } 1089 }
1176 1090
1091 } // namespace
1092
1093 // static
1094 scoped_ptr<ProxyResolverV8TracingFactory>
1095 ProxyResolverV8TracingFactory::Create() {
1096 return make_scoped_ptr(new ProxyResolverV8TracingFactoryImpl());
1097 }
1098
1177 } // namespace net 1099 } // namespace net
OLDNEW
« no previous file with comments | « net/proxy/proxy_resolver_v8_tracing.h ('k') | net/proxy/proxy_resolver_v8_tracing_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698