Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(633)

Unified Diff: fpdfsdk/src/jsapi/fxjs_v8.cpp

Issue 1353193004: Add signatures to FXJS_V8. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: fpdfsdk/src/jsapi/fxjs_v8.cpp
diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp
index 69ea2cb48bbe96ae886220f4cde9f5249219d61a..cf93e95842567f9573ed185712fb50954700a06e 100644
--- a/fpdfsdk/src/jsapi/fxjs_v8.cpp
+++ b/fpdfsdk/src/jsapi/fxjs_v8.cpp
@@ -18,6 +18,7 @@ const wchar_t kFXJSValueNameNull[] = L"null";
const wchar_t kFXJSValueNameUndefined[] = L"undefined";
static unsigned int g_embedderDataSlot = 0u;
+static v8::Global<v8::ObjectTemplate> g_DefaultGloabalObjectTemplate;
jochen (gone - plz use gerrit) 2015/09/25 11:30:19 spelling of Global
Tom Sepez 2015/09/28 18:13:38 Done.
class CFXJS_PrivateData {
public:
@@ -26,47 +27,97 @@ class CFXJS_PrivateData {
void* pPrivate;
};
-class CFXJS_ObjDefintion {
+class CFXJS_ObjDefinition {
public:
- CFXJS_ObjDefintion(v8::Isolate* isolate,
- const wchar_t* sObjName,
- FXJSOBJTYPE eObjType,
- FXJS_CONSTRUCTOR pConstructor,
- FXJS_DESTRUCTOR pDestructor)
+ CFXJS_ObjDefinition(v8::Isolate* isolate,
+ const wchar_t* sObjName,
+ FXJSOBJTYPE eObjType,
+ FXJS_CONSTRUCTOR pConstructor,
+ FXJS_DESTRUCTOR pDestructor)
: objName(sObjName),
objType(eObjType),
m_pConstructor(pConstructor),
m_pDestructor(pDestructor),
- m_bSetAsGlobalObject(FALSE) {
+ m_bSetAsGlobalObject(FALSE),
+ m_pIsolate(isolate) {
v8::Isolate::Scope isolate_scope(isolate);
v8::HandleScope handle_scope(isolate);
- v8::Local<v8::ObjectTemplate> objTemplate =
- v8::ObjectTemplate::New(isolate);
- objTemplate->SetInternalFieldCount(2);
- m_objTemplate.Reset(isolate, objTemplate);
+ v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate);
+ v8::Local<v8::Signature> sig = v8::Signature::New(isolate, fun);
+
+ fun->InstanceTemplate()->SetInternalFieldCount(2);
+ fun->PrototypeTemplate()->SetInternalFieldCount(2);
+
+ m_Signature.Reset(isolate, sig);
+ m_FunctionTemplate.Reset(isolate, fun);
// Document as the global object.
if (FXSYS_wcscmp(sObjName, L"Document") == 0) {
m_bSetAsGlobalObject = TRUE;
}
}
- ~CFXJS_ObjDefintion() {
- m_objTemplate.Reset();
- m_StaticObj.Reset();
+
+ static CFXJS_ObjDefinition* FromID(v8::Isolate* pIsolate, int nObjDefnID) {
+ CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot);
+ // Note: GetAt() halts if out-of-range even in release builds.
+ return (CFXJS_ObjDefinition*)pArray->GetAt(nObjDefnID);
+ }
+
+ int AssignID() {
+ CFX_PtrArray* pArray =
+ (CFX_PtrArray*)m_pIsolate->GetData(g_embedderDataSlot);
+ pArray->Add(this);
+ return pArray->GetSize() - 1;
+ }
+
+ v8::Local<v8::ObjectTemplate> GetPrototypeTemplate() {
+ v8::EscapableHandleScope scope(m_pIsolate);
+ v8::Local<v8::FunctionTemplate> function =
+ m_FunctionTemplate.Get(m_pIsolate);
+ return scope.Escape(function->PrototypeTemplate());
+ }
+
+ v8::Local<v8::ObjectTemplate> GetInstanceTemplate() {
+ v8::EscapableHandleScope scope(m_pIsolate);
+ v8::Local<v8::FunctionTemplate> function =
+ m_FunctionTemplate.Get(m_pIsolate);
+ return scope.Escape(function->InstanceTemplate());
+ }
+
+ v8::Local<v8::Signature> GetSignature() {
+ v8::EscapableHandleScope scope(m_pIsolate);
+ return scope.Escape(m_Signature.Get(m_pIsolate));
}
- public:
const wchar_t* objName;
- FXJSOBJTYPE objType;
- FXJS_CONSTRUCTOR m_pConstructor;
- FXJS_DESTRUCTOR m_pDestructor;
+ const FXJSOBJTYPE objType;
+ const FXJS_CONSTRUCTOR m_pConstructor;
+ const FXJS_DESTRUCTOR m_pDestructor;
FX_BOOL m_bSetAsGlobalObject;
- v8::Global<v8::ObjectTemplate> m_objTemplate;
+ v8::Isolate* m_pIsolate;
+ v8::Global<v8::FunctionTemplate> m_FunctionTemplate;
+ v8::Global<v8::Signature> m_Signature;
v8::Global<v8::Object> m_StaticObj;
};
+static v8::Local<v8::ObjectTemplate> GetGlobalObjectTemplate(
+ v8::Isolate* pIsolate) {
+ CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot);
+ for (int i = 0; i < pArray->GetSize(); ++i) {
+ CFXJS_ObjDefinition* pObjDef = (CFXJS_ObjDefinition*)pArray->GetAt(i);
+ if (pObjDef->m_bSetAsGlobalObject)
+ return pObjDef->GetPrototypeTemplate();
+ }
+
+ if (g_DefaultGloabalObjectTemplate.IsEmpty())
+ g_DefaultGloabalObjectTemplate.Reset(pIsolate,
+ v8::ObjectTemplate::New(pIsolate));
+
+ return g_DefaultGloabalObjectTemplate.Get(pIsolate);
+}
+
void* FXJS_ArrayBufferAllocator::Allocate(size_t length) {
return calloc(1, length);
}
@@ -91,13 +142,10 @@ int FXJS_DefineObj(v8::Isolate* pIsolate,
FXJS_DESTRUCTOR pDestructor) {
v8::Isolate::Scope isolate_scope(pIsolate);
v8::HandleScope handle_scope(pIsolate);
-
FXJS_PrepareIsolate(pIsolate);
- CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot);
- CFXJS_ObjDefintion* pObjDef = new CFXJS_ObjDefintion(
+ CFXJS_ObjDefinition* pObjDef = new CFXJS_ObjDefinition(
pIsolate, sObjName, eObjType, pConstructor, pDestructor);
- pArray->Add(pObjDef);
- return pArray->GetSize() - 1;
+ return pObjDef->AssignID();
}
void FXJS_DefineObjMethod(v8::Isolate* pIsolate,
@@ -106,20 +154,15 @@ void FXJS_DefineObjMethod(v8::Isolate* pIsolate,
v8::FunctionCallback pMethodCall) {
v8::Isolate::Scope isolate_scope(pIsolate);
v8::HandleScope handle_scope(pIsolate);
-
- CFX_WideString ws = CFX_WideString(sMethodName);
- CFX_ByteString bsMethodName = ws.UTF8Encode();
- CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot);
-
- // Note: GetAt() halts if out-of-range even in release builds.
- CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
- v8::Local<v8::ObjectTemplate> objTemp =
- v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate);
- objTemp->Set(
+ CFX_ByteString bsMethodName = CFX_WideString(sMethodName).UTF8Encode();
+ CFXJS_ObjDefinition* pObjDef =
+ CFXJS_ObjDefinition::FromID(pIsolate, nObjDefnID);
+ pObjDef->GetPrototypeTemplate()->Set(
v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(),
v8::NewStringType::kNormal).ToLocalChecked(),
- v8::FunctionTemplate::New(pIsolate, pMethodCall), v8::ReadOnly);
- pObjDef->m_objTemplate.Reset(pIsolate, objTemp);
+ v8::FunctionTemplate::New(pIsolate, pMethodCall, v8::Local<v8::Value>(),
+ pObjDef->GetSignature()),
+ v8::ReadOnly);
}
void FXJS_DefineObjProperty(v8::Isolate* pIsolate,
@@ -129,20 +172,13 @@ void FXJS_DefineObjProperty(v8::Isolate* pIsolate,
v8::AccessorSetterCallback pPropPut) {
v8::Isolate::Scope isolate_scope(pIsolate);
v8::HandleScope handle_scope(pIsolate);
-
- CFX_WideString ws = CFX_WideString(sPropName);
- CFX_ByteString bsPropertyName = ws.UTF8Encode();
- CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot);
-
- // Note: GetAt() halts if out-of-range even in release builds.
- CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
- v8::Local<v8::ObjectTemplate> objTemp =
- v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate);
- objTemp->SetAccessor(
+ CFX_ByteString bsPropertyName = CFX_WideString(sPropName).UTF8Encode();
+ CFXJS_ObjDefinition* pObjDef =
+ CFXJS_ObjDefinition::FromID(pIsolate, nObjDefnID);
+ pObjDef->GetPrototypeTemplate()->SetAccessor(
v8::String::NewFromUtf8(pIsolate, bsPropertyName.c_str(),
v8::NewStringType::kNormal).ToLocalChecked(),
pPropGet, pPropPut);
- pObjDef->m_objTemplate.Reset(pIsolate, objTemp);
}
void FXJS_DefineObjAllProperties(v8::Isolate* pIsolate,
@@ -153,14 +189,10 @@ void FXJS_DefineObjAllProperties(v8::Isolate* pIsolate,
v8::NamedPropertyDeleterCallback pPropDel) {
v8::Isolate::Scope isolate_scope(pIsolate);
v8::HandleScope handle_scope(pIsolate);
- CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot);
-
- // Note: GetAt() halts if out-of-range even in release builds.
- CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
- v8::Local<v8::ObjectTemplate> objTemp =
- v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate);
- objTemp->SetNamedPropertyHandler(pPropGet, pPropPut, pPropQurey, pPropDel);
- pObjDef->m_objTemplate.Reset(pIsolate, objTemp);
+ CFXJS_ObjDefinition* pObjDef =
+ CFXJS_ObjDefinition::FromID(pIsolate, nObjDefnID);
+ pObjDef->GetPrototypeTemplate()->SetNamedPropertyHandler(
+ pPropGet, pPropPut, pPropQurey, pPropDel);
}
void FXJS_DefineObjConst(v8::Isolate* pIsolate,
@@ -169,33 +201,10 @@ void FXJS_DefineObjConst(v8::Isolate* pIsolate,
v8::Local<v8::Value> pDefault) {
v8::Isolate::Scope isolate_scope(pIsolate);
v8::HandleScope handle_scope(pIsolate);
-
- CFX_WideString ws = CFX_WideString(sConstName);
- CFX_ByteString bsConstName = ws.UTF8Encode();
- CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot);
-
- // Note: GetAt() halts if out-of-range even in release builds.
- CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
- v8::Local<v8::ObjectTemplate> objTemp =
- v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate);
- objTemp->Set(pIsolate, bsConstName.c_str(), pDefault);
- pObjDef->m_objTemplate.Reset(pIsolate, objTemp);
-}
-
-static v8::Global<v8::ObjectTemplate>& _getGlobalObjectTemplate(
- v8::Isolate* pIsolate) {
- v8::Isolate::Scope isolate_scope(pIsolate);
- v8::HandleScope handle_scope(pIsolate);
-
- CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot);
- ASSERT(pArray != NULL);
- for (int i = 0; i < pArray->GetSize(); i++) {
- CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i);
- if (pObjDef->m_bSetAsGlobalObject)
- return pObjDef->m_objTemplate;
- }
- static v8::Global<v8::ObjectTemplate> gloabalObjectTemplate;
- return gloabalObjectTemplate;
+ CFX_ByteString bsConstName = CFX_WideString(sConstName).UTF8Encode();
+ CFXJS_ObjDefinition* pObjDef =
+ CFXJS_ObjDefinition::FromID(pIsolate, nObjDefnID);
+ pObjDef->GetPrototypeTemplate()->Set(pIsolate, bsConstName.c_str(), pDefault);
}
void FXJS_DefineGlobalMethod(v8::Isolate* pIsolate,
@@ -203,26 +212,11 @@ void FXJS_DefineGlobalMethod(v8::Isolate* pIsolate,
v8::FunctionCallback pMethodCall) {
v8::Isolate::Scope isolate_scope(pIsolate);
v8::HandleScope handle_scope(pIsolate);
-
- CFX_WideString ws = CFX_WideString(sMethodName);
- CFX_ByteString bsMethodName = ws.UTF8Encode();
-
- v8::Local<v8::FunctionTemplate> funTempl =
- v8::FunctionTemplate::New(pIsolate, pMethodCall);
- v8::Local<v8::ObjectTemplate> objTemp;
-
- v8::Global<v8::ObjectTemplate>& globalObjTemp =
- _getGlobalObjectTemplate(pIsolate);
- if (globalObjTemp.IsEmpty())
- objTemp = v8::ObjectTemplate::New(pIsolate);
- else
- objTemp = v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp);
- objTemp->Set(
+ CFX_ByteString bsMethodName = CFX_WideString(sMethodName).UTF8Encode();
+ GetGlobalObjectTemplate(pIsolate)->Set(
v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(),
v8::NewStringType::kNormal).ToLocalChecked(),
- funTempl, v8::ReadOnly);
-
- globalObjTemp.Reset(pIsolate, objTemp);
+ v8::FunctionTemplate::New(pIsolate, pMethodCall), v8::ReadOnly);
}
void FXJS_DefineGlobalConst(v8::Isolate* pIsolate,
@@ -230,24 +224,11 @@ void FXJS_DefineGlobalConst(v8::Isolate* pIsolate,
v8::Local<v8::Value> pDefault) {
v8::Isolate::Scope isolate_scope(pIsolate);
v8::HandleScope handle_scope(pIsolate);
-
- CFX_WideString ws = CFX_WideString(sConstName);
- CFX_ByteString bsConst = ws.UTF8Encode();
-
- v8::Local<v8::ObjectTemplate> objTemp;
-
- v8::Global<v8::ObjectTemplate>& globalObjTemp =
- _getGlobalObjectTemplate(pIsolate);
- if (globalObjTemp.IsEmpty())
- objTemp = v8::ObjectTemplate::New(pIsolate);
- else
- objTemp = v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp);
- objTemp->Set(
+ CFX_ByteString bsConst = CFX_WideString(sConstName).UTF8Encode();
+ GetGlobalObjectTemplate(pIsolate)->Set(
v8::String::NewFromUtf8(pIsolate, bsConst.c_str(),
v8::NewStringType::kNormal).ToLocalChecked(),
pDefault, v8::ReadOnly);
-
- globalObjTemp.Reset(pIsolate, objTemp);
}
void FXJS_InitializeRuntime(v8::Isolate* pIsolate,
@@ -256,12 +237,8 @@ void FXJS_InitializeRuntime(v8::Isolate* pIsolate,
v8::Global<v8::Context>& v8PersistentContext) {
v8::Isolate::Scope isolate_scope(pIsolate);
v8::HandleScope handle_scope(pIsolate);
-
- v8::Global<v8::ObjectTemplate>& globalObjTemp =
- _getGlobalObjectTemplate(pIsolate);
- v8::Local<v8::Context> v8Context = v8::Context::New(
- pIsolate, NULL,
- v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp));
+ v8::Local<v8::Context> v8Context =
+ v8::Context::New(pIsolate, NULL, GetGlobalObjectTemplate(pIsolate));
v8::Context::Scope context_scope(v8Context);
v8::Local<v8::External> ptr = v8::External::New(pIsolate, pFXRuntime);
@@ -272,7 +249,7 @@ void FXJS_InitializeRuntime(v8::Isolate* pIsolate,
return;
for (int i = 0; i < pArray->GetSize(); i++) {
- CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i);
+ CFXJS_ObjDefinition* pObjDef = (CFXJS_ObjDefinition*)pArray->GetAt(i);
CFX_WideString ws = CFX_WideString(pObjDef->objName);
CFX_ByteString bs = ws.UTF8Encode();
v8::Local<v8::String> objName =
@@ -324,7 +301,7 @@ void FXJS_ReleaseRuntime(v8::Isolate* pIsolate,
return;
for (int i = 0; i < pArray->GetSize(); i++) {
- CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i);
+ CFXJS_ObjDefinition* pObjDef = (CFXJS_ObjDefinition*)pArray->GetAt(i);
if (!pObjDef->m_StaticObj.IsEmpty()) {
v8::Local<v8::Object> pObj =
v8::Local<v8::Object>::New(pIsolate, pObjDef->m_StaticObj);
@@ -352,10 +329,7 @@ int FXJS_Execute(v8::Isolate* pIsolate,
FXJSErr* pError) {
v8::Isolate::Scope isolate_scope(pIsolate);
v8::TryCatch try_catch(pIsolate);
-
- CFX_WideString wsScript(script);
- CFX_ByteString bsScript = wsScript.UTF8Encode();
-
+ CFX_ByteString bsScript = CFX_WideString(script).UTF8Encode();
v8::Local<v8::Context> context = pIsolate->GetCurrentContext();
v8::Local<v8::Script> compiled_script;
if (!v8::Script::Compile(
@@ -385,23 +359,18 @@ v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate,
if (-1 == nObjDefnID) {
v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(pIsolate);
v8::Local<v8::Object> obj;
- if (objTempl->NewInstance(context).ToLocal(&obj))
- return obj;
- return v8::Local<v8::Object>();
+ if (!objTempl->NewInstance(context).ToLocal(&obj))
+ return v8::Local<v8::Object>();
+ return obj;
}
- CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot);
- if (!pArray)
- return v8::Local<v8::Object>();
-
- if (nObjDefnID < 0 || nObjDefnID >= pArray->GetSize())
+ if (!pIsolate->GetData(g_embedderDataSlot))
return v8::Local<v8::Object>();
- CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
- v8::Local<v8::ObjectTemplate> objTemp =
- v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate);
+ CFXJS_ObjDefinition* pObjDef =
+ CFXJS_ObjDefinition::FromID(pIsolate, nObjDefnID);
v8::Local<v8::Object> obj;
- if (!objTemp->NewInstance(context).ToLocal(&obj))
+ if (!pObjDef->GetInstanceTemplate()->NewInstance(context).ToLocal(&obj))
return v8::Local<v8::Object>();
CFXJS_PrivateData* pPrivateData = new CFXJS_PrivateData;
@@ -453,7 +422,7 @@ int FXJS_GetObjDefnID(v8::Isolate* pIsolate, const wchar_t* pObjName) {
return -1;
for (int i = 0; i < pArray->GetSize(); i++) {
- CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i);
+ CFXJS_ObjDefinition* pObjDef = (CFXJS_ObjDefinition*)pArray->GetAt(i);
if (FXSYS_wcscmp(pObjDef->objName, pObjName) == 0)
return i;
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698