自Firefox 36起,Function.__exposedProps__
无法使用。相反,如果想要公开 chrome JS对象以在内容脚本中使用,则必须使用Components.utils.cloneInto
,目标范围为browser.contentWindow.wrappedJSObject
。
如果没有打开cloneFunctions
标志,则只克隆那些不是函数的属性。转动旗帜也会克隆功能,但不会通过Function.prototype
路径定义那些功能。对于这些函数,必须通过Components.utils.exportTo
将目标范围作为公开对象导出它们。
来到我面临的问题。 (因为我无法用语言表达,我正在添加一个MWE)。
Chrome结束JS:
function Foo(){
this._nFunc = "something";
this._func = function(){/*do something*/};
}
Foo.prototype.Bar = function(){
this._func();
}
Foo.prototype.FooBar = function(){
this._nFunc = "somthing else";
}
var myFoo = new Foo();
var targetScope = browser.contentWindow.wrappedJSObject;
targetScope.myExposedObject = Components.utils.cloneInto(myFoo, targetScope, {cloneFunctions:true});
Components.utils.exportFunction(myFoo.Bar, targetScope.myExposedObject , {defineAs:"Bar"});
Components.utils.exportFunction(myFoo.FooBar, targetScope.myExposedObject , {defineAs:"FooBar"});
内容结束JS:
window.myExposedObject.FooBar(); // works
window.myExposedObject._func(); // works
window.myExposedObject.Bar() // error this._func is undefined
在记录函数this
收到的Bar()
范围后,我们得到_func:(void 0)
,而_nFunc
被正确记录。
问题:
Bar()
无法以某种方式访问调用对象的范围,我尝试将范围作为参数提供给它,即Foo.prototype.Bar = function(scope){ scope._func();}
和window.myExposedObject.Bar(window.myExposedObject);
。有趣的是,在记录时,范围对象也变成了(void 0)
。这是为什么? 我确信我在这里遗漏了一些东西。我所期望的是暴露的对象将映射到原始对象,并且在将暴露的对象作为参数发送时,chrome end JS将能够获得原始对象。答案 0 :(得分:1)
虽然您正在尝试使用cloneInto
/ exportFunction
的正确组合并放弃xrays,但我建议您只需将类层次结构的非特权部分直接加载到使用subscript loader的目标上下文,并且只有在创建原型后才将最少量的特权函数挂钩到原型中。
这样可以减少攻击面并避免头痛并继承。
此外,这些可能有用:
https://developer.mozilla.org/en-US/docs/Components.utils.createObjectIn https://developer.mozilla.org/en-US/docs/Components.utils.makeObjectPropsNormal