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