• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef NET_PROXY_PROXY_RESOLVER_V8_H_
6 #define NET_PROXY_PROXY_RESOLVER_V8_H_
7 #pragma once
8 
9 #include "base/memory/scoped_ptr.h"
10 #include "net/proxy/proxy_resolver.h"
11 
12 namespace net {
13 
14 class ProxyResolverJSBindings;
15 
16 // Implementation of ProxyResolver that uses V8 to evaluate PAC scripts.
17 //
18 // ----------------------------------------------------------------------------
19 // !!! Important note on threading model:
20 // ----------------------------------------------------------------------------
21 // There can be only one instance of V8 running at a time. To enforce this
22 // constraint, ProxyResolverV8 holds a v8::Locker during execution. Therefore
23 // it is OK to run multiple instances of ProxyResolverV8 on different threads,
24 // since only one will be running inside V8 at a time.
25 //
26 // It is important that *ALL* instances of V8 in the process be using
27 // v8::Locker. If not there can be race conditions beween the non-locked V8
28 // instances and the locked V8 instances used by ProxyResolverV8 (assuming they
29 // run on different threads).
30 //
31 // This is the case with the V8 instance used by chromium's renderer -- it runs
32 // on a different thread from ProxyResolver (renderer thread vs PAC thread),
33 // and does not use locking since it expects to be alone.
34 class ProxyResolverV8 : public ProxyResolver {
35  public:
36   // Constructs a ProxyResolverV8 with custom bindings. ProxyResolverV8 takes
37   // ownership of |custom_js_bindings| and deletes it when ProxyResolverV8
38   // is destroyed.
39   explicit ProxyResolverV8(ProxyResolverJSBindings* custom_js_bindings);
40 
41   virtual ~ProxyResolverV8();
42 
js_bindings()43   ProxyResolverJSBindings* js_bindings() const { return js_bindings_.get(); }
44 
45   // ProxyResolver implementation:
46   virtual int GetProxyForURL(const GURL& url,
47                              ProxyInfo* results,
48                              CompletionCallback* /*callback*/,
49                              RequestHandle* /*request*/,
50                              const BoundNetLog& net_log);
51   virtual void CancelRequest(RequestHandle request);
52   virtual void CancelSetPacScript();
53   virtual void PurgeMemory();
54   virtual void Shutdown();
55   virtual int SetPacScript(
56       const scoped_refptr<ProxyResolverScriptData>& script_data,
57       CompletionCallback* /*callback*/);
58 
59  private:
60   // Context holds the Javascript state for the most recently loaded PAC
61   // script. It corresponds with the data from the last call to
62   // SetPacScript().
63   class Context;
64   scoped_ptr<Context> context_;
65 
66   scoped_ptr<ProxyResolverJSBindings> js_bindings_;
67 
68   DISALLOW_COPY_AND_ASSIGN(ProxyResolverV8);
69 };
70 
71 }  // namespace net
72 
73 #endif  // NET_PROXY_PROXY_RESOLVER_V8_H_
74