@@ -158,6 +158,7 @@ export class SimpleDbTransaction {
158
158
*/
159
159
export class SimpleDb {
160
160
private db ?: IDBDatabase ;
161
+ private lastClosedDbVersion : number | null = null ;
161
162
private versionchangelistener ?: ( event : IDBVersionChangeEvent ) => void ;
162
163
163
164
/** Deletes the specified database. */
@@ -344,6 +345,24 @@ export class SimpleDb {
344
345
event . oldVersion
345
346
) ;
346
347
const db = ( event . target as IDBOpenDBRequest ) . result ;
348
+ if (
349
+ this . lastClosedDbVersion !== null &&
350
+ this . lastClosedDbVersion !== event . oldVersion
351
+ ) {
352
+ // This thrown error will get passed to the `onerror` callback
353
+ // registered above, and will then be propagated correctly.
354
+ throw new Error (
355
+ `refusing to open IndexedDB database due to potential ` +
356
+ `corruption of the IndexedDB database data; this corruption ` +
357
+ `could be caused by clicking the "clear site data" button in ` +
358
+ `a web browser; try reloading the web page to re-initialize ` +
359
+ `the IndexedDB database: ` +
360
+ `lastClosedDbVersion=${ this . lastClosedDbVersion } , ` +
361
+ `event.oldVersion=${ event . oldVersion } , ` +
362
+ `event.newVersion=${ event . newVersion } , ` +
363
+ `db.version=${ db . version } `
364
+ ) ;
365
+ }
347
366
this . schemaConverter
348
367
. createOrUpgrade (
349
368
db ,
@@ -359,11 +378,21 @@ export class SimpleDb {
359
378
} ) ;
360
379
} ;
361
380
} ) ;
381
+
382
+ this . db . addEventListener (
383
+ 'close' ,
384
+ event => {
385
+ const db = event . target as IDBDatabase ;
386
+ this . lastClosedDbVersion = db . version ;
387
+ } ,
388
+ { passive : true }
389
+ ) ;
362
390
}
363
391
364
392
if ( this . versionchangelistener ) {
365
393
this . db . onversionchange = event => this . versionchangelistener ! ( event ) ;
366
394
}
395
+
367
396
return this . db ;
368
397
}
369
398
0 commit comments