From a2f9ec42d523a5955a9ec30d7589925fc0c88d0b Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Thu, 27 Mar 2025 03:01:07 +0000 Subject: [PATCH 1/2] fix `undefined` document snapshot data after "clear site data" --- .changeset/slow-students-fry.md | 6 +++++ packages/firestore/src/local/simple_db.ts | 29 +++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 .changeset/slow-students-fry.md diff --git a/.changeset/slow-students-fry.md b/.changeset/slow-students-fry.md new file mode 100644 index 00000000000..45f3cf7e576 --- /dev/null +++ b/.changeset/slow-students-fry.md @@ -0,0 +1,6 @@ +--- +'@firebase/firestore': patch +'firebase': patch +--- + +Fix issue where Firestore would produce `undefined` for document snapshot data if using IndexedDB persistence and "clear site data" (or equivalent) button was pressed in the web browser. diff --git a/packages/firestore/src/local/simple_db.ts b/packages/firestore/src/local/simple_db.ts index 8665136a9f5..ffe8e534f72 100644 --- a/packages/firestore/src/local/simple_db.ts +++ b/packages/firestore/src/local/simple_db.ts @@ -158,6 +158,7 @@ export class SimpleDbTransaction { */ export class SimpleDb { private db?: IDBDatabase; + private lastDbVersion: number | null = null; private versionchangelistener?: (event: IDBVersionChangeEvent) => void; /** Deletes the specified database. */ @@ -344,6 +345,24 @@ export class SimpleDb { event.oldVersion ); const db = (event.target as IDBOpenDBRequest).result; + if ( + this.lastDbVersion !== null && + this.lastDbVersion !== event.oldVersion + ) { + // This thrown error will get passed to the `onerror` callback + // registered above, and will then be propagated correctly. + throw new Error( + `refusing to open IndexedDB database due to potential ` + + `corruption of the IndexedDB database data; this corruption ` + + `could be caused by clicking the "clear site data" button in ` + + `a web browser; try reloading the web page to re-initialize ` + + `the IndexedDB database: ` + + `lastDbVersion=${this.lastDbVersion}, ` + + `event.oldVersion=${event.oldVersion}, ` + + `event.newVersion=${event.newVersion}, ` + + `db.version=${db.version}` + ); + } this.schemaConverter .createOrUpgrade( db, @@ -359,11 +378,21 @@ export class SimpleDb { }); }; }); + + this.db.addEventListener( + 'close', + event => { + const db = event.target as IDBDatabase; + this.lastDbVersion = db.version; + }, + { passive: true } + ); } if (this.versionchangelistener) { this.db.onversionchange = event => this.versionchangelistener!(event); } + return this.db; } From a4cb73497acaa7f574896452b9434bdae26e86d4 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Thu, 27 Mar 2025 16:21:43 +0000 Subject: [PATCH 2/2] simple_db.ts: rename `lastDbVersion` to `lastClosedDbVersion` so that its name is more self-documenting --- packages/firestore/src/local/simple_db.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/firestore/src/local/simple_db.ts b/packages/firestore/src/local/simple_db.ts index ffe8e534f72..3327f66acb7 100644 --- a/packages/firestore/src/local/simple_db.ts +++ b/packages/firestore/src/local/simple_db.ts @@ -158,7 +158,7 @@ export class SimpleDbTransaction { */ export class SimpleDb { private db?: IDBDatabase; - private lastDbVersion: number | null = null; + private lastClosedDbVersion: number | null = null; private versionchangelistener?: (event: IDBVersionChangeEvent) => void; /** Deletes the specified database. */ @@ -346,8 +346,8 @@ export class SimpleDb { ); const db = (event.target as IDBOpenDBRequest).result; if ( - this.lastDbVersion !== null && - this.lastDbVersion !== event.oldVersion + this.lastClosedDbVersion !== null && + this.lastClosedDbVersion !== event.oldVersion ) { // This thrown error will get passed to the `onerror` callback // registered above, and will then be propagated correctly. @@ -357,7 +357,7 @@ export class SimpleDb { `could be caused by clicking the "clear site data" button in ` + `a web browser; try reloading the web page to re-initialize ` + `the IndexedDB database: ` + - `lastDbVersion=${this.lastDbVersion}, ` + + `lastClosedDbVersion=${this.lastClosedDbVersion}, ` + `event.oldVersion=${event.oldVersion}, ` + `event.newVersion=${event.newVersion}, ` + `db.version=${db.version}` @@ -383,7 +383,7 @@ export class SimpleDb { 'close', event => { const db = event.target as IDBDatabase; - this.lastDbVersion = db.version; + this.lastClosedDbVersion = db.version; }, { passive: true } );