我正在寻找一种方法/解决方案,用于将声明到上下文(即上下文A)中的js对象共享到另一个上下文(即上下文B)中。两者在同一个隔离区中。 详细地: 我正在使用v8 c ++包装器将c ++类(即cppClass)变为js代码。因此,我可以直接将cppClass.myfunction()或cppClass.myProperty调用到js代码中。
我只有一个隔离区,还有一个用于加载和运行复杂的js文件(由许多js文件和声明的许多对象/函数组成)的主要上下文。
此外,我还有其他正在运行其他简单JS代码的上下文。所有上下文都在同一隔离中。
假设在contextA中声明并使用了一个AObject,它具有类似AObject.foo = 10的属性。我想知道是否可以访问ContextB中的AObject并读取/更改AObject.foo属性,例如:
// JS code in ContextA
var AObject=new cppClass();
AOBject.foo=10;
...
// JS code in ContextB
var newvalue=AObject.foo +1; //or something like myWrapMethod.AObject.foo+1;
Console.Log(" The new value is : " + newvalue );
// The new value is : 11
我可以从ContextB访问AObject(即调用其函数或设置其属性/属性)吗? 预先谢谢你
安德里亚
答案 0 :(得分:1)
我的问题的可能答案可能是以下方法。在c ++中,假设具有以下代码:
Handle<Context> contextA=myIsolate::GetCurrentContext();
... some code
Handle<Context> contextB=GetMyBContext();
... some code
contextA->Enter(); // change the context to A Context
auto global_obj = contextA->Global();
v8::Local<v8::Value> desiredValue = global_obj->Get(String::NewFromUtf8(myIsolate,"AObject"));
contextA->Exit(); // change the context to B Context
// Now AObject can be used also in the context B (another script js)
myIsolate->GetCurrentContext()->Global()->Set(v8::String::NewFromUtf8(myIsolate, "AObject"), desiredValue ->ToObject());
然后,在js文件(与B上下文相关)中,我可以将AObject与AContext中使用的值相同。
希望有用。 此致。
安德里亚
答案 1 :(得分:0)
您应该将两个上下文安全性令牌设置为相同。 然后,您可以从上下文中获取对象Ref,并从另一个对象中存储/使用它。
从v8.h头文件中获取:
/**
* Sets the security token for the context. To access an object in
* another context, the security tokens must match.
*/
void SetSecurityToken(Local<Value> token);