在Firefox扩展中使用相对路径

3
我使用绑定的可执行文件开发Firefox扩展程序,该文件应在浏览器启动时运行。
为了运行进程,我需要获取指向可执行文件的nsIFile或nsILocalFile实例。 我知道一种解决方案可以使用目录服务来获取它:
var file = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProfD", Components.interfaces.nsIFile);
file.append("extensions");
file.append("<extension id>");
file.append("<relative path>");

但是这种解决方案有两个缺点:

  1. 在开发模式下,当我只有实际扩展路径的文本文件而不是已安装的扩展时,它无法工作。

  2. 由于路径中硬编码的“extensions”部分,我不确定它是否适用于所有Firefox配置

那么有没有更好的方法来运行随Firefox扩展一起提供的可执行文件呢?

谢谢。

3个回答

3

您对Firefox配置文件的目录结构做出了太多的假设 - 不要这样做。 Add-on Manager API 可以让您获取扩展内文件的路径,建议使用它:

Components.utils.import("resource://gre/modules/AddonManager.jsm");

AddonManager.getAddonByID("<extension id>", function(addon)
{
  var uri = addon.getResourceURI("<relative path>");
  var file = uri.QueryInterface(Components.interfaces.nsIFileURL).file;
  ...
});

2
一个无需重启的插件的startup函数(在bootstrap.js文件中)将接收到插件安装路径作为其第一个参数。然后,您可以使用各种技巧来读取.jar文件中的文件(如果有的话):例如,请参见https://github.com/protz/GMail-Conversation-View/blob/master/bootstrap.js#L55
在非无需重启的情况下,我必须承认我不太清楚 :)。

0
我在寻找一种方法从内容脚本引用扩展目录中托管的图像路径时,发现了这个线程。以下是解决方案:
在扩展程序清单中的web_accessible_resources中包含您的文件。
"web_accessible_resources": [
    "images/*"
]

这些资源的绝对路径包含随机生成的UUID,因此我们使用runtime.getUrl()将其相对于manifest.json的路径传递给它。例如:

let myImg = document.createElement('img');
myImg.src = browser.runtime.getURL("images/my-img.png")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接