// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef FXJSE_CONTEXT_H_
#define FXJSE_CONTEXT_H_
class CFXJSE_Class;
class CFXJSE_Value;
class CFXJSE_Context {
 protected:
  CFXJSE_Context(v8::Isolate* pIsolate) : m_pIsolate(pIsolate) {}

 public:
  static CFXJSE_Context* Create(v8::Isolate* pIsolate,
                                const FXJSE_CLASS* lpGlobalClass = NULL,
                                void* lpGlobalObject = NULL);
  ~CFXJSE_Context();
  V8_INLINE v8::Isolate* GetRuntime(void) { return m_pIsolate; }
  void GetGlobalObject(CFXJSE_Value* pValue);
  FX_BOOL ExecuteScript(const FX_CHAR* szScript,
                        CFXJSE_Value* lpRetValue,
                        CFXJSE_Value* lpNewThisObject = NULL);

 protected:
  CFXJSE_Context();
  CFXJSE_Context(const CFXJSE_Context&);
  CFXJSE_Context& operator=(const CFXJSE_Context&);

 protected:
  v8::Global<v8::Context> m_hContext;
  v8::Isolate* m_pIsolate;
  CFX_ArrayTemplate<CFXJSE_Class*> m_rgClasses;
  friend class CFXJSE_Class;
  friend class CFXJSE_ScopeUtil_IsolateHandleContext;
  friend class CFXJSE_ScopeUtil_IsolateHandleRootOrNormalContext;
};
v8::Local<v8::Object> FXJSE_CreateReturnValue(v8::Isolate* pIsolate,
                                              v8::TryCatch& trycatch);
#endif
