| 
									
										
										
										
											2021-06-19 02:04: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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-23 17:08:35 +08:00
										 |  |  | import { fail } from 'assert'; | 
					
						
							| 
									
										
										
										
											2021-08-05 02:54:52 +08:00
										 |  |  | import os from 'os'; | 
					
						
							| 
									
										
										
										
											2021-10-11 22:52:17 +08:00
										 |  |  | import type { Route, Response } from 'playwright-core'; | 
					
						
							| 
									
										
										
										
											2021-08-05 02:54:52 +08:00
										 |  |  | import { expect, test as it } from './pageTest'; | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should fulfill intercepted response', async ({ page, server, browserName }) => { | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |   await page.route('**/*', async route => { | 
					
						
							| 
									
										
										
										
											2021-07-02 00:33:47 +08:00
										 |  |  |     // @ts-expect-error
 | 
					
						
							| 
									
										
										
										
											2021-08-25 02:07:54 +08:00
										 |  |  |     await route._continueToResponse({}); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |     await route.fulfill({ | 
					
						
							|  |  |  |       status: 201, | 
					
						
							|  |  |  |       headers: { | 
					
						
							|  |  |  |         foo: 'bar' | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       contentType: 'text/plain', | 
					
						
							|  |  |  |       body: 'Yo, page!' | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const response = await page.goto(server.PREFIX + '/empty.html'); | 
					
						
							|  |  |  |   expect(response.status()).toBe(201); | 
					
						
							|  |  |  |   expect(response.headers().foo).toBe('bar'); | 
					
						
							|  |  |  |   expect(response.headers()['content-type']).toBe('text/plain'); | 
					
						
							|  |  |  |   expect(await page.evaluate(() => document.body.textContent)).toBe('Yo, page!'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should fulfill response with empty body', async ({ page, server, browserName, browserMajorVersion }) => { | 
					
						
							| 
									
										
										
										
											2021-08-19 22:44:13 +08:00
										 |  |  |   it.skip(browserName === 'chromium' && browserMajorVersion <= 91, 'Fails in Electron that uses old Chromium'); | 
					
						
							| 
									
										
										
										
											2021-08-12 05:47:05 +08:00
										 |  |  |   await page.route('**/*', async route => { | 
					
						
							|  |  |  |     // @ts-expect-error
 | 
					
						
							| 
									
										
										
										
											2021-08-27 06:44:20 +08:00
										 |  |  |     const response = await route._continueToResponse({}); | 
					
						
							| 
									
										
										
										
											2021-08-12 05:47:05 +08:00
										 |  |  |     await route.fulfill({ | 
					
						
							| 
									
										
										
										
											2021-08-27 06:44:20 +08:00
										 |  |  |       response, | 
					
						
							| 
									
										
										
										
											2021-08-12 05:47:05 +08:00
										 |  |  |       status: 201, | 
					
						
							|  |  |  |       body: '' | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const response = await page.goto(server.PREFIX + '/title.html'); | 
					
						
							|  |  |  |   expect(response.status()).toBe(201); | 
					
						
							|  |  |  |   expect(await response.text()).toBe(''); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should override with defaults when intercepted response not provided', async ({ page, server, browserName, browserMajorVersion }) => { | 
					
						
							| 
									
										
										
										
											2021-08-25 02:07:54 +08:00
										 |  |  |   it.skip(browserName === 'chromium' && browserMajorVersion <= 91, 'Fails in Electron that uses old Chromium'); | 
					
						
							|  |  |  |   server.setRoute('/empty.html', (req, res) => { | 
					
						
							|  |  |  |     res.setHeader('foo', 'bar'); | 
					
						
							|  |  |  |     res.end('my content'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   await page.route('**/*', async route => { | 
					
						
							|  |  |  |     // @ts-expect-error
 | 
					
						
							|  |  |  |     await route._continueToResponse({}); | 
					
						
							|  |  |  |     await route.fulfill({ | 
					
						
							|  |  |  |       status: 201, | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const response = await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   expect(response.status()).toBe(201); | 
					
						
							|  |  |  |   expect(await response.text()).toBe(''); | 
					
						
							|  |  |  |   if (browserName === 'webkit') | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  |     expect(response.headers()).toEqual({ 'content-type': 'text/plain' }); | 
					
						
							| 
									
										
										
										
											2021-08-25 02:07:54 +08:00
										 |  |  |   else | 
					
						
							|  |  |  |     expect(response.headers()).toEqual({ }); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should fulfill with any response', async ({ page, server, browserName, browserMajorVersion, isLinux }) => { | 
					
						
							| 
									
										
										
										
											2021-08-25 02:07:54 +08:00
										 |  |  |   it.skip(browserName === 'chromium' && browserMajorVersion <= 91, 'Fails in Electron that uses old Chromium'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   server.setRoute('/sample', (req, res) => { | 
					
						
							|  |  |  |     res.setHeader('foo', 'bar'); | 
					
						
							|  |  |  |     res.end('Woo-hoo'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const page2 = await page.context().newPage(); | 
					
						
							|  |  |  |   const sampleResponse = await page2.goto(`${server.PREFIX}/sample`); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   await page.route('**/*', async route => { | 
					
						
							|  |  |  |     // @ts-expect-error
 | 
					
						
							|  |  |  |     await route._continueToResponse({}); | 
					
						
							|  |  |  |     await route.fulfill({ | 
					
						
							| 
									
										
										
										
											2021-08-27 06:44:20 +08:00
										 |  |  |       // @ts-expect-error
 | 
					
						
							|  |  |  |       response: sampleResponse, | 
					
						
							| 
									
										
										
										
											2021-08-25 02:07:54 +08:00
										 |  |  |       status: 201, | 
					
						
							| 
									
										
										
										
											2021-08-25 08:34:29 +08:00
										 |  |  |       contentType: 'text/plain' | 
					
						
							| 
									
										
										
										
											2021-08-25 02:07:54 +08:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const response = await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   expect(response.status()).toBe(201); | 
					
						
							|  |  |  |   expect(await response.text()).toBe('Woo-hoo'); | 
					
						
							|  |  |  |   expect(response.headers()['foo']).toBe('bar'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should throw on continue after intercept', async ({ page, server, browserName }) => { | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |   let routeCallback; | 
					
						
							|  |  |  |   const routePromise = new Promise<Route>(f => routeCallback = f); | 
					
						
							|  |  |  |   await page.route('**', routeCallback); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   page.goto(server.EMPTY_PAGE).catch(e => {}); | 
					
						
							|  |  |  |   const route = await routePromise; | 
					
						
							| 
									
										
										
										
											2021-07-02 00:33:47 +08:00
										 |  |  |   // @ts-expect-error
 | 
					
						
							| 
									
										
										
										
											2021-08-25 02:07:54 +08:00
										 |  |  |   await route._continueToResponse(); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |   try { | 
					
						
							|  |  |  |     await route.continue(); | 
					
						
							|  |  |  |     fail('did not throw'); | 
					
						
							|  |  |  |   } catch (e) { | 
					
						
							| 
									
										
										
										
											2021-06-23 17:08:35 +08:00
										 |  |  |     expect(e.message).toContain('Cannot call continue after response interception!'); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should support fulfill after intercept', async ({ page, server }) => { | 
					
						
							| 
									
										
										
										
											2021-08-04 06:29:51 +08:00
										 |  |  |   const requestPromise = server.waitForRequest('/title.html'); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |   await page.route('**', async route => { | 
					
						
							| 
									
										
										
										
											2021-07-02 00:33:47 +08:00
										 |  |  |     // @ts-expect-error
 | 
					
						
							| 
									
										
										
										
											2021-08-27 06:44:20 +08:00
										 |  |  |     const response = await route._continueToResponse(); | 
					
						
							|  |  |  |     await route.fulfill({ response }); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2021-08-04 06:29:51 +08:00
										 |  |  |   const response = await page.goto(server.PREFIX + '/title.html'); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |   const request = await requestPromise; | 
					
						
							| 
									
										
										
										
											2021-08-04 06:29:51 +08:00
										 |  |  |   expect(request.url).toBe('/title.html'); | 
					
						
							| 
									
										
										
										
											2021-08-05 02:54:52 +08:00
										 |  |  |   expect(await response.text()).toBe('<title>Woof-Woof</title>' + os.EOL); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should intercept failures', async ({ page, browserName, browserMajorVersion, server }) => { | 
					
						
							| 
									
										
										
										
											2021-08-19 22:44:13 +08:00
										 |  |  |   it.skip(browserName === 'chromium' && browserMajorVersion <= 91, 'Fails in Electron that uses old Chromium'); | 
					
						
							| 
									
										
										
										
											2021-08-17 07:40:47 +08:00
										 |  |  |   server.setRoute('/title.html', (req, res) => { | 
					
						
							|  |  |  |     req.destroy(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const requestPromise = server.waitForRequest('/title.html'); | 
					
						
							|  |  |  |   let error; | 
					
						
							|  |  |  |   await page.route('**', async route => { | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       // @ts-expect-error
 | 
					
						
							| 
									
										
										
										
											2021-08-27 06:44:20 +08:00
										 |  |  |       const response = await route._continueToResponse(); | 
					
						
							|  |  |  |       await route.fulfill({ response }); | 
					
						
							| 
									
										
										
										
											2021-08-17 07:40:47 +08:00
										 |  |  |     } catch (e) { | 
					
						
							|  |  |  |       error = e; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const [request] = await Promise.all([ | 
					
						
							|  |  |  |     requestPromise, | 
					
						
							|  |  |  |     page.goto(server.PREFIX + '/title.html').catch(e => {}) | 
					
						
							|  |  |  |   ]); | 
					
						
							|  |  |  |   expect(error).toBeTruthy(); | 
					
						
							|  |  |  |   expect(error.message).toContain('Request failed'); | 
					
						
							|  |  |  |   expect(request.url).toBe('/title.html'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should support request overrides', async ({ page, server, browserName, browserMajorVersion }) => { | 
					
						
							| 
									
										
										
										
											2021-08-19 22:44:13 +08:00
										 |  |  |   it.skip(browserName === 'chromium' && browserMajorVersion <= 91, 'Fails in Electron that uses old Chromium'); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |   const requestPromise = server.waitForRequest('/empty.html'); | 
					
						
							|  |  |  |   await page.route('**/foo', async route => { | 
					
						
							| 
									
										
										
										
											2021-07-02 00:33:47 +08:00
										 |  |  |     // @ts-expect-error
 | 
					
						
							| 
									
										
										
										
											2021-08-27 06:44:20 +08:00
										 |  |  |     const response = await route._continueToResponse({ | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |       url: server.EMPTY_PAGE, | 
					
						
							|  |  |  |       method: 'POST', | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  |       headers: { 'foo': 'bar' }, | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |       postData: 'my data', | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2021-08-27 06:44:20 +08:00
										 |  |  |     await route.fulfill({ response }); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |   }); | 
					
						
							|  |  |  |   await page.goto(server.PREFIX + '/foo'); | 
					
						
							|  |  |  |   const request = await requestPromise; | 
					
						
							|  |  |  |   expect(request.method).toBe('POST'); | 
					
						
							|  |  |  |   expect(request.url).toBe('/empty.html'); | 
					
						
							|  |  |  |   expect(request.headers['foo']).toBe('bar'); | 
					
						
							|  |  |  |   expect((await request.postBody).toString('utf8')).toBe('my data'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should give access to the intercepted response', async ({ page, server }) => { | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let routeCallback; | 
					
						
							|  |  |  |   const routePromise = new Promise<Route>(f => routeCallback = f); | 
					
						
							|  |  |  |   await page.route('**/title.html', routeCallback); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-14 07:28:42 +08:00
										 |  |  |   const evalPromise = page.evaluate(url => fetch(url), server.PREFIX + '/title.html'); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const route = await routePromise; | 
					
						
							| 
									
										
										
										
											2021-07-02 00:33:47 +08:00
										 |  |  |   // @ts-expect-error
 | 
					
						
							| 
									
										
										
										
											2021-09-08 01:27:53 +08:00
										 |  |  |   const response: Response = await route._continueToResponse(); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   expect(response.status()).toBe(200); | 
					
						
							|  |  |  |   expect(response.ok()).toBeTruthy(); | 
					
						
							|  |  |  |   expect(response.url()).toBe(server.PREFIX + '/title.html'); | 
					
						
							|  |  |  |   expect(response.headers()['content-type']).toBe('text/html; charset=utf-8'); | 
					
						
							| 
									
										
										
										
											2021-09-08 01:27:53 +08:00
										 |  |  |   expect((await response.allHeaders())['content-type']).toBe('text/html; charset=utf-8'); | 
					
						
							| 
									
										
										
										
											2021-09-12 04:27:00 +08:00
										 |  |  |   expect(await (await response.headersArray()).filter(({ name }) => name.toLowerCase() === 'content-type')).toEqual([{ name: 'Content-Type', value: 'text/html; charset=utf-8' }]); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 06:44:20 +08:00
										 |  |  |   // @ts-expect-error
 | 
					
						
							|  |  |  |   await Promise.all([route.fulfill({ response }), evalPromise]); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should give access to the intercepted response status text', async ({ page, server, browserName }) => { | 
					
						
							| 
									
										
										
										
											2021-08-14 07:28:42 +08:00
										 |  |  |   it.fail(browserName === 'chromium', 'Status line is not reported for intercepted responses'); | 
					
						
							|  |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  |   server.setRoute('/title.html', (req, res) => { | 
					
						
							|  |  |  |     res.statusCode = 200; | 
					
						
							|  |  |  |     res.statusMessage = 'You are awesome'; | 
					
						
							|  |  |  |     res.setHeader('Content-Type', 'text/plain'); | 
					
						
							|  |  |  |     res.end(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   let routeCallback; | 
					
						
							|  |  |  |   const routePromise = new Promise<Route>(f => routeCallback = f); | 
					
						
							|  |  |  |   await page.route('**/title.html', routeCallback); | 
					
						
							|  |  |  |   const evalPromise = page.evaluate(url => fetch(url), server.PREFIX + '/title.html'); | 
					
						
							|  |  |  |   const route = await routePromise; | 
					
						
							|  |  |  |   // @ts-expect-error
 | 
					
						
							| 
									
										
										
										
											2021-08-25 02:07:54 +08:00
										 |  |  |   const response = await route._continueToResponse(); | 
					
						
							| 
									
										
										
										
											2021-08-14 07:28:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-30 04:36:12 +08:00
										 |  |  |   await Promise.all([route.fulfill({ response }), evalPromise]); | 
					
						
							| 
									
										
										
										
											2021-08-14 07:28:42 +08:00
										 |  |  |   expect(response.statusText()).toBe('You are awesome'); | 
					
						
							|  |  |  |   expect(response.url()).toBe(server.PREFIX + '/title.html'); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should give access to the intercepted response body', async ({ page, server }) => { | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |   await page.goto(server.EMPTY_PAGE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let routeCallback; | 
					
						
							|  |  |  |   const routePromise = new Promise<Route>(f => routeCallback = f); | 
					
						
							|  |  |  |   await page.route('**/simple.json', routeCallback); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-27 23:28:53 +08:00
										 |  |  |   const evalPromise = page.evaluate(url => fetch(url), server.PREFIX + '/simple.json').catch(() => {}); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const route = await routePromise; | 
					
						
							| 
									
										
										
										
											2021-07-02 00:33:47 +08:00
										 |  |  |   // @ts-expect-error
 | 
					
						
							| 
									
										
										
										
											2021-08-25 02:07:54 +08:00
										 |  |  |   const response = await route._continueToResponse(); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   expect((await response.text())).toBe('{"foo": "bar"}\n'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-27 06:44:20 +08:00
										 |  |  |   await Promise.all([route.fulfill({ response }), evalPromise]); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should be abortable after interception', async ({ page, server, browserName }) => { | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |   await page.route(/\.css$/, async route => { | 
					
						
							| 
									
										
										
										
											2021-07-02 00:33:47 +08:00
										 |  |  |     // @ts-expect-error
 | 
					
						
							| 
									
										
										
										
											2021-08-25 02:07:54 +08:00
										 |  |  |     await route._continueToResponse(); | 
					
						
							| 
									
										
										
										
											2021-06-19 02:04:48 +08:00
										 |  |  |     await route.abort(); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   let failed = false; | 
					
						
							|  |  |  |   page.on('requestfailed', request => { | 
					
						
							|  |  |  |     if (request.url().includes('.css')) | 
					
						
							|  |  |  |       failed = true; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const response = await page.goto(server.PREFIX + '/one-style.html'); | 
					
						
							|  |  |  |   expect(response.ok()).toBe(true); | 
					
						
							|  |  |  |   expect(response.request().failure()).toBe(null); | 
					
						
							|  |  |  |   expect(failed).toBe(true); | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should fulfill after redirects', async ({ page, server, browserName }) => { | 
					
						
							| 
									
										
										
										
											2021-07-12 18:07:47 +08:00
										 |  |  |   server.setRedirect('/redirect/1.html', '/redirect/2.html'); | 
					
						
							|  |  |  |   server.setRedirect('/redirect/2.html', '/empty.html'); | 
					
						
							|  |  |  |   const expectedUrls = ['/redirect/1.html', '/redirect/2.html', '/empty.html'].map(s => server.PREFIX + s); | 
					
						
							|  |  |  |   const requestUrls = []; | 
					
						
							|  |  |  |   const responseUrls = []; | 
					
						
							|  |  |  |   const requestFinishedUrls = []; | 
					
						
							|  |  |  |   page.on('request', request => requestUrls.push(request.url())); | 
					
						
							|  |  |  |   page.on('response', response => responseUrls.push(response.url())); | 
					
						
							|  |  |  |   page.on('requestfinished', request => requestFinishedUrls.push(request.url())); | 
					
						
							| 
									
										
										
										
											2021-08-05 23:49:02 +08:00
										 |  |  |   let routeCalls = 0; | 
					
						
							| 
									
										
										
										
											2021-07-12 18:07:47 +08:00
										 |  |  |   await page.route('**/*', async route => { | 
					
						
							| 
									
										
										
										
											2021-08-05 23:49:02 +08:00
										 |  |  |     ++routeCalls; | 
					
						
							| 
									
										
										
										
											2021-07-12 18:07:47 +08:00
										 |  |  |     // @ts-expect-error
 | 
					
						
							| 
									
										
										
										
											2021-08-25 02:07:54 +08:00
										 |  |  |     await route._continueToResponse({}); | 
					
						
							| 
									
										
										
										
											2021-07-12 18:07:47 +08:00
										 |  |  |     await route.fulfill({ | 
					
						
							|  |  |  |       status: 201, | 
					
						
							|  |  |  |       headers: { | 
					
						
							|  |  |  |         foo: 'bar' | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       contentType: 'text/plain', | 
					
						
							|  |  |  |       body: 'Yo, page!' | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   const response = await page.goto(server.PREFIX + '/redirect/1.html'); | 
					
						
							|  |  |  |   expect(requestUrls).toEqual(expectedUrls); | 
					
						
							|  |  |  |   expect(responseUrls).toEqual(expectedUrls); | 
					
						
							|  |  |  |   await response.finished(); | 
					
						
							|  |  |  |   expect(requestFinishedUrls).toEqual(expectedUrls); | 
					
						
							| 
									
										
										
										
											2021-08-05 23:49:02 +08:00
										 |  |  |   expect(routeCalls).toBe(1); | 
					
						
							| 
									
										
										
										
											2021-07-12 18:07:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const redirectChain = []; | 
					
						
							|  |  |  |   for (let req = response.request(); req; req = req.redirectedFrom()) | 
					
						
							|  |  |  |     redirectChain.unshift(req.url()); | 
					
						
							|  |  |  |   expect(redirectChain).toEqual(expectedUrls); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   expect(response.status()).toBe(201); | 
					
						
							|  |  |  |   expect(response.headers().foo).toBe('bar'); | 
					
						
							|  |  |  |   expect(response.headers()['content-type']).toBe('text/plain'); | 
					
						
							|  |  |  |   expect(await response.text()).toBe('Yo, page!'); | 
					
						
							|  |  |  | }); | 
					
						
							| 
									
										
										
										
											2021-08-05 23:49:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should fulfill original response after redirects', async ({ page, browserName, server }) => { | 
					
						
							| 
									
										
										
										
											2021-08-05 23:49:02 +08:00
										 |  |  |   server.setRedirect('/redirect/1.html', '/redirect/2.html'); | 
					
						
							|  |  |  |   server.setRedirect('/redirect/2.html', '/title.html'); | 
					
						
							|  |  |  |   const expectedUrls = ['/redirect/1.html', '/redirect/2.html', '/title.html'].map(s => server.PREFIX + s); | 
					
						
							|  |  |  |   const requestUrls = []; | 
					
						
							|  |  |  |   const responseUrls = []; | 
					
						
							|  |  |  |   const requestFinishedUrls = []; | 
					
						
							|  |  |  |   page.on('request', request => requestUrls.push(request.url())); | 
					
						
							|  |  |  |   page.on('response', response => responseUrls.push(response.url())); | 
					
						
							|  |  |  |   page.on('requestfinished', request => requestFinishedUrls.push(request.url())); | 
					
						
							|  |  |  |   let routeCalls = 0; | 
					
						
							|  |  |  |   await page.route('**/*', async route => { | 
					
						
							|  |  |  |     ++routeCalls; | 
					
						
							|  |  |  |     // @ts-expect-error
 | 
					
						
							| 
									
										
										
										
											2021-08-27 06:44:20 +08:00
										 |  |  |     const response = await route._continueToResponse({}); | 
					
						
							|  |  |  |     await route.fulfill({ response }); | 
					
						
							| 
									
										
										
										
											2021-08-05 23:49:02 +08:00
										 |  |  |   }); | 
					
						
							|  |  |  |   const response = await page.goto(server.PREFIX + '/redirect/1.html'); | 
					
						
							|  |  |  |   expect(requestUrls).toEqual(expectedUrls); | 
					
						
							|  |  |  |   expect(responseUrls).toEqual(expectedUrls); | 
					
						
							|  |  |  |   await response.finished(); | 
					
						
							|  |  |  |   expect(requestFinishedUrls).toEqual(expectedUrls); | 
					
						
							|  |  |  |   expect(routeCalls).toBe(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const redirectChain = []; | 
					
						
							|  |  |  |   for (let req = response.request(); req; req = req.redirectedFrom()) | 
					
						
							|  |  |  |     redirectChain.unshift(req.url()); | 
					
						
							|  |  |  |   expect(redirectChain).toEqual(expectedUrls); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   expect(response.status()).toBe(200); | 
					
						
							| 
									
										
										
										
											2021-08-05 23:59:48 +08:00
										 |  |  |   expect(await response.text()).toBe('<title>Woof-Woof</title>' + os.EOL); | 
					
						
							| 
									
										
										
										
											2021-08-05 23:49:02 +08:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 00:58:08 +08:00
										 |  |  | it('should abort after redirects', async ({ page, browserName, server }) => { | 
					
						
							| 
									
										
										
										
											2021-08-05 23:49:02 +08:00
										 |  |  |   server.setRedirect('/redirect/1.html', '/redirect/2.html'); | 
					
						
							|  |  |  |   server.setRedirect('/redirect/2.html', '/title.html'); | 
					
						
							|  |  |  |   const expectedUrls = ['/redirect/1.html', '/redirect/2.html', '/title.html'].map(s => server.PREFIX + s); | 
					
						
							|  |  |  |   const requestUrls = []; | 
					
						
							|  |  |  |   const responseUrls = []; | 
					
						
							|  |  |  |   const requestFinishedUrls = []; | 
					
						
							|  |  |  |   const requestFailedUrls = []; | 
					
						
							|  |  |  |   page.on('request', request => requestUrls.push(request.url())); | 
					
						
							|  |  |  |   page.on('response', response => responseUrls.push(response.url())); | 
					
						
							|  |  |  |   page.on('requestfinished', request => requestFinishedUrls.push(request.url())); | 
					
						
							|  |  |  |   page.on('requestfailed', request => requestFailedUrls.push(request.url())); | 
					
						
							|  |  |  |   let routeCalls = 0; | 
					
						
							|  |  |  |   await page.route('**/*', async route => { | 
					
						
							|  |  |  |     ++routeCalls; | 
					
						
							|  |  |  |     // @ts-expect-error
 | 
					
						
							| 
									
										
										
										
											2021-08-25 02:07:54 +08:00
										 |  |  |     await route._continueToResponse({}); | 
					
						
							| 
									
										
										
										
											2021-08-05 23:49:02 +08:00
										 |  |  |     await route.abort('connectionreset'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   try { | 
					
						
							|  |  |  |     await page.goto(server.PREFIX + '/redirect/1.html'); | 
					
						
							|  |  |  |   } catch (e) { | 
					
						
							| 
									
										
										
										
											2021-08-12 02:14:50 +08:00
										 |  |  |     if (browserName === 'webkit') | 
					
						
							|  |  |  |       expect(e.message).toContain('Request intercepted'); | 
					
						
							| 
									
										
										
										
											2021-08-12 03:48:30 +08:00
										 |  |  |     else if (browserName === 'chromium') | 
					
						
							| 
									
										
										
										
											2021-08-12 02:14:50 +08:00
										 |  |  |       expect(e.message).toContain('ERR_CONNECTION_RESET'); | 
					
						
							| 
									
										
										
										
											2021-08-12 03:48:30 +08:00
										 |  |  |     else | 
					
						
							|  |  |  |       expect(e.message).toContain('NS_ERROR_NET_RESET'); | 
					
						
							| 
									
										
										
										
											2021-08-05 23:49:02 +08:00
										 |  |  |   } | 
					
						
							|  |  |  |   expect(requestUrls).toEqual(expectedUrls); | 
					
						
							|  |  |  |   expect(responseUrls).toEqual(expectedUrls.slice(0, -1)); | 
					
						
							|  |  |  |   expect(requestFinishedUrls).toEqual(expectedUrls.slice(0, -1)); | 
					
						
							|  |  |  |   expect(requestFailedUrls).toEqual(expectedUrls.slice(-1)); | 
					
						
							|  |  |  |   expect(routeCalls).toBe(1); | 
					
						
							|  |  |  | }); |