// Copyright 2015 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.

#include "testing/js_embedder_test.h"

JSEmbedderTest::JSEmbedderTest()
    : m_pArrayBufferAllocator(new FXJS_ArrayBufferAllocator) {
  v8::Isolate::CreateParams params;
  params.array_buffer_allocator = m_pArrayBufferAllocator.get();
  m_pIsolate = v8::Isolate::New(params);
}

JSEmbedderTest::~JSEmbedderTest() {
  m_pIsolate->Dispose();
}

void JSEmbedderTest::SetUp() {
  EmbedderTest::SetExternalIsolate(m_pIsolate);
  EmbedderTest::SetUp();

  v8::Isolate::Scope isolate_scope(m_pIsolate);
#ifdef PDF_ENABLE_XFA
  v8::Locker locker(m_pIsolate);
#endif  // PDF_ENABLE_XFA
  v8::HandleScope handle_scope(m_pIsolate);
  FXJS_PerIsolateData::SetUp(m_pIsolate);
  FXJS_InitializeRuntime(m_pIsolate, nullptr, &m_pPersistentContext,
                         &m_StaticObjects);
}

void JSEmbedderTest::TearDown() {
  FXJS_ReleaseRuntime(m_pIsolate, &m_pPersistentContext, &m_StaticObjects);
  m_pPersistentContext.Reset();
  FXJS_Release();
  EmbedderTest::TearDown();
}

v8::Isolate* JSEmbedderTest::isolate() {
  return m_pIsolate;
}

v8::Local<v8::Context> JSEmbedderTest::GetV8Context() {
  return m_pPersistentContext.Get(m_pIsolate);
}
