Skip to content

IndexedDB connections must be closed so bfcache works #6167

Open
@gustavopch

Description

@gustavopch

[REQUIRED] Describe your environment

  • Operating System version: macOS 12.3
  • Browser version: Chrome 100
  • Firebase SDK version: 9.6.7
  • Firebase Product: auth

[REQUIRED] Describe the problem

As described in https://web.dev/bfcache, the browsers' back/forward cache doesn't work when IndexedDB has an open connection. Currently, connections are opened here and then they're never closed:

export function _openDatabase(): Promise<IDBDatabase> {
const request = indexedDB.open(DB_NAME, DB_VERSION);
return new Promise((resolve, reject) => {
request.addEventListener('error', () => {

They should be closed (db.close()) immediately after used or when deleteApp() is called.

As a workaround, I monkey patched window.indexedDB.open to keep references to each connection so I can close them on pagehide so bfcache works:

const open = window.indexedDB.open.bind(window.indexedDB)
const dbs = []

window.indexedDB.open = (...args) => {
  const request = open(...args)

  request.addEventListener('success', event => {
    const db = event.target.result
    dbs.push(db)
  })

  return request
}

window.addEventListener(
  'pagehide',
  () => {
    for (const db of dbs) {
      db.close()
    }
  },
  { capture: true },
)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions