Run FXJS_V8 embedder tests against a shared isolate.
authorTom Sepez <tsepez@chromium.org>
Tue, 6 Oct 2015 15:53:13 +0000 (08:53 -0700)
committerTom Sepez <tsepez@chromium.org>
Tue, 6 Oct 2015 15:53:13 +0000 (08:53 -0700)
Start to back-fill some tests for the recent isolate work.

R=thestig@chromium.org

Review URL: https://codereview.chromium.org/1377293004 .

fpdfsdk/src/jsapi/fxjs_v8_embeddertest.cpp
testing/embedder_test.cpp
testing/embedder_test.h

index 394933a..187d611 100644 (file)
@@ -16,39 +16,41 @@ const wchar_t kScript[] = L"fred = 7";
 
 class FXJSV8Embeddertest : public EmbedderTest {
  public:
-  FXJSV8Embeddertest() : m_pIsolate(nullptr) {}
-  ~FXJSV8Embeddertest() override {}
+  FXJSV8Embeddertest()
+      : m_pArrayBufferAllocator(new FXJS_ArrayBufferAllocator) {
+    v8::Isolate::CreateParams params;
+    params.array_buffer_allocator = m_pArrayBufferAllocator.get();
+    m_pIsolate = v8::Isolate::New(params);
+  }
+
+  ~FXJSV8Embeddertest() override { m_pIsolate->Dispose(); }
 
   void SetUp() override {
+    EmbedderTest::SetExternalIsolate(m_pIsolate);
     EmbedderTest::SetUp();
-    m_pAllocator.reset(new FXJS_ArrayBufferAllocator());
-
-    v8::Isolate::CreateParams params;
-    params.array_buffer_allocator = m_pAllocator.get();
-    m_pIsolate = v8::Isolate::New(params);
 
     v8::Isolate::Scope isolate_scope(m_pIsolate);
     v8::HandleScope handle_scope(m_pIsolate);
-    FXJS_Initialize(0, nullptr);
     FXJS_PerIsolateData::SetUp(m_pIsolate);
     FXJS_InitializeRuntime(m_pIsolate, nullptr, nullptr, m_pPersistentContext);
   }
 
   void TearDown() override {
     FXJS_ReleaseRuntime(m_pIsolate, m_pPersistentContext);
+    m_pPersistentContext.Reset();
     FXJS_Release();
     EmbedderTest::TearDown();
   }
 
-  v8::Isolate* isolate() const { return m_pIsolate; }
+  v8::Isolate* isolate() { return m_pIsolate; }
   v8::Local<v8::Context> GetV8Context() {
-    return v8::Local<v8::Context>::New(m_pIsolate, m_pPersistentContext);
+    return m_pPersistentContext.Get(m_pIsolate);
   }
 
  private:
+  nonstd::unique_ptr<FXJS_ArrayBufferAllocator> m_pArrayBufferAllocator;
   v8::Isolate* m_pIsolate;
   v8::Global<v8::Context> m_pPersistentContext;
-  nonstd::unique_ptr<FXJS_ArrayBufferAllocator> m_pAllocator;
 };
 
 TEST_F(FXJSV8Embeddertest, Getters) {
index 951da84..d17df9a 100644 (file)
@@ -123,21 +123,21 @@ FPDF_BOOL Is_Data_Avail(FX_FILEAVAIL* pThis, size_t offset, size_t size) {
 void Add_Segment(FX_DOWNLOADHINTS* pThis, size_t offset, size_t size) {}
 
 EmbedderTest::EmbedderTest()
-    : document_(nullptr),
+    : default_delegate_(new EmbedderTest::Delegate()),
+      document_(nullptr),
       form_handle_(nullptr),
       avail_(nullptr),
+      external_isolate_(nullptr),
       loader_(nullptr),
       file_length_(0),
       file_contents_(nullptr) {
   memset(&hints_, 0, sizeof(hints_));
   memset(&file_access_, 0, sizeof(file_access_));
   memset(&file_avail_, 0, sizeof(file_avail_));
-  default_delegate_ = new EmbedderTest::Delegate();
-  delegate_ = default_delegate_;
+  delegate_ = default_delegate_.get();
 }
 
 EmbedderTest::~EmbedderTest() {
-  delete default_delegate_;
 }
 
 void EmbedderTest::SetUp() {
@@ -159,7 +159,12 @@ void EmbedderTest::SetUp() {
   v8::V8::SetSnapshotDataBlob(&snapshot_);
 #endif  // V8_USE_EXTERNAL_STARTUP_DATA
 
-  FPDF_InitLibrary();
+  FPDF_LIBRARY_CONFIG config;
+  config.version = 2;
+  config.m_pUserFontPaths = nullptr;
+  config.m_pIsolate = external_isolate_;
+  config.m_v8EmbedderSlot = 0;
+  FPDF_InitLibraryWithConfig(&config);
 
   UNSUPPORT_INFO* info = static_cast<UNSUPPORT_INFO*>(this);
   memset(info, 0, sizeof(UNSUPPORT_INFO));
index f490f82..f6842d2 100644 (file)
@@ -12,6 +12,7 @@
 #include "../public/fpdf_ext.h"
 #include "../public/fpdf_formfill.h"
 #include "../public/fpdfview.h"
+#include "../third_party/base/nonstd_unique_ptr.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "v8/include/v8.h"
 
@@ -60,8 +61,11 @@ class EmbedderTest : public ::testing::Test,
   void SetUp() override;
   void TearDown() override;
 
+  // Call before SetUp to pass shared isolate, otherwise PDFium creates one.
+  void SetExternalIsolate(v8::Isolate* isolate) { external_isolate_ = isolate; }
+
   void SetDelegate(Delegate* delegate) {
-    delegate_ = delegate ? delegate : default_delegate_;
+    delegate_ = delegate ? delegate : default_delegate_.get();
   }
 
   FPDF_DOCUMENT document() { return document_; }
@@ -94,7 +98,7 @@ class EmbedderTest : public ::testing::Test,
 
  protected:
   Delegate* delegate_;
-  Delegate* default_delegate_;
+  nonstd::unique_ptr<Delegate> default_delegate_;
   FPDF_DOCUMENT document_;
   FPDF_FORMHANDLE form_handle_;
   FPDF_AVAIL avail_;
@@ -104,6 +108,7 @@ class EmbedderTest : public ::testing::Test,
   v8::Platform* platform_;
   v8::StartupData natives_;
   v8::StartupData snapshot_;
+  v8::Isolate* external_isolate_;
   TestLoader* loader_;
   size_t file_length_;
   char* file_contents_;