Firefox附加组件:在操作范围后功能不可用

时间:2015-05-19 16:30:54

标签: javascript firefox firefox-addon

自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被正确记录。

问题:

  1. 我有什么遗漏,或者这是Firefox的限制吗?如果是限制,请建议可能的方法来解决限制。
  2. 最初我认为Bar()无法以某种方式访问​​调用对象的范围,我尝试将范围作为参数提供给它,即Foo.prototype.Bar = function(scope){ scope._func();}window.myExposedObject.Bar(window.myExposedObject);。有趣的是,在记录时,范围对象也变成了(void 0) 。这是为什么? 我确信我在这里遗漏了一些东西。我所期望的是暴露的对象将映射到原始对象,并且在将暴露的对象作为参数发送时,chrome end JS将能够获得原始对象。

1 个答案:

答案 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