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

标签 javascript firefox xmlhttprequest firefox-addon

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

我想重写此函数的原因是我想知道何时发出某个请求以触发我的事件之一。

我当前使用的ma​​in.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 中运行对对象有不同的看法(又名。 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)

关于javascript - 无法使用 pageMod(Firefox 插件)覆盖 XMLHttpRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28725561/

相关文章:

css - 边距在 Opera、Chrome 和 IE 中正确显示,但在 FF 中不正确

css - Firefox 特定利润率?

javascript - 使用 Javascript 将 PDF 表单转换为 self 更正作业

javascript - TinyMCE 剥离所有标记

javascript - 删除类后的事件委托(delegate)

Mozilla Firefox 样式编辑器中的 Css 代码包装

http - HTTP 多部分 (POST) 请求中的边界参数是什么?

javascript - 强制同步 XMLHttpRequest/Ajax 而不发出警告

javascript - 向 Flask 提交多个表单(400 BAD REQUEST)

javascript - 如何在 Ionic React 5 中触发反向重定向?