我创建了一个定义自定义协议的插件; 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
属性的访问权限。