我创建了一个定义自定义协议的插件;布拉布拉:
现在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为''
答案 0 :(得分:1)
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
module,如果禁用/卸载扩展,则可以自动取消您的请求。还有一个低级net/xhr
module提供了一个类似于本机XMLHttpRequest
的接口,如果需要,它还会自动取消请求。但是,据我所知,这两者都不会访问查找请求的“真实”URL所需的XMLHttpRequest.channel
属性。