mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
fix(wk,ff): properly support getting and setting non-session cookies (#1280)
This commit is contained in:
parent
bfd32fe6d2
commit
d1ef0c8694
@ -383,7 +383,6 @@ will be closed.
|
|||||||
- `size` <[number]>
|
- `size` <[number]>
|
||||||
- `httpOnly` <[boolean]>
|
- `httpOnly` <[boolean]>
|
||||||
- `secure` <[boolean]>
|
- `secure` <[boolean]>
|
||||||
- `session` <[boolean]>
|
|
||||||
- `sameSite` <"Strict"|"Lax"|"None">
|
- `sameSite` <"Strict"|"Lax"|"None">
|
||||||
|
|
||||||
If no URLs are specified, this method returns all cookies.
|
If no URLs are specified, this method returns all cookies.
|
||||||
|
|||||||
@ -289,6 +289,7 @@ export class CRBrowserContext extends BrowserContextBase {
|
|||||||
const copy: any = { sameSite: 'None', ...c };
|
const copy: any = { sameSite: 'None', ...c };
|
||||||
delete copy.size;
|
delete copy.size;
|
||||||
delete copy.priority;
|
delete copy.priority;
|
||||||
|
delete copy.session;
|
||||||
return copy as network.NetworkCookie;
|
return copy as network.NetworkCookie;
|
||||||
}), urls);
|
}), urls);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -324,6 +324,7 @@ export class FFBrowserContext extends BrowserContextBase {
|
|||||||
return network.filterCookies(cookies.map(c => {
|
return network.filterCookies(cookies.map(c => {
|
||||||
const copy: any = { ... c };
|
const copy: any = { ... c };
|
||||||
delete copy.size;
|
delete copy.size;
|
||||||
|
delete copy.session;
|
||||||
return copy as network.NetworkCookie;
|
return copy as network.NetworkCookie;
|
||||||
}), urls);
|
}), urls);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,7 +26,6 @@ export type NetworkCookie = {
|
|||||||
expires: number,
|
expires: number,
|
||||||
httpOnly: boolean,
|
httpOnly: boolean,
|
||||||
secure: boolean,
|
secure: boolean,
|
||||||
session: boolean,
|
|
||||||
sameSite: 'Strict' | 'Lax' | 'None'
|
sameSite: 'Strict' | 'Lax' | 'None'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -235,14 +235,20 @@ export class WKBrowserContext extends BrowserContextBase {
|
|||||||
|
|
||||||
async cookies(urls?: string | string[]): Promise<network.NetworkCookie[]> {
|
async cookies(urls?: string | string[]): Promise<network.NetworkCookie[]> {
|
||||||
const { cookies } = await this._browser._browserSession.send('Browser.getAllCookies', { browserContextId: this._browserContextId });
|
const { cookies } = await this._browser._browserSession.send('Browser.getAllCookies', { browserContextId: this._browserContextId });
|
||||||
return network.filterCookies(cookies.map((c: network.NetworkCookie) => ({
|
return network.filterCookies(cookies.map((c: network.NetworkCookie) => {
|
||||||
...c,
|
const copy: any = { ... c };
|
||||||
expires: c.expires === 0 ? -1 : c.expires
|
copy.expires = c.expires === 0 ? -1 : c.expires / 1000;
|
||||||
})), urls);
|
delete copy.session;
|
||||||
|
return copy as network.NetworkCookie;
|
||||||
|
}), urls);
|
||||||
}
|
}
|
||||||
|
|
||||||
async setCookies(cookies: network.SetNetworkCookieParam[]) {
|
async setCookies(cookies: network.SetNetworkCookieParam[]) {
|
||||||
const cc = network.rewriteCookies(cookies).map(c => ({ ...c, session: c.expires === -1 || c.expires === undefined })) as Protocol.Browser.SetCookieParam[];
|
const cc = network.rewriteCookies(cookies).map(c => ({
|
||||||
|
...c,
|
||||||
|
session: c.expires === -1 || c.expires === undefined,
|
||||||
|
expires: c.expires && c.expires !== -1 ? c.expires * 1000 : c.expires
|
||||||
|
})) as Protocol.Browser.SetCookieParam[];
|
||||||
await this._browser._browserSession.send('Browser.setCookies', { cookies: cc, browserContextId: this._browserContextId });
|
await this._browser._browserSession.send('Browser.setCookies', { cookies: cc, browserContextId: this._browserContextId });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -40,7 +40,25 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
|
|||||||
expires: -1,
|
expires: -1,
|
||||||
httpOnly: false,
|
httpOnly: false,
|
||||||
secure: false,
|
secure: false,
|
||||||
session: true,
|
sameSite: 'None',
|
||||||
|
}]);
|
||||||
|
});
|
||||||
|
it('should get a non-session cookie', async({context, page, server}) => {
|
||||||
|
await page.goto(server.EMPTY_PAGE);
|
||||||
|
// @see https://en.wikipedia.org/wiki/Year_2038_problem
|
||||||
|
const date = +(new Date('1/1/2038'));
|
||||||
|
await page.evaluate(timestamp => {
|
||||||
|
const date = new Date(timestamp);
|
||||||
|
document.cookie = `username=John Doe;expires=${date.toUTCString()}`;
|
||||||
|
}, date);
|
||||||
|
expect(await context.cookies()).toEqual([{
|
||||||
|
name: 'username',
|
||||||
|
value: 'John Doe',
|
||||||
|
domain: 'localhost',
|
||||||
|
path: '/',
|
||||||
|
expires: date / 1000,
|
||||||
|
httpOnly: false,
|
||||||
|
secure: false,
|
||||||
sameSite: 'None',
|
sameSite: 'None',
|
||||||
}]);
|
}]);
|
||||||
});
|
});
|
||||||
@ -91,7 +109,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
|
|||||||
expires: -1,
|
expires: -1,
|
||||||
httpOnly: false,
|
httpOnly: false,
|
||||||
secure: false,
|
secure: false,
|
||||||
session: true,
|
|
||||||
sameSite: 'None',
|
sameSite: 'None',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -102,7 +119,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
|
|||||||
expires: -1,
|
expires: -1,
|
||||||
httpOnly: false,
|
httpOnly: false,
|
||||||
secure: false,
|
secure: false,
|
||||||
session: true,
|
|
||||||
sameSite: 'None',
|
sameSite: 'None',
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
@ -131,7 +147,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
|
|||||||
expires: -1,
|
expires: -1,
|
||||||
httpOnly: false,
|
httpOnly: false,
|
||||||
secure: true,
|
secure: true,
|
||||||
session: true,
|
|
||||||
sameSite: 'None',
|
sameSite: 'None',
|
||||||
}, {
|
}, {
|
||||||
name: 'doggo',
|
name: 'doggo',
|
||||||
@ -141,7 +156,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
|
|||||||
expires: -1,
|
expires: -1,
|
||||||
httpOnly: false,
|
httpOnly: false,
|
||||||
secure: true,
|
secure: true,
|
||||||
session: true,
|
|
||||||
sameSite: 'None',
|
sameSite: 'None',
|
||||||
}]);
|
}]);
|
||||||
});
|
});
|
||||||
@ -157,6 +171,20 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
|
|||||||
}]);
|
}]);
|
||||||
expect(await page.evaluate(() => document.cookie)).toEqual('password=123456');
|
expect(await page.evaluate(() => document.cookie)).toEqual('password=123456');
|
||||||
});
|
});
|
||||||
|
it('should roundtrip cookie', async({context, page, server}) => {
|
||||||
|
await page.goto(server.EMPTY_PAGE);
|
||||||
|
// @see https://en.wikipedia.org/wiki/Year_2038_problem
|
||||||
|
const date = +(new Date('1/1/2038'));
|
||||||
|
await page.evaluate(timestamp => {
|
||||||
|
const date = new Date(timestamp);
|
||||||
|
document.cookie = `username=John Doe;expires=${date.toUTCString()}`;
|
||||||
|
}, date);
|
||||||
|
const cookies = await context.cookies();
|
||||||
|
await context.clearCookies();
|
||||||
|
expect(await context.cookies()).toEqual([]);
|
||||||
|
await context.setCookies(cookies);
|
||||||
|
expect(await context.cookies()).toEqual(cookies);
|
||||||
|
});
|
||||||
it('should send cookie header', async({server, context}) => {
|
it('should send cookie header', async({server, context}) => {
|
||||||
let cookie = '';
|
let cookie = '';
|
||||||
server.setRoute('/empty.html', (req, res) => {
|
server.setRoute('/empty.html', (req, res) => {
|
||||||
@ -250,7 +278,7 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
|
|||||||
it.slow()('should isolate cookies between launches', async({server}) => {
|
it.slow()('should isolate cookies between launches', async({server}) => {
|
||||||
const browser1 = await playwright.launch(defaultBrowserOptions);
|
const browser1 = await playwright.launch(defaultBrowserOptions);
|
||||||
const context1 = await browser1.newContext();
|
const context1 = await browser1.newContext();
|
||||||
await context1.setCookies([{url: server.EMPTY_PAGE, name: 'cookie-in-context-1', value: 'value', expires: Date.now() + 1000000000 }]);
|
await context1.setCookies([{url: server.EMPTY_PAGE, name: 'cookie-in-context-1', value: 'value', expires: Date.now() / 1000 + 10000}]);
|
||||||
await browser1.close();
|
await browser1.close();
|
||||||
|
|
||||||
const browser2 = await playwright.launch(defaultBrowserOptions);
|
const browser2 = await playwright.launch(defaultBrowserOptions);
|
||||||
@ -285,7 +313,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
|
|||||||
value: '123456'
|
value: '123456'
|
||||||
}]);
|
}]);
|
||||||
const cookies = await context.cookies();
|
const cookies = await context.cookies();
|
||||||
expect(cookies[0].session).toBe(true);
|
|
||||||
expect(cookies[0].expires).toBe(-1);
|
expect(cookies[0].expires).toBe(-1);
|
||||||
});
|
});
|
||||||
it('should set cookie with reasonable defaults', async({context, server}) => {
|
it('should set cookie with reasonable defaults', async({context, server}) => {
|
||||||
@ -303,7 +330,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
|
|||||||
expires: -1,
|
expires: -1,
|
||||||
httpOnly: false,
|
httpOnly: false,
|
||||||
secure: false,
|
secure: false,
|
||||||
session: true,
|
|
||||||
sameSite: 'None',
|
sameSite: 'None',
|
||||||
}]);
|
}]);
|
||||||
});
|
});
|
||||||
@ -323,7 +349,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
|
|||||||
expires: -1,
|
expires: -1,
|
||||||
httpOnly: false,
|
httpOnly: false,
|
||||||
secure: false,
|
secure: false,
|
||||||
session: true,
|
|
||||||
sameSite: 'None',
|
sameSite: 'None',
|
||||||
}]);
|
}]);
|
||||||
expect(await page.evaluate('document.cookie')).toBe('gridcookie=GRID');
|
expect(await page.evaluate('document.cookie')).toBe('gridcookie=GRID');
|
||||||
@ -393,7 +418,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
|
|||||||
expires: -1,
|
expires: -1,
|
||||||
httpOnly: false,
|
httpOnly: false,
|
||||||
secure: true,
|
secure: true,
|
||||||
session: true,
|
|
||||||
sameSite: 'None',
|
sameSite: 'None',
|
||||||
}]);
|
}]);
|
||||||
});
|
});
|
||||||
@ -424,7 +448,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
|
|||||||
expires: -1,
|
expires: -1,
|
||||||
httpOnly: false,
|
httpOnly: false,
|
||||||
secure: false,
|
secure: false,
|
||||||
session: true,
|
|
||||||
sameSite: 'None',
|
sameSite: 'None',
|
||||||
}]);
|
}]);
|
||||||
|
|
||||||
@ -436,7 +459,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
|
|||||||
expires: -1,
|
expires: -1,
|
||||||
httpOnly: false,
|
httpOnly: false,
|
||||||
secure: false,
|
secure: false,
|
||||||
session: true,
|
|
||||||
sameSite: 'None',
|
sameSite: 'None',
|
||||||
}]);
|
}]);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -50,7 +50,6 @@ module.exports.describe = function ({ testRunner, expect, defaultBrowserOptions,
|
|||||||
expires: -1,
|
expires: -1,
|
||||||
httpOnly: false,
|
httpOnly: false,
|
||||||
secure: false,
|
secure: false,
|
||||||
session: true,
|
|
||||||
sameSite: 'None',
|
sameSite: 'None',
|
||||||
}]);
|
}]);
|
||||||
});
|
});
|
||||||
@ -70,7 +69,6 @@ module.exports.describe = function ({ testRunner, expect, defaultBrowserOptions,
|
|||||||
expires: -1,
|
expires: -1,
|
||||||
httpOnly: false,
|
httpOnly: false,
|
||||||
secure: false,
|
secure: false,
|
||||||
session: true,
|
|
||||||
sameSite: 'None',
|
sameSite: 'None',
|
||||||
}]);
|
}]);
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user