12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef NET_PROXY_PROXY_RESOLVER_V8_TRACING_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define NET_PROXY_PROXY_RESOLVER_V8_TRACING_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/non_thread_safe.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_export.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/proxy/proxy_resolver.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Thread; 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MessageLoopProxy; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace base 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class HostResolver; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetLog; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ProxyResolverErrorObserver; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ProxyResolverV8; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ProxyResolverV8Tracing is a non-blocking ProxyResolver. It executes 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ProxyResolverV8 on a single helper thread, and does some magic to avoid 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// blocking in DNS. For more details see the design document: 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// https://docs.google.com/a/google.com/document/d/16Ij5OcVnR3s0MH4Z5XkhI9VTPoMJdaBn9rKreAmGOdE/edit?pli=1 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NET_EXPORT_PRIVATE ProxyResolverV8Tracing 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public ProxyResolver, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NON_EXPORTED_BASE(public base::NonThreadSafe) { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Constructs a ProxyResolver that will issue DNS requests through 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |host_resolver|, forward Javascript errors through |error_observer|, and 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // log Javascript errors and alerts to |net_log|. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that the constructor takes ownership of |error_observer|, whereas 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |host_resolver| and |net_log| are expected to outlive |this|. 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverV8Tracing(HostResolver* host_resolver, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyResolverErrorObserver* error_observer, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetLog* net_log); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ProxyResolverV8Tracing(); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ProxyResolver implementation: 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int GetProxyForURL(const GURL& url, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProxyInfo* results, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CompletionCallback& callback, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestHandle* request, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BoundNetLog& net_log) OVERRIDE; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CancelRequest(RequestHandle request) OVERRIDE; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual LoadState GetLoadState(RequestHandle request) const OVERRIDE; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CancelSetPacScript() OVERRIDE; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int SetPacScript( 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<ProxyResolverScriptData>& script_data, 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CompletionCallback& callback) OVERRIDE; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class Job; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The worker thread on which the ProxyResolverV8 will be run. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Thread> thread_; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ProxyResolverV8> v8_resolver_; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Non-owned host resolver, which is to be operated on the origin thread. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HostResolver* host_resolver_; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ProxyResolverErrorObserver> error_observer_; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NetLog* net_log_; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The outstanding SetPacScript operation, or NULL. 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Job> set_pac_script_job_; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The number of outstanding (non-cancelled) jobs. 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_outstanding_callbacks_; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ProxyResolverV8Tracing); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace net 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // NET_PROXY_PROXY_RESOLVER_V8_TRACING_H_ 85