如何将ArrayBuffers存储在浏览器的Web扩展中?

时间:2019-07-11 15:26:30

标签: javascript google-chrome-extension local-storage firefox-webextensions

有时候,浏览器扩展需要保留一些数据,为此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接口,但不确定:

  1. 目前最高的rated answer确实不正确,因为ArrayBuffers应该处于结构化克隆状态,因此应该工作。但是,即使是不清楚的/缺乏的规范/标准/参考,即使是这个答案也受到挑战。
  2. MDN提示在其他数据持久化API(例如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>

0 个答案:

没有答案