summaryrefslogtreecommitdiff
path: root/fpdfsdk
diff options
context:
space:
mode:
Diffstat (limited to 'fpdfsdk')
-rw-r--r--fpdfsdk/src/jsapi/fxjs_v8.cpp171
1 files changed, 71 insertions, 100 deletions
diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp
index 7009b4442b..ffe04bbfe5 100644
--- a/fpdfsdk/src/jsapi/fxjs_v8.cpp
+++ b/fpdfsdk/src/jsapi/fxjs_v8.cpp
@@ -24,6 +24,8 @@ static unsigned int g_embedderDataSlot = 1u;
// kPerContextDataStartIndex + kEmbedderPDFium, which is 3.
static const unsigned int kPerContextDataIndex = 3u;
+static v8::Global<v8::ObjectTemplate> g_DefaultGlobalObjectTemplate;
+
class CFXJS_PrivateData {
public:
CFXJS_PrivateData(int nObjDefID) : ObjDefID(nObjDefID), pPrivate(NULL) {}
@@ -52,35 +54,70 @@ class CFXJS_ObjDefinition {
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);
+ fun->InstanceTemplate()->SetInternalFieldCount(2);
+ m_FunctionTemplate.Reset(isolate, fun);
+
+ v8::Local<v8::Signature> sig = v8::Signature::New(isolate, fun);
+ m_Signature.Reset(isolate, sig);
// Document as the global object.
if (FXSYS_wcscmp(sObjName, L"Document") == 0) {
m_bSetAsGlobalObject = TRUE;
}
}
- ~CFXJS_ObjDefinition() {
- m_objTemplate.Reset();
- m_StaticObj.Reset();
+
+ int AssignID() {
+ FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(m_pIsolate);
+ pData->m_ObjectDefnArray.Add(this);
+ return pData->m_ObjectDefnArray.GetSize() - 1;
+ }
+
+ 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));
}
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) {
+ int maxID = CFXJS_ObjDefinition::MaxID(pIsolate);
+ for (int i = 0; i < maxID; ++i) {
+ CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i);
+ if (pObjDef->m_bSetAsGlobalObject)
+ return pObjDef->GetInstanceTemplate();
+ }
+
+ if (g_DefaultGlobalObjectTemplate.IsEmpty())
+ g_DefaultGlobalObjectTemplate.Reset(pIsolate,
+ v8::ObjectTemplate::New(pIsolate));
+
+ return g_DefaultGlobalObjectTemplate.Get(pIsolate);
+}
+
void* FXJS_ArrayBufferAllocator::Allocate(size_t length) {
return calloc(1, length);
}
@@ -121,10 +158,9 @@ int FXJS_DefineObj(v8::Isolate* pIsolate,
v8::HandleScope handle_scope(pIsolate);
FXJS_PerIsolateData::SetUp(pIsolate);
- FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate);
- pData->m_ObjectDefnArray.Add(new CFXJS_ObjDefinition(
- pIsolate, sObjName, eObjType, pConstructor, pDestructor));
- return pData->m_ObjectDefnArray.GetSize() - 1;
+ CFXJS_ObjDefinition* pObjDef = new CFXJS_ObjDefinition(
+ pIsolate, sObjName, eObjType, pConstructor, pDestructor);
+ return pObjDef->AssignID();
}
void FXJS_DefineObjMethod(v8::Isolate* pIsolate,
@@ -133,18 +169,15 @@ void FXJS_DefineObjMethod(v8::Isolate* pIsolate,
v8::FunctionCallback pMethodCall) {
v8::Isolate::Scope isolate_scope(pIsolate);
v8::HandleScope handle_scope(pIsolate);
-
CFX_ByteString bsMethodName = CFX_WideString(sMethodName).UTF8Encode();
CFXJS_ObjDefinition* pObjDef =
CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID);
- v8::Local<v8::ObjectTemplate> objTemp =
- v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate);
-
- objTemp->Set(
+ pObjDef->GetInstanceTemplate()->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,
@@ -154,17 +187,13 @@ void FXJS_DefineObjProperty(v8::Isolate* pIsolate,
v8::AccessorSetterCallback pPropPut) {
v8::Isolate::Scope isolate_scope(pIsolate);
v8::HandleScope handle_scope(pIsolate);
-
CFX_ByteString bsPropertyName = CFX_WideString(sPropName).UTF8Encode();
CFXJS_ObjDefinition* pObjDef =
CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID);
- v8::Local<v8::ObjectTemplate> objTemp =
- v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate);
- objTemp->SetAccessor(
+ pObjDef->GetInstanceTemplate()->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,
@@ -175,13 +204,10 @@ void FXJS_DefineObjAllProperties(v8::Isolate* pIsolate,
v8::NamedPropertyDeleterCallback pPropDel) {
v8::Isolate::Scope isolate_scope(pIsolate);
v8::HandleScope handle_scope(pIsolate);
-
CFXJS_ObjDefinition* pObjDef =
CFXJS_ObjDefinition::ForID(pIsolate, 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);
+ pObjDef->GetInstanceTemplate()->SetNamedPropertyHandler(pPropGet, pPropPut,
+ pPropQurey, pPropDel);
}
void FXJS_DefineObjConst(v8::Isolate* pIsolate,
@@ -190,29 +216,10 @@ void FXJS_DefineObjConst(v8::Isolate* pIsolate,
v8::Local<v8::Value> pDefault) {
v8::Isolate::Scope isolate_scope(pIsolate);
v8::HandleScope handle_scope(pIsolate);
-
CFX_ByteString bsConstName = CFX_WideString(sConstName).UTF8Encode();
CFXJS_ObjDefinition* pObjDef =
CFXJS_ObjDefinition::ForID(pIsolate, 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);
-
- int maxID = CFXJS_ObjDefinition::MaxID(pIsolate);
- for (int i = 0; i < maxID; ++i) {
- CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i);
- if (pObjDef->m_bSetAsGlobalObject)
- return pObjDef->m_objTemplate;
- }
- static v8::Global<v8::ObjectTemplate> gloabalObjectTemplate;
- return gloabalObjectTemplate;
+ pObjDef->GetInstanceTemplate()->Set(pIsolate, bsConstName.c_str(), pDefault);
}
void FXJS_DefineGlobalMethod(v8::Isolate* pIsolate,
@@ -220,24 +227,11 @@ void FXJS_DefineGlobalMethod(v8::Isolate* pIsolate,
v8::FunctionCallback pMethodCall) {
v8::Isolate::Scope isolate_scope(pIsolate);
v8::HandleScope handle_scope(pIsolate);
-
CFX_ByteString bsMethodName = CFX_WideString(sMethodName).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(
+ 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,
@@ -245,24 +239,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,
@@ -272,12 +253,8 @@ void FXJS_InitializeRuntime(v8::Isolate* pIsolate,
v8::Isolate::Scope isolate_scope(pIsolate);
v8::Locker locker(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);
FXJS_PerIsolateData::SetUp(pIsolate);
@@ -367,10 +344,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(
@@ -400,9 +374,9 @@ v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate,
if (nObjDefnID == -1) {
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;
}
FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate);
@@ -414,11 +388,8 @@ v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate,
CFXJS_ObjDefinition* pObjDef =
CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID);
-
- v8::Local<v8::ObjectTemplate> objTemp =
- v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate);
v8::Local<v8::Object> obj;
- if (!objTemp->NewInstance(context).ToLocal(&obj))
+ if (!pObjDef->GetInstanceTemplate()->NewInstance(context).ToLocal(&obj))
return v8::Local<v8::Object>();
obj->SetAlignedPointerInInternalField(0, new CFXJS_PrivateData(nObjDefnID));