summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fxjs/cfxjs_engine.cpp38
1 files changed, 27 insertions, 11 deletions
diff --git a/fxjs/cfxjs_engine.cpp b/fxjs/cfxjs_engine.cpp
index 1a02ec9a78..8587b8af98 100644
--- a/fxjs/cfxjs_engine.cpp
+++ b/fxjs/cfxjs_engine.cpp
@@ -586,17 +586,33 @@ void CFXJS_Engine::Error(const WideString& message) {
// static
CJS_Object* CFXJS_Engine::GetObjectPrivate(v8::Local<v8::Object> pObj) {
- CFXJS_PerObjectData* pData = CFXJS_PerObjectData::GetFromObject(pObj);
- if (!pData && !pObj.IsEmpty()) {
- // It could be a global proxy object.
- v8::Local<v8::Value> v = pObj->GetPrototype();
- if (v->IsObject()) {
- pData = CFXJS_PerObjectData::GetFromObject(
- v->ToObject(v8::Isolate::GetCurrent()->GetCurrentContext())
- .ToLocalChecked());
- }
- }
- return pData ? pData->m_pPrivate.get() : nullptr;
+ auto* pData = CFXJS_PerObjectData::GetFromObject(pObj);
+ if (pData)
+ return pData->m_pPrivate.get();
+
+ if (pObj.IsEmpty())
+ return nullptr;
+
+ // It could be a global proxy object, in which case the prototype holds
+ // the actual bound object.
+ v8::Local<v8::Value> val = pObj->GetPrototype();
+ if (!val->IsObject())
+ return nullptr;
+
+ auto* pProtoData = CFXJS_PerObjectData::GetFromObject(val.As<v8::Object>());
+ if (!pProtoData)
+ return nullptr;
+
+ auto* pIsolateData = FXJS_PerIsolateData::Get(v8::Isolate::GetCurrent());
+ if (!pIsolateData)
+ return nullptr;
+
+ CFXJS_ObjDefinition* pObjDef =
+ pIsolateData->ObjDefinitionForID(pProtoData->m_ObjDefID);
+ if (!pObjDef || pObjDef->m_ObjType != FXJSOBJTYPE_GLOBAL)
+ return nullptr;
+
+ return pProtoData->m_pPrivate.get();
}
v8::Local<v8::Array> CFXJS_Engine::GetConstArray(const WideString& name) {