diff options
-rw-r--r-- | DEPS | 2 | ||||
-rw-r--r-- | fpdfsdk/include/javascript/JS_Define.h | 49 | ||||
-rw-r--r-- | fpdfsdk/include/jsapi/fxjs_v8.h | 5 | ||||
-rw-r--r-- | fpdfsdk/src/jsapi/fxjs_v8.cpp | 26 | ||||
-rw-r--r-- | testing/resources/javascript/app_props_expected.txt | 4 |
5 files changed, 36 insertions, 50 deletions
@@ -15,7 +15,7 @@ deps = { "https://chromium.googlesource.com/external/googletest.git@8245545b6dc9c4703e6496d1efd19e975ad2b038", "v8": - "https://chromium.googlesource.com/v8/v8.git", + "https://chromium.googlesource.com/v8/v8.git@4d03c3aabad6517ff058124bb799ca6a4156e570", "v8/third_party/icu": "https://chromium.googlesource.com/chromium/deps/icu46", diff --git a/fpdfsdk/include/javascript/JS_Define.h b/fpdfsdk/include/javascript/JS_Define.h index adf69ec0e9..e91ce03d30 100644 --- a/fpdfsdk/include/javascript/JS_Define.h +++ b/fpdfsdk/include/javascript/JS_Define.h @@ -79,12 +79,9 @@ void JSPropGetter(const char* prop_name_string, v8::Local<v8::String> property, const v8::PropertyCallbackInfo<v8::Value>& info) { v8::Isolate* isolate = info.GetIsolate(); - v8::Local<v8::Context> context = isolate->GetCurrentContext(); - v8::Local<v8::Value> v = context->GetEmbedderData(1); - if (v.IsEmpty()) + IFXJS_Runtime* pRuntime = FXJS_GetRuntimeFromIsolate(isolate); + if (!pRuntime) return; - v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v); - IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder()); C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); @@ -107,12 +104,9 @@ void JSPropSetter(const char* prop_name_string, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<void>& info) { v8::Isolate* isolate = info.GetIsolate(); - v8::Local<v8::Context> context = isolate->GetCurrentContext(); - v8::Local<v8::Value> v = context->GetEmbedderData(1); - if (v.IsEmpty()) + IFXJS_Runtime* pRuntime = FXJS_GetRuntimeFromIsolate(isolate); + if (!pRuntime) return; - v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v); - IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder()); C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); @@ -151,12 +145,9 @@ void JSMethod(const char* method_name_string, const char* class_name_string, const v8::FunctionCallbackInfo<v8::Value>& info) { v8::Isolate* isolate = info.GetIsolate(); - v8::Local<v8::Context> context = isolate->GetCurrentContext(); - v8::Local<v8::Value> v = context->GetEmbedderData(1); - if (v.IsEmpty()) + IFXJS_Runtime* pRuntime = FXJS_GetRuntimeFromIsolate(isolate); + if (!pRuntime) return; - v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v); - IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); CJS_Parameters parameters; for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) { @@ -282,12 +273,9 @@ void JSSpecialPropGet(const char* class_name, v8::Local<v8::String> property, const v8::PropertyCallbackInfo<v8::Value>& info) { v8::Isolate* isolate = info.GetIsolate(); - v8::Local<v8::Context> context = isolate->GetCurrentContext(); - v8::Local<v8::Value> v = context->GetEmbedderData(1); - if (v.IsEmpty()) + IFXJS_Runtime* pRuntime = FXJS_GetRuntimeFromIsolate(isolate); + if (!pRuntime) return; - v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v); - IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); CJS_Object* pJSObj = reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); @@ -311,12 +299,9 @@ void JSSpecialPropPut(const char* class_name, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<v8::Value>& info) { v8::Isolate* isolate = info.GetIsolate(); - v8::Local<v8::Context> context = isolate->GetCurrentContext(); - v8::Local<v8::Value> v = context->GetEmbedderData(1); - if (v.IsEmpty()) + IFXJS_Runtime* pRuntime = FXJS_GetRuntimeFromIsolate(isolate); + if (!pRuntime) return; - v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v); - IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); CJS_Object* pJSObj = reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); @@ -337,12 +322,9 @@ void JSSpecialPropDel(const char* class_name, v8::Local<v8::String> property, const v8::PropertyCallbackInfo<v8::Boolean>& info) { v8::Isolate* isolate = info.GetIsolate(); - v8::Local<v8::Context> context = isolate->GetCurrentContext(); - v8::Local<v8::Value> v = context->GetEmbedderData(1); - if (v.IsEmpty()) + IFXJS_Runtime* pRuntime = FXJS_GetRuntimeFromIsolate(isolate); + if (!pRuntime) return; - v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v); - IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); CJS_Object* pJSObj = reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); @@ -448,12 +430,9 @@ template <FX_BOOL ( void JSGlobalFunc(const char* func_name_string, const v8::FunctionCallbackInfo<v8::Value>& info) { v8::Isolate* isolate = info.GetIsolate(); - v8::Local<v8::Context> context = isolate->GetCurrentContext(); - v8::Local<v8::Value> v = context->GetEmbedderData(1); - if (v.IsEmpty()) + IFXJS_Runtime* pRuntime = FXJS_GetRuntimeFromIsolate(isolate); + if (!pRuntime) return; - v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v); - IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); CJS_Parameters parameters; for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) { diff --git a/fpdfsdk/include/jsapi/fxjs_v8.h b/fpdfsdk/include/jsapi/fxjs_v8.h index 0b51332dbc..ed652942af 100644 --- a/fpdfsdk/include/jsapi/fxjs_v8.h +++ b/fpdfsdk/include/jsapi/fxjs_v8.h @@ -74,10 +74,6 @@ void FXJS_Release(); // as part of FXJS_ReleaseRuntime(). void FXJS_PrepareIsolate(v8::Isolate* pIsolate); -// Call before making JS_PrepareIsolate call. -void JS_Initialize(unsigned int embedderDataSlot); -void JS_Release(); - // Call before making JS_Define* calls. Resources allocated here are cleared // as part of JS_ReleaseRuntime(). void JS_PrepareIsolate(v8::Isolate* pIsolate); @@ -122,6 +118,7 @@ void FXJS_InitializeRuntime(v8::Isolate* pIsolate, v8::Global<v8::Context>& v8PersistentContext); void FXJS_ReleaseRuntime(v8::Isolate* pIsolate, v8::Global<v8::Context>& v8PersistentContext); +IFXJS_Runtime* FXJS_GetRuntimeFromIsolate(v8::Isolate* pIsolate); // Called after FXJS_InitializeRuntime call made. int FXJS_Execute(v8::Isolate* pIsolate, diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp index d7868f1586..7009b4442b 100644 --- a/fpdfsdk/src/jsapi/fxjs_v8.cpp +++ b/fpdfsdk/src/jsapi/fxjs_v8.cpp @@ -5,7 +5,6 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #include "../../../core/include/fxcrt/fx_basic.h" -#include "../../include/fsdk_define.h" #include "../../include/jsapi/fxjs_v8.h" const wchar_t kFXJSValueNameString[] = L"string"; @@ -19,6 +18,12 @@ const wchar_t kFXJSValueNameUndefined[] = L"undefined"; static unsigned int g_embedderDataSlot = 1u; +// Keep this consistent with the values defined in gin/public/context_holder.h +// (without actually requiring a dependency on gin itself for the standalone +// embedders of PDFIum). The value we want to use is: +// kPerContextDataStartIndex + kEmbedderPDFium, which is 3. +static const unsigned int kPerContextDataIndex = 3u; + class CFXJS_PrivateData { public: CFXJS_PrivateData(int nObjDefID) : ObjDefID(nObjDefID), pPrivate(NULL) {} @@ -100,6 +105,13 @@ FXJS_PerIsolateData* FXJS_PerIsolateData::Get(v8::Isolate* pIsolate) { pIsolate->GetData(g_embedderDataSlot)); } +void FXJS_Initialize(unsigned int embedderDataSlot) { + g_embedderDataSlot = embedderDataSlot; +} + +void FXJS_Release() { +} + int FXJS_DefineObj(v8::Isolate* pIsolate, const wchar_t* sObjName, FXJSOBJTYPE eObjType, @@ -269,8 +281,7 @@ void FXJS_InitializeRuntime(v8::Isolate* pIsolate, v8::Context::Scope context_scope(v8Context); FXJS_PerIsolateData::SetUp(pIsolate); - v8::Local<v8::External> ptr = v8::External::New(pIsolate, pFXRuntime); - v8Context->SetEmbedderData(1, ptr); + v8Context->SetAlignedPointerInEmbedderData(kPerContextDataIndex, pFXRuntime); int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); for (int i = 0; i < maxID; ++i) { @@ -343,11 +354,10 @@ void FXJS_ReleaseRuntime(v8::Isolate* pIsolate, delete pData; } -void FXJS_Initialize(unsigned int embedderDataSlot) { - g_embedderDataSlot = embedderDataSlot; -} - -void FXJS_Release() { +IFXJS_Runtime* FXJS_GetRuntimeFromIsolate(v8::Isolate* pIsolate) { + v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); + return static_cast<IFXJS_Runtime*>( + context->GetAlignedPointerFromEmbedderData(kPerContextDataIndex)); } int FXJS_Execute(v8::Isolate* pIsolate, diff --git a/testing/resources/javascript/app_props_expected.txt b/testing/resources/javascript/app_props_expected.txt index 6e78ba510b..a17e0f82b5 100644 --- a/testing/resources/javascript/app_props_expected.txt +++ b/testing/resources/javascript/app_props_expected.txt @@ -1,5 +1,5 @@ Alert: *** Getting properties *** -Alert: app.activeDocs is object [object Object] +Alert: app.activeDocs is object [object global] Alert: app.calculate is boolean true Alert: app.formsVersion is number 7 Alert: ERROR: app.fs: @@ -25,7 +25,7 @@ Alert: ERROR: app.viewerType: Alert: ERROR: app.viewerVariation: Alert: ERROR: app.viewerVersion: Alert: *** Getting properties *** -Alert: app.activeDocs is object [object Object] +Alert: app.activeDocs is object [object global] Alert: app.calculate is boolean true Alert: app.formsVersion is number 7 Alert: ERROR: app.fs: |