diff options
author | Tom Sepez <tsepez@chromium.org> | 2015-09-15 14:03:52 -0700 |
---|---|---|
committer | Tom Sepez <tsepez@chromium.org> | 2015-09-15 14:03:52 -0700 |
commit | 09ed30750282bf56a92d0e646ab22c64bea81a36 (patch) | |
tree | 919cf39ff0c0688589a9db2521bce07abf16ed8f /fpdfsdk/src | |
parent | 72d51871ae152163eeb9b005fd0a74d5c1651cd2 (diff) | |
download | pdfium-09ed30750282bf56a92d0e646ab22c64bea81a36.tar.xz |
Refactor fxjs_v8 and add embeddertests for it.
This forces the layer defined by fxjs_v8.h to be (more)
self-contained, so that it can be tested apart from the
CJS_* objects (in fpdfsdk/{src,include}/javascript. This
implies the array buffer allocator must be part of fxjs_v8.
One wrinkle is that we'd like to be able to test an isolate
upon which no native objects have been added, so some
initialization that would have occurred as part of object
definition must be made explicit.
R=thestig@chromium.org
Review URL: https://codereview.chromium.org/1338073002 .
Diffstat (limited to 'fpdfsdk/src')
-rw-r--r-- | fpdfsdk/src/javascript/JS_Runtime.cpp | 31 | ||||
-rw-r--r-- | fpdfsdk/src/jsapi/fxjs_v8.cpp | 33 | ||||
-rw-r--r-- | fpdfsdk/src/jsapi/fxjs_v8_embeddertest.cpp | 69 |
3 files changed, 99 insertions, 34 deletions
diff --git a/fpdfsdk/src/javascript/JS_Runtime.cpp b/fpdfsdk/src/javascript/JS_Runtime.cpp index 8ba7e81654..37b0d353e2 100644 --- a/fpdfsdk/src/javascript/JS_Runtime.cpp +++ b/fpdfsdk/src/javascript/JS_Runtime.cpp @@ -30,24 +30,14 @@ CJS_RuntimeFactory::~CJS_RuntimeFactory() {} IFXJS_Runtime* CJS_RuntimeFactory::NewJSRuntime(CPDFDoc_Environment* pApp) { - if (!m_bInit) { - unsigned int embedderDataSlot = 0; - if (pApp->GetFormFillInfo()->m_pJsPlatform->version >= 2) { - embedderDataSlot = - pApp->GetFormFillInfo()->m_pJsPlatform->m_v8EmbedderSlot; - } - JS_Initial(embedderDataSlot); - m_bInit = TRUE; - } + m_bInit = true; return new CJS_Runtime(pApp); } void CJS_RuntimeFactory::AddRef() { - // to do.Should be implemented as atom manipulation. m_nRef++; } void CJS_RuntimeFactory::Release() { if (m_bInit) { - // to do.Should be implemented as atom manipulation. if (--m_nRef == 0) { JS_Release(); m_bInit = FALSE; @@ -59,18 +49,6 @@ void CJS_RuntimeFactory::DeleteJSRuntime(IFXJS_Runtime* pRuntime) { delete (CJS_Runtime*)pRuntime; } -void* CJS_ArrayBufferAllocator::Allocate(size_t length) { - return calloc(1, length); -} - -void* CJS_ArrayBufferAllocator::AllocateUninitialized(size_t length) { - return malloc(length); -} - -void CJS_ArrayBufferAllocator::Free(void* data, size_t length) { - free(data); -} - /* ------------------------------ CJS_Runtime ------------------------------ */ CJS_Runtime::CJS_Runtime(CPDFDoc_Environment* pApp) @@ -80,12 +58,14 @@ CJS_Runtime::CJS_Runtime(CPDFDoc_Environment* pApp) m_pFieldEventPath(NULL), m_isolate(NULL), m_isolateManaged(false) { + unsigned int embedderDataSlot = 0; if (m_pApp->GetFormFillInfo()->m_pJsPlatform->version >= 2) { m_isolate = reinterpret_cast<v8::Isolate*>( m_pApp->GetFormFillInfo()->m_pJsPlatform->m_isolate); + embedderDataSlot = pApp->GetFormFillInfo()->m_pJsPlatform->m_v8EmbedderSlot; } if (!m_isolate) { - m_pArrayBufferAllocator.reset(new CJS_ArrayBufferAllocator()); + m_pArrayBufferAllocator.reset(new JS_ArrayBufferAllocator()); v8::Isolate::CreateParams params; params.array_buffer_allocator = m_pArrayBufferAllocator.get(); @@ -93,10 +73,11 @@ CJS_Runtime::CJS_Runtime(CPDFDoc_Environment* pApp) m_isolateManaged = true; } + JS_Initialize(embedderDataSlot); DefineJSObjects(); CJS_Context* pContext = (CJS_Context*)NewContext(); - JS_InitialRuntime(GetIsolate(), this, pContext, m_context); + JS_InitializeRuntime(GetIsolate(), this, pContext, m_context); ReleaseContext(pContext); } diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp index e0c8938c34..c516645dc2 100644 --- a/fpdfsdk/src/jsapi/fxjs_v8.cpp +++ b/fpdfsdk/src/jsapi/fxjs_v8.cpp @@ -75,6 +75,23 @@ class CJS_ObjDefintion { v8::Global<v8::Object> m_StaticObj; }; +void* JS_ArrayBufferAllocator::Allocate(size_t length) { + return calloc(1, length); +} + +void* JS_ArrayBufferAllocator::AllocateUninitialized(size_t length) { + return malloc(length); +} + +void JS_ArrayBufferAllocator::Free(void* data, size_t length) { + free(data); +} + +void JS_PrepareIsolate(v8::Isolate* pIsolate) { + if (!pIsolate->GetData(g_embedderDataSlot)) + pIsolate->SetData(g_embedderDataSlot, new CFX_PtrArray()); +} + int JS_DefineObj(v8::Isolate* pIsolate, const wchar_t* sObjName, FXJSOBJTYPE eObjType, @@ -82,11 +99,9 @@ int JS_DefineObj(v8::Isolate* pIsolate, LP_DESTRUCTOR pDestructor) { v8::Isolate::Scope isolate_scope(pIsolate); v8::HandleScope handle_scope(pIsolate); + + JS_PrepareIsolate(pIsolate); CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); - if (!pArray) { - pArray = new CFX_PtrArray(); - pIsolate->SetData(g_embedderDataSlot, pArray); - } CJS_ObjDefintion* pObjDef = new CJS_ObjDefintion(pIsolate, sObjName, eObjType, pConstructor, pDestructor); pArray->Add(pObjDef); @@ -243,10 +258,10 @@ void JS_DefineGlobalConst(v8::Isolate* pIsolate, globalObjTemp.Reset(pIsolate, objTemp); } -void JS_InitialRuntime(v8::Isolate* pIsolate, - IFXJS_Runtime* pFXRuntime, - IFXJS_Context* context, - v8::Global<v8::Context>& v8PersistentContext) { +void JS_InitializeRuntime(v8::Isolate* pIsolate, + IFXJS_Runtime* pFXRuntime, + IFXJS_Context* context, + v8::Global<v8::Context>& v8PersistentContext) { v8::Isolate::Scope isolate_scope(pIsolate); v8::HandleScope handle_scope(pIsolate); @@ -331,7 +346,7 @@ void JS_ReleaseRuntime(v8::Isolate* pIsolate, pIsolate->SetData(g_embedderDataSlot, NULL); } -void JS_Initial(unsigned int embedderDataSlot) { +void JS_Initialize(unsigned int embedderDataSlot) { g_embedderDataSlot = embedderDataSlot; } diff --git a/fpdfsdk/src/jsapi/fxjs_v8_embeddertest.cpp b/fpdfsdk/src/jsapi/fxjs_v8_embeddertest.cpp new file mode 100644 index 0000000000..cb4c3fe072 --- /dev/null +++ b/fpdfsdk/src/jsapi/fxjs_v8_embeddertest.cpp @@ -0,0 +1,69 @@ +// 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 "../../../core/include/fpdfapi/fpdf_parser.h" +#include "../../../testing/embedder_test.h" +#include "../../include/fsdk_mgr.h" +#include "../../include/javascript/JS_Runtime.h" +#include "../../include/jsapi/fxjs_v8.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +const wchar_t kScript[] = L"fred = 7"; + +} // namespace + +class FXJSV8Embeddertest : public EmbedderTest { + public: + FXJSV8Embeddertest() : m_pIsolate(nullptr) {} + ~FXJSV8Embeddertest() override {} + + void SetUp() override { + EmbedderTest::SetUp(); + m_pAllocator.reset(new JS_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); + JS_Initialize(0); + JS_PrepareIsolate(m_pIsolate); + JS_InitializeRuntime(m_pIsolate, nullptr, nullptr, m_pPersistentContext); + } + + void TearDown() override { + JS_ReleaseRuntime(m_pIsolate, m_pPersistentContext); + JS_Release(); + EmbedderTest::TearDown(); + } + + v8::Isolate* isolate() const { return m_pIsolate; } + v8::Local<v8::Context> GetV8Context() { + return v8::Local<v8::Context>::New(m_pIsolate, m_pPersistentContext); + } + + private: + v8::Isolate* m_pIsolate; + v8::Global<v8::Context> m_pPersistentContext; + nonstd::unique_ptr<v8::ArrayBuffer::Allocator> m_pAllocator; +}; + +TEST_F(FXJSV8Embeddertest, Getters) { + v8::Isolate::Scope isolate_scope(isolate()); + v8::HandleScope handle_scope(isolate()); + v8::Context::Scope context_scope(GetV8Context()); + + FXJSErr error; + CFX_WideString wsInfo; + CFX_WideString wsScript(kScript); + int sts = JS_Execute(nullptr, nullptr, kScript, wcslen(kScript), &error); + EXPECT_EQ(0, sts); + + v8::Local<v8::Object> This = JS_GetThisObj(isolate()); + v8::Local<v8::Value> fred = JS_GetObjectElement(isolate(), This, L"fred"); + EXPECT_TRUE(fred->IsNumber()); +} |