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