diff --git a/packages/playwright-core/src/server/storageScript.ts b/packages/playwright-core/src/server/storageScript.ts index cb1b21bc692be..6302722fcc4d8 100644 --- a/packages/playwright-core/src/server/storageScript.ts +++ b/packages/playwright-core/src/server/storageScript.ts @@ -85,6 +85,9 @@ export class StorageScript { throw new Error('Database version is unset'); const db = await this._idbRequestToPromise(indexedDB.open(dbInfo.name)); + if (db.objectStoreNames.length === 0) + return { name: dbInfo.name, version: dbInfo.version, stores: [] }; + const transaction = db.transaction(db.objectStoreNames, 'readonly'); const stores = await Promise.all([...db.objectStoreNames].map(async storeName => { const objectStore = transaction.objectStore(storeName); @@ -165,6 +168,9 @@ export class StorageScript { // after `upgradeneeded` finishes, `success` event is fired. const db = await this._idbRequestToPromise(openRequest); + + if (db.objectStoreNames.length === 0) + return; const transaction = db.transaction(db.objectStoreNames, 'readwrite'); await Promise.all(dbInfo.stores.map(async store => { const objectStore = transaction.objectStore(store.name); diff --git a/tests/library/browsercontext-storage-state.spec.ts b/tests/library/browsercontext-storage-state.spec.ts index 31c4884e650e7..9aed5f7466217 100644 --- a/tests/library/browsercontext-storage-state.spec.ts +++ b/tests/library/browsercontext-storage-state.spec.ts @@ -450,3 +450,25 @@ it('should support IndexedDB', async ({ page, server, contextFactory }) => { expect(await context.storageState()).toEqual({ cookies: [], origins: [] }); }); + +it('should support empty indexedDB', { annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/35760' } }, async ({ page, server, contextFactory }) => { + await page.goto(server.EMPTY_PAGE); + await page.evaluate(() => new Promise(resolve => { + const openRequest = indexedDB.open('unused-db'); + openRequest.onsuccess = () => resolve(); + openRequest.onerror = () => resolve(); + })); + const storageState = await page.context().storageState({ indexedDB: true }); + expect(storageState.origins).toEqual([{ + origin: server.PREFIX, + localStorage: [], + indexedDB: [{ + name: 'unused-db', + version: 1, + stores: [], + }] + }]); + + const context = await contextFactory({ storageState }); + expect(await context.storageState({ indexedDB: true })).toEqual(storageState); +});