在Firefox附加组件中使用带有XMLHttpRequest的自定义协议

时间:2013-12-29 19:45:34

标签: firefox firefox-addon firefox-addon-sdk

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

现在blabla:***只是重定向到google.com - 这样可以正常使用。

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

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插件中跨域?

当我将其更改为fetch http://google.com/而不是localhost时,我得到一个响应.status为0,而response.responseText为''

1 个答案:

答案 0 :(得分:1)

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

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

供参考:chrome authorityUsing XMLHttpRequest from JavaScript modules / XPCOM components

请注意,基于SDK的扩展的通常建议是使用request module,如果禁用/卸载扩展,则可以自动取消您的请求。还有一个低级net/xhr module提供了一个类似于本机XMLHttpRequest的接口,如果需要,它还会自动取消请求。但是,据我所知,这两者都不会访问查找请求的“真实”URL所需的XMLHttpRequest.channel属性。