// Copyright 2016 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 FPDFSDK_JAVASCRIPT_IJS_RUNTIME_H_
#define FPDFSDK_JAVASCRIPT_IJS_RUNTIME_H_

#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/fx_system.h"

#ifdef PDF_ENABLE_XFA
#include "fxjs/fxjse.h"
#endif  // PDF_ENABLE_XFA

class CPDFSDK_FormFillEnvironment;
class CPDFSDK_Document;
class IJS_Context;

// Owns the FJXS objects needed to actually execute JS.
class IJS_Runtime {
 public:
  static void Initialize(unsigned int slot, void* isolate);
  static void Destroy();
  static IJS_Runtime* Create(CPDFSDK_FormFillEnvironment* pEnv);
  virtual ~IJS_Runtime() {}

  virtual IJS_Context* NewContext() = 0;
  virtual void ReleaseContext(IJS_Context* pContext) = 0;
  virtual IJS_Context* GetCurrentContext() = 0;
  virtual void SetReaderDocument(CPDFSDK_Document* pReaderDoc) = 0;
  virtual CPDFSDK_Document* GetReaderDocument() = 0;
  virtual int ExecuteScript(const CFX_WideString& script,
                            CFX_WideString* info) = 0;

#ifdef PDF_ENABLE_XFA
  virtual FX_BOOL GetValueByName(const CFX_ByteStringC& utf8Name,
                                 CFXJSE_Value* pValue) = 0;
  virtual FX_BOOL SetValueByName(const CFX_ByteStringC& utf8Name,
                                 CFXJSE_Value* pValue) = 0;
#endif  // PDF_ENABLE_XFA

 protected:
  IJS_Runtime() {}
};

#endif  // FPDFSDK_JAVASCRIPT_IJS_RUNTIME_H_
