无法使用 pageMod(Firefox 插件)覆盖 XMLHttpRequest

Unable to override XMLHttpRequest using pageMod (Firefox addon)

我在尝试从 Firefox 插件上下文覆盖 XMLHttpRequest 时遇到了一些麻烦。

我想覆盖此功能的原因是我想知道何时发出某个请求以触发我的事件之一。

我目前使用的main.js

pageMod.PageMod({
    include: "*.example.com",
    contentScriptWhen: "start",
    attachTo: ["top"],
    contentScriptFile: data.url("js/script.js"),
});

这里是 script.js

var oldOpen = XMLHttpRequest.prototype.open;
  XMLHttpRequest.prototype.open = function (method, uri, async, user, pass) {
  alert("working");
  oldOpen.call(this, method, uri, async, user, pass);
};
// This request is for an example purpose it is not in my real script
var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("GET", "", false);
xmlhttp.send();

我注意到当我用 unsafeWindow.XMLHttpRequest 替换 XMLHttpRequest 时,请求不再有效。

谢谢关心

PageMod 脚本 运行 在 sandbox that have a different view on objects (aka. xrays).
根据您定义它们的准确程度,内容页面无法访问这些对象或在尝试调用函数时获得安全异常。

访问 unsafeWindow 是正确的方法,但您仍然必须通过 exportFunction.

将包装函数导出到目标页面上下文中

基本上,内容可以调用的每个函数都必须导出。 对象必须被克隆到或在目标隔间中创建,例如通过 new unsafeWindow.ArrayBuffer(1024) 在内容中创建缓冲区 - 基于内容的不安全构造函数 - 而不是沙箱。

检查工具箱控制台的安全异常情况可能很有用。

编辑:

代码大概是这样的,可能需要稍作修改,我还没有测试过:

let wrapped = unsafeWindow.XMLHttpRequest.prototype.open;
let wrapper = function(){wrapped.apply(this,arguments) } // might need to waive xrays on this or the arguments?
unsafeWindow.XMLHttpRequest.prototype.open = exportFunction(wrapper,unsafeWindow)