From c3f0319942fc0d4b680b0533c6cdb508e6c7b4ca Mon Sep 17 00:00:00 2001 From: PaulTriandafilov Date: Fri, 1 Mar 2024 21:39:59 +0200 Subject: [PATCH] feat(playwright-core): add remove cookies api Fix review comments --- docs/src/api/class-browsercontext.md | 5 +++-- .../playwright-core/src/client/browserContext.ts | 4 ++-- packages/playwright-core/src/protocol/validator.ts | 2 +- .../playwright-core/src/server/browserContext.ts | 12 ++++++------ .../server/dispatchers/browserContextDispatcher.ts | 2 +- packages/playwright-core/types/types.d.ts | 6 +++--- packages/protocol/src/channels.ts | 2 +- packages/protocol/src/protocol.yml | 2 +- tests/library/browsercontext-remove-cookies.spec.ts | 5 +++-- 9 files changed, 21 insertions(+), 19 deletions(-) diff --git a/docs/src/api/class-browsercontext.md b/docs/src/api/class-browsercontext.md index 681823e8a5..8cb2cb7652 100644 --- a/docs/src/api/class-browsercontext.md +++ b/docs/src/api/class-browsercontext.md @@ -1014,6 +1014,7 @@ Returns all open pages in the context. * since: v1.43 Removes cookies from context. +The method will throw an error if either name, domain or path has not been passed. **Usage** @@ -1024,9 +1025,9 @@ await browserContext.removeCookies({ path: '/api/v1' }); await browserContext.removeCookies({ name: 'session-id', domain: 'my-origin.com' }); ``` -### param: BrowserContext.removeCookies.criteria +### param: BrowserContext.removeCookies.filter * since: v1.43 -- `criteria` <[Object]> +- `filter` <[Object]> - `name` ?<[string]> - `domain` ?<[string]> - `path` ?<[string]> diff --git a/packages/playwright-core/src/client/browserContext.ts b/packages/playwright-core/src/client/browserContext.ts index 9d48a65c59..974e6bb743 100644 --- a/packages/playwright-core/src/client/browserContext.ts +++ b/packages/playwright-core/src/client/browserContext.ts @@ -269,8 +269,8 @@ export class BrowserContext extends ChannelOwner await this._channel.clearCookies(); } - async removeCookies(criteria: network.RemoveNetworkCookieParam): Promise { - await this._channel.removeCookies({ criteria }); + async removeCookies(filter: network.RemoveNetworkCookieParam): Promise { + await this._channel.removeCookies({ filter }); } async grantPermissions(permissions: string[], options?: { origin?: string }): Promise { diff --git a/packages/playwright-core/src/protocol/validator.ts b/packages/playwright-core/src/protocol/validator.ts index 06c4160e12..4a8f7fb3d1 100644 --- a/packages/playwright-core/src/protocol/validator.ts +++ b/packages/playwright-core/src/protocol/validator.ts @@ -829,7 +829,7 @@ scheme.BrowserContextAddInitScriptResult = tOptional(tObject({})); scheme.BrowserContextClearCookiesParams = tOptional(tObject({})); scheme.BrowserContextClearCookiesResult = tOptional(tObject({})); scheme.BrowserContextRemoveCookiesParams = tObject({ - criteria: tObject({ + filter: tObject({ name: tOptional(tString), domain: tOptional(tString), path: tOptional(tString), diff --git a/packages/playwright-core/src/server/browserContext.ts b/packages/playwright-core/src/server/browserContext.ts index 33a1109d50..51add38e0e 100644 --- a/packages/playwright-core/src/server/browserContext.ts +++ b/packages/playwright-core/src/server/browserContext.ts @@ -276,16 +276,16 @@ export abstract class BrowserContext extends SdkObject { return await this.doGetCookies(urls as string[]); } - async removeCookies(criteria: {name?: string, domain?: string, path?: string}): Promise { - if (!criteria.name && !criteria.domain && !criteria.path) - return; + async removeCookies(filter: {name?: string, domain?: string, path?: string}): Promise { + if (!filter.name && !filter.domain && !filter.path) + throw new Error(`Either name, domain or path are required`); const currentCookies = await this.cookies(); const cookiesToKeep = currentCookies.filter(cookie => { - return !((!criteria.name || criteria.name === cookie.name) && - (!criteria.domain || criteria.domain === cookie.domain) && - (!criteria.path || criteria.path === cookie.path)); + return !((!filter.name || filter.name === cookie.name) && + (!filter.domain || filter.domain === cookie.domain) && + (!filter.path || filter.path === cookie.path)); }); await this.clearCookies(); diff --git a/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts b/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts index fc8b35825b..d04418866a 100644 --- a/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/browserContextDispatcher.ts @@ -225,7 +225,7 @@ export class BrowserContextDispatcher extends Dispatcher { - await this._context.removeCookies(params.criteria); + await this._context.removeCookies(params.filter); } async grantPermissions(params: channels.BrowserContextGrantPermissionsParams): Promise { diff --git a/packages/playwright-core/types/types.d.ts b/packages/playwright-core/types/types.d.ts index 5fa04dd43e..e3880c829d 100644 --- a/packages/playwright-core/types/types.d.ts +++ b/packages/playwright-core/types/types.d.ts @@ -8439,7 +8439,7 @@ export interface BrowserContext { pages(): Array; /** - * Removes cookies from context. + * Removes cookies from context. The method will throw an error if either name, domain or path has not been passed. * * **Usage** * @@ -8450,9 +8450,9 @@ export interface BrowserContext { * await browserContext.removeCookies({ name: 'session-id', domain: 'my-origin.com' }); * ``` * - * @param criteria + * @param filter */ - removeCookies(criteria: { + removeCookies(filter: { name?: string; domain?: string; diff --git a/packages/protocol/src/channels.ts b/packages/protocol/src/channels.ts index 4f214df7f9..c0af7ac678 100644 --- a/packages/protocol/src/channels.ts +++ b/packages/protocol/src/channels.ts @@ -1525,7 +1525,7 @@ export type BrowserContextClearCookiesParams = {}; export type BrowserContextClearCookiesOptions = {}; export type BrowserContextClearCookiesResult = void; export type BrowserContextRemoveCookiesParams = { - criteria: { + filter: { name?: string, domain?: string, path?: string, diff --git a/packages/protocol/src/protocol.yml b/packages/protocol/src/protocol.yml index 0b3b387fe6..acb847b08b 100644 --- a/packages/protocol/src/protocol.yml +++ b/packages/protocol/src/protocol.yml @@ -1034,7 +1034,7 @@ BrowserContext: removeCookies: parameters: - criteria: + filter: type: object properties: name: string? diff --git a/tests/library/browsercontext-remove-cookies.spec.ts b/tests/library/browsercontext-remove-cookies.spec.ts index 9a5f295c3b..e7a3cdaad3 100644 --- a/tests/library/browsercontext-remove-cookies.spec.ts +++ b/tests/library/browsercontext-remove-cookies.spec.ts @@ -209,7 +209,7 @@ it('should remove cookies by name, domain and path', async ({ context, page, ser expect(await page.evaluate('document.cookie')).toBe('cookie1=1'); }); -it('should not remove cookies when empty object passed', async ({ context, page, server }) => { +it('should throw if empty object is passed', async ({ context, page, server }) => { await context.addCookies([{ name: 'cookie1', value: '1', @@ -225,6 +225,7 @@ it('should not remove cookies when empty object passed', async ({ context, page, ]); await page.goto('https://www.example.com/'); expect(await page.evaluate('document.cookie')).toBe('cookie1=1; cookie2=2'); - await context.removeCookies({ }); + const error = await context.removeCookies({ }).catch(e => e); + expect(error.message).toContain(`Either name, domain or path are required`); expect(await page.evaluate('document.cookie')).toBe('cookie1=1; cookie2=2'); });