// 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 XFA_FXJSE_RUNTIME_H_
#define XFA_FXJSE_RUNTIME_H_

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

class CFXJSE_RuntimeList;

class CFXJSE_RuntimeData {
 protected:
  CFXJSE_RuntimeData(v8::Isolate* pIsolate) : m_pIsolate(pIsolate) {}

 public:
  static CFXJSE_RuntimeData* Create(v8::Isolate* pIsolate);
  static CFXJSE_RuntimeData* Get(v8::Isolate* pIsolate);

 public:
  v8::Isolate* m_pIsolate;
  v8::Global<v8::FunctionTemplate> m_hRootContextGlobalTemplate;
  v8::Global<v8::Context> m_hRootContext;

 public:
  static CFXJSE_RuntimeList* g_RuntimeList;

 protected:
  CFXJSE_RuntimeData();
  CFXJSE_RuntimeData(const CFXJSE_RuntimeData&);
  CFXJSE_RuntimeData& operator=(const CFXJSE_RuntimeData&);
};

class CFXJSE_RuntimeList {
 public:
  typedef void (*RuntimeDisposeCallback)(v8::Isolate*);

 public:
  void AppendRuntime(v8::Isolate* pIsolate);
  void RemoveRuntime(v8::Isolate* pIsolate,
                     RuntimeDisposeCallback lpfnDisposeCallback);
  void RemoveAllRuntimes(RuntimeDisposeCallback lpfnDisposeCallback);

 protected:
  CFX_ArrayTemplate<v8::Isolate*> m_RuntimeList;
};

#endif  // XFA_FXJSE_RUNTIME_H_
