在 Firefox 插件中使用带有 XMLHttpRequest 的自定义协议



我创建了一个定义自定义协议的插件; blabla:

目前blabla:***只是重定向到 google.com - 这工作正常。

但是,我想执行一个XMLHttpRequest来获取它应该重定向到的真实URL。但是从我添加这 1 行的那一刻起(还没有其他行),插件就停止运行:

var request = new XMLHttpRequest();

自定义协议插件是否有我不知道的特殊规则?(例如没有XMLhttprequests)?难道就没有办法吗?

var wheretogo = WhereToGo(resource);
var uri = ioservice.newURI(wheretogo, null, null);
var channel = ioservice.newChannelFromURI(uri, null).QueryInterface(Ci.nsIHttpChannel);

function  WhereToGo(fres) {       
  //  var request = new XMLHttpRequest();
  return 'http://google.com';
}

编辑:

我现在使用此代码:

    var request = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"] .createInstance(Components.interfaces.nsIXMLHttpRequest);
    request.open("GET", "http://localhost:5000/?request=" + fres, false); //synchronous
    request.setRequestHeader("Content-Type", "application/json");
    request.send(null);

但是收到此错误:

[Exception... "Failure"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: file:///Users/wesley/Desktop/ProtocolFx/components/Protocol.js :: WhereToGo :: line 51"  data: no]

知道为什么这不起作用吗?(是因为端口号吗?我以为 XMLHttpRequest 被允许在 Firefox 插件中跨域?

当我将其更改为获取 http://google.com/而不是本地主机时,我得到的响应.状态为 0 和响应。响应文本为 ''

XMLHttpRequest构造函数仅在 DOM 窗口的上下文中定义。如果您的代码在不同的上下文中运行(例如本质上是沙盒的 SDK 模块),则不会定义此构造函数,您必须通过 XPCOM 创建实例:

var {Cc, Ci} = require("chrome");
var request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
                .createInstance(Ci.nsIXMLHttpRequest);

供参考:chrome authority,Using XMLHttpRequest from JavaScript modules/XPCOM components。

请注意,基于 SDK 的扩展的通常建议是使用 request 模块,该模块的优点是在禁用/卸载扩展时自动取消请求。还有一个低级net/xhr模块,提供了一个类似于本机XMLHttpRequest的接口,如果需要,它也会自动取消请求。但是,据我所知,两者都不会提供对查找请求的"真实"URL所需的XMLHttpRequest.channel属性的访问权限。

相关内容

  • 没有找到相关文章

最新更新