Skip to content

Commit

Permalink
fix(wk,ff): properly support getting and setting non-session cookies
Browse files Browse the repository at this point in the history
  • Loading branch information
aslushnikov committed Mar 7, 2020
1 parent aee6324 commit 9181a3a
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 3 deletions.
1 change: 1 addition & 0 deletions src/network.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ export function rewriteCookies(cookies: SetNetworkCookieParam[]): SetNetworkCook
assert(!(c.url && c.domain), 'Cookie should have either url or domain');
assert(!(c.url && c.path), 'Cookie should have either url or domain');
const copy = {...c};
delete copy.session;
if (copy.url) {
assert(copy.url !== 'about:blank', `Blank page can not have cookie "${c.name}"`);
assert(!copy.url.startsWith('data:'), `Data URL page can not have cookie "${c.name}"`);
Expand Down
8 changes: 6 additions & 2 deletions src/webkit/wkBrowser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -237,12 +237,16 @@ export class WKBrowserContext extends BrowserContextBase {
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
expires: c.expires === 0 ? -1 : c.expires / 1000,
})), 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 });
}

Expand Down
36 changes: 35 additions & 1 deletion test/cookies.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,26 @@ module.exports.describe = function({testRunner, expect, playwright, defaultBrows
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,
session: false,
sameSite: 'None',
}]);
});
it('should properly report httpOnly cookie', async({context, page, server}) => {
server.setRoute('/empty.html', (req, res) => {
res.setHeader('Set-Cookie', 'name=value;HttpOnly; Path=/');
Expand Down Expand Up @@ -157,6 +177,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) => {
Expand Down Expand Up @@ -250,7 +284,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);
Expand Down

0 comments on commit 9181a3a

Please sign in to comment.