| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Copyright 2018 Google Inc. All rights reserved. | 
					
						
							|  |  |  |  * Modifications copyright (c) Microsoft Corporation. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  |  * you may not use this file except in compliance with the License. | 
					
						
							|  |  |  |  * You may obtain a copy of the License at | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  |  * distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  |  * See the License for the specific language governing permissions and | 
					
						
							|  |  |  |  * limitations under the License. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-09-03 12:43:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-26 07:05:50 +08:00
										 |  |  | import { contextTest as it, expect } from '../config/browserTest'; | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should return no cookies in pristine browser context', async ({ context, page, server }) => { | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |   expect(await context.cookies()).toEqual([]); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-11 02:42:52 +08:00
										 |  |  | it('should get a cookie @smoke', async ({ context, page, server, defaultSameSiteCookieValue }) => { | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   const documentCookie = await page.evaluate(() => { | 
					
						
							|  |  |  |     document.cookie = 'username=John Doe'; | 
					
						
							|  |  |  |     return document.cookie; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   expect(documentCookie).toBe('username=John Doe'); | 
					
						
							|  |  |  |   expect(await context.cookies()).toEqual([{ | 
					
						
							|  |  |  |     name: 'username', | 
					
						
							|  |  |  |     value: 'John Doe', | 
					
						
							|  |  |  |     domain: 'localhost', | 
					
						
							|  |  |  |     path: '/', | 
					
						
							|  |  |  |     expires: -1, | 
					
						
							|  |  |  |     httpOnly: false, | 
					
						
							|  |  |  |     secure: false, | 
					
						
							| 
									
										
										
										
											2021-12-16 09:33:09 +08:00
										 |  |  |     sameSite: defaultSameSiteCookieValue, | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |   }]); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-17 01:36:37 +08:00
										 |  |  | it('should get a non-session cookie', async ({ context, page, server, defaultSameSiteCookieValue }) => { | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   // @see https://en.wikipedia.org/wiki/Year_2038_problem
 | 
					
						
							|  |  |  |   const date = +(new Date('1/1/2038')); | 
					
						
							|  |  |  |   const documentCookie = await page.evaluate(timestamp => { | 
					
						
							|  |  |  |     const date = new Date(timestamp); | 
					
						
							|  |  |  |     document.cookie = `username=John Doe;expires=${date.toUTCString()}`; | 
					
						
							|  |  |  |     return document.cookie; | 
					
						
							|  |  |  |   }, date); | 
					
						
							|  |  |  |   expect(documentCookie).toBe('username=John Doe'); | 
					
						
							| 
									
										
										
										
											2022-05-20 00:29:44 +08:00
										 |  |  |   const cookies = await context.cookies(); | 
					
						
							|  |  |  |   expect(cookies.length).toBe(1); | 
					
						
							|  |  |  |   expect(cookies[0]).toEqual({ | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |     name: 'username', | 
					
						
							|  |  |  |     value: 'John Doe', | 
					
						
							|  |  |  |     domain: 'localhost', | 
					
						
							|  |  |  |     path: '/', | 
					
						
							| 
									
										
										
										
											2022-05-20 00:29:44 +08:00
										 |  |  |     // We will check this separately.
 | 
					
						
							|  |  |  |     expires: expect.anything(), | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |     httpOnly: false, | 
					
						
							|  |  |  |     secure: false, | 
					
						
							| 
									
										
										
										
											2021-12-16 09:33:09 +08:00
										 |  |  |     sameSite: defaultSameSiteCookieValue, | 
					
						
							| 
									
										
										
										
											2022-05-20 00:29:44 +08:00
										 |  |  |   }); | 
					
						
							|  |  |  |   // Browsers start to cap cookies with 400 days max expires value.
 | 
					
						
							|  |  |  |   // See https://github.com/httpwg/http-extensions/pull/1732
 | 
					
						
							|  |  |  |   // Chromium patch: https://chromium.googlesource.com/chromium/src/+/aaa5d2b55478eac2ee642653dcd77a50ac3faff6
 | 
					
						
							|  |  |  |   // We want to make sure that expires date is at least 400 days in future.
 | 
					
						
							|  |  |  |   const FOUR_HUNDRED_DAYS = 1000 * 60 * 60 * 24 * 400; | 
					
						
							|  |  |  |   const FIVE_MINUTES = 1000 * 60 * 5; // relax condition a bit to make sure test is not flaky.
 | 
					
						
							|  |  |  |   expect(cookies[0].expires).toBeGreaterThan((Date.now() + FOUR_HUNDRED_DAYS - FIVE_MINUTES) / 1000); | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should properly report httpOnly cookie', async ({ context, page, server }) => { | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |   server.setRoute('/empty.html', (req, res) => { | 
					
						
							|  |  |  |     res.setHeader('Set-Cookie', 'name=value;HttpOnly; Path=/'); | 
					
						
							|  |  |  |     res.end(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   const cookies = await context.cookies(); | 
					
						
							|  |  |  |   expect(cookies.length).toBe(1); | 
					
						
							|  |  |  |   expect(cookies[0].httpOnly).toBe(true); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should properly report "Strict" sameSite cookie', async ({ context, page, server, browserName, platform }) => { | 
					
						
							| 
									
										
										
										
											2021-04-03 12:07:45 +08:00
										 |  |  |   it.fail(browserName === 'webkit' && platform === 'win32'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |   server.setRoute('/empty.html', (req, res) => { | 
					
						
							|  |  |  |     res.setHeader('Set-Cookie', 'name=value;SameSite=Strict'); | 
					
						
							|  |  |  |     res.end(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   const cookies = await context.cookies(); | 
					
						
							|  |  |  |   expect(cookies.length).toBe(1); | 
					
						
							|  |  |  |   expect(cookies[0].sameSite).toBe('Strict'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should properly report "Lax" sameSite cookie', async ({ context, page, server, browserName, platform }) => { | 
					
						
							| 
									
										
										
										
											2021-04-03 12:07:45 +08:00
										 |  |  |   it.fail(browserName === 'webkit' && platform === 'win32'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |   server.setRoute('/empty.html', (req, res) => { | 
					
						
							|  |  |  |     res.setHeader('Set-Cookie', 'name=value;SameSite=Lax'); | 
					
						
							|  |  |  |     res.end(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   const cookies = await context.cookies(); | 
					
						
							|  |  |  |   expect(cookies.length).toBe(1); | 
					
						
							|  |  |  |   expect(cookies[0].sameSite).toBe('Lax'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-01 16:17:33 +08:00
										 |  |  | it('should get multiple cookies', async ({ context, page, server, defaultSameSiteCookieValue }) => { | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   const documentCookie = await page.evaluate(() => { | 
					
						
							|  |  |  |     document.cookie = 'username=John Doe'; | 
					
						
							|  |  |  |     document.cookie = 'password=1234'; | 
					
						
							|  |  |  |     return document.cookie.split('; ').sort().join('; '); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2021-02-20 03:50:59 +08:00
										 |  |  |   const cookies = new Set(await context.cookies()); | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |   expect(documentCookie).toBe('password=1234; username=John Doe'); | 
					
						
							| 
									
										
										
										
											2021-02-20 03:50:59 +08:00
										 |  |  |   expect(cookies).toEqual(new Set([ | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |       name: 'password', | 
					
						
							|  |  |  |       value: '1234', | 
					
						
							|  |  |  |       domain: 'localhost', | 
					
						
							|  |  |  |       path: '/', | 
					
						
							|  |  |  |       expires: -1, | 
					
						
							|  |  |  |       httpOnly: false, | 
					
						
							|  |  |  |       secure: false, | 
					
						
							| 
									
										
										
										
											2021-12-16 09:33:09 +08:00
										 |  |  |       sameSite: defaultSameSiteCookieValue, | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       name: 'username', | 
					
						
							|  |  |  |       value: 'John Doe', | 
					
						
							|  |  |  |       domain: 'localhost', | 
					
						
							|  |  |  |       path: '/', | 
					
						
							|  |  |  |       expires: -1, | 
					
						
							|  |  |  |       httpOnly: false, | 
					
						
							|  |  |  |       secure: false, | 
					
						
							| 
									
										
										
										
											2021-12-16 09:33:09 +08:00
										 |  |  |       sameSite: defaultSameSiteCookieValue, | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-02-20 03:50:59 +08:00
										 |  |  |   ])); | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should get cookies from multiple urls', async ({ context, browserName, isWindows }) => { | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |   await context.addCookies([{ | 
					
						
							|  |  |  |     url: 'https://foo.com', | 
					
						
							|  |  |  |     name: 'doggo', | 
					
						
							|  |  |  |     value: 'woofs', | 
					
						
							| 
									
										
										
										
											2021-08-10 04:57:17 +08:00
										 |  |  |     sameSite: 'None', | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |   }, { | 
					
						
							|  |  |  |     url: 'https://bar.com', | 
					
						
							|  |  |  |     name: 'catto', | 
					
						
							|  |  |  |     value: 'purrs', | 
					
						
							| 
									
										
										
										
											2021-08-10 04:57:17 +08:00
										 |  |  |     sameSite: 'Lax', | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |   }, { | 
					
						
							|  |  |  |     url: 'https://baz.com', | 
					
						
							|  |  |  |     name: 'birdo', | 
					
						
							|  |  |  |     value: 'tweets', | 
					
						
							| 
									
										
										
										
											2021-08-10 04:57:17 +08:00
										 |  |  |     sameSite: 'Lax', | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |   }]); | 
					
						
							| 
									
										
										
										
											2021-02-20 03:50:59 +08:00
										 |  |  |   const cookies = new Set(await context.cookies(['https://foo.com', 'https://baz.com'])); | 
					
						
							|  |  |  |   expect(cookies).toEqual(new Set([{ | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |     name: 'birdo', | 
					
						
							|  |  |  |     value: 'tweets', | 
					
						
							|  |  |  |     domain: 'baz.com', | 
					
						
							|  |  |  |     path: '/', | 
					
						
							|  |  |  |     expires: -1, | 
					
						
							|  |  |  |     httpOnly: false, | 
					
						
							|  |  |  |     secure: true, | 
					
						
							| 
									
										
										
										
											2021-08-12 01:27:41 +08:00
										 |  |  |     sameSite: (browserName === 'webkit' && isWindows) ? 'None' : 'Lax', | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  |   }, { | 
					
						
							|  |  |  |     name: 'doggo', | 
					
						
							|  |  |  |     value: 'woofs', | 
					
						
							|  |  |  |     domain: 'foo.com', | 
					
						
							|  |  |  |     path: '/', | 
					
						
							|  |  |  |     expires: -1, | 
					
						
							|  |  |  |     httpOnly: false, | 
					
						
							|  |  |  |     secure: true, | 
					
						
							|  |  |  |     sameSite: 'None', | 
					
						
							| 
									
										
										
										
											2021-02-20 03:50:59 +08:00
										 |  |  |   }])); | 
					
						
							| 
									
										
										
										
											2020-08-04 04:41:48 +08:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2021-01-13 07:56:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should work with subdomain cookie', async ({ context, browserName, isWindows }) => { | 
					
						
							| 
									
										
										
										
											2021-01-13 07:56:29 +08:00
										 |  |  |   await context.addCookies([{ | 
					
						
							|  |  |  |     domain: '.foo.com', | 
					
						
							|  |  |  |     path: '/', | 
					
						
							|  |  |  |     name: 'doggo', | 
					
						
							|  |  |  |     value: 'woofs', | 
					
						
							| 
									
										
										
										
											2021-08-10 04:57:17 +08:00
										 |  |  |     sameSite: 'Lax', | 
					
						
							| 
									
										
										
										
											2021-01-13 07:56:29 +08:00
										 |  |  |     secure: true | 
					
						
							|  |  |  |   }]); | 
					
						
							|  |  |  |   expect(await context.cookies('https://foo.com')).toEqual([{ | 
					
						
							|  |  |  |     name: 'doggo', | 
					
						
							|  |  |  |     value: 'woofs', | 
					
						
							|  |  |  |     domain: '.foo.com', | 
					
						
							|  |  |  |     path: '/', | 
					
						
							|  |  |  |     expires: -1, | 
					
						
							|  |  |  |     httpOnly: false, | 
					
						
							|  |  |  |     secure: true, | 
					
						
							| 
									
										
										
										
											2021-08-12 01:27:41 +08:00
										 |  |  |     sameSite: (browserName === 'webkit' && isWindows) ? 'None' : 'Lax', | 
					
						
							| 
									
										
										
										
											2021-01-13 07:56:29 +08:00
										 |  |  |   }]); | 
					
						
							|  |  |  |   expect(await context.cookies('https://sub.foo.com')).toEqual([{ | 
					
						
							|  |  |  |     name: 'doggo', | 
					
						
							|  |  |  |     value: 'woofs', | 
					
						
							|  |  |  |     domain: '.foo.com', | 
					
						
							|  |  |  |     path: '/', | 
					
						
							|  |  |  |     expires: -1, | 
					
						
							|  |  |  |     httpOnly: false, | 
					
						
							|  |  |  |     secure: true, | 
					
						
							| 
									
										
										
										
											2021-08-12 01:27:41 +08:00
										 |  |  |     sameSite: (browserName === 'webkit' && isWindows) ? 'None' : 'Lax', | 
					
						
							| 
									
										
										
										
											2021-01-13 07:56:29 +08:00
										 |  |  |   }]); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2021-01-26 08:37:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-08 06:37:47 +08:00
										 |  |  | it('should return cookies with empty value', async ({ context, page, server }) => { | 
					
						
							| 
									
										
										
										
											2021-01-26 08:37:33 +08:00
										 |  |  |   server.setRoute('/empty.html', (req, res) => { | 
					
						
							|  |  |  |     res.setHeader('Set-Cookie', 'name=;Path=/'); | 
					
						
							|  |  |  |     res.end(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   const cookies = await context.cookies(); | 
					
						
							| 
									
										
										
										
											2021-10-08 06:37:47 +08:00
										 |  |  |   expect(cookies).toEqual([ | 
					
						
							|  |  |  |     expect.objectContaining({ | 
					
						
							|  |  |  |       name: 'name', | 
					
						
							|  |  |  |       value: '' | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |   ]); | 
					
						
							| 
									
										
										
										
											2021-01-26 08:37:33 +08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should return secure cookies based on HTTP(S) protocol', async ({ context, browserName, isWindows }) => { | 
					
						
							| 
									
										
										
										
											2021-02-20 03:50:59 +08:00
										 |  |  |   await context.addCookies([{ | 
					
						
							|  |  |  |     url: 'https://foo.com', | 
					
						
							|  |  |  |     name: 'doggo', | 
					
						
							|  |  |  |     value: 'woofs', | 
					
						
							| 
									
										
										
										
											2021-08-10 04:57:17 +08:00
										 |  |  |     sameSite: 'Lax', | 
					
						
							| 
									
										
										
										
											2021-02-20 03:50:59 +08:00
										 |  |  |     secure: true | 
					
						
							|  |  |  |   }, { | 
					
						
							|  |  |  |     url: 'http://foo.com', | 
					
						
							|  |  |  |     name: 'catto', | 
					
						
							|  |  |  |     value: 'purrs', | 
					
						
							| 
									
										
										
										
											2021-08-10 04:57:17 +08:00
										 |  |  |     sameSite: 'Lax', | 
					
						
							| 
									
										
										
										
											2021-02-20 03:50:59 +08:00
										 |  |  |     secure: false | 
					
						
							|  |  |  |   }]); | 
					
						
							|  |  |  |   const cookies = new Set(await context.cookies('https://foo.com')); | 
					
						
							|  |  |  |   expect(cookies).toEqual(new Set([{ | 
					
						
							|  |  |  |     name: 'catto', | 
					
						
							|  |  |  |     value: 'purrs', | 
					
						
							|  |  |  |     domain: 'foo.com', | 
					
						
							|  |  |  |     path: '/', | 
					
						
							|  |  |  |     expires: -1, | 
					
						
							|  |  |  |     httpOnly: false, | 
					
						
							|  |  |  |     secure: false, | 
					
						
							| 
									
										
										
										
											2021-08-12 01:27:41 +08:00
										 |  |  |     sameSite: (browserName === 'webkit' && isWindows) ? 'None' : 'Lax', | 
					
						
							| 
									
										
										
										
											2021-02-20 03:50:59 +08:00
										 |  |  |   }, { | 
					
						
							|  |  |  |     name: 'doggo', | 
					
						
							|  |  |  |     value: 'woofs', | 
					
						
							|  |  |  |     domain: 'foo.com', | 
					
						
							|  |  |  |     path: '/', | 
					
						
							|  |  |  |     expires: -1, | 
					
						
							|  |  |  |     httpOnly: false, | 
					
						
							|  |  |  |     secure: true, | 
					
						
							| 
									
										
										
										
											2021-08-12 01:27:41 +08:00
										 |  |  |     sameSite: (browserName === 'webkit' && isWindows) ? 'None' : 'Lax', | 
					
						
							| 
									
										
										
										
											2021-02-20 03:50:59 +08:00
										 |  |  |   }])); | 
					
						
							|  |  |  |   expect(await context.cookies('http://foo.com/')).toEqual([{ | 
					
						
							|  |  |  |     name: 'catto', | 
					
						
							|  |  |  |     value: 'purrs', | 
					
						
							|  |  |  |     domain: 'foo.com', | 
					
						
							|  |  |  |     path: '/', | 
					
						
							|  |  |  |     expires: -1, | 
					
						
							|  |  |  |     httpOnly: false, | 
					
						
							|  |  |  |     secure: false, | 
					
						
							| 
									
										
										
										
											2021-08-12 01:27:41 +08:00
										 |  |  |     sameSite: (browserName === 'webkit' && isWindows) ? 'None' : 'Lax', | 
					
						
							| 
									
										
										
										
											2021-02-20 03:50:59 +08:00
										 |  |  |   }]); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2022-02-26 06:00:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-03 06:10:40 +08:00
										 |  |  | it('should add cookies with an expiration', async ({ context }) => { | 
					
						
							|  |  |  |   const expires = Math.floor((Date.now() / 1000)) + 3600; | 
					
						
							| 
									
										
										
										
											2022-02-26 06:00:51 +08:00
										 |  |  |   await context.addCookies([{ | 
					
						
							|  |  |  |     url: 'https://foo.com', | 
					
						
							|  |  |  |     name: 'doggo', | 
					
						
							|  |  |  |     value: 'woofs', | 
					
						
							|  |  |  |     sameSite: 'None', | 
					
						
							|  |  |  |     expires, | 
					
						
							|  |  |  |   }]); | 
					
						
							|  |  |  |   const cookies = await context.cookies(['https://foo.com']); | 
					
						
							|  |  |  |   expect(cookies.length).toBe(1); | 
					
						
							|  |  |  |   expect(cookies).toEqual([{ | 
					
						
							|  |  |  |     name: 'doggo', | 
					
						
							|  |  |  |     value: 'woofs', | 
					
						
							|  |  |  |     domain: 'foo.com', | 
					
						
							|  |  |  |     path: '/', | 
					
						
							|  |  |  |     expires, | 
					
						
							|  |  |  |     httpOnly: false, | 
					
						
							|  |  |  |     secure: true, | 
					
						
							|  |  |  |     sameSite: 'None', | 
					
						
							|  |  |  |   }]); | 
					
						
							| 
									
										
										
										
											2022-03-03 06:10:40 +08:00
										 |  |  |   { | 
					
						
							|  |  |  |     // Rollover to 5-digit year
 | 
					
						
							|  |  |  |     await context.addCookies([{ | 
					
						
							|  |  |  |       url: 'https://foo.com', | 
					
						
							|  |  |  |       name: 'doggo', | 
					
						
							|  |  |  |       value: 'woofs', | 
					
						
							|  |  |  |       sameSite: 'None', | 
					
						
							|  |  |  |       expires: 253402300799, // Fri, 31 Dec 9999 23:59:59 +0000 (UTC)
 | 
					
						
							|  |  |  |     }]); | 
					
						
							|  |  |  |     await expect(context.addCookies([{ | 
					
						
							|  |  |  |       url: 'https://foo.com', | 
					
						
							|  |  |  |       name: 'doggo', | 
					
						
							|  |  |  |       value: 'woofs', | 
					
						
							|  |  |  |       sameSite: 'None', | 
					
						
							|  |  |  |       expires: 253402300800, // Sat,  1 Jan 1000 00:00:00 +0000 (UTC)
 | 
					
						
							|  |  |  |     }])).rejects.toThrow(/Cookie should have a valid expires/); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await expect(context.addCookies([{ | 
					
						
							|  |  |  |     url: 'https://foo.com', | 
					
						
							|  |  |  |     name: 'doggo', | 
					
						
							|  |  |  |     value: 'woofs', | 
					
						
							|  |  |  |     sameSite: 'None', | 
					
						
							|  |  |  |     expires: -42, | 
					
						
							|  |  |  |   }])).rejects.toThrow(/Cookie should have a valid expires/); | 
					
						
							| 
									
										
										
										
											2022-02-26 06:00:51 +08:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2022-09-03 02:00:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-03 06:03:39 +08:00
										 |  |  | it('should be able to send third party cookies via an iframe', async ({ browser, httpsServer, browserName, isMac }) => { | 
					
						
							| 
									
										
										
										
											2022-09-03 06:46:03 +08:00
										 |  |  |   it.fixme(browserName === 'webkit' && isMac); | 
					
						
							| 
									
										
										
										
											2022-09-03 02:00:55 +08:00
										 |  |  |   it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/16937' }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const context = await browser.newContext({ | 
					
						
							|  |  |  |     ignoreHTTPSErrors: true, | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   try { | 
					
						
							|  |  |  |     const page = await context.newPage(); | 
					
						
							|  |  |  |     await page.goto(httpsServer.EMPTY_PAGE); | 
					
						
							|  |  |  |     await context.addCookies([{ | 
					
						
							|  |  |  |       domain: new URL(httpsServer.CROSS_PROCESS_PREFIX).hostname, | 
					
						
							|  |  |  |       path: '/', | 
					
						
							|  |  |  |       name: 'cookie1', | 
					
						
							|  |  |  |       value: 'yes', | 
					
						
							|  |  |  |       httpOnly: true, | 
					
						
							|  |  |  |       secure: true, | 
					
						
							|  |  |  |       sameSite: 'None' | 
					
						
							|  |  |  |     }]); | 
					
						
							|  |  |  |     const [response] = await Promise.all([ | 
					
						
							|  |  |  |       httpsServer.waitForRequest('/grid.html'), | 
					
						
							|  |  |  |       page.setContent(`<iframe src="${httpsServer.CROSS_PROCESS_PREFIX}/grid.html"></iframe>`) | 
					
						
							|  |  |  |     ]); | 
					
						
							|  |  |  |     expect(response.headers['cookie']).toBe('cookie1=yes'); | 
					
						
							|  |  |  |   } finally { | 
					
						
							|  |  |  |     await context.close(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2022-10-01 09:56:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-07 01:11:59 +08:00
										 |  |  | it('should support requestStorageAccess', async ({ page, server, channel, browserName, isMac, isLinux, isWindows }) => { | 
					
						
							| 
									
										
										
										
											2022-10-01 09:56:05 +08:00
										 |  |  |   it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/17285' }); | 
					
						
							|  |  |  |   it.skip(browserName === 'chromium', 'requestStorageAccess API is not available in Chromium'); | 
					
						
							| 
									
										
										
										
											2023-01-28 13:52:34 +08:00
										 |  |  |   it.skip(channel === 'firefox-beta', 'hasStorageAccess returns true, but no cookie is sent'); | 
					
						
							| 
									
										
										
										
											2022-10-07 01:11:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-01 09:56:05 +08:00
										 |  |  |   server.setRoute('/set-cookie.html', (req, res) => { | 
					
						
							|  |  |  |     res.setHeader('Set-Cookie', 'name=value; Path=/'); | 
					
						
							|  |  |  |     res.end(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   // Navigate once to the domain as top level.
 | 
					
						
							|  |  |  |   await page.goto(server.CROSS_PROCESS_PREFIX + '/set-cookie.html'); | 
					
						
							|  |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   await page.setContent(`<iframe src="${server.CROSS_PROCESS_PREFIX + '/empty.html'}"></iframe>`); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const frame = page.frames()[1]; | 
					
						
							|  |  |  |   if (browserName === 'firefox') { | 
					
						
							|  |  |  |     expect(await frame.evaluate(() => document.hasStorageAccess())).toBeTruthy(); | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       const [serverRequest] = await Promise.all([ | 
					
						
							|  |  |  |         server.waitForRequest('/title.html'), | 
					
						
							|  |  |  |         frame.evaluate(() => fetch('/title.html')) | 
					
						
							|  |  |  |       ]); | 
					
						
							|  |  |  |       expect(serverRequest.headers.cookie).toBe('name=value'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2022-10-04 11:46:47 +08:00
										 |  |  |     if (isLinux && browserName === 'webkit') | 
					
						
							|  |  |  |       expect(await frame.evaluate(() => document.hasStorageAccess())).toBeTruthy(); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       expect(await frame.evaluate(() => document.hasStorageAccess())).toBeFalsy(); | 
					
						
							| 
									
										
										
										
											2022-10-01 09:56:05 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |       const [serverRequest] = await Promise.all([ | 
					
						
							|  |  |  |         server.waitForRequest('/title.html'), | 
					
						
							|  |  |  |         frame.evaluate(() => fetch('/title.html')) | 
					
						
							|  |  |  |       ]); | 
					
						
							| 
									
										
										
										
											2022-10-04 11:46:47 +08:00
										 |  |  |       if (!isMac && browserName === 'webkit') | 
					
						
							|  |  |  |         expect(serverRequest.headers.cookie).toBe('name=value'); | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         expect(serverRequest.headers.cookie).toBeFalsy(); | 
					
						
							| 
									
										
										
										
											2022-10-01 09:56:05 +08:00
										 |  |  |     } | 
					
						
							|  |  |  |     expect(await frame.evaluate(() => document.requestStorageAccess().then(() => true, e => false))).toBeTruthy(); | 
					
						
							|  |  |  |     expect(await frame.evaluate(() => document.hasStorageAccess())).toBeTruthy(); | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       const [serverRequest] = await Promise.all([ | 
					
						
							|  |  |  |         server.waitForRequest('/title.html'), | 
					
						
							|  |  |  |         frame.evaluate(() => fetch('/title.html')) | 
					
						
							|  |  |  |       ]); | 
					
						
							|  |  |  |       expect(serverRequest.headers.cookie).toBe('name=value'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2024-04-11 04:13:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | it('should parse cookie with large Max-Age correctly', async ({ server, page, defaultSameSiteCookieValue, browserName, platform }) => { | 
					
						
							|  |  |  |   it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/30305' }); | 
					
						
							|  |  |  |   it.fixme(browserName === 'webkit' && platform === 'linux', 'https://github.com/microsoft/playwright/issues/30305'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   server.setRoute('/foobar', (req, res) => { | 
					
						
							|  |  |  |     res.setHeader('set-cookie', [ | 
					
						
							|  |  |  |       'cookie1=value1; Path=/; Expires=Thu, 08 Sep 2270 15:06:12 GMT; Max-Age=7776000000' | 
					
						
							|  |  |  |     ]); | 
					
						
							|  |  |  |     res.statusCode = 200; | 
					
						
							|  |  |  |     res.end(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   await page.goto(server.PREFIX + '/foobar'); | 
					
						
							|  |  |  |   expect(await page.evaluate(() => document.cookie)).toBe('cookie1=value1'); | 
					
						
							|  |  |  |   expect(await page.context().cookies()).toEqual([ | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       name: 'cookie1', | 
					
						
							|  |  |  |       value: 'value1', | 
					
						
							|  |  |  |       domain: 'localhost', | 
					
						
							|  |  |  |       path: '/', | 
					
						
							|  |  |  |       expires: expect.any(Number), | 
					
						
							|  |  |  |       httpOnly: false, | 
					
						
							|  |  |  |       secure: false, | 
					
						
							|  |  |  |       sameSite: defaultSameSiteCookieValue, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  | }); |