Signatur
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
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);
}
});
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));
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);
}
// Wichtig · Fallstricke
- Nur angeforderte Speicherarten: Die Eigenschaft ist nur nutzbar, wenn beim Aufruf von
requestStorageAccess()die OptionindexedDB: truegesetzt war. Sonst wird eineSecurityErrorgeworfen. - Nutzeraktivierung:
requestStorageAccess()muss in der Regel durch eine Nutzeraktion wie einen Klick ausgelöst werden. Das iframe braucht außerdem gegebenenfallssandbox=\"allow-storage-access-by-user-activation\". - Nicht mit
window.indexedDBverwechseln: Im Drittanbieter-Kontext bleibtwindow.indexedDBauch nach gewährtem Zugriff partitioniert. Nurhandle.indexedDBerreicht 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.