@@ -23,6 +23,7 @@ import { logDebug, logError } from '../util/log';
2323import { Deferred } from '../util/promise' ;
2424
2525import { PersistencePromise } from './persistence_promise' ;
26+ import { DatabaseDeletedListener } from './persistence' ;
2627
2728// References to `indexedDB` are guarded by SimpleDb.isAvailable() and getGlobal()
2829/* eslint-disable no-restricted-globals */
@@ -158,8 +159,8 @@ export class SimpleDbTransaction {
158159 */
159160export class SimpleDb {
160161 private db ?: IDBDatabase ;
162+ private databaseDeletedListener ?: DatabaseDeletedListener ;
161163 private lastClosedDbVersion : number | null = null ;
162- private versionchangelistener ?: ( event : IDBVersionChangeEvent ) => void ;
163164
164165 /** Deletes the specified database. */
165166 static delete ( name : string ) : Promise < void > {
@@ -392,22 +393,31 @@ export class SimpleDb {
392393 ) ;
393394 }
394395
395- if ( this . versionchangelistener ) {
396- this . db . onversionchange = event => this . versionchangelistener ! ( event ) ;
397- }
396+ this . db . addEventListener (
397+ 'versionchange' ,
398+ event => {
399+ // Notify the listener if another tab attempted to delete the IndexedDb
400+ // database, such as by calling clearIndexedDbPersistence().
401+ if ( event . newVersion === null ) {
402+ this . databaseDeletedListener ?.( ) ;
403+ }
404+ } ,
405+ { passive : true }
406+ ) ;
398407
399408 return this . db ;
400409 }
401410
402- setVersionChangeListener (
403- versionChangeListener : ( event : IDBVersionChangeEvent ) => void
411+ setDatabaseDeletedListener (
412+ databaseDeletedListener : DatabaseDeletedListener
404413 ) : void {
405- this . versionchangelistener = versionChangeListener ;
406- if ( this . db ) {
407- this . db . onversionchange = ( event : IDBVersionChangeEvent ) => {
408- return versionChangeListener ( event ) ;
409- } ;
414+ if ( this . databaseDeletedListener ) {
415+ throw new Error (
416+ 'setDatabaseDeletedListener() may only be called once, ' +
417+ 'and it has already been called'
418+ ) ;
410419 }
420+ this . databaseDeletedListener = databaseDeletedListener ;
411421 }
412422
413423 async runTransaction < T > (
0 commit comments