2

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

我发现了这一点,但对于简单的字符串存储来说似乎太复杂了。SS API 在幕后使用相同的东西吗?

4

3 回答 3

3

由于同步文件 I/O, simple-storage/ localStorageAPI 很糟糕。有一些替代方案,例如IndexedDB可以很容易地chrome/add-on 代码中使用。

您也可以localStorage在附加组件中使用(无需使用 SDK simple-storageAPI),但不应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.

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

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

于 2014-05-18T20:13:50.720 回答
2

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

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

let ss = require('sdk/simple-storage');
于 2014-05-16T21:10:38.460 回答
1

您可以使用会话存储 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 不同,它的大小不受限制。

ps setGlobalValue, getGlobalValue,deleteGlobalValue没有在任何地方记录。

于 2016-11-25T00:40:20.120 回答