IndexedDB: копировать в другой домен?

#google-chrome #indexeddb

#google-chrome #indexeddb

Вопрос:

Я переключаю домены и хочу предоставить своим пользователям возможность продолжать использовать тот же IndexedDB в моем новом домене.

Я думаю, это невозможно из JavaScript из-за политики того же происхождения. Тем не менее, мои пользователи являются «техническими специалистами», и все они используют Chrome.

Итак, есть ли способ, которым мои пользователи могут вручную перемещать IndexedDB из одного домена в другой? Может быть, какая-то операция копирования файлов в каталоге пользователя Chrome?

Ответ №1:

Вы можете использовать iframe и postMessage() для передачи данных. Пусть новый домен откроет iframe для старого домена и настроит прослушиватель message событий. Должен ли старый домен предоставлять страницу, которая при открытии обходит базу данных и выполняет a postMessage() в родительском окне — указав параметр targetOrigin, чтобы ограничить это правильным новым доменом. Вам нужно будет придумать подходящую схему отправки сообщений для пакетной обработки и сигнализации завершения.

(В Chrome хранилище резервных копий для индексированной базы данных включает источник в самих данных, поэтому вы не можете просто перемещать файлы.)

Комментарии:

1. Легко ли редактировать источник в одном из файлов данных (например, в каком-то файле метаданных?) или он скрыт в каком-то трудно редактируемом двоичном формате? (как вы уже могли догадаться, моих пользователей немного, и все они достаточно технически опытны, чтобы редактировать файлы в шестнадцатеричном редакторе) Я бы выбрал предложенный postMessage() вами подход (отличная идея!), Только если действительно необходимы дополнительные усилия 🙂

2. Источник существует как ключевой префикс для записей метаданных базы данных в leveldb. В каталоге имеется произвольное количество файлов таблиц leveldb, в зависимости от истории базы данных (сжатие и т. Д.), И записи могут существовать в любом файле таблицы. Записи также сжимаются внутри таблиц. Итак, короткий ответ: я не думаю, что человек мог бы это сделать. : (Я полагаю, технически возможно написание пользовательского клиента leveldb и переопределение процедур сравнения / декодирования ключей Chrome.

3. Спасибо за ваше время и понимание, я попробую использовать подход экспорта-импорта!

Ответ №2:

ВАРИАНТ 1 экспорт / импорт

 objectstore.getall()  //and done on each store. 
  

некоторые транзакции для добавления данных на новый сайт.

 //a few createobjectstore()    
for(var i in myobject.length){
    objecstore.add(myobject[i]
}
  

ВАРИАНТ 2
, если chrome и использует расширение Chrome. передо мной нет страницы, но если вы знаете идентификатор своего расширения и другого расширения, вы можете перейти на другой сайт

я хочу сказать, что chrome.runtime.message() используется для обмена данными между backpage расширения и другими страницами расширения, а также для связи с другим сайтом.