Make v8 embedder data slot configurable Chrome already uses 0 and 1. BUG=none R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1235303003 .
diff --git a/fpdfsdk/include/jsapi/fxjs_v8.h b/fpdfsdk/include/jsapi/fxjs_v8.h index f5d6992..b4dac71 100644 --- a/fpdfsdk/include/jsapi/fxjs_v8.h +++ b/fpdfsdk/include/jsapi/fxjs_v8.h
@@ -63,7 +63,7 @@ void JS_InitialRuntime(IJS_Runtime* pJSRuntime,IFXJS_Runtime* pFXRuntime, IFXJS_Context* context, v8::Global<v8::Context>& v8PersistentContext); void JS_ReleaseRuntime(IJS_Runtime* pJSRuntime, v8::Global<v8::Context>& v8PersistentContext); -void JS_Initial(); +void JS_Initial(unsigned int embedderDataSlot); void JS_Release(); int JS_Parse(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror); int JS_Execute(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror);
diff --git a/fpdfsdk/src/javascript/JS_Runtime.cpp b/fpdfsdk/src/javascript/JS_Runtime.cpp index b26f5a2..f21819a 100644 --- a/fpdfsdk/src/javascript/JS_Runtime.cpp +++ b/fpdfsdk/src/javascript/JS_Runtime.cpp
@@ -35,7 +35,11 @@ { if (!m_bInit) { - JS_Initial(); + unsigned int embedderDataSlot = 0; + if (pApp->GetFormFillInfo()->m_pJsPlatform->version >= 2) { + embedderDataSlot = pApp->GetFormFillInfo()->m_pJsPlatform->m_v8EmbedderSlot; + } + JS_Initial(embedderDataSlot); m_bInit = TRUE; } return new CJS_Runtime(pApp);
diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp index 7adfc26..feed779 100644 --- a/fpdfsdk/src/jsapi/fxjs_v8.cpp +++ b/fpdfsdk/src/jsapi/fxjs_v8.cpp
@@ -26,6 +26,7 @@ { return *(double*)g_nan; } +static unsigned int g_embedderDataSlot = 0u; class CJS_PrivateData @@ -79,11 +80,11 @@ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; v8::Isolate::Scope isolate_scope(isolate); v8::HandleScope handle_scope(isolate); - CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot); if(!pArray) { pArray = new CFX_PtrArray(); - isolate->SetData(0, pArray); + isolate->SetData(g_embedderDataSlot, pArray); } CJS_ObjDefintion* pObjDef = new CJS_ObjDefintion(isolate, sObjName, eObjType, pConstructor, pDestructor, bApplyNew); pArray->Add(pObjDef); @@ -99,7 +100,7 @@ CFX_WideString ws = CFX_WideString(sMethodName); CFX_ByteString bsMethodName = ws.UTF8Encode(); - CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot); if(!pArray) return 0; if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0; @@ -119,7 +120,7 @@ CFX_WideString ws = CFX_WideString(sPropName); CFX_ByteString bsPropertyName = ws.UTF8Encode(); - CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot); if(!pArray) return 0; if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0; @@ -136,7 +137,7 @@ v8::Isolate::Scope isolate_scope(isolate); v8::HandleScope handle_scope(isolate); - CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot); if(!pArray) return 0; if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0; @@ -153,7 +154,7 @@ v8::Isolate::Scope isolate_scope(isolate); v8::HandleScope handle_scope(isolate); - CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot); if(!pArray) return 0; CFX_WideString ws = CFX_WideString(sConstName); @@ -173,7 +174,7 @@ v8::Isolate::Scope isolate_scope(isolate); v8::HandleScope handle_scope(isolate); - CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot); ASSERT(pArray != NULL); for(int i=0; i<pArray->GetSize(); i++) { @@ -246,7 +247,7 @@ v8::Local<v8::External> ptr = v8::External::New(isolate, pFXRuntime); v8Context->SetEmbedderData(1, ptr); - CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot); if(!pArray) return; for(int i=0; i<pArray->GetSize(); i++) @@ -290,7 +291,7 @@ v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, v8PersistentContext); v8::Context::Scope context_scope(context); - CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot); if(!pArray) return ; for(int i=0; i<pArray->GetSize(); i++) @@ -306,11 +307,12 @@ delete pObjDef; } delete pArray; - isolate->SetData(0,NULL); + isolate->SetData(g_embedderDataSlot,NULL); } -void JS_Initial() +void JS_Initial(unsigned int embedderDataSlot) { + g_embedderDataSlot = embedderDataSlot; } void JS_Release() { @@ -372,7 +374,7 @@ return v8::Local<v8::Object>(); } - CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot); if(!pArray) return v8::Local<v8::Object>(); @@ -398,7 +400,7 @@ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; v8::Isolate::Scope isolate_scope(isolate); - CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot); if(!pArray) return v8::Local<v8::Object>(); if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return v8::Local<v8::Object>(); @@ -417,7 +419,7 @@ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; v8::Isolate::Scope isolate_scope(isolate); - CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot); if(!pArray) return v8::Local<v8::Object>(); v8::Local<v8::Context> context = isolate->GetCurrentContext(); @@ -446,7 +448,7 @@ v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; v8::Isolate::Scope isolate_scope(isolate); - CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); + CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(g_embedderDataSlot); if(!pArray) return -1; for(int i=0; i<pArray->GetSize(); i++)
diff --git a/public/fpdf_formfill.h b/public/fpdf_formfill.h index 1cc5551..22ebc61 100644 --- a/public/fpdf_formfill.h +++ b/public/fpdf_formfill.h
@@ -231,6 +231,13 @@ * pointer to the v8::Isolate to use, or NULL to force PDFium to create one. **/ void* m_isolate; + + /** + * The embedder data slot to use in the v8::Isolate to store PDFium's + * per-isolate data. The value needs to be between 0 and + * v8::Internals::kNumIsolateDataLots (exclusive). + */ + unsigned int m_v8EmbedderSlot; } IPDF_JSPLATFORM; // Flags for Cursor type