Start · Sprachen · JavaScript · Referenz · StorageAccessHandle.indexedDB

StorageAccessHandle.indexedDB

Eigenschaft

Gibt ein nicht partitioniertes <code>IDBFactory</code>-Objekt zurück, über das ein eingebetteter Drittanbieter-Kontext auf seine eigene IndexedDB aus dem First-Party-Kontext zugreift.

seit JavaScript Chrome/Edge 125+ (nicht Baseline) Kategorie: webapi

Signatur

StorageAccessHandle.indexedDB

Beschreibung

Die schreibgeschützte Eigenschaft indexedDB des Interfaces StorageAccessHandle liefert eine IDBFactory, die auf den nicht partitionierten IndexedDB-Speicher des Ursprungs zeigt. Normalerweise bekommt ein eingebetteter Drittanbieter-iframe über window.indexedDB nur einen partitionierten Speicher, der an die übergeordnete Website gebunden ist. Über diesen Handle erreicht er dieselben Datenbanken wie bei einem direkten Besuch der eigenen Domain.

Einen StorageAccessHandle erhalten Sie, indem Sie document.requestStorageAccess() mit einem Optionsobjekt aufrufen, zum Beispiel { indexedDB: true }. Die Eigenschaft funktioniert nur, wenn indexedDB bei dieser Anfrage ausdrücklich angefordert und der Zugriff gewährt wurde. Sonst wirft der Zugriff eine SecurityError-DOMException.

Die zurückgegebene IDBFactory nutzen Sie wie gewohnt: open(), deleteDatabase(), databases() usw. Typische Einsatzfälle sind eingebettete Widgets wie Chat, Login oder Bezahlung, die Daten über mehrere einbettende Websites hinweg gemeinsam nutzen müssen.

Rückgabewert

Typ
IDBFactory
Beschreibung
Eine IDBFactory für den nicht partitionierten IndexedDB-Speicher des Ursprungs. Wirft eine SecurityError-DOMException, wenn indexedDB beim Aufruf von requestStorageAccess() nicht angefordert wurde.

Beispiele

Nicht partitionierte IndexedDB im iframe anfordern

// Im eingebetteten Drittanbieter-iframe, ausgelöst durch einen Klick des Nutzers
const button = document.querySelector('#zugriff');

button.addEventListener('click', async () => {
  try {
    const handle = await document.requestStorageAccess({ indexedDB: true });
    const request = handle.indexedDB.open('widget-db', 1);

    request.onupgradeneeded = () => {
      request.result.createObjectStore('einstellungen');
    };
    request.onsuccess = () => {
      console.log('Nicht partitionierte DB geöffnet:', request.result.name);
    };
  } catch (err) {
    console.warn('Speicherzugriff verweigert:', err.name);
  }
});
Nicht partitionierte DB geöffnet: widget-db

Mit Rückfall auf partitionierten Speicher

const getIDBFactory = async () => {
  if (!('requestStorageAccess' in document)) return window.indexedDB;
  try {
    const handle = await document.requestStorageAccess({ indexedDB: true });
    return handle.indexedDB;
  } catch {
    // Kein Zugriff gewährt: partitionierten Speicher verwenden
    return window.indexedDB;
  }
};

const idb = await getIDBFactory();
const dbs = await idb.databases();
console.log(dbs.map((db) => db.name));
["widget-db"]

Fehler, wenn indexedDB nicht angefordert wurde

const handle = await document.requestStorageAccess({ localStorage: true });

try {
  handle.indexedDB.open('widget-db');
} catch (err) {
  console.log(err.name);
}
SecurityError

// Wichtig · Fallstricke

  • Nur angeforderte Speicherarten: Die Eigenschaft ist nur nutzbar, wenn beim Aufruf von requestStorageAccess() die Option indexedDB: true gesetzt war. Sonst wird eine SecurityError geworfen.
  • Nutzeraktivierung: requestStorageAccess() muss in der Regel durch eine Nutzeraktion wie einen Klick ausgelöst werden. Das iframe braucht außerdem gegebenenfalls sandbox=\"allow-storage-access-by-user-activation\".
  • Nicht mit window.indexedDB verwechseln: Im Drittanbieter-Kontext bleibt window.indexedDB auch nach gewährtem Zugriff partitioniert. Nur handle.indexedDB erreicht den nicht partitionierten Speicher.
  • Browser-Kompatibilität: Die Erweiterung des Optionsobjekts für requestStorageAccess() gibt es bisher nur in Chromium-Browsern ab Version 125. Firefox und Safari unterstützen sie nicht. Prüfen Sie die Unterstützung vorab und sehen Sie einen Rückfall vor.
  • Nur in sicheren Kontexten (HTTPS) verfügbar.