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

时间:2015-02-25 17:23:51

标签: javascript firefox xmlhttprequest 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 时,请求不再有效。

  • 为什么这个脚本不能按我的意愿运行?
  • 它与我的插件的范围有关吗?

感谢您的关注。

1 个答案:

答案 0 :(得分:0)

PageMod脚本在sandbox中运行,对象具有不同的视图(又名。xrays)。
根据您如何定义它们,内容页面在尝试调用函数时无法访问这些对象或获取安全性异常。

访问unsafeWindow是正确的方法,但您仍需要通过exportFunction将包装函数导出到目标页面上下文中。

基本上,必须导出内容可以调用的每个函数。 对象必须是clonedInto或在目标隔离专区中创建,例如通过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)