Firefox插件:从自定义协议处理程序返回HTML?

时间:2013-12-30 08:39:04

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

我正在尝试从自定义协议处理程序返回文档内容。

我可以重定向到网址,但我不能自己退回文档正文。

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";

但这也没有做任何事情。

有什么想法吗?

1 个答案:

答案 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;
},

一些注意事项:

  • nsIIOService.newChannelFromURI只接受一个参数(您的代码为两个参数)。
  • newChannel无法返回布尔值,它必须返回null或(更好)抛出异常,例如throw Components.results.NS_ERROR_UNEXPECTED
  • 您不需要QueryInterfacenewChannel可以返回任何频道 - 不一定是HTTP频道。