【问题标题】:Equivalent of simple storage API for restartless firefox extension用于无重启 Firefox 扩展的简单存储 API 等价物
【发布时间】:2014-05-16 15:35:21
【问题描述】:

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

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

【问题讨论】:

  • simple-storage api 在使用 addon-sdk 开发无需重启的插件时应该可以正常工作。你试过这些例子吗?他们会失败还是给你任何错误?
  • 这就是重点。我没有使用插件 SDK。我正在使用来自bootstrap.js 的本机代码,因为我使用了很多外部 dll 函数。
  • 我会尽快将当前的扩展移动到 addon-sdk,但在那之前我需要修复。

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


【解决方案1】:

simple-storage/localStorage API 很糟糕,因为同步文件 I/O。 有诸如IndexedDB 之类的替代方案can be used from chrome/add-on code 很容易。

您也可以在您的插件中使用localStorage(无需使用SDK simple-storage API),但不应在叠加层中使用window.localStorage,因为这将在插件之间共享,并且不能使用window.localStoragebootstrap.js 和/或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 的通常限制适用(配额等)。

顺便说一句:该代码还允许您访问网站的localStorage,例如getStorage("http://stackoverflow.com/");.

【讨论】:

  • dsm.createStorage(principal, "") 对我不起作用,直到我将null 指定为第一个参数dsm.createStorage(null,principal, "")。也许会有用...无论如何,谢谢!
【解决方案2】:

您可以通过这种方式将任何 SDK 模块导入到正常的无重启扩展中:

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

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

【讨论】:

  • 非常感谢您的快速回复。
  • 不完全确定这是个好主意...这将为您提供simple-storage 实例,该实例在devtools 和任何其他使用此hack 的附加组件之间共享。因此,如果两个不同的附加组件使用这个 shared devtools 实例和相同的密钥,事情将会boom。最好自己创建一个合适的 SDK 加载器。
  • 正如我们所说的那样努力。在此期间,我只需要临时修复。该插件现在被用作概念证明,只有经过大量工作才能上线 :)
  • 将 SDK simple-storage 导入正常的无重启扩展程序将失败,因为 simple-storage 使用了 storeFile.append(jpSelf.id);(第 192 行)中不可用的扩展程序 ID。
【解决方案3】:

您可以使用Session store API (nsISessionStore):

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");

会话存储在所有扩展之间共享,因此为存储的值选择唯一名称(例如,在所有键名前加上您的扩展名)。与 simple-storage 和 localStorage 不同,它没有大小限制。

附言setGlobalValuegetGlobalValuedeleteGlobalValue 没有在任何地方记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多