javascript - 如何通过 URI 引用外部二进制文件?

标签 javascript thunderbird thunderbird-addon

我有一个 Thunderbird 扩展,它使用外部可执行文件来改变消息正文。目前,我做了一个黑客工作,只需将此可执行文件放在 /tmp/someBinary 中,然后像这样调用它:

var exe = FileUtils.File("/tmp/someBinary");
var proc = Components.classes["@mozilla.org/process/util;1"]
                     .createInstance(Components.interfaces.nsIProcess);
proc.init(exe);
var args = [msgBody.path];
proc.run(true, args, args.length);

这显然很愚蠢,最好通过 URI 调用它并将可执行文件与应用程序捆绑在一起。遗憾的是,我有限的 JS 意味着我只能想到以下内容:

var URL = ios.newURI("chrome://myExtension/content/someBinary",null,null);
var exe = URL.QueryInterface(Components.interfaces.nsIFileURL).file;

但这并不完全正确。有正常的方法来完成这个任务吗?

最佳答案

您需要询问 Chrome 注册表,您的 URL 解析为:

var chromeRegistry = Components.classes["@mozilla.org/chrome/chrome-registry;1"]
                               .getService(Components.interfaces.nsIChromeRegistry);
var URL = ios.newURI("chrome://myExtension/content/someBinary", null, null);
URL = chromeRegistry.convertChromeURL(URL);
var exe = null;
if (URL instanceof Components.interfaces.nsIFileURL)
  exe = URL.file;

请注意 chrome:// URL 不一定会解析为 file://网址。通常,扩展会作为打包的 XPI 文件安装,并且只会获得指向此存档内文件的链接,而不是操作系统可以执行的内容。因此,您需要指定 <em:unpack> flag在你的install.rdf文件。

这种方法很简单,但会降低启动性能(出于某种原因,扩展管理器默认情况下不会解压扩展)。因此,更好的解决方案可能是在您第一次需要时将可执行文件复制到临时目录中。

关于javascript - 如何通过 URI 引用外部二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11510122/

相关文章:

javascript - 如何使用 JavaScript 从被拒绝的 WebSocket 打开握手中读取状态代码?

javascript - 停止发送电子邮件

c# - 是否可以使用 C# 与 Thunderbird 互操作?

rss - 如何通过插件处理 Thunderbird 中的提要文件夹?

javascript - 返回数组的回调函数 Jquery/javascript

JavaScript If 语句有效,但 Else 无效

javascript - 雷鸟插件 : Disable toolbar button programmatically

javascript - 使用 JavaScript 中的正则表达式替换大文本中两个字符之间出现的每个字符串

ssl - Thunderbird 中对 LDAP 的 TLS 支持