Javascript Firefox加载项:切换作用域后功能不可用
从Firefox 36开始,Javascript Firefox加载项:切换作用域后功能不可用,javascript,firefox,firefox-addon,Javascript,Firefox,Firefox Addon,从Firefox 36开始,功能。\uuuuu exposedProps\uuuuu不可用。相反,如果想要公开内容脚本中使用的chrome JS对象,则必须使用Components.utils.cloneInto,目标范围为browser.contentWindow.wrappedJSObject 如果未启用cloneFunctions标志,则仅克隆非函数的属性。旋转标志也会克隆函数,但不会克隆通过函数.prototype路径定义的函数。对于这些函数,必须通过Components.utils.e
功能。\uuuuu exposedProps\uuuuu
不可用。相反,如果想要公开内容脚本中使用的chrome JS对象,则必须使用Components.utils.cloneInto
,目标范围为browser.contentWindow.wrappedJSObject
如果未启用cloneFunctions
标志,则仅克隆非函数的属性。旋转标志也会克隆函数,但不会克隆通过函数.prototype
路径定义的函数。对于这些函数,必须通过Components.utils.exportTo
将其导出,目标范围为公开对象
说到我面临的问题。(由于我无法用语言表达,我添加了一个MWE)
Chrome-end-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"});
window.myExposedObject.FooBar(); // works
window.myExposedObject._func(); // works
window.myExposedObject.Bar() // error this._func is undefined
内容端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"});
window.myExposedObject.FooBar(); // works
window.myExposedObject._func(); // works
window.myExposedObject.Bar() // error this._func is undefined
在记录函数Bar()
接收的这个范围后,我们得到\u func:(void 0)
,而\u nFunc
被正确记录
问题:
我有没有遗漏什么,或者这是Firefox的一个限制?如果这是一个限制,请建议解决该限制的可能方法
起初,我认为Bar()
不知何故无法访问调用对象的作用域,我尝试将作用域作为参数提供给它,即Foo.prototype.Bar=function(scope){scope.\u func()}
和window.myExposedObject.Bar(window.myExposedObject)代码>。有趣的是,在日志记录时,范围对象也变成了(void 0)
。为什么呢我确信我在这里遗漏了一些东西。我所期望的是,暴露的对象将映射到原始对象,在将暴露的对象作为参数发送时,chrome end JS将能够获得原始对象
虽然您正试图通过正确组合cloneInto
/exportFunction
和放弃X光片来实现这一点,但我建议您只需使用将类层次结构的非特权部分直接加载到目标上下文中,并且只将最少量的特权函数挂接到原型一旦被创建
这将减少攻击面,并避免继承带来的麻烦
此外,这些可能证明是有用的:
对于所有的流浪者: