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