@@ -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