我在尝试从 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 中运行对对象有不同的看法(又名。 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/