Иногда расширения браузера должны сохранять некоторые данные, для которых MDN предлагает использовать интерфейс browser.storage.<StorageArea>
(см. здесь ).Однако он говорит:
Значения могут быть примитивными типами (такими как числа, логические значения и строки) или типами массивов.
Как правило, невозможно хранить другие типы, такие как функция, Date, RegExp, Set, Map, ArrayBuffer и так далее.Некоторые из этих неподдерживаемых типов восстанавливаются как пустой объект, а некоторые вызывают set () для выдачи ошибки.Точное поведение здесь зависит от браузера.
(см .: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage/StorageArea/set)
Поскольку данные, которые я пытаюсь сохранить, представляют собой ArrayBuffers, которые содержат двоичные данные, мне интересноесли есть способ хранения таких двоичных данных, , отличных от , для преобразования их туда и обратно в промежуточное строковое представление?
с этот вопрос , которыйспрашивает также о том, как сохранить / сохранить ArrayBuffers
с использованием IndexedDB
, я испытываю желание поверить, что возможно использовать интерфейс IndexedDB
, но я не уверен:
- На данный момент это самый высокий оцененный ответ действительно говорит, что
ArrayBuffers
должно работать из-за их структурированной ситуации клонирования.Но даже этот ответ подвергается сомнению из-за неясной / недостающей спецификации / стандарта / ссылки. - MDN намекает на использование
browser.storage.local
над другими API-интерфейсами для сохранения данных, такими как, например, localStorage
, поскольку последний более склонен к его использованию.данные удаляются.
Хотя этот API * [browser.storage.local] (аналогичен Window.localStorage, рекомендуется не использовать Window.localStorage в коде расширения.Firefox удалит данные, сохраненные расширениями, используя API localStorage в различных сценариях, когда пользователи очищают свою историю посещений и данные из соображений конфиденциальности, тогда как данные, сохраненные с помощью API storage.local, будут правильно сохраняться в этих сценариях.
Что заставляет меня сомневаться и в надежности IndexedDB
.
Однако я не могу, но думаю, что было бы довольно скучно, если в веб-расширениях не было бы способа хранить двоичные данные. Поэтому вопрос:
** Как веб-расширения должны хранить двоичные данные, такие как 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, … ]
});
});
что, по-видимому, говорит о том, что действительно нет никаких проблем (или больше) для хранения ArrayBuffer в browser.storage.local
API.Может быть, ответ поможет подтвердить, что, несмотря на предупреждения MDN, вполне возможно / допустимо хранить ArrayBuffer
s через browser.storage.<StorageArea>