【问题标题】:Unable to override XMLHttpRequest using pageMod (Firefox addon)无法使用 pageMod(Firefox 插件)覆盖 XMLHttpRequest
【发布时间】:2015-03-18 08:28:03
【问题描述】:

我在尝试从 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();

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

  • 为什么这个脚本不能正常工作?
  • 和我的插件范围有关吗?

感谢您的关心。

【问题讨论】:

    标签: javascript firefox xmlhttprequest firefox-addon


    【解决方案1】:

    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)
    

    【讨论】:

    • 感谢您的回答。我想我理解了特权代码的概念。我导出了所有需要的函数,然后使用了 unsafeWindow 对象。这是我的新code。出于好奇,为什么当我用 unsafeWindow.old = unsafeWindow.XMLHttpRequest.prototype.open 替换 unsafeWindow.old = XMLHttpRequest.prototype.open 时,回调有效,但它不想使用旧变量调用旧方法?这就像旧变量已被更改。
    • 你可以只使用局部变量。无需使用defineAs 或为不安全窗口分配中间值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    相关资源
    最近更新 更多