有时候,浏览器扩展需要保留一些数据,为此MDN建议使用browser.storage.<StorageArea>
界面(请参见here)。它说:
值可以是原始类型(例如数字,布尔值和字符串) 或数组类型。
通常无法存储其他类型,例如Function, 日期,RegExp,Set,Map,ArrayBuffer等。其中一些 不支持的类型将恢复为空对象,并且某些原因 set()引发错误。确切的行为是特定于浏览器的。
(请参阅:https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage/StorageArea/set)
由于我尝试存储的数据是包含二进制数据的ArrayBuffer,所以我想知道是否存在一种存储此类二进制数据的方法,不是来回将其转换为中间数据字符串表示形式?
有了this question,它也询问如何使用ArrayBuffers
来持久化/存储IndexedDB
,我很想相信因此可以使用IndexedDB
接口,但不确定:
ArrayBuffers
应该处于结构化克隆状态,因此应该工作。但是,即使是不清楚的/缺乏的规范/标准/参考,即使是这个答案也受到挑战。browser.storage.local
)上使用localStorage
,因为后者更易于删除其数据。尽管此API * [browser.storage.local](与Window.localStorage相似,但建议 不要在扩展代码中使用Window.localStorage。 Firefox将 使用localStorage API清除扩展存储的各种数据 用户清除其浏览历史记录和数据的方案 隐私原因,而使用storage.local API保存的数据将是 在这些情况下正确存在。
这也让我质疑IndexedDB
的可靠性。
但是我不能,但是如果Web扩展程序缺少一种存储二进制数据的方法,我认为那将是一件相当缺少的事情。因此,问题是:
** Web扩展应如何存储二进制数据(例如ArrayBuffers)?**
更新
除了MDN引用的警告外,似乎还可以存储ArrayBuffers, 像这样没有任何问题:
var u8array = new Uint8Array(100);
for(var i=0;i<u8array.length;i++)u8array[i]=i;
var storedPromise =
browser.storage.local.set({"u8arraybuffer":u8array.buffer});
storedPromise.then(()=>{
browser.storage.local.get("u8arraybuffer").then((result)=>{
var u8arrayFromStorage = new Uint8Array(result.u8arraybuffer);
console.log("u8arrayFromStorage",u8arrayFromStorage);
// prints:
// u8arrayFromStorage
// Uint8Array(100) [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, … ]
});
});
这似乎表明确实没有任何问题(可以再存储)
browser.storage.local
API中的ArrayBuffer。
也许有一个答案可以帮助确认,尽管MDN警告,通过ArrayBuffer
browser.storage.<StorageArea>