@@ -19,9 +19,10 @@ import { getGlobal, getUA, isIndexedDBAvailable } from '@firebase/util';
1919
2020import { debugAssert } from '../util/assert' ;
2121import { Code , FirestoreError } from '../util/error' ;
22- import { logDebug , logError } from '../util/log' ;
22+ import { logDebug , logError , logWarn } from '../util/log' ;
2323import { Deferred } from '../util/promise' ;
2424
25+ import { DatabaseDeletedListener } from './persistence' ;
2526import { PersistencePromise } from './persistence_promise' ;
2627
2728// References to `indexedDB` are guarded by SimpleDb.isAvailable() and getGlobal()
@@ -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,35 @@ 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+ logWarn (
403+ `Received "versionchange" event with newVersion===null; ` +
404+ 'notifying the registered DatabaseDeletedListener, if any'
405+ ) ;
406+ this . databaseDeletedListener ?.( ) ;
407+ }
408+ } ,
409+ { passive : true }
410+ ) ;
398411
399412 return this . db ;
400413 }
401414
402- setVersionChangeListener (
403- versionChangeListener : ( event : IDBVersionChangeEvent ) => void
415+ setDatabaseDeletedListener (
416+ databaseDeletedListener : DatabaseDeletedListener
404417 ) : void {
405- this . versionchangelistener = versionChangeListener ;
406- if ( this . db ) {
407- this . db . onversionchange = ( event : IDBVersionChangeEvent ) => {
408- return versionChangeListener ( event ) ;
409- } ;
418+ if ( this . databaseDeletedListener ) {
419+ throw new Error (
420+ 'setDatabaseDeletedListener() may only be called once, ' +
421+ 'and it has already been called'
422+ ) ;
410423 }
424+ this . databaseDeletedListener = databaseDeletedListener ;
411425 }
412426
413427 async runTransaction < T > (
0 commit comments