相当于简单的存储API,用于无重启的firefox扩展

时间:2014-05-16 15:35:22

标签: javascript firefox firefox-addon firefox-addon-restartless

是否有相当于this API或从无重启扩展程序调用它的方法?我需要在浏览器会话之间存储一些字符串。

我找到了this,但对于简单的字符串存储来说似乎太复杂了。 SS API在场景后面使用相同的东西吗?

3 个答案:

答案 0 :(得分:3)

由于同步文件I / O,simple-storage / localStorage API很糟糕。 还有IndexedDB等替代方案can be used from chrome/add-on code非常容易。

您也可以在附加组件中使用localStorage(无需使用SDK simple-storage API),但不应在重叠中使用window.localStorage,因为这会在添加之间共享-ons,并且不能在window.localStorage和/或js代码模块中使用bootstrap.js,因为根本没有window。但是你可以自己构建一个存储对象。

function getStorage(uri) {
  if (!(uri instanceof Ci.nsIURI)) {
    uri = Services.io.newURI(uri, null, null);
  }
  let principal = Cc["@mozilla.org/scriptsecuritymanager;1"].
    getService(Ci.nsIScriptSecurityManager).
    getNoAppCodebasePrincipal(uri);
  let dsm = Cc["@mozilla.org/dom/localStorage-manager;1"].
    getService(Ci.nsIDOMStorageManager);
  return dsm.createStorage(principal, "");
}

var s1 = getStorage("chrome://my-addon/content/whatever.xul"); // does not actually have to point to a resource.

localStorage的通常限制适用(配额等)。

BTW:该代码还允许您访问localStorage个网站,例如getStorage("http://stackoverflow.com/");

答案 1 :(得分:2)

您可以通过以下方式将任何SDK模块导入正常的无重启式扩展程序:

const { devtools } = Cu.import("resource://gre/modules/devtools/Loader.jsm", {});
const { require } = devtools;

let ss = require('sdk/simple-storage');

答案 2 :(得分:1)

您可以使用Session store APInsISessionStore):

const ss = Cc["@mozilla.org/browser/sessionstore;1"].getService(Ci.nsISessionStore);
ss.setGlobalValue("my-extension-few-strings", "blah blah blah");
const fewStrings = ss.getGlobalValue("my-extension-few-strings");
// fewStrings === "blah blah blah";
ss.deleteGlobalValue("my-extension-few-strings");

会话存储在所有扩展中共享,因此请为存储的值选择唯一的名称(例如,使用您的扩展名前置所有键名)。与简单存储和localStorage不同,它的大小不受限制。

P.S。 <{1}},setGlobalValuegetGlobalValue未在任何地方记录。