我正在尝试从自定义协议处理程序返回文档内容。
我可以重定向到网址,但我不能自己退回文档正文。
newChannel: function(aURI)
{
var ioservice = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
var resource = aURI.spec.split(":")[1];
var wheretogo = WhereToGo(resource);
var uri = ioservice.newURI(wheretogo, null, null);
if (uri) {
var channel = ioservice.newChannelFromURI(uri, null).QueryInterface(Ci.nsIHttpChannel);
return channel;
} else {
return false;
}
},
classDescription: "Protocol Handler",
contractID: "@mozilla.org/network/protocol;1?name=myproto",
classID: Components.ID('{xxxx}'),
QueryInterface: XPCOMUtils.generateQI([Ci.nsIProtocolHandler])
我试过从wheretogo方法中访问该窗口:
var ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
.getService(Components.interfaces.nsIWindowWatcher);
var win = ww.activeWindow.document.innerHTML = 'test';
但是这没有做任何事情(也没有错误)。
我也尝试过:
return "data:text/html,test";
但这也没有做任何事情。
有什么想法吗?
答案 0 :(得分:0)
使用data:
URI应该是最简单的方法,但您不能简单地返回一个字符串 - 方法newChannel
必须返回一个频道。以下应该有效:
newChannel: function(aURI)
{
var htmlData = "test";
var ioservice = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
var uri = ioservice.newURI("data:text/html," + encodeURIComponent(htmlData),
null, null);
var channel = ioservice.newChannelFromURI(uri);
return channel;
},
一些注意事项:
newChannel
无法返回布尔值,它必须返回null
或(更好)抛出异常,例如throw Components.results.NS_ERROR_UNEXPECTED
。QueryInterface
,newChannel
可以返回任何频道 - 不一定是HTTP频道。