Javascript 覆盖Firefox插件中的原型方法时发生XrayWrapper错误(值可调用)

Javascript 覆盖Firefox插件中的原型方法时发生XrayWrapper错误(值可调用),javascript,firefox,firefox-addon-sdk,content-script,Javascript,Firefox,Firefox Addon Sdk,Content Script,我想通过Firefox插件监控对浏览器内置对象某些方法的访问。下面包含的示例代码基本上是有效的,除非其中一个方法参数是函数。然后,我收到以下X射线包装错误: XrayWrapper拒绝访问属性0(原因:值可调用)。 查看更多信息 信息。请注意,只有第一个被拒绝的属性才能从 将报告给定的全局对象 我不明白为什么会抛出XrayWrapper错误,因为插入指令的原型是unsafeWindow(页面脚本)范围内的对象。用于检测的内容脚本为: function logCalls(object, objec

我想通过Firefox插件监控对浏览器内置对象某些方法的访问。下面包含的示例代码基本上是有效的,除非其中一个方法参数是函数。然后,我收到以下X射线包装错误:

XrayWrapper拒绝访问属性0(原因:值可调用)。 查看更多信息 信息。请注意,只有第一个被拒绝的属性才能从 将报告给定的全局对象

我不明白为什么会抛出XrayWrapper错误,因为插入指令的原型是
unsafeWindow
(页面脚本)范围内的对象。用于检测的内容脚本为:

function logCalls(object, objectName, methodName) {
  var originalMethod = object[methodName];
  object[methodName] = function () {
    console.log(objectName + "." + methodName, "was called");
    originalMethod.apply(this, arguments);
  };
}

// 1. Works (expected)
logCalls(unsafeWindow.RTCPeerConnection.prototype,
        "unsafeWindow.RTCPeerConnection", "createDataChannel");

// 2. Throws XrayWrapper Error (unexpected)
logCalls(unsafeWindow.RTCPeerConnection.prototype,
        "unsafeWindow.RTCPeerConnection", "createOffer");
示例页面脚本:

var PeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection;
var connection = new PeerConnection({iceServers: []}, {optional: [{RtpDataChannels: !0}]});

// 1. Method call recorded
connection.createDataChannel("", {reliable: !1});

// 2. Method call recorded but causes XrayWrapper error
connection.createOffer(function(a) {
    connection.setLocalDescription(a)
}, function(err) {})
对于第(1)项,仪器按预期工作。对createDataChannel的调用将记录到控制台并成功创建dataChannel


对于(2),检测成功地登录到控制台。但是,由于包含函数的参数列表,内容脚本的第5行(
originalMethod.apply(这是参数);
)会导致上面的XrayWrapper错误。

首先,您应该对分配到不同安全上下文的任何方法进行处理

但这可能还不够,因为方法体本身仍然在特权上下文中执行,这意味着它接收的任何参数也将是xray包装。将它们传递回权限较低的范围,特别是通过像
apply
arguments
对象这样的神秘魔法,可能无法实现您所期望的功能。可能需要额外的X射线展开或使用rest参数和.call

在这样的情况下,将调用侦听逻辑
eval()
导入目标作用域并仅导出侦听包装器调用的日志函数可能更容易。这样,参数、
this
或返回值就不会有任何未经授权的->特权的->未经授权的转换,只有日志调用会跨越安全边界


由于插件审查指南不鼓励eval,因此您也可能希望咨询审查人员有关该方法的意见。

我尝试实施解决方案,按照您的建议添加额外的X射线展开,但似乎无法解决该问题。相反,我决定采用eval方法,这被证明更容易。我的扩展只用于测试,所以我不需要担心评论。非常感谢。