1 // Copyright 2016 PDFium 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 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef FXJS_CFXJSE_CONTEXT_H_
8 #define FXJS_CFXJSE_CONTEXT_H_
9 
10 #include <memory>
11 #include <vector>
12 
13 #include "core/fxcrt/fx_basic.h"
14 #include "fxjs/fxjse.h"
15 #include "v8/include/v8.h"
16 
17 class CFXJSE_Class;
18 class CFXJSE_Value;
19 struct FXJSE_CLASS_DESCRIPTOR;
20 
21 class CFXJSE_Context {
22  public:
23   static CFXJSE_Context* Create(
24       v8::Isolate* pIsolate,
25       const FXJSE_CLASS_DESCRIPTOR* lpGlobalClass = nullptr,
26       CFXJSE_HostObject* lpGlobalObject = nullptr);
27 
28   ~CFXJSE_Context();
29 
GetRuntime()30   v8::Isolate* GetRuntime() { return m_pIsolate; }
31   std::unique_ptr<CFXJSE_Value> GetGlobalObject();
32   void EnableCompatibleMode();
33   bool ExecuteScript(const FX_CHAR* szScript,
34                      CFXJSE_Value* lpRetValue,
35                      CFXJSE_Value* lpNewThisObject = nullptr);
36 
37  protected:
38   friend class CFXJSE_Class;
39   friend class CFXJSE_ScopeUtil_IsolateHandleContext;
40 
41   CFXJSE_Context();
42   CFXJSE_Context(const CFXJSE_Context&);
43   explicit CFXJSE_Context(v8::Isolate* pIsolate);
44 
45   CFXJSE_Context& operator=(const CFXJSE_Context&);
46 
47   v8::Global<v8::Context> m_hContext;
48   v8::Isolate* m_pIsolate;
49   std::vector<std::unique_ptr<CFXJSE_Class>> m_rgClasses;
50 };
51 
52 v8::Local<v8::Object> FXJSE_CreateReturnValue(v8::Isolate* pIsolate,
53                                               v8::TryCatch& trycatch);
54 
55 v8::Local<v8::Object> FXJSE_GetGlobalObjectFromContext(
56     const v8::Local<v8::Context>& hContext);
57 
58 void FXJSE_UpdateObjectBinding(v8::Local<v8::Object>& hObject,
59                                CFXJSE_HostObject* lpNewBinding = nullptr);
60 
61 CFXJSE_HostObject* FXJSE_RetrieveObjectBinding(
62     const v8::Local<v8::Object>& hJSObject,
63     CFXJSE_Class* lpClass = nullptr);
64 
65 #endif  // FXJS_CFXJSE_CONTEXT_H_
66