@@ -19,9 +19,10 @@ import { getGlobal, getUA, isIndexedDBAvailable } from '@firebase/util';
19
19
20
20
import { debugAssert } from '../util/assert' ;
21
21
import { Code , FirestoreError } from '../util/error' ;
22
- import { logDebug , logError } from '../util/log' ;
22
+ import { logDebug , logError , logWarn } from '../util/log' ;
23
23
import { Deferred } from '../util/promise' ;
24
24
25
+ import { DatabaseDeletedListener } from './persistence' ;
25
26
import { PersistencePromise } from './persistence_promise' ;
26
27
27
28
// References to `indexedDB` are guarded by SimpleDb.isAvailable() and getGlobal()
@@ -158,8 +159,8 @@ export class SimpleDbTransaction {
158
159
*/
159
160
export class SimpleDb {
160
161
private db ?: IDBDatabase ;
162
+ private databaseDeletedListener ?: DatabaseDeletedListener ;
161
163
private lastClosedDbVersion : number | null = null ;
162
- private versionchangelistener ?: ( event : IDBVersionChangeEvent ) => void ;
163
164
164
165
/** Deletes the specified database. */
165
166
static delete ( name : string ) : Promise < void > {
@@ -392,22 +393,35 @@ export class SimpleDb {
392
393
) ;
393
394
}
394
395
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
+ ) ;
398
411
399
412
return this . db ;
400
413
}
401
414
402
- setVersionChangeListener (
403
- versionChangeListener : ( event : IDBVersionChangeEvent ) => void
415
+ setDatabaseDeletedListener (
416
+ databaseDeletedListener : DatabaseDeletedListener
404
417
) : 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
+ ) ;
410
423
}
424
+ this . databaseDeletedListener = databaseDeletedListener ;
411
425
}
412
426
413
427
async runTransaction < T > (
0 commit comments