fix(wk,ff): properly support getting and setting non-session cookies (#1280)

This commit is contained in:
Andrey Lushnikov 2020-03-07 08:41:57 -08:00 committed by GitHub
parent bfd32fe6d2
commit d1ef0c8694
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 47 additions and 21 deletions

View File

@ -383,7 +383,6 @@ will be closed.
- `size` <[number]>
- `httpOnly` <[boolean]>
- `secure` <[boolean]>
- `session` <[boolean]>
- `sameSite` <"Strict"|"Lax"|"None">
If no URLs are specified, this method returns all cookies.

View File

@ -289,6 +289,7 @@ export class CRBrowserContext extends BrowserContextBase {
const copy: any = { sameSite: 'None', ...c };
delete copy.size;
delete copy.priority;
delete copy.session;
return copy as network.NetworkCookie;
}), urls);
}

View File

@ -324,6 +324,7 @@ export class FFBrowserContext extends BrowserContextBase {
return network.filterCookies(cookies.map(c => {
const copy: any = { ... c };
delete copy.size;
delete copy.session;
return copy as network.NetworkCookie;
}), urls);
}

View File

@ -26,7 +26,6 @@ export type NetworkCookie = {
expires: number,
httpOnly: boolean,
secure: boolean,
session: boolean,
sameSite: 'Strict' | 'Lax' | 'None'
};

View File

@ -235,14 +235,20 @@ export class WKBrowserContext extends BrowserContextBase {
async cookies(urls?: string | string[]): Promise<network.NetworkCookie[]> {
const { cookies } = await this._browser._browserSession.send('Browser.getAllCookies', { browserContextId: this._browserContextId });
return network.filterCookies(cookies.map((c: network.NetworkCookie) => ({
...c,
expires: c.expires === 0 ? -1 : c.expires
})), urls);
return network.filterCookies(cookies.map((c: network.NetworkCookie) => {
const copy: any = { ... c };
copy.expires = c.expires === 0 ? -1 : c.expires / 1000;
delete copy.session;
return copy as network.NetworkCookie;
}), urls);
}
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 });
}

View File

@ -40,7 +40,25 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
expires: -1,
httpOnly: 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',
}]);
});
@ -91,7 +109,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
expires: -1,
httpOnly: false,
secure: false,
session: true,
sameSite: 'None',
},
{
@ -102,7 +119,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
expires: -1,
httpOnly: false,
secure: false,
session: true,
sameSite: 'None',
},
]);
@ -131,7 +147,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
expires: -1,
httpOnly: false,
secure: true,
session: true,
sameSite: 'None',
}, {
name: 'doggo',
@ -141,7 +156,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
expires: -1,
httpOnly: false,
secure: true,
session: true,
sameSite: 'None',
}]);
});
@ -157,6 +171,20 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
}]);
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}) => {
let cookie = '';
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}) => {
const browser1 = await playwright.launch(defaultBrowserOptions);
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();
const browser2 = await playwright.launch(defaultBrowserOptions);
@ -285,7 +313,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
value: '123456'
}]);
const cookies = await context.cookies();
expect(cookies[0].session).toBe(true);
expect(cookies[0].expires).toBe(-1);
});
it('should set cookie with reasonable defaults', async({context, server}) => {
@ -303,7 +330,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
expires: -1,
httpOnly: false,
secure: false,
session: true,
sameSite: 'None',
}]);
});
@ -323,7 +349,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
expires: -1,
httpOnly: false,
secure: false,
session: true,
sameSite: 'None',
}]);
expect(await page.evaluate('document.cookie')).toBe('gridcookie=GRID');
@ -393,7 +418,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
expires: -1,
httpOnly: false,
secure: true,
session: true,
sameSite: 'None',
}]);
});
@ -424,7 +448,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
expires: -1,
httpOnly: false,
secure: false,
session: true,
sameSite: 'None',
}]);
@ -436,7 +459,6 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
expires: -1,
httpOnly: false,
secure: false,
session: true,
sameSite: 'None',
}]);
});

View File

@ -50,7 +50,6 @@ module.exports.describe = function ({ testRunner, expect, defaultBrowserOptions,
expires: -1,
httpOnly: false,
secure: false,
session: true,
sameSite: 'None',
}]);
});
@ -70,7 +69,6 @@ module.exports.describe = function ({ testRunner, expect, defaultBrowserOptions,
expires: -1,
httpOnly: false,
secure: false,
session: true,
sameSite: 'None',
}]);
});