2

我正在编写一个引导 Firefox 插件并且需要注册一个新的协议/模式处理程序(例如foo:somthing)。我已经看了一遍,我只看到了使用的方法chrome.manifest,而引导加载项不能使用。

那么,有没有人知道一种方法或者是否可以在引导加载项中注册自定义协议处理程序?

4

2 回答 2

2

尽管@nmair 的回答是我会记住的一个很好的一般性问题,但我能够找到更好的解决方案来解决我自己的问题。我注意到有一个 HTML5 方法会尝试要求用户为协议/模式注册一个处理程序,并且在选择omni.ja(firefox 源代码)之后,我找到了它的定义。在摆弄之后,我写了这个:

var handler = Cc["@mozilla.org/uriloader/web-handler-app;1"]
    .createInstance(Ci.nsIWebHandlerApp);
handler.name='My Protocol';
handler.uriTemplate='chrome://myprotocol/content/launcher.xul#%s';

var eps=Cc["@mozilla.org/uriloader/external-protocol-service;1"].
    getService(Ci.nsIExternalProtocolService);
var handlerInfo=eps.getProtocolHandlerInfo('myprotocol');
handlerInfo.possibleApplicationHandlers.appendElement(handler, false);
handlerInfo.alwaysAskBeforeHandling=false;        // don't ask the user
handlerInfo.preferredApplicationHandler=handler;  // set my handler as default
hi=handlerInfo;

var hs=Cc["@mozilla.org/uriloader/handler-service;1"].
getService(Ci.nsIHandlerService);
hs.store(handlerInfo);

注册协议,无需重启或组件。

于 2013-11-13T19:51:09.077 回答
2

是的,但是您必须完成附加组件/组件管理器将为您完成的工作,尤其是调用您.registerFactory自己。

已经a test演示了如何在运行时自己注册一般的组件,特别是协议处理程序。

于 2013-11-13T07:10:10.043 回答