我正在编写一个bootstrap Firefox插件,需要注册一个新的协议/架构处理程序(例如foo:somthing
)。我已经查看了所有内容,我只看到使用chrome.manifest
执行此操作的方法,这些引导加载项无法使用。
那么,是否有人知道某种方式或是否可以在自举附加组件中注册自定义协议处理程序?
答案 0 :(得分:2)
是的,但是您必须完成附加组件/组件管理器为您做的工作,特别是自己调用.registerFactory
。
已经a test
演示了如何在运行时自己注册组件,特别是协议处理程序。
答案 1 :(得分: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);
注册协议,无需重启或需要组件。