Экземпляр IndexedDB, общий для скрипта содержимого аддона и страницы настроек - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь создать расширение для браузера, в котором есть скрипт контента, который собирает данные с посещенных веб-страниц и сохраняет их в IndexedDB.

Расширение имеет «страницу настроек», которая представляет собой всплывающее HTML-окно;Я хотел бы, чтобы эта страница имела возможность доступа к данным из той же индексированной БД, которая использовалась сценарием содержимого, но пока я не добился успеха.

Я думал, что проблема может быть вызвана политиками CORS браузера (Сейчас я тестирую его в Firefox), но при использовании API локального хранилища такой же проблемы не возникает - в этом случае я могу легко получить доступ к одной и той же информации из обоих сценариев.

Ниже приведен код, используемыйСтраница настроек для того, чтобы открыть базу данных (тот же код, который используется сценарием содержимого, где он корректно извлекает все вставленные данные):

var db;
var openRequest = indexedDB.open('dbname', 1);

openRequest.onupgradeneeded = function(e) {
  var db = e.target.result;
  if (!db.objectStoreNames.contains('profiles')) {
    var storeOS = db.createObjectStore('profiles',
      {keyPath: 'id'});
  }
};
openRequest.onsuccess = function(e) {
  console.log('[*] Local database opened successfully');
  db = e.target.result;
  document.getElementById('utenti').innerHTML += 'SUCCESS';
};
openRequest.onerror = function(e) {
  console.log('[!] Error while opening local database');
  console.dir(e);
  document.getElementById('utenti').innerHTML += 'FAIL';

};

function logTimestamps(timestamps) {
  document.getElementById('utenti').innerHTML += '<br>There are ' + timestamps.length +
    ' timestamp(s) saved in IndexedDB: ' + timestamps.join(', ');
}

function getProfiles() {
    var tx = db.transaction('profiles', 'readonly');
    var profilesDB = tx.objectStore('profiles');

    if ('getAll' in profilesDB) {
      profilesDB.getAll().onsuccess = function(event) {
        logTimestamps(event.target.result);
      };
    } else {
      var timestamps = [];
      profilesDB.openCursor().onsuccess = function(event) {
        var cursor = event.target.result;
        if (cursor) {
          timestamps.push(cursor.value);
          cursor.continue();
        } else {
          logTimestamps(timestamps);
        }
      };
    }

}

Я попытался «вручную» добавить элементы в IndexDB изскрипт страницы настроек;при этом содержимое правильно извлекается из базы данных.

Поэтому я полагаю, что это должно быть проблемой разделения одной базы данных между двумя сценариями.Как мне этого добиться?Спасибо!

1 Ответ

0 голосов
/ 16 мая 2018

Вы можете подключиться к одной и той же базе данных indexedDB из двух сценариев, если оба сценария имеют одинаковое происхождение. Чтобы подключиться к одной и той же базе данных indexedDB из двух сценариев, имеющих один и тот же источник, вы открываете подключение к одному и тому же имени базы данных в каждом сценарии.

...