// 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_

#include <memory>
#include <vector>

#include "core/fxcrt/include/fx_basic.h"
#include "fxjse/include/fxjse.h"
#include "v8/include/v8.h"

class CFXJSE_Class;
class CFXJSE_Value;
struct FXJSE_CLASS_DESCRIPTOR;

class CFXJSE_Context {
 public:
  static CFXJSE_Context* Create(
      v8::Isolate* pIsolate,
      const FXJSE_CLASS_DESCRIPTOR* lpGlobalClass = nullptr,
      CFXJSE_HostObject* lpGlobalObject = nullptr);
  ~CFXJSE_Context();

  v8::Isolate* GetRuntime() { return m_pIsolate; }
  std::unique_ptr<CFXJSE_Value> GetGlobalObject();
  void EnableCompatibleMode();
  FX_BOOL ExecuteScript(const FX_CHAR* szScript,
                        CFXJSE_Value* lpRetValue,
                        CFXJSE_Value* lpNewThisObject = nullptr);

 protected:
  CFXJSE_Context();
  CFXJSE_Context(const CFXJSE_Context&);
  explicit CFXJSE_Context(v8::Isolate* pIsolate);
  CFXJSE_Context& operator=(const CFXJSE_Context&);

  v8::Global<v8::Context> m_hContext;
  v8::Isolate* m_pIsolate;
  std::vector<std::unique_ptr<CFXJSE_Class>> m_rgClasses;

  friend class CFXJSE_Class;
  friend class CFXJSE_ScopeUtil_IsolateHandleContext;
};

v8::Local<v8::Object> FXJSE_CreateReturnValue(v8::Isolate* pIsolate,
                                              v8::TryCatch& trycatch);

v8::Local<v8::Object> FXJSE_GetGlobalObjectFromContext(
    const v8::Local<v8::Context>& hContext);

void FXJSE_UpdateObjectBinding(v8::Local<v8::Object>& hObject,
                               CFXJSE_HostObject* lpNewBinding = nullptr);

CFXJSE_HostObject* FXJSE_RetrieveObjectBinding(
    const v8::Local<v8::Object>& hJSObject,
    CFXJSE_Class* lpClass = nullptr);

#endif  // FXJSE_CONTEXT_H_
