From 700b310150c0eac3f610d712ecf7b96c4577cf60 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Tue, 12 Sep 2023 13:11:18 -0700 Subject: [PATCH] fix(fetch): restore from empty storage state (#27025) Fixes #26833 --- packages/playwright-core/src/protocol/validator.ts | 4 ++-- packages/playwright-core/src/server/fetch.ts | 2 +- packages/protocol/src/channels.ts | 8 ++++---- packages/protocol/src/protocol.yml | 4 ++-- tests/library/global-fetch-cookie.spec.ts | 11 +++++++++++ 5 files changed, 20 insertions(+), 9 deletions(-) diff --git a/packages/playwright-core/src/protocol/validator.ts b/packages/playwright-core/src/protocol/validator.ts index c05a349a56..ddb477f310 100644 --- a/packages/playwright-core/src/protocol/validator.ts +++ b/packages/playwright-core/src/protocol/validator.ts @@ -342,8 +342,8 @@ scheme.PlaywrightNewRequestParams = tObject({ })), timeout: tOptional(tNumber), storageState: tOptional(tObject({ - cookies: tArray(tType('NetworkCookie')), - origins: tArray(tType('OriginStorage')), + cookies: tOptional(tArray(tType('NetworkCookie'))), + origins: tOptional(tArray(tType('OriginStorage'))), })), tracesDir: tOptional(tString), }); diff --git a/packages/playwright-core/src/server/fetch.ts b/packages/playwright-core/src/server/fetch.ts index d439d393a3..e2c92b2b4b 100644 --- a/packages/playwright-core/src/server/fetch.ts +++ b/packages/playwright-core/src/server/fetch.ts @@ -523,7 +523,7 @@ export class GlobalAPIRequestContext extends APIRequestContext { } if (options.storageState) { this._origins = options.storageState.origins; - this._cookieStore.addCookies(options.storageState.cookies); + this._cookieStore.addCookies(options.storageState.cookies || []); } this._options = { baseURL: options.baseURL, diff --git a/packages/protocol/src/channels.ts b/packages/protocol/src/channels.ts index 9e7abcbd1c..bd8ab7ce54 100644 --- a/packages/protocol/src/channels.ts +++ b/packages/protocol/src/channels.ts @@ -587,8 +587,8 @@ export type PlaywrightNewRequestParams = { }, timeout?: number, storageState?: { - cookies: NetworkCookie[], - origins: OriginStorage[], + cookies?: NetworkCookie[], + origins?: OriginStorage[], }, tracesDir?: string, }; @@ -610,8 +610,8 @@ export type PlaywrightNewRequestOptions = { }, timeout?: number, storageState?: { - cookies: NetworkCookie[], - origins: OriginStorage[], + cookies?: NetworkCookie[], + origins?: OriginStorage[], }, tracesDir?: string, }; diff --git a/packages/protocol/src/protocol.yml b/packages/protocol/src/protocol.yml index de3e8686c5..486890e60d 100644 --- a/packages/protocol/src/protocol.yml +++ b/packages/protocol/src/protocol.yml @@ -683,10 +683,10 @@ Playwright: type: object? properties: cookies: - type: array + type: array? items: NetworkCookie origins: - type: array + type: array? items: OriginStorage tracesDir: string? diff --git a/tests/library/global-fetch-cookie.spec.ts b/tests/library/global-fetch-cookie.spec.ts index 374d6eef90..67845f8b8e 100644 --- a/tests/library/global-fetch-cookie.spec.ts +++ b/tests/library/global-fetch-cookie.spec.ts @@ -436,3 +436,14 @@ it('storage state should round-trip through file', async ({ playwright, server } const state2 = await request2.storageState(); expect(state2).toEqual(storageState); }); + +it('should work with empty storage state', async ({ playwright, server }, testInfo) => { + const storageState = testInfo.outputPath('storage-state.json'); + await fs.promises.writeFile(storageState, '{}'); + const request1 = await playwright.request.newContext({ storageState }); + + const state1 = await request1.storageState(); + expect(state1).toEqual({ cookies: [], origins: [] }); + await expect(await request1.get(server.EMPTY_PAGE)).toBeOK(); + await request1.dispose(); +});