From 2116f5f290560f20677f896657e218d85f76e33f Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Thu, 6 Feb 2025 13:02:16 +0100 Subject: [PATCH] make it a param --- docs/src/api/class-browsercontext.md | 6 ++++++ packages/playwright-core/src/client/browserContext.ts | 4 ++-- packages/playwright-core/src/protocol/validator.ts | 4 +++- packages/playwright-core/src/server/browserContext.ts | 4 ++-- .../src/server/dispatchers/browserContextDispatcher.ts | 2 +- packages/playwright-core/src/server/storageScript.ts | 6 +++--- packages/playwright-core/types/types.d.ts | 5 +++++ packages/protocol/src/channels.d.ts | 10 +++++++--- packages/protocol/src/protocol.yml | 2 ++ tests/library/browsercontext-storage-state.spec.ts | 3 +++ 10 files changed, 34 insertions(+), 12 deletions(-) diff --git a/docs/src/api/class-browsercontext.md b/docs/src/api/class-browsercontext.md index 0da156b664..ff40212983 100644 --- a/docs/src/api/class-browsercontext.md +++ b/docs/src/api/class-browsercontext.md @@ -1541,6 +1541,12 @@ Returns storage state for this browser context, contains current cookies, local ### option: BrowserContext.storageState.path = %%-storagestate-option-path-%% * since: v1.8 +### option: BrowserContext.storageState.indexedDB +* since: v1.51 +- `indexedDB` ? + +Set to `false` to disable IndexedDB snapshot. + ## property: BrowserContext.tracing * since: v1.12 - type: <[Tracing]> diff --git a/packages/playwright-core/src/client/browserContext.ts b/packages/playwright-core/src/client/browserContext.ts index c87fc5bc7d..922fb03bfe 100644 --- a/packages/playwright-core/src/client/browserContext.ts +++ b/packages/playwright-core/src/client/browserContext.ts @@ -425,8 +425,8 @@ export class BrowserContext extends ChannelOwner }); } - async storageState(options: { path?: string } = {}): Promise { - const state = await this._channel.storageState(); + async storageState(options: { path?: string, indexedDB?: boolean } = {}): Promise { + const state = await this._channel.storageState({ indexedDB: options.indexedDB ?? true }); if (options.path) { await mkdirIfNeeded(options.path); await fs.promises.writeFile(options.path, JSON.stringify(state, undefined, 2), 'utf8'); diff --git a/packages/playwright-core/src/protocol/validator.ts b/packages/playwright-core/src/protocol/validator.ts index 35832219ee..ec5e167f8a 100644 --- a/packages/playwright-core/src/protocol/validator.ts +++ b/packages/playwright-core/src/protocol/validator.ts @@ -992,7 +992,9 @@ scheme.BrowserContextSetOfflineParams = tObject({ offline: tBoolean, }); scheme.BrowserContextSetOfflineResult = tOptional(tObject({})); -scheme.BrowserContextStorageStateParams = tOptional(tObject({})); +scheme.BrowserContextStorageStateParams = tObject({ + indexedDB: tBoolean, +}); scheme.BrowserContextStorageStateResult = tObject({ cookies: tArray(tType('NetworkCookie')), origins: tArray(tType('OriginStorage')), diff --git a/packages/playwright-core/src/server/browserContext.ts b/packages/playwright-core/src/server/browserContext.ts index 3773c4fdf8..1fd7f4d6a1 100644 --- a/packages/playwright-core/src/server/browserContext.ts +++ b/packages/playwright-core/src/server/browserContext.ts @@ -508,14 +508,14 @@ export abstract class BrowserContext extends SdkObject { this._origins.add(origin); } - async storageState(): Promise { + async storageState(indexedDB: boolean): Promise { const result: channels.BrowserContextStorageStateResult = { cookies: await this.cookies(), origins: [] }; const originsToSave = new Set(this._origins); - const collectScript = `(${storageScript.collect})((${utilityScriptSerializers.source})(), ${this._browser.options.name === 'firefox'}, ${Boolean(process.env.PLAYWRIGHT_SKIP_INDEXEDDB)})`; + const collectScript = `(${storageScript.collect})((${utilityScriptSerializers.source})(), ${this._browser.options.name === 'firefox'}, ${indexedDB})`; // First try collecting storage stage from existing pages. for (const page of this.pages()) { diff --git a/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts b/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts index 0dcfb23e0a..9ee416ce85 100644 --- a/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts @@ -291,7 +291,7 @@ export class BrowserContextDispatcher extends Dispatcher { - return await this._context.storageState(); + return await this._context.storageState(params.indexedDB); } async close(params: channels.BrowserContextCloseParams, metadata: CallMetadata): Promise { diff --git a/packages/playwright-core/src/server/storageScript.ts b/packages/playwright-core/src/server/storageScript.ts index f3282eb49b..04e6b3f6d1 100644 --- a/packages/playwright-core/src/server/storageScript.ts +++ b/packages/playwright-core/src/server/storageScript.ts @@ -19,7 +19,7 @@ import type { source } from './isomorphic/utilityScriptSerializers'; export type Storage = Omit; -export async function collect(serializers: ReturnType, isFirefox: boolean, skipIndexedDB: boolean): Promise { +export async function collect(serializers: ReturnType, isFirefox: boolean, recordIndexedDB: boolean): Promise { async function collectDB(dbInfo: IDBDatabaseInfo) { if (!dbInfo.name) throw new Error('Database name is empty'); @@ -123,9 +123,9 @@ export async function collect(serializers: ReturnType, isFirefox: return { localStorage: Object.keys(localStorage).map(name => ({ name, value: localStorage.getItem(name)! })), - indexedDB: skipIndexedDB ? [] : await Promise.all((await indexedDB.databases()).map(collectDB)).catch(e => { + indexedDB: recordIndexedDB ? await Promise.all((await indexedDB.databases()).map(collectDB)).catch(e => { throw new Error('Unable to serialize IndexedDB: ' + e.message); - }), + }) : [], }; } diff --git a/packages/playwright-core/types/types.d.ts b/packages/playwright-core/types/types.d.ts index 6f7c35e361..6db87e13d4 100644 --- a/packages/playwright-core/types/types.d.ts +++ b/packages/playwright-core/types/types.d.ts @@ -9271,6 +9271,11 @@ export interface BrowserContext { * @param options */ storageState(options?: { + /** + * Set to `false` to disable IndexedDB snapshot. + */ + indexedDB?: boolean; + /** * The file path to save the storage state to. If * [`path`](https://playwright.dev/docs/api/class-browsercontext#browser-context-storage-state-option-path) is a diff --git a/packages/protocol/src/channels.d.ts b/packages/protocol/src/channels.d.ts index b0ccdcbc2a..9c57586284 100644 --- a/packages/protocol/src/channels.d.ts +++ b/packages/protocol/src/channels.d.ts @@ -1564,7 +1564,7 @@ export interface BrowserContextChannel extends BrowserContextEventTarget, EventT setNetworkInterceptionPatterns(params: BrowserContextSetNetworkInterceptionPatternsParams, metadata?: CallMetadata): Promise; setWebSocketInterceptionPatterns(params: BrowserContextSetWebSocketInterceptionPatternsParams, metadata?: CallMetadata): Promise; setOffline(params: BrowserContextSetOfflineParams, metadata?: CallMetadata): Promise; - storageState(params?: BrowserContextStorageStateParams, metadata?: CallMetadata): Promise; + storageState(params: BrowserContextStorageStateParams, metadata?: CallMetadata): Promise; pause(params?: BrowserContextPauseParams, metadata?: CallMetadata): Promise; enableRecorder(params: BrowserContextEnableRecorderParams, metadata?: CallMetadata): Promise; newCDPSession(params: BrowserContextNewCDPSessionParams, metadata?: CallMetadata): Promise; @@ -1797,8 +1797,12 @@ export type BrowserContextSetOfflineOptions = { }; export type BrowserContextSetOfflineResult = void; -export type BrowserContextStorageStateParams = {}; -export type BrowserContextStorageStateOptions = {}; +export type BrowserContextStorageStateParams = { + indexedDB: boolean, +}; +export type BrowserContextStorageStateOptions = { + +}; export type BrowserContextStorageStateResult = { cookies: NetworkCookie[], origins: OriginStorage[], diff --git a/packages/protocol/src/protocol.yml b/packages/protocol/src/protocol.yml index b581eacb4e..5134d5e405 100644 --- a/packages/protocol/src/protocol.yml +++ b/packages/protocol/src/protocol.yml @@ -1234,6 +1234,8 @@ BrowserContext: offline: boolean storageState: + parameters: + indexedDB: boolean returns: cookies: type: array diff --git a/tests/library/browsercontext-storage-state.spec.ts b/tests/library/browsercontext-storage-state.spec.ts index 4b003a6c81..ee53088e9f 100644 --- a/tests/library/browsercontext-storage-state.spec.ts +++ b/tests/library/browsercontext-storage-state.spec.ts @@ -436,4 +436,7 @@ it('should support IndexedDB', async ({ page, server, contextFactory }) => { - listitem: - text: /Pet the cat/ `); + + + expect(await context.storageState({ indexedDB: false })).toEqual({ cookies: [], origins: [] }); });