在 Firefox 插件中持久化数据

persisting data in firefox plugin

我的插件收集了有关在 firefox 中打开的每个选项卡的一些上下文数据。我希望在浏览器崩溃的情况下保留并恢复它。此数据并非特定于选项卡的 url,而是选项卡实例本身(它可能类似于 'how many times there was a redirect performed in this tab')。我考虑过将一些数据附加到 firefox 会话(崩溃后打开浏览器时恢复的那个),但我找不到任何文档,无论这是否可能或如何做到这一点。

是否可以向 firefox 会话添加数据?还有其他方法可以实现吗?

据我所知,add-on(扩展)数据持久化有两种方法。一个是 Storage API, which uses SQLite, and the other is the simple-storage API,它是 Add-on SDK 的一部分。我发现 simple-storage 偶尔会随机发作失忆症。

Simple-storage 只是一个包含 JSON-serializable 对象的本地文件。您可以按照链接文档中的描述在会话开始时对其进行初始化,并在您想要更改值时保存它。它在信息上等同于 key-value 商店,但读写访问涉及加载或保存整个商店。

我发现 SQLite 接口(存储)可靠且快速(如果异步调用)。

我不知道这些持久性选项中的一个或两个是否计划在未来弃用。由于它们似乎 de-evolving Firefox 变成 Chrome,您可能想尝试 Chrome 扩展开发,特别是使用 storage API,这似乎是一个真正的 fully-asynchronous key-value 商店.

似乎有一个 API 可以用来实现这一点 - nsISessionStore.

你可以像这样存储值:

var ss = Components.classes["@mozilla.org/browser/sessionstore;1"]
                .getService(Components.interfaces.nsISessionStore);
var currentTab = gBrowser.selectedTab;
var dataToAttach = "I want to attach this";
ss.setTabValue(currentTab, "key-name-here", dataToAttach);

并像这样检索它:

var retrievedData = ss.getTabValue(currentTab, "key-name-here");

可以找到更多信息和示例 here

此外,如果像我一样,你想在附加SDK中使用它,你可以通过这种方式获得适当的服务:

var { Cc, Ci } = require('chrome');
var ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);

您需要提供的选项卡不是SDK中的选项卡,您需要将其转换为XUL选项卡:

var { viewFor } = require("sdk/view/core");
var let lowLevelTab = viewFor(tab);

总结一下。如果 - 例如 - 想要为每个添加的选项卡添加存储值,可以这样做:

var tabs = require("sdk/tabs");
var { viewFor } = require("sdk/view/core");

tabs.on('open', tab => {
    var { Cc, Ci } = require('chrome');
    var ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
    var lowLevelTab = viewFor(tab);
    ss.setTabValue(lowLevelTab, "key-name-here", "value");
});