从Firefox附加组件保存文件的位置?

时间:2015-09-25 13:13:03

标签: firefox-addon firefox-addon-sdk

我正在开发一个Firefox附加组件,其中包括生成附加组件使用的网站缩略图。到目前为止,我一直使用简单存储通过图像数据URL存储它们。这有两个问题:存储空间有限并且发送非常长的字符串似乎不是最佳的(我假设浏览器已经优化了加载图像文件的方法,但可能不是数据URL)。我认为将文件保存到磁盘应该不是问题,问题是在哪里。我google了很多,找不到任何东西。这有自然的地方吗?有没有限制?

1 个答案:

答案 0 :(得分:0)

Firefox 32开始,存储加载项数据的位置应为:[profile]/extension-data/[add-on ID]。这是通过“Bug 915838 - Provide add-ons a standard directory to store data, settings”的决议确定的。有一个后续错误,“Bug 952304 - (JSONStore) JSON storage API for addons to use in storing data and settings”,它应该提供一个API以便于访问。

对于Addon-SDK,您可以使用以下命令获取插件ID(在 package.json 中定义):

let self = require("sdk/self");
let addonID = self.id;

对于XUL和无重新启动扩展,您应该能够使用以下命令获取插件的ID(您在 install.rdf 文件中定义):

Components.utils.import("resource://gre/modules/Services.jsm");
let addonID = Services.appInfo.ID

然后,您可以执行以下操作为该目录中的文件生成URI:

userProfileDirectoryPath = Components.classes["@mozilla.org/file/directory_service;1"]
                                     .getService( Components.interfaces.nsIProperties)
                                     .get("ProfD", Components.interfaces.nsIFile).path,

/**
 * Generate URI for a filename in the extension's data directory under the preferences
 *   directory.
 */
function generateURIForFileInPrefExtensionDataDirectory (fileName) {
    //Account for the path separator being OS dependent
    let toReturn = "file://" + userProfileDirectoryPath.replace(/\\/g,"/");

    return toReturn +"/extension-data/" + addonID + "/" + fileName;
    }
}

对象myExtension.addonData是我存储在Bootstrap data中的入口点的bootstrap.js的副本。