Add type tags to calls to v8::External The v8::External API got extended to take a type tag parameter. A v8::External created with a Tag A can only be unwrapped with the same Tag A. So far, this CL only adds the default tag everywhere in PDFium. Ideally, each type stored in a v8::External would get its own tag. However, it is unclear so far how to synchronize the tags used in PDFium with the tags used in Blink. Change-Id: Ic18c72f6c008c2f31796b9a48b9a3625a3ca7ca2 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/136650 Reviewed-by: Tom Sepez <tsepez@chromium.org> Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/xfa/cfxjse_class.cpp b/fxjs/xfa/cfxjse_class.cpp index 47b3339..0e5f8c4 100644 --- a/fxjs/xfa/cfxjse_class.cpp +++ b/fxjs/xfa/cfxjse_class.cpp
@@ -50,7 +50,8 @@ void V8FunctionCallback_Wrapper( const v8::FunctionCallbackInfo<v8::Value>& info) { const FXJSE_FUNCTION_DESCRIPTOR* pFunctionInfo = - AsFunctionDescriptor(info.Data().As<v8::External>()->Value()); + AsFunctionDescriptor(info.Data().As<v8::External>()->Value( + v8::kExternalPointerTypeTagDefault)); if (!pFunctionInfo) { return; } @@ -65,21 +66,22 @@ } const FXJSE_CLASS_DESCRIPTOR* pClassDescriptor = - AsClassDescriptor(info.Data().As<v8::External>()->Value()); + AsClassDescriptor(info.Data().As<v8::External>()->Value( + v8::kExternalPointerTypeTagDefault)); if (!pClassDescriptor) { return; } DCHECK_EQ(info.This()->InternalFieldCount(), 2); - info.This()->SetAlignedPointerInInternalField( - 0, nullptr, kDefaultPDFiumTag); + info.This()->SetAlignedPointerInInternalField(0, nullptr, kDefaultPDFiumTag); info.This()->SetInternalField(1, v8::Undefined(info.GetIsolate())); } void Context_GlobalObjToString( const v8::FunctionCallbackInfo<v8::Value>& info) { const FXJSE_CLASS_DESCRIPTOR* pClassDescriptor = - AsClassDescriptor(info.Data().As<v8::External>()->Value()); + AsClassDescriptor(info.Data().As<v8::External>()->Value( + v8::kExternalPointerTypeTagDefault)); if (!pClassDescriptor) { return; } @@ -106,8 +108,7 @@ } auto* pClassDescriptor = static_cast<const FXJSE_CLASS_DESCRIPTOR*>( - hCallBackInfo->GetAlignedPointerFromInternalField( - 0, kDefaultPDFiumTag)); + hCallBackInfo->GetAlignedPointerFromInternalField(0, kDefaultPDFiumTag)); if (pClassDescriptor != &kGlobalClassDescriptor && pClassDescriptor != &kNormalClassDescriptor && pClassDescriptor != &kVariablesClassDescriptor && @@ -212,7 +213,8 @@ v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Integer>& info) { const FXJSE_CLASS_DESCRIPTOR* pClass = - AsClassDescriptor(info.Data().As<v8::External>()->Value()); + AsClassDescriptor(info.Data().As<v8::External>()->Value( + v8::kExternalPointerTypeTagDefault)); if (!pClass) { return v8::Intercepted::kNo; } @@ -235,7 +237,8 @@ v8::Local<v8::Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) { const FXJSE_CLASS_DESCRIPTOR* pClass = - AsClassDescriptor(info.Data().As<v8::External>()->Value()); + AsClassDescriptor(info.Data().As<v8::External>()->Value( + v8::kExternalPointerTypeTagDefault)); if (!pClass) { return v8::Intercepted::kNo; } @@ -255,7 +258,8 @@ v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<void>& info) { const FXJSE_CLASS_DESCRIPTOR* pClass = - AsClassDescriptor(info.Data().As<v8::External>()->Value()); + AsClassDescriptor(info.Data().As<v8::External>()->Value( + v8::kExternalPointerTypeTagDefault)); if (!pClass) { return v8::Intercepted::kNo; } @@ -285,7 +289,8 @@ : nullptr, nullptr, NamedPropertyEnumeratorCallback, v8::External::New(pIsolate, - const_cast<FXJSE_CLASS_DESCRIPTOR*>(pClassDescriptor)), + const_cast<FXJSE_CLASS_DESCRIPTOR*>(pClassDescriptor), + v8::kExternalPointerTypeTagDefault), v8::PropertyHandlerFlags::kNonMasking); pObjectTemplate->SetHandler(configuration); } @@ -315,7 +320,8 @@ v8::Local<v8::FunctionTemplate> hFunctionTemplate = v8::FunctionTemplate::New( pIsolate, bIsJSGlobal ? nullptr : V8ConstructorCallback_Wrapper, v8::External::New(pIsolate, - const_cast<FXJSE_CLASS_DESCRIPTOR*>(pClassDescriptor))); + const_cast<FXJSE_CLASS_DESCRIPTOR*>(pClassDescriptor), + v8::kExternalPointerTypeTagDefault)); v8::Local<v8::String> classname = fxv8::NewStringHelper(pIsolate, pClassDescriptor->name); hFunctionTemplate->SetClassName(classname); @@ -331,7 +337,8 @@ v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New( pIsolate, V8FunctionCallback_Wrapper, v8::External::New(pIsolate, - const_cast<FXJSE_FUNCTION_DESCRIPTOR*>(&method))); + const_cast<FXJSE_FUNCTION_DESCRIPTOR*>(&method), + v8::kExternalPointerTypeTagDefault)); fun->RemovePrototype(); hObjectTemplate->Set( fxv8::NewStringHelper(pIsolate, method.name), fun, @@ -341,8 +348,9 @@ if (bIsJSGlobal) { v8::Local<v8::FunctionTemplate> fn = v8::FunctionTemplate::New( pIsolate, Context_GlobalObjToString, - v8::External::New( - pIsolate, const_cast<FXJSE_CLASS_DESCRIPTOR*>(pClassDescriptor))); + v8::External::New(pIsolate, + const_cast<FXJSE_CLASS_DESCRIPTOR*>(pClassDescriptor), + v8::kExternalPointerTypeTagDefault)); fn->RemovePrototype(); hObjectTemplate->Set(fxv8::NewStringHelper(pIsolate, "toString"), fn); }
diff --git a/fxjs/xfa/cfxjse_runtimedata.cpp b/fxjs/xfa/cfxjse_runtimedata.cpp index a1b68b9..0d4126a 100644 --- a/fxjs/xfa/cfxjse_runtimedata.cpp +++ b/fxjs/xfa/cfxjse_runtimedata.cpp
@@ -4,14 +4,13 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -#include "fxjs/xfa/cfxjse_runtimedata.h" - #include <utility> #include "core/fxcrt/check_op.h" #include "fxjs/cfxjs_engine.h" #include "fxjs/fxv8.h" #include "fxjs/xfa/cfxjse_isolatetracker.h" +#include "fxjs/xfa/cfxjse_runtimedata.h" #include "v8/include/v8-context.h" #include "v8/include/v8-external.h" #include "v8/include/v8-isolate.h" @@ -40,7 +39,8 @@ DCHECK_EQ(hContext->Global()->InternalFieldCount(), 0); - hContext->SetSecurityToken(v8::External::New(pIsolate, pIsolate)); + hContext->SetSecurityToken(v8::External::New( + pIsolate, pIsolate, v8::kExternalPointerTypeTagDefault)); pRuntimeData->root_context_global_template_.Reset(pIsolate, hFuncTemplate); pRuntimeData->root_context_.Reset(pIsolate, hContext); return pRuntimeData;