| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Copyright 2017 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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-25 15:05:50 -08:00
										 |  |  | import { playwrightTest as it, expect } from '../config/browserTest'; | 
					
						
							|  |  |  | import { verifyViewport } from '../config/utils'; | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  | import fs from 'fs'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-10 19:42:52 +01:00
										 |  |  | it('context.cookies() should work @smoke', async ({ server, launchPersistent, defaultSameSiteCookieValue }) => { | 
					
						
							| 
									
										
										
										
											2021-09-27 18:58:08 +02:00
										 |  |  |   const { page } = await launchPersistent(); | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07: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 page.context().cookies()).toEqual([{ | 
					
						
							|  |  |  |     name: 'username', | 
					
						
							|  |  |  |     value: 'John Doe', | 
					
						
							|  |  |  |     domain: 'localhost', | 
					
						
							|  |  |  |     path: '/', | 
					
						
							|  |  |  |     expires: -1, | 
					
						
							|  |  |  |     httpOnly: false, | 
					
						
							|  |  |  |     secure: false, | 
					
						
							| 
									
										
										
										
											2021-12-15 17:33:09 -08:00
										 |  |  |     sameSite: defaultSameSiteCookieValue, | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   }]); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-27 18:58:08 +02:00
										 |  |  | it('context.addCookies() should work', async ({ server, launchPersistent, browserName, isWindows }) => { | 
					
						
							|  |  |  |   const { page } = await launchPersistent(); | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   await page.context().addCookies([{ | 
					
						
							|  |  |  |     url: server.EMPTY_PAGE, | 
					
						
							|  |  |  |     name: 'username', | 
					
						
							| 
									
										
										
										
											2021-08-09 23:57:17 +03:00
										 |  |  |     value: 'John Doe', | 
					
						
							|  |  |  |     sameSite: 'Lax', | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   }]); | 
					
						
							|  |  |  |   expect(await page.evaluate(() => document.cookie)).toBe('username=John Doe'); | 
					
						
							|  |  |  |   expect(await page.context().cookies()).toEqual([{ | 
					
						
							|  |  |  |     name: 'username', | 
					
						
							|  |  |  |     value: 'John Doe', | 
					
						
							|  |  |  |     domain: 'localhost', | 
					
						
							|  |  |  |     path: '/', | 
					
						
							|  |  |  |     expires: -1, | 
					
						
							|  |  |  |     httpOnly: false, | 
					
						
							|  |  |  |     secure: false, | 
					
						
							| 
									
										
										
										
											2021-08-11 10:27:41 -07:00
										 |  |  |     sameSite: (browserName === 'webkit' && isWindows) ? 'None' : 'Lax', | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   }]); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-27 18:58:08 +02:00
										 |  |  | it('context.clearCookies() should work', async ({ server, launchPersistent }) => { | 
					
						
							|  |  |  |   const { page } = await launchPersistent(); | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   await page.context().addCookies([{ | 
					
						
							|  |  |  |     url: server.EMPTY_PAGE, | 
					
						
							|  |  |  |     name: 'cookie1', | 
					
						
							|  |  |  |     value: '1' | 
					
						
							|  |  |  |   }, { | 
					
						
							|  |  |  |     url: server.EMPTY_PAGE, | 
					
						
							|  |  |  |     name: 'cookie2', | 
					
						
							|  |  |  |     value: '2' | 
					
						
							|  |  |  |   }]); | 
					
						
							|  |  |  |   expect(await page.evaluate('document.cookie')).toBe('cookie1=1; cookie2=2'); | 
					
						
							|  |  |  |   await page.context().clearCookies(); | 
					
						
							|  |  |  |   await page.reload(); | 
					
						
							|  |  |  |   expect(await page.context().cookies([])).toEqual([]); | 
					
						
							|  |  |  |   expect(await page.evaluate('document.cookie')).toBe(''); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-15 17:33:09 -08:00
										 |  |  | it('should(not) block third party cookies', async ({ server, launchPersistent, browserName, browserMajorVersion }) => { | 
					
						
							| 
									
										
										
										
											2021-09-27 18:58:08 +02:00
										 |  |  |   const { page, context } = await launchPersistent(); | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   await page.evaluate(src => { | 
					
						
							|  |  |  |     let fulfill; | 
					
						
							|  |  |  |     const promise = new Promise(x => fulfill = x); | 
					
						
							|  |  |  |     const iframe = document.createElement('iframe'); | 
					
						
							|  |  |  |     document.body.appendChild(iframe); | 
					
						
							|  |  |  |     iframe.onload = fulfill; | 
					
						
							|  |  |  |     iframe.src = src; | 
					
						
							|  |  |  |     return promise; | 
					
						
							|  |  |  |   }, server.CROSS_PROCESS_PREFIX + '/grid.html'); | 
					
						
							|  |  |  |   const documentCookie = await page.frames()[1].evaluate(() => { | 
					
						
							|  |  |  |     document.cookie = 'username=John Doe'; | 
					
						
							|  |  |  |     return document.cookie; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   await page.waitForTimeout(2000); | 
					
						
							| 
									
										
										
										
											2022-03-07 17:16:42 -07:00
										 |  |  |   const allowsThirdParty = browserName === 'firefox' && browserMajorVersion >= 97; | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   expect(documentCookie).toBe(allowsThirdParty ? 'username=John Doe' : ''); | 
					
						
							|  |  |  |   const cookies = await context.cookies(server.CROSS_PROCESS_PREFIX + '/grid.html'); | 
					
						
							|  |  |  |   if (allowsThirdParty) { | 
					
						
							|  |  |  |     expect(cookies).toEqual([ | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2020-08-28 04:20:29 -07:00
										 |  |  |         'domain': '127.0.0.1', | 
					
						
							|  |  |  |         'expires': -1, | 
					
						
							|  |  |  |         'httpOnly': false, | 
					
						
							|  |  |  |         'name': 'username', | 
					
						
							|  |  |  |         'path': '/', | 
					
						
							|  |  |  |         'sameSite': 'None', | 
					
						
							|  |  |  |         'secure': false, | 
					
						
							|  |  |  |         'value': 'John Doe' | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |       } | 
					
						
							|  |  |  |     ]); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     expect(cookies).toEqual([]); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-27 18:58:08 +02:00
										 |  |  | it('should support viewport option', async ({ launchPersistent }) => { | 
					
						
							|  |  |  |   const { page, context } = await launchPersistent({ viewport: { width: 456, height: 789 } }); | 
					
						
							| 
									
										
										
										
											2020-09-18 15:52:14 -07:00
										 |  |  |   await verifyViewport(page, 456, 789); | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   const page2 = await context.newPage(); | 
					
						
							| 
									
										
										
										
											2020-09-18 15:52:14 -07:00
										 |  |  |   await verifyViewport(page2, 456, 789); | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-27 18:58:08 +02:00
										 |  |  | it('should support deviceScaleFactor option', async ({ launchPersistent }) => { | 
					
						
							|  |  |  |   const { page } = await launchPersistent({ deviceScaleFactor: 3 }); | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   expect(await page.evaluate('window.devicePixelRatio')).toBe(3); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-27 18:58:08 +02:00
										 |  |  | it('should support userAgent option', async ({ server, launchPersistent }) => { | 
					
						
							|  |  |  |   const { page } = await launchPersistent({ userAgent: 'foobar' }); | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   expect(await page.evaluate(() => navigator.userAgent)).toBe('foobar'); | 
					
						
							|  |  |  |   const [request] = await Promise.all([ | 
					
						
							|  |  |  |     server.waitForRequest('/empty.html'), | 
					
						
							|  |  |  |     page.goto(server.EMPTY_PAGE), | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  |   expect(request.headers['user-agent']).toBe('foobar'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-27 18:58:08 +02:00
										 |  |  | it('should support bypassCSP option', async ({ server, launchPersistent }) => { | 
					
						
							|  |  |  |   const { page } = await launchPersistent({ bypassCSP: true }); | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   await page.goto(server.PREFIX + '/csp.html'); | 
					
						
							| 
									
										
										
										
											2021-09-27 18:58:08 +02:00
										 |  |  |   await page.addScriptTag({ content: 'window["__injected"] = 42;' }); | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   expect(await page.evaluate('__injected')).toBe(42); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-27 18:58:08 +02:00
										 |  |  | it('should support javascriptEnabled option', async ({ launchPersistent, browserName }) => { | 
					
						
							|  |  |  |   const { page } = await launchPersistent({ javaScriptEnabled: false }); | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   await page.goto('data:text/html, <script>var something = "forbidden"</script>'); | 
					
						
							|  |  |  |   let error = null; | 
					
						
							|  |  |  |   await page.evaluate('something').catch(e => error = e); | 
					
						
							| 
									
										
										
										
											2021-05-13 10:22:23 -07:00
										 |  |  |   if (browserName === 'webkit') | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |     expect(error.message).toContain('Can\'t find variable: something'); | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     expect(error.message).toContain('something is not defined'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-27 18:58:08 +02:00
										 |  |  | it('should support httpCredentials option', async ({ server, launchPersistent }) => { | 
					
						
							|  |  |  |   const { page } = await launchPersistent({ httpCredentials: { username: 'user', password: 'pass' } }); | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   server.setAuth('/playground.html', 'user', 'pass'); | 
					
						
							|  |  |  |   const response = await page.goto(server.PREFIX + '/playground.html'); | 
					
						
							|  |  |  |   expect(response.status()).toBe(200); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-27 18:58:08 +02:00
										 |  |  | it('should support offline option', async ({ server, launchPersistent }) => { | 
					
						
							|  |  |  |   const { page } = await launchPersistent({ offline: true }); | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   const error = await page.goto(server.EMPTY_PAGE).catch(e => e); | 
					
						
							|  |  |  |   expect(error).toBeTruthy(); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-14 10:41:03 -07:00
										 |  |  | it('should support acceptDownloads option', async ({ server, launchPersistent, mode }) => { | 
					
						
							|  |  |  |   it.skip(mode === 'service', 'download.path() is not avaialble in remote mode'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-06 09:25:24 -08:00
										 |  |  |   const { page } = await launchPersistent(); | 
					
						
							| 
									
										
										
										
											2020-08-24 20:26:06 -07:00
										 |  |  |   server.setRoute('/download', (req, res) => { | 
					
						
							|  |  |  |     res.setHeader('Content-Type', 'application/octet-stream'); | 
					
						
							|  |  |  |     res.setHeader('Content-Disposition', 'attachment'); | 
					
						
							|  |  |  |     res.end(`Hello world`); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   await page.setContent(`<a href="${server.PREFIX}/download">download</a>`); | 
					
						
							|  |  |  |   const [ download ] = await Promise.all([ | 
					
						
							|  |  |  |     page.waitForEvent('download'), | 
					
						
							|  |  |  |     page.click('a') | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  |   const path = await download.path(); | 
					
						
							|  |  |  |   expect(fs.existsSync(path)).toBeTruthy(); | 
					
						
							|  |  |  |   expect(fs.readFileSync(path).toString()).toBe('Hello world'); | 
					
						
							|  |  |  | }); |